aboutsummaryrefslogtreecommitdiff
path: root/build-kernel
blob: c7137b1383e721160b46038ed7d87c76f56f8977 (plain)
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
#!/bin/bash

set -e

if [[ -f ${HOME}/.randomscripts.rc ]]; then
    source ${HOME}/.randomscripts.rc
else
    TOP=${TOP:-"${HOME}/random-scripts-artifacts"}
fi
mkdir -p ${TOP}

NUM_CPUS=${NUM_CPUS:-"$(getconf _NPROCESSORS_ONLN)"}
FIT_NAME="kernel kernel_dtb"

KDIR=${KDIR:-$(pwd)}

clean_build=0
build_deb_packages=0
#ARCH=arm64
git_describe=$(git describe --long)
KERNEL_VERSION="linux-mainline"

usage() {
    echo -e "$0's help text"
    echo -e "   -a ARCH, specify the architecture to build, default: arm64"
    echo -e "   -c, cleanup output and staging dir before building, default: 0"
    echo -e "   -d CONFIG_URL, specify a url to a config file,"
    echo -e "      default: ${CONFIG_URL}"
    echo -e "   -k KERNEL_VERSION, kernel version that you want to build, default: linux-mainline"
    echo -e "      KERNEL_VERSION's to choose from:"
    echo -e "          linux-mainline,"
    echo -e "          linux-next,"
    echo -e "          linux-stable-4.14,"
    echo -e "          ..."
    echo -e "   -i defconfig, defconfig to build in the src tree"
    echo -e "   -m MACHINE, add machine name"
    echo -e "   -p, build deb packages"
    echo -e "   -h, prints out this help"
}

while getopts "a:cd:hk:i:m:p" arg; do
    case $arg in
        a)
            ARCH="$OPTARG"
            ;;
        c)
            clean_build=1
            ;;
        d)
            CONFIG_URL="$OPTARG"
            ;;
        k)
            KERNEL_VERSION="$OPTARG"
            ;;
        i)
            DEFCONFIG_FILENAME="$OPTARG"
            ;;
        m)
            MACHINE="$OPTARG"
            ;;
        p)
            build_deb_packages=1
            ;;
        h|*)
            usage
            exit 0
            ;;
    esac
done

case ${MACHINE} in
    am57xx-evm)
        ARCH=arm
        CONFIG_URL=${CONFIG_URL:-"http://snapshots.linaro.org/openembedded/lkft/morty/${MACHINE}/rpb/${KERNEL_VERSION}/latest/config"}
        image_name=zImage
        dtb_name="am57xx-beagle-x15"
        ;;
    hikey)
        ARCH=arm64
        CONFIG_URL=${CONFIG_URL:-"http://snapshots.linaro.org/openembedded/lkft/morty/${MACHINE}/rpb/${KERNEL_VERSION}/latest/config"}
        image_name=Image
        dtb_name="hi6220-hikey"
        ;;
    *)
        usage
        exit 1
        ;;
esac

OUTPUT=${OUTPUT:-"${TOP}/build_output/${ARCH}/${git_describe}"}
STAGING=${STAGING:-"${TOP}/staging/${ARCH}/${git_describe}"}

if [ $(grep -c "^WHAT IS LINUX" README) -ne 1 ] &&
    [  $(grep -c "^Linux kernel" README) -ne 1 ]; then
    echo -e "ERROR: Need to run this script $(basename $0),"
    echo -e "  from a kernel repository"
    echo ""
    usage
    exit 1
fi

case $ARCH in
    arm)
        CROSS_COMPILE=${CROSS_COMPILE:-arm-linux-gnueabihf-}
        ;;
    arm64)
        CROSS_COMPILE=${CROSS_COMPILE:-aarch64-linux-gnu-}
        ;;

    *)
esac

if [[ $clean_build -eq 1 ]]; then
    echo "Cleaning up output and staging dir before building!"
    rm -rf ${OUTPUT}
    rm -rf ${STAGING}
fi

if [[ -z ${DEFCONFIG_FILENAME} ]]; then
    curl -sSL -o .config ${CONFIG_URL}
    yes '' |make -j ${NUM_CPUS} CROSS_COMPILE=${CROSS_COMPILE} ARCH=${ARCH} KDIR=${KDIR} O=${OUTPUT} oldconfig
    rm .config
else
    make -j ${NUM_CPUS} CROSS_COMPILE=${CROSS_COMPILE} ARCH=${ARCH} KDIR=${KDIR} O=${OUTPUT} ${DEFCONFIG_FILENAME}
fi

make -j ${NUM_CPUS} CROSS_COMPILE=${CROSS_COMPILE} ARCH=${ARCH} KDIR=${KDIR} O=${OUTPUT}
if [[ -d arch/${ARCH}/boot/dts ]]; then
    make -j ${NUM_CPUS} CROSS_COMPILE=${CROSS_COMPILE} ARCH=${ARCH} KDIR=${KDIR} O=${OUTPUT} INSTALL_DTBS_PATH=${STAGING}/dtbs dtbs_install
    for file in $(find ${STAGING}/dtbs -type f -name '*.dtb') ; do
        if [[ ! $(basename ${file}) =~ ${git_describe}.dtb ]]; then
            new_file=$(printf '%s\n' "${file%.dtb}-${git_describe}.dtb");
            mv ${file} ${new_file}
        fi
    done
fi
if [[ $(grep CONFIG_MODULES=y ${OUTPUT}/.config) ]]; then
    make -j ${NUM_CPUS} CROSS_COMPILE=${CROSS_COMPILE} ARCH=${ARCH} KDIR=${KDIR} O=${OUTPUT} INSTALL_MOD_PATH=${STAGING} modules_install
    pushd ${STAGING}
    tar -zcf modules-$(basename ${STAGING}).tar.gz lib/
    popd
fi

cp -f ${OUTPUT}/.config ${STAGING}/kernel-${git_describe}.config
make -j ${NUM_CPUS} CROSS_COMPILE=${CROSS_COMPILE} ARCH=${ARCH} KDIR=${KDIR} O=${OUTPUT} Image
cp -f ${OUTPUT}/arch/${ARCH}/boot/${image_name} ${STAGING}/${image_name}-${git_describe}
cp -f $(find ${STAGING} -type f -name "*${dtb_name}-${git_describe}.dtb") ${STAGING}/

if [[ $build_deb_packages -eq 1 ]]; then
    make -j ${NUM_CPUS} CROSS_COMPILE=${CROSS_COMPILE} ARCH=${ARCH} KDIR=${KDIR} O=${OUTPUT} bindeb-pkg
    mv -f ${OUTPUT}/../*$(basename ${OUTPUT} |awk -F'-' '{print $1-$2}')*.* ${STAGING}
fi
## vim: set sw=4 sts=4 et foldmethod=syntax : ##