summary refs log tree commit diff
path: root/pkgs/os-specific/linux/kernel/builder.sh
blob: 14d8108ba16b961444691f28e4a227771f9a6cbc (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
source $stdenv/setup


makeFlags="ARCH=$arch SHELL=/bin/sh"
if [ -n "$crossConfig" ]; then
  makeFlags="$makeFlags CROSS_COMPILE=$crossConfig-"
fi

postPatch() {
    # Makefiles are full of /bin/pwd, /bin/false, /bin/bash, etc.
    # Patch these away, assuming the tools are in $PATH.
    for mf in $(find -name Makefile); do
	echo "stripping FHS paths in \`$mf'..."
	sed -i "$mf" -e 's|/usr/bin/||g ; s|/bin/||g'
    done
}

configurePhase() {
    if test -n "$preConfigure"; then
        eval "$preConfigure";
    fi

    export INSTALL_PATH=$out
    export INSTALL_MOD_PATH=$out


    # Set our own localversion, if specified.
    rm -f localversion*
    if test -n "$localVersion"; then
        echo "$localVersion" > localversion-nix
    fi


    # Patch kconfig to print "###" after every question so that
    # generate-config.pl can answer them.
    sed -e '/fflush(stdout);/i\printf("###");' -i scripts/kconfig/conf.c

    # Get a basic config file for later refinement with $generateConfig.
    make $kernelBaseConfig ARCH=$arch

    # Create the config file.
    echo "generating kernel configuration..."
    echo "$kernelConfig" > kernel-config
    DEBUG=1 ARCH=$arch KERNEL_CONFIG=kernel-config AUTO_MODULES=$autoModules \
        perl -w $generateConfig
}


installPhase() {

    mkdir -p $out

    # New kernel versions have a combined tree for i386 and x86_64.
    archDir=$arch
    if test -e arch/x86 -a \( "$arch" = i386 -o "$arch" = x86_64 \); then
        archDir=x86
    fi


    # Copy the bzImage and System.map.
    cp System.map $out
    if test "$arch" = um; then
        mkdir -p $out/bin
        cp linux $out/bin
    elif test "$kernelTarget" != "vmlinux"; then
        # In any case we copy the 'vmlinux' ELF in the next lines
        cp arch/$archDir/boot/$kernelTarget $out
    fi

    cp vmlinux $out

    if grep -q "CONFIG_MODULES=y" .config; then
        # Install the modules in $out/lib/modules with matching paths
        # in modules.dep (i.e., refererring to $out/lib/modules, not
        # /lib/modules).  The depmod_opts= is to prevent the kernel
        # from passing `-b PATH' to depmod.
        export MODULE_DIR=$out/lib/modules/
        substituteInPlace Makefile --replace '-b $(INSTALL_MOD_PATH)' ''
        make modules_install \
            DEPMOD=$module_init_tools/sbin/depmod depmod_opts= \
            $makeFlags "${makeFlagsArray[@]}" \
            $installFlags "${installFlagsArray[@]}"

        if test -z "$dontStrip"; then
            # Strip the kernel modules.
        echo "Stripping kernel modules..."
        if [ -z "$crossConfig" ]; then
                find $out -name "*.ko" -print0 | xargs -0 strip -S
        else
                find $out -name "*.ko" -print0 | xargs -0 $crossConfig-strip -S
        fi
        fi

        # move this to install later on
        # largely copied from early FC3 kernel spec files
        version=$(cd $out/lib/modules && ls -d *)

        # remove symlinks and create directories
        rm -f $out/lib/modules/$version/build
        rm -f $out/lib/modules/$version/source
        mkdir $out/lib/modules/$version/build

        # copy config
        cp .config $out/lib/modules/$version/build/.config
        ln -s $out/lib/modules/$version/build/.config $out/config

        if test "$arch" != um; then
            # copy all Makefiles and Kconfig files
            ln -s $out/lib/modules/$version/build $out/lib/modules/$version/source
            cp --parents `find  -type f -name Makefile -o -name "Kconfig*"` $out/lib/modules/$version/build
            cp Module.symvers $out/lib/modules/$version/build

        if test "$dontStrip" = "1"; then
            # copy any debugging info that can be found
            cp --parents -rv `find -name \*.debug -o -name debug.a`	\
               "$out/lib/modules/$version/build"
        fi

            # weed out unneeded stuff
            rm -rf $out/lib/modules/$version/build/Documentation
            rm -rf $out/lib/modules/$version/build/scripts
            rm -rf $out/lib/modules/$version/build/include

            # copy architecture dependent files
            cp -a arch/$archDir/scripts $out/lib/modules/$version/build/ || true
            cp -a arch/$archDir/*lds $out/lib/modules/$version/build/ || true
            cp -a arch/$archDir/Makefile*.cpu $out/lib/modules/$version/build/arch/$archDir/ || true
            cp -a --parents arch/$archDir/kernel/asm-offsets.s $out/lib/modules/$version/build/arch/$archDir/kernel/ || true

            # copy scripts
            rm -f scripts/*.o
            rm -f scripts/*/*.o
            cp -a scripts $out/lib/modules/$version/build

            # copy include files
            includeDir=$out/lib/modules/$version/build/include
            mkdir -p $includeDir
            (cd include && cp -a * $includeDir)
        (cd arch/$archDir/include && cp -a * $includeDir || true)
        (cd arch/$archDir/include && cp -a asm/* $includeDir/asm/ || true)
        (cd arch/$archDir/include && cp -a generated/asm/* $includeDir/asm/ || true)
        (cd arch/$archDir/include/asm/mach-generic && cp -a * $includeDir/ || true)
            # include files for special arm architectures 
            if [ "$archDir" == "arm" ]; then
                cp -a --parents arch/arm/mach-*/include $out/lib/modules/$version/build
            fi
        fi
    fi

    if test -n "$postInstall"; then
        eval "$postInstall";
    fi
}


genericBuild