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
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
答え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.sh
Targetのシンプルなフロントエンドですmake 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_FILES
。https://stackoverflow.com/questions/1414968/how-do-i-configure-the-linux-kernel-within-buildroot
答え3
CentOSカーネルをアップグレードし、複数のシステムでアップグレードする必要があるため、同じ問題に直面しました。私の新しいCentOSカーネルツリーが/ linux-5.1にあるとしましょう(私はrootとしてログインしました)。
cd /linux-5.1
- 実行し
make menuconfig
て変更して保存します。.config
/linux-5.1/.config
開発サーバーにファイルをコピーする- 次のコンピュータをアップグレードするには、
.config
開発サーバーのファイルを/linux-5.1/.config
新しいコンピュータにコピーする必要があります。
これが同じ問題に遭遇した誰かに役立つことを願っています。