लिनक्स कर्नेल बिल्ड कॉन्फ़िगरेशन को स्वचालित करने के लिए स्क्रिप्ट को menuconfig कैसे करें?


10

मैं एक लिनक्स बिल्ड को स्वचालित करना चाहता हूं, लेकिन अंततः एक ऐसे बिंदु पर पहुंच जाता हूं, जहां मुझे चलाने की आवश्यकता होती है जो एक बहुत ही मैनुअल कदम लगता है make menuconfig:। ऐसा लगता है कि OS और कर्नेल कॉन्फिग के बीच कॉन्फिगर को सिंक्रोनाइज़ करना है?

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

मूल रूप से, मैं make menuconfigबिल्ड स्क्रिप्ट के लिए कॉल कैसे निकाल सकता हूं ?

एक तरफ के रूप में, यह एक बिल्ड त्रुटि के जवाब में है जो तब होता है जब मैं बिना कॉल किए मेन्यूफ़ोनफिग को चलाता हूं:

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

ऐसा लगता है कि किसी मेकफाइल में शायद एक गायब नियम है क्योंकि मेकफाइल स्वयं मौजूद नहीं है या उस नियम को शामिल करने के लिए मेकफाइल उत्पन्न / मॉर्फ नहीं किया गया है लेकिन यह एक अलग प्रश्न है।

इस पूरी तरह से संपर्क करने का एक बेहतर तरीका हो सकता है। क्या कोई अन्य कॉन्फिगरेशन है जो मैं ट्रैक नहीं कर रहा हूं, लेकिन (जैसे कि पुरानी कॉन्फिग) होनी चाहिए?


1
क्या आपने परीक्षण किया है make olddefconfig?
जिमीज

नहीं, इस बारे में अभी और पढ़ना ... यह सिर्फ इतना दर्दनाक है क्योंकि किसी भी छोटे से प्रयोग में इतना समय लगता है।
tarabyte

जवाबों:


8

लिनक्स कर्नेल बिल्ड-सिस्टम कई बिल्ड लक्ष्य प्रदान करता है, इसके बारे में जानने का सबसे अच्छा तरीका शायद यह करना है 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

जैसा कि जिमीज टिप्पणी में कहते हैं, oldconfigसंबंधित भागों में दिलचस्प भाग हैं ।

व्यक्तिगत रूप से, मैं आपको सुझाव silentoldconfigदूंगा कि यदि आप .configफ़ाइल में कुछ भी नहीं बदलते हैं या olddefconfigयदि आपने अपनी .configफ़ाइल को नए कर्नेल के साथ अपडेट किया है ।


1
randconfigमुझे चौंका दिया। संभवतः संयोजनों की संभावना पैदा करके बिल्ड का परीक्षण करने के लिए उपयोग किया जाता है?
17:15 पर कॉर्सच

2
हाँ, यह ठीक विन्यास फाइल के लिए एक फजर के रूप में प्रयोग किया जाता है। इस प्रश्न को देखें: लिनक्स कर्नेल को संकलित करते समय, इसका उद्देश्य क्या है make randconfig? ('उबंटू से पूछें ’वेबसाइट पर)।
प्रति

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_FILES: /programming/1414968/how-do-i-configure-the-linux-kernel-within-buildroot

संबंधित: /programming/7505164/how-do-you-non-interactively-turn-on-features-in-a-linux-kernel-config-file


0

मेरे पास यही मुद्दा था क्योंकि मैं अपने CentOS कर्नेल को अपग्रेड करना चाहता था और इसे कई मशीनों पर करने की आवश्यकता थी। यहाँ मान लें कि मेरा नया CentOS कर्नेल ट्री /linux-5.1 में है (मैं रूट खाते में लॉग इन हूं)

  1. cd /linux-5.1
  2. दौड़ें make menuconfigऔर अपने बदलाव करें और उन्हें बचाने के लिए.config
  3. /linux-5.1/.configफ़ाइल को अपने विकास सर्वर पर कॉपी करें
  4. अब आपकी अगली मशीन को अपग्रेड करने के लिए आप .configअपने विकास सर्वर से /linux-5.1/.configनई मशीन पर फाइल कॉपी करेंगे ।

आशा है कि यह किसी को एक ही विधेय में मदद करता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.