Commit Graph

33 Commits

Author SHA1 Message Date
aszlig
639edcb829
manual-kernel: Fix handling spaces in readConfig.
The previos version did a for loop over the output of set, which spits out _all_
defined variables and their contents. This not only is dangerous if there is a
variable starting with CONFIG_ but also can't handle whitespace, as the IFS is
set to any (horizontal _and_ vertical) whitespace by default.

So, imagine (actually don't imagine, something like this is the case in a lot of
kernel configuration files) you have the following variable:

CONFIG_ARCH_HWEIGHT_CFLAGS="-fcall-saved-rdi -fcall-saved-rsi ..."

A loop with for and the default IFS would result in the following variable
pieces:

0: CONFIG_ARCH_HWEIGHT_CFLAGS="-fcall-saved-rdi
1: -fcall-saved-rsi
2: ..."

This obviously leads to the problem that this config variable is being cut off
at the first whitespace.

Another downside of this approach is that set not only returns variables but
functions as well. This could lead to quite a lot of unexpected behaviour and
confusion.

So the new approach doesn't source the kernel configuration anymore but uses
`read` to parse the file line-by line, setting IFS to '=', thus splitting all
configuration lines into key/value pairs.

Using parameter expansion, we ensure that we only read lines starting with
"CONFIG_". This particularily has the advantage of not being bash-specific,
should we choose to change to a different default shell someday.

Now, after we got a correct "CONFIG_" line, we're using a temporary variable to
split off the first quote from the result. Particularily the reason behind this
is shell compatibility again, as ${${foo#"}%"} only works in Bash, Zsh and
whatnot but not in plain SH.

And within the next line we obviously insert the no_firstquote variable without
it's last quote removed.

But, what about escaping?

First of all, if we'd just eval the $val variable, we would correctly unescape
the value, but this has the downside that variables within the content would be
expanded, for example look at this:

CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"

Well, obviously this is a bad example at the Nix sense, but just to show that
variables within kernel configuration entries aren't impossible.

And second, which would have been a show stopper if \" would be within $val: It
simply would end up being an invalid Nix expression, because \" would end up as
a ploin " within a double quoted string.

Signed-off-by: aszlig <aszlig@redmoonstudios.org>
2012-12-13 22:54:57 +01:00
Shea Levy
839c58f5b1 linux/manual-config: Cleanup 2012-08-11 21:21:06 -04:00
Shea Levy
9ac776ab22 linux/manual-config.nix: Set sourceRoot directly to the pre-unpacked source rather than using a symlink 2012-08-11 21:07:37 -04:00
Shea Levy
0c18551c93 linux/manual-config: Do source unpacking/patching in a separate derivation.
Since we keep the source in the kernel build anyway, no space is wasted by having a separate store path for the unpacked source. The upside is that the same source can be used to build the kernel multiple times, or generate configurations for later kernel builds, without going through the (fairly long) unpack and patch process multiple times.
2012-08-11 21:02:30 -04:00
Shea Levy
21a200d6b2 linux/manual-config: Fix depmod step, remove false comment 2012-08-07 06:36:50 -04:00
Shea Levy
1935f7e5b8 linux/manual-config: Add informative comment 2012-08-03 08:33:31 -04:00
Shea Levy
1b7264d349 linux/manual-config.nix: When stripping, use xargs -r in case CONFIG_MODULES=y but no modules are actually installed 2012-08-01 23:32:02 -04:00
Shea Levy
4aba2bb3f5 linux/manual-config: Use kernelPatches like generic.nix, not a plain patches list 2012-08-01 23:02:17 -04:00
Shea Levy
fd330e9315 linux/manual-config: Install the kernel with the name given in stdenv.platform.kernelTarget 2012-08-01 15:39:49 -04:00
Shea Levy
ad49d92899 linux/manual-config: When installing firmware, create the firmware directory prior to make *_install.
It is probably a kernel build system bug that this is necessary, but it's not really a big deal either.
2012-08-01 11:56:12 -04:00
Shea Levy
3f4fd55c63 linux/manual-config: Remove unnecessary quotation 2012-08-01 11:26:30 -04:00
Shea Levy
443b9bc936 linux/kernel/manual-config: use isDisabled instead of isNo in case FIRMWARE_IN_KERNEL is left unspecified 2012-08-01 11:21:32 -04:00
Shea Levy
3dbfca0d7f linux/manual-config: Change from 'features' to 'config' and fix build when firmware is installed.
Instead of manually adding which 'features' a kernel has based on its config here, just generate a nixexpr representation of the whole config and let places that need it (e.g. NixOS modules) decide how to map config options to features.

Note that if your kernel requires firmware whose hex file sits directly in ${src}/firmware rather than in a subdirectory thereof, you may need this patch for now: https://lkml.org/lkml/2012/7/31/724
2012-08-01 06:18:03 -04:00
Shea Levy
da4c64026a linux/kernel/manual-config: Greatly simplify config parser 2012-07-29 15:54:31 -04:00
Shea Levy
298b5ccdab linux/kernel/manual-config: Only import from derivation when explicitly asked to 2012-07-29 13:26:39 -04:00
Shea Levy
f0694a3151 linux/kernel/manual-config: Do all of the config file parsing in the imported-from derivation 2012-07-29 13:24:05 -04:00
Shea Levy
6585646d41 linux/kernel/manual-config: Add meta 2012-07-29 04:59:38 -04:00
Shea Levy
46fa5ab105 linux/kernel/manual-config: Relink the symlink from the build directory to the source directory after the source directory is moved 2012-07-29 04:56:56 -04:00
Shea Levy
f7b6f01da1 linux/kernel/manual-config: Cleanup 2012-07-29 04:52:34 -04:00
Shea Levy
98341e0bda linux/kernel/manual-config: Use the kernel's make install 2012-07-29 04:48:50 -04:00
Shea Levy
a9a7085684 linux/kernel/manual-config: Allow manually specifying features, cleanup 2012-07-29 04:31:40 -04:00
Shea Levy
6bb20c7ba2 linux/kernel/manual-config: Strip modules after install 2012-07-29 04:23:28 -04:00
Shea Levy
6b18ab5365 linux/kernel/manual-config: Remove useless INSTALL_MOD_STRIP variable 2012-07-29 04:07:43 -04:00
Shea Levy
6e3b17feec linux/kernel/manual-config: Run depmod after build 2012-07-29 04:01:40 -04:00
Shea Levy
48b5e8eee7 linux/kernel/manual-config: Build in a separate directory and move the build and source trees into $out 2012-07-29 03:49:52 -04:00
Shea Levy
e42a6c5f46 linux/kernel/manual-config: Move the build directory to $out instead of symlinking it 2012-07-29 03:27:09 -04:00
Shea Levy
a36456ca25 linux/kernel-manual-config: Simplify the lines.nix runCommand now that I know how to escape properly 2012-07-29 03:09:44 -04:00
Shea Levy
5a9d9f4f45 linux/kernel/manual-config: Properly escape makeFlagsArray and installFlagsArray 2012-07-29 02:57:58 -04:00
Shea Levy
471b4bc9bb MODLIB needs to be passed directly to make 2012-07-29 02:49:31 -04:00
Shea Levy
aa40e0ff59 linux/kernel/manual-config: The default 'make install' tries to do something with LILO, so install the kernel manually 2012-07-29 01:57:59 -04:00
Shea Levy
dfa750732d linux/kernel/manual-config: Properly set env vars referencing $out 2012-07-29 01:34:27 -04:00
Shea Levy
ff728a6365 The kernel build needs hostname and perl 2012-07-29 01:29:56 -04:00
Shea Levy
bf7467cbb1 Add first attempt at linux/kernel/manual-config.
The goal of this function is to make it possible to build a kernel with a user provided .config.
As a secondary goal, it will extract NixOS-relevant features from the config automatically.
As a tertiary goal, the build will aim to be simpler than the current generic kernel builder.sh.

Unfortunately, that simplicity is offset by the complexity of the feature extraction, especially since nix segfaults when trying to split the file into lines (so an import from a derivation is used)
2012-07-29 01:23:51 -04:00