Linuxカーネルのビルド構成を自動化するスクリプトmake menuconfigの方法は?


10

Linuxビルドを自動化したいのですが、最終的には非常に手動のステップのように見えるものを実行する必要がありますmake menuconfig。これは、OSとカーネル構成の間で構成を同期しているようですか?

cp git-tracked-config .config
make defconfig 
make menuconfig # <- how to automate/script this?
make V=s

基本的に、make menuconfigビルドスクリプトの呼び出しを削除するにはどうすればよいですか?

余談ですが、これはmake menuconfigを呼び出さずに実行したときに発生するように見えるビルドエラーに対する反応です。

make[1]: *** No rule to make target `include/config/auto.conf', needed by `include/config/kernel.release'.  Stop.

おそらくメイクファイル自体が存在しないか、メイクファイルがそのルールを含むように生成/モーフィングされていないために、メイクファイルにルールがないようですが、それは別の質問です。

これをまとめて取り組むためのよりスマートな方法があるかもしれません。追跡していないけれどもすべき他の設定はありますか(例:oldconfig)?


1
テストしましたmake olddefconfigか?
jimmij

いいえ、それについて今読んでください...小さな実験はとても時間がかかるので、それはとても大変です。
タラバイト

回答:


8

Linuxカーネルビルドシステムは多くのビルドターゲットを提供します。それを知る最善の方法は、おそらく次のようにすることですmake help

Configuration targets:
  config      - Update current config utilising a line-oriented program
  nconfig         - Update current config utilising a ncurses menu based program
  menuconfig      - Update current config utilising a menu based program
  xconfig     - Update current config utilising a QT based front-end
  gconfig     - Update current config utilising a GTK based front-end
  oldconfig   - Update current config utilising a provided .config as base
  localmodconfig  - Update current config disabling modules not loaded
  localyesconfig  - Update current config converting local mods to core
  silentoldconfig - Same as oldconfig, but quietly, additionally update deps
  defconfig   - New config with default from ARCH supplied defconfig
  savedefconfig   - Save current config as ./defconfig (minimal config)
  allnoconfig     - New config where all options are answered with no
  allyesconfig    - New config where all options are accepted with yes
  allmodconfig    - New config selecting modules when possible
  alldefconfig    - New config with all symbols set to default
  randconfig      - New config with random answer to all options
  listnewconfig   - List new options
  olddefconfig    - Same as silentoldconfig but sets new symbols to their default value
  kvmconfig   - Enable additional options for guest kernel support
  tinyconfig      - Configure the tiniest possible kernel

jimmijがコメントで言っているように、興味深い部分はoldconfig関連するターゲットにあります。

個人的にsilentoldconfigは、.configファイルに何も変更されていない場合、または新しいカーネルでファイルをolddefconfig更新した場合に進むことをお勧めします.config


1
randconfig驚いた。おそらく、ありそうもない組み合わせを生成することによってビルドをテストするために使用されますか?
conorsch

2
はい、これは構成ファイルのファザーとして正確に使用されます。この質問を参照してください:Linuxカーネルをコンパイルするとき、目的はmake randconfig何ですか?(「Ask Ubuntu」のWebサイト)。
2015

2

merge_config.sh 構成フラグメント

$ cd linux
$ git checkout v4.9
$ make x86_64_defconfig
$ grep -E 'CONFIG_(DEBUG_INFO|GDB_SCRIPTS)[= ]' .config
# CONFIG_DEBUG_INFO is not set
$ # GDB_SCRIPTS depends on CONFIG_DEBUG_INFO in lib/Kconfig.debug.
$ cat <<EOF >.config-fragment
> CONFIG_DEBUG_INFO=y
> CONFIG_GDB_SCRIPTS=y
> EOF
$ # Order is important here. Must be first base config, then fragment.
$ ./scripts/kconfig/merge_config.sh .config .config-fragment
$ grep -E 'CONFIG_(DEBUG_INFO|GDB_SCRIPTS)[= ]' .config
CONFIG_DEBUG_INFO=y
CONFIG_GDB_SCRIPTS=y

残念ながら、プロセスの置換は機能しませ

./scripts/kconfig/merge_config.sh arch/x86/configs/x86_64_defconfig \
    <( printf 'CONFIG_DEBUG_INFO=y\nCONFIG_GDB_SCRIPTS=y\n' ) 

理由:https : //unix.stackexchange.com/a/164109/32558

merge_config.shmake alldefconfigターゲットのシンプルなフロントエンドです。

クロスコンパイルARCHする場合はmerge_config.sh、実行時にエクスポートする必要があります。例:

export ARCH=arm64
export CROSS_COMPILE=aarch64-linux-gnu-
make defconfig
./scripts/kconfig/merge_config.sh .config .config-fragment

マージされた出力ファイルは、KCONFIG_CONFIG環境変数で明示的に指定できます。それ以外の場合は、単に上書きします.config

KCONFIG_CONFIG=some/path/.config ./scripts/kconfig/merge_config.sh .config .config-fragment

Buildrootは次のように自動化しますBR2_LINUX_KERNEL_CONFIG_FRAGMENT_FILEShttps : //stackoverflow.com/questions/1414968/how-do-i-configure-the-linux-kernel-within-buildroot

関連:https : //stackoverflow.com/questions/7505164/how-do-you-non-interactively-turn-on-features-in-a-linux-kernel-config-file


0

私のCentOSカーネルをアップグレードしたかったので、これと同じ問題があり、いくつかのマシンでアップグレードする必要がありました。ここで私の新しいCentOSカーネルツリーが/linux-5.1にあると仮定します(私はrootアカウントにログインしています)

  1. cd /linux-5.1
  2. 実行make menuconfigして変更を加え、保存します.config
  3. /linux-5.1/.configファイルを開発サーバーにコピーします
  4. 次のマシンをアップグレードする.configため/linux-5.1/.configに、開発用サーバーから新しいマシンにファイルをコピーします。

これが同じ苦境にいる誰かを助けることを願っています。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.