* Added a script to generate the kernel configuration.

`generate-config.pl' runs `make config' to generate a Linux kernel
  configuration file.  For each question (i.e. kernel configuration
  option), unless an override is provided, it answers "m" if possible,
  and otherwise uses the default answer (as determined by the default
  config for the architecture).  This is safer than allmodconfig,
  which answers "y" everywhere it can't answer "m" and thus ends up
  enabling a lot of experimental or debug options.  (For this reason,
  a configuration generated by allmodconfig must be carefully checked
  with every new release to ensure that nothing dangerous is enabled.
  The default config should be safer wrt new kernel releases.)

  Overrides are specified in the `config' argument to generic.nix,
  which is a string that contains lines such as `EXT2_FS_POSIX_ACL y'.
  The script warns about ignored options, and aborts if `make config'
  selects an answer inconsistent with the one in `config'.  This
  allows us to be sure that `make config' doesn't silently override
  our configuration values (e.g., depending on other options, it will
  set FB_TILEBLITTING to "y" even if we want it to be "n").

svn path=/nixpkgs/branches/kernel-config/; revision=18910
This commit is contained in:
Eelco Dolstra 2009-12-12 13:51:07 +00:00
parent adbaa14548
commit 03e45e0cb4
7 changed files with 369 additions and 8537 deletions

View File

@ -21,37 +21,14 @@ configurePhase() {
fi
# Patch kconfig to print "###" after every question -
# generate-config.pl expects this.
sed -e '/fflush(stdout);/i\printf("###");' -i scripts/kconfig/conf.c
# Create the config file.
cp $config .config
chmod u+w .config
echo --extraConfig--;
echo "${extraConfig}";
echo "$extraConfig" | while read; do
optionName=$( echo "$REPLY" | sed -e 's/[^A-Z_]//g' );
echo --optionName--;
echo "$REPLY";
echo ${optionName};
if [ -n "${optionName}" ]; then
sed -e s/.'*'${optionName}.'*'/"$REPLY/" -i .config
fi;
done;
echo "$extraConfig" >> .config
#substituteInPlace scripts/kconfig/lxdialog/check-lxdialog.sh \
# --replace /usr /no-such-path
# Necessary until NIXPKGS-38 is fixed:
echo "#! $SHELL" > scripts/kconfig/lxdialog/check-lxdialog.sh
chmod +x scripts/kconfig/lxdialog/check-lxdialog.sh
make oldconfig \
$makeFlags "${makeFlagsArray[@]}"
echo --finalConfig--
cat .config
echo "generating kernel configuration..."
echo "$kernelConfig" > kernel-config
ARCH=$arch KERNEL_CONFIG=kernel-config SHELL=bash NIX_INDENT_MAKE= perl -w $generateConfig
}

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,130 @@
# This script runs `make config' to generate a Linux kernel
# configuration file. For each question (i.e. kernel configuration
# option), unless an override is provided, it answers "m" if possible,
# and otherwise uses the default answer (as determined by the default
# config for the architecture). Overrides are read from the file
# $KERNEL_CONFIG, which on each line contains an option name and an
# answer, e.g. "EXT2_FS_POSIX_ACL y". The script warns about ignored
# options in $KERNEL_CONFIG, and barfs if `make config' selects
# another answer for an option than the one provided in
# $KERNEL_CONFIG.
use strict;
use IPC::Open2;
my $debug = $ENV{'DEBUG'};
$SIG{PIPE} = 'IGNORE';
# Read the answers.
my %answers;
open ANSWERS, "<$ENV{KERNEL_CONFIG}" or die;
while (<ANSWERS>) {
chomp;
s/#.*//;
my ($name, $value) = split / /;
$answers{$name} = $value if $name;
}
close ANSWERS;
sub runConfig {
# Run `make config'.
my $pid = open2(\*IN, \*OUT, "make config SHELL=bash ARCH=$ENV{ARCH}");
# Parse the output, look for questions and then send an
# appropriate answer.
my $line = ""; my $s;
my %choices = ();
my ($prevQuestion, $prevName);
while (!eof IN) {
read IN, $s, 1 or next;
$line .= $s;
#print STDERR "LINE: $line\n";
if ($s eq "\n") {
print STDERR "GOT: $line" if $debug;
# Remember choice alternatives ("> 1. bla (FOO)" or " 2. bla (BAR)").
if ($line =~ /^\s*>?\s*(\d+)\.\s+.*\(([A-Za-z0-9_]+)\)$/) {
$choices{$2} = $1;
}
$line = "";
}
elsif ($line =~ /###$/) {
# The config program is waiting for an answer.
# Is this a regular question? ("bla bla (OPTION_NAME) [Y/n/m/...] ")
if ($line =~ /(.*) \(([A-Za-z0-9_]+)\) \[(.*)\].*###$/) {
my $question = $1; my $name = $2; my $alts = $3;
my $answer = "";
# Build everything as a module if possible.
$answer = "m" if $alts =~ /\/m/;
$answer = $answers{$name} if defined $answers{$name};
print STDERR "QUESTION: $question, NAME: $name, ALTS: $alts, ANSWER: $answer\n" if $debug;
print OUT "$answer\n";
die "repeated question: $question" if $prevQuestion && $prevQuestion eq $question && $name eq $prevName;
$prevQuestion = $question;
$prevName = $name;
}
# Is this a choice? ("choice[1-N]: ")
elsif ($line =~ /choice\[(.*)\]: ###$/) {
my $answer = "";
foreach my $name (keys %choices) {
$answer = $choices{$name} if ($answers{$name} || "") eq "y";
}
print STDERR "CHOICE: $1, ANSWER: $answer\n" if $debug;
print OUT "$answer\n" if $1 =~ /-/;
}
# Some questions lack the option name ("bla bla [Y/n/m/...] ").
elsif ($line =~ /(.*) \[(.*)\] ###$/) {
print OUT "\n";
}
else {
die "don't know how to answer this question: $line\n";
}
$line = "";
%choices = ();
}
}
close IN;
waitpid $pid, 0;
}
# Run `make config' several times to converge on the desired result.
# (Some options may only become available after other options are
# set in a previous run.)
runConfig;
runConfig;
# Read the final .config file and check that our answers are in
# there. `make config' often overrides answers if later questions
# cause options to be selected.
my %config;
open CONFIG, "<.config" or die;
while (<CONFIG>) {
chomp;
if (/^CONFIG_([A-Za-z0-9_]+)=(.*)$/) {
$config{$1} = $2;
} elsif (/^# CONFIG_([A-Za-z0-9_]+) is not set$/) {
$config{$1} = "n";
}
}
close CONFIG;
foreach my $name (sort (keys %answers)) {
print STDERR "unused option: $name\n"
unless defined $config{$name};
die "option not set correctly: $name\n"
if $config{$name} && $config{$name} ne $answers{$name};
}

View File

@ -31,13 +31,8 @@
# "-my-kernel").
localVersion ? ""
, # A list of additional statements to be appended to the
# configuration file.
extraConfig ? []
, preConfigure ? ""
, extraMeta ? {}
, ...
}:
assert stdenv.system == "i686-linux" || stdenv.system == "x86_64-linux";
@ -59,19 +54,21 @@ stdenv.mkDerivation {
builder = ./builder.sh;
generateConfig = ./generate-config.pl;
inherit preConfigure;
inherit src config;
patches = map (p: p.patch) kernelPatches;
extraConfig =
let addNewlines = map (s: "\n" + s + "\n");
configFromPatches =
map (p: if p ? extraConfig then p.extraConfig else "") kernelPatches;
in lib.concatStrings (addNewlines (configFromPatches ++ extraConfig));
buildInputs = [perl mktemp];
kernelConfig =
let
configFromPatches =
map ({extraConfig ? "", ...}: extraConfig) kernelPatches;
in lib.concatStringsSep "\n" ([config] ++ configFromPatches);
buildInputs = [ perl mktemp ];
arch =
if xen then "xen" else

View File

@ -1,7 +1,5 @@
args @ {stdenv, fetchurl, userModeLinux ? false, ...}:
assert !userModeLinux;
import ./generic.nix (
rec {
@ -12,14 +10,230 @@ import ./generic.nix (
sha256 = "1yf5xhdnpcyhw4y78v35wyidlsyzxvbbnzw6jd31zni7ira6jvjk";
};
features = {
iwlwifi = true;
};
features.iwlwifi = true;
config =
if stdenv.system == "i686-linux" then ./config-2.6.29-i686-smp else
if stdenv.system == "x86_64-linux" then ./config-2.6.29-x86_64-smp else
abort "No kernel configuration for your platform!";
''
# Don't include any debug features.
DEBUG_KERNEL n
# Support drivers that need external firmware.
STANDALONE n
# Make /proc/config.gz available.
IKCONFIG_PROC y
# Optimize with -O2, not -Os.
CC_OPTIMIZE_FOR_SIZE n
# Virtualisation (KVM, Xen...).
PARAVIRT_GUEST y
KVM_CLOCK y
KVM_GUEST y
XEN y
# We need 64 GB (PAE) support for Xen guest support.
HIGHMEM64G y
# Enable the kernel's built-in memory tester.
MEMTEST y
# Include the CFQ I/O scheduler in the kernel, rather than as a
# module, so that the initrd gets a good I/O scheduler.
IOSCHED_CFQ y
# Disable some expensive (?) features.
MARKERS n
KPROBES n
NUMA n
PM_TRACE_RTC n
# Enable various subsystems.
ACCESSIBILITY y # Accessibility support
AUXDISPLAY y # Auxiliary Display support
DONGLE y # Serial dongle support
HIPPI y
MTD_COMPLEX_MAPPINGS y # needed for many devices
NET_POCKET y # enable pocket and portable adapters
SCSI_LOWLEVEL y # enable lots of SCSI devices
SCSI_LOWLEVEL_PCMCIA y
SPI y # needed for many devices
SPI_MASTER y
WAN y
# Networking options.
IP_PNP n
IPV6_PRIVACY y
NETFILTER_ADVANCED y
IP_VS_PROTO_TCP y
IP_VS_PROTO_UDP y
IP_VS_PROTO_ESP y
IP_VS_PROTO_AH y
IP_DCCP_CCID3 n # experimental
CLS_U32_PERF y
CLS_U32_MARK y
# Wireless networking.
IPW2100_MONITOR y # support promiscuous mode
IPW2200_MONITOR y # support promiscuous mode
${stdenv.lib.optionalString (!userModeLinux) ''
IWLWIFI_LEDS y
''}
IWLWIFI_RFKILL y
IWLAGN_SPECTRUM_MEASUREMENT y
IWLAGN_LEDS y
IWL4965 y # Intel Wireless WiFi 4965AGN
IWL5000 y # Intel Wireless WiFi 5000AGN
IWL3945_RFKILL y
IWL3945_LEDS y
HOSTAP_FIRMWARE y # Support downloading firmware images with Host AP driver
HOSTAP_FIRMWARE_NVRAM y
# Some settings to make sure that fbcondecor works - in particular,
# disable tileblitting and the drivers that need it.
FB y
FB_TILEBLITTING n
FB_MATROX n
FB_S3 n
FB_VT8623 n
FB_ARK n
FB_CFB_FILLRECT y
FB_CFB_COPYAREA y
FB_CFB_IMAGEBLIT y
FB_VESA y
# Enable various FB devices.
FB_EFI y
FB_NVIDIA_I2C y # Enable DDC Support
FB_RIVA_I2C y
FB_ATY_CT y # Mach64 CT/VT/GT/LT (incl. 3D RAGE) support
FB_ATY_GX y # Mach64 GX support
FB_SAVAGE_I2C y
FB_SAVAGE_ACCEL y
FB_SIS_300 y
FB_SIS_315 y
FB_3DFX_ACCEL y
FB_TRIDENT_ACCEL y
FB_GEODE y
# Sound.
SND_AC97_POWER_SAVE y # AC97 Power-Saving Mode
SND_HDA_INPUT_BEEP y # Support digital beep via input layer
SND_USB_CAIAQ_INPUT y
PSS_MIXER y # Enable PSS mixer (Beethoven ADSP-16 and other compatible)
# Enable a bunch of USB storage devices.
USB_STORAGE_DATAFAB y
USB_STORAGE_FREECOM y
USB_STORAGE_ISD200 y
USB_STORAGE_USBAT y
USB_STORAGE_SDDR09 y
USB_STORAGE_SDDR55 y
USB_STORAGE_JUMPSHOT y
USB_STORAGE_ONETOUCH y
USB_STORAGE_KARMA y
USB_STORAGE_CYPRESS_ATACB y
# USB serial devices.
USB_SERIAL_GENERIC y # USB Generic Serial Driver
USB_SERIAL_KEYSPAN_MPR y # include firmware for various USB serial devices
USB_SERIAL_KEYSPAN_USA28 y
USB_SERIAL_KEYSPAN_USA28X y
USB_SERIAL_KEYSPAN_USA28XA y
USB_SERIAL_KEYSPAN_USA28XB y
USB_SERIAL_KEYSPAN_USA19 y
USB_SERIAL_KEYSPAN_USA18X y
USB_SERIAL_KEYSPAN_USA19W y
USB_SERIAL_KEYSPAN_USA19QW y
USB_SERIAL_KEYSPAN_USA19QI y
USB_SERIAL_KEYSPAN_USA49W y
USB_SERIAL_KEYSPAN_USA49WLC y
# Filesystem options - in particular, enable extended attributes and
# ACLs for all filesystems that support them.
EXT2_FS_XATTR y # Ext2 extended attributes
EXT2_FS_POSIX_ACL y # Ext2 POSIX Access Control Lists
EXT2_FS_SECURITY y # Ext2 Security Labels
EXT2_FS_XIP y # Ext2 execute in place support
EXT4_FS_POSIX_ACL y
EXT4_FS_SECURITY y
REISERFS_FS_XATTR y
REISERFS_FS_POSIX_ACL y
REISERFS_FS_SECURITY y
JFS_POSIX_ACL y
JFS_SECURITY y
XFS_QUOTA y
XFS_POSIX_ACL y
XFS_RT y # XFS Realtime subvolume support
OCFS2_DEBUG_MASKLOG n
OCFS2_FS_POSIX_ACL y
BTRFS_FS_POSIX_ACL y
UBIFS_FS_XATTR y
UBIFS_FS_ADVANCED_COMPR y
NFSD_V2_ACL y
NFSD_V3 y
NFSD_V3_ACL y
NFSD_V4 y
CIFS_XATTR y
CIFS_POSIX y
# Security related features.
STRICT_DEVMEM y # Filter access to /dev/mem
SECURITY_SELINUX_BOOTPARAM_VALUE 0 # disable SELinux by default
# Misc. options.
8139TOO_8129 y
8139TOO_PIO n # PIO is slower
AIC79XX_DEBUG_ENABLE n
AIC7XXX_DEBUG_ENABLE n
AIC94XX_DEBUG n
B43_PCMCIA y
BLK_DEV_BSG n
BLK_DEV_CMD640_ENHANCED y # CMD640 enhanced support
BLK_DEV_IDEACPI y # IDE ACPI support
BLK_DEV_INTEGRITY y
BLK_DEV_IO_TRACE n
BSD_PROCESS_ACCT_V3 y
BT_HCIUART_BCSP y
BT_HCIUART_H4 y # UART (H4) protocol support
BT_HCIUART_LL y
BT_RFCOMM_TTY y # RFCOMM TTY support
CPU_FREQ_DEBUG n
CRASH_DUMP n
DMAR n # experimental
DVB_DYNAMIC_MINORS y # we use udev
FUSION y # Fusion MPT device support
IDE_GD_ATAPI y # ATAPI floppy support
IRDA_ULTRA y # Ultra (connectionless) protocol
JOYSTICK_IFORCE_232 y # I-Force Serial joysticks and wheels
JOYSTICK_IFORCE_USB y # I-Force USB joysticks and wheels
JOYSTICK_XPAD_FF y # X-Box gamepad rumble support
JOYSTICK_XPAD_LEDS y # LED Support for Xbox360 controller 'BigX' LED
KALLSYMS_EXTRA_PASS n
LDM_PARTITION y # Windows Logical Disk Manager (Dynamic Disk) support
LEDS_TRIGGER_IDE_DISK y # LED IDE Disk Trigger
LOGIRUMBLEPAD2_FF y # Logitech Rumblepad 2 force feedback
LOGO n # not needed
MEDIA_ATTACH y
MEGARAID_NEWGEN y
MICROCODE_AMD y
MODVERSIONS y
MOUSE_PS2_ELANTECH y # Elantech PS/2 protocol extension
MTRR_SANITIZER y
NET_FC y # Fibre Channel driver support
PCI_LEGACY y
PPP_MULTILINK y # PPP multilink support
REGULATOR y # Voltage and Current Regulator Support
SCSI_LOGGING y # SCSI logging facility
SERIAL_8250 y # 8250/16550 and compatible serial support
SLIP_COMPRESSED y # CSLIP compressed headers
SLIP_SMART y
THERMAL_HWMON y # Hardware monitoring support
USB_DEBUG n
USB_EHCI_ROOT_HUB_TT y # Root Hub Transaction Translators
X86_CHECK_BIOS_CORRUPTION y
X86_MCE y
'';
}
// args

View File

@ -5919,7 +5919,7 @@ let
inherit fetchurl stdenv gperf pkgconfig acl libusb usbutils pciutils glib;
};
uml = import ../os-specific/linux/kernel/linux-2.6.20.nix {
uml = import ../os-specific/linux/kernel/linux-2.6.29.nix {
inherit fetchurl stdenv perl mktemp module_init_tools;
userModeLinux = true;
};