build-clfs (10066B)
1 #!/bin/bash 2 3 4 CONFIRM () { 5 read -p "Press enter to continue..." _ 6 } 7 8 9 echo "Please run this script as the root user!" 10 CONFIRM 11 12 13 ################################################################################ 14 ### 0) Parameters ############################################################## 15 ################################################################################ 16 export CLFS_HOSTNAME="raspi" 17 18 # arm 19 export CLFS_TARGET="arm-linux-musleabihf" 20 export CLFS_ARCH="arm" 21 export CLFS_DTS_LIST=("bcm2836-rpi-2-b.dtb" "bcm2837-rpi-3-b.dtb") 22 export CLFS_KERNEL="zImage" 23 export CLFS_GCC_ARCH="armv8-a+crc+crypto" 24 export CLFS_GCC_OPTS="--with-tune=cortex-a53 --with-float=hard --with-fpu=crypto-neon-fp-armv8" 25 26 # aarch64 27 #export CLFS_TARGET="aarch64-linux-musl" 28 #export CLFS_ARCH="arm64" 29 #export CLFS_DTS_LIST=("broadcom/bcm2837-rpi-3-b.dtb") 30 #export CLFS_KERNEL="Image" 31 #export CLFS_GCC_ARCH="armv8-a" 32 #export CLFS_GCC_OPTS="" 33 34 35 export CLFS_CFLAGS="-Os -pipe" 36 export CLFS_CXXFLAGS="-Os -pipe" 37 export CLFS_MAKEFLAGS="-j$(nproc)" 38 39 40 ################################################################################ 41 ### I) Preparation for the build ############################################### 42 ################################################################################ 43 export CLFS=/mnt/clfs 44 export CLFS_BOOTSCRIPTS=${CLFS}/bootscripts 45 export CLFS_CONFIGS=${CLFS}/configs 46 export CLFS_LOGS=${CLFS}/logs 47 export CLFS_SCRIPTS=${CLFS}/scripts 48 export CLFS_SOURCES=${CLFS}/sources 49 export CLFS_ROOT=${CLFS}/rootfs 50 export CLFS_BOOT_ROOT=${CLFS}/bootfs 51 export CLFS_CROSS_ROOT=${CLFS}/crossfs 52 export CLFS_CROSS_SYSROOT=${CLFS_CROSS_ROOT} # temporary assignment 53 54 55 mkdir -pv ${CLFS} 56 rm -rf ${CLFS_ROOT} ${CLFS_BOOT_ROOT} 57 chmod 777 ${CLFS} 58 59 mkdir -pv ${CLFS_BOOTSCRIPTS} ${CLFS_CONFIGS} ${CLFS_LOGS} ${CLFS_SCRIPTS} ${CLFS_SOURCES} 60 chmod -v a+wt ${CLFS_BOOTSCRIPTS} ${CLFS_CONFIGS} ${CLFS_LOGS} ${CLFS_SCRIPTS} ${CLFS_SOURCES} 61 62 63 FETCH_PKGS () { 64 rm -rf ${CLFS_SOURCES}/{md5sums,wget-list} 65 66 cp wget-list.src ${CLFS_SOURCES}/wget-list 67 cp md5sums.src ${CLFS_SOURCES}/md5sums 68 69 pushd ${CLFS_SOURCES} > /dev/null 70 wget --input-file=wget-list --continue 71 md5sum -c md5sums 72 popd > /dev/null 73 } 74 #FETCH_PKGS 75 76 77 ## Copying over scripts and additional config files 78 rm -rf ${CLFS_BOOTSCRIPTS}/* ${CLFS_CONFIGS}/* ${CLFS_SCRIPTS}/* 79 cp -rf bootscripts/* ${CLFS_BOOTSCRIPTS} 80 cp -rf configs/* ${CLFS_CONFIGS} 81 cp -rf scripts/* ${CLFS_SCRIPTS} 82 chmod +x ${CLFS_SCRIPTS}/* 83 84 85 ${CLFS_SCRIPTS}/host-check.sh 86 CONFIRM 87 88 89 ## Creating the CLFS build user 90 rm -rf /home/clfs 91 userdel clfs 92 93 groupadd clfs 94 useradd -s /bin/bash -g clfs -m -k /dev/null clfs 95 96 chown -Rv clfs:clfs ${CLFS} 97 98 mkdir -p /home/clfs 99 100 cat > /home/clfs/.bash_profile <<'EOF' 101 exec env -i HOME=${HOME} TERM=${TERM} PS1='\u:\w\$ ' /bin/bash 102 EOF 103 104 cat > /home/clfs/.bashrc <<'EOF' 105 set +h 106 umask 022 107 108 ## Extracts a package source archive, and runs the given callback function. 109 ## $1 : Package definition variable group name (i.e. GCC, LINUX, ZLIB) 110 ## $2 : Processing callback function, run in source directory after unzipping 111 ## $3 : Vanity package name 112 EXTRACT () { 113 local PKG_VAR_GROUP_NAME=$1 114 local PROCESS_FUNC=$2 115 local PKG_VANITY_NAME=${3:-${PKG_VAR_GROUP_NAME}} 116 117 local PKG_VER=${PKG_VAR_GROUP_NAME}_VER 118 local PKG_VER=${!PKG_VER} 119 local PKG_DIR=${PKG_VAR_GROUP_NAME}_DIR 120 local PKG_DIR=${!PKG_DIR} 121 local PKG_ARCHIVE=${PKG_VAR_GROUP_NAME}_ARCHIVE 122 local PKG_ARCHIVE=${!PKG_ARCHIVE} 123 124 echo "Extracting package ${PKG_VANITY_NAME} (ver. ${PKG_VER}) source: '${PKG_ARCHIVE}' -> '${PKG_DIR}'" 125 local OLD=$(pwd) 126 cd ${CLFS_SOURCES} 127 128 local STDOUT_LOG="${PKG_VANITY_NAME}.stdout.log" 129 local STDERR_LOG="${PKG_VANITY_NAME}.stderr.log" 130 131 echo " stdout will be logged to '${STDOUT_LOG}'; stderr will be logged to '${STDERR_LOG}'" 132 133 local TMP_OUT="${TMPDIR:-/tmp}/out.$$" 134 local TMP_ERR="${TMPDIR:-/tmp}/err.$$" 135 mkfifo "${TMP_OUT}" "${TMP_ERR}" 136 137 tar xf ${PKG_ARCHIVE} && cd ${PKG_DIR} && \ 138 $PROCESS_FUNC >"${TMP_OUT}" 2>"${TMP_ERR}" & \ 139 tee "${CLFS_LOGS}/${STDOUT_LOG}" < "${TMP_OUT}" & \ 140 tee "${CLFS_LOGS}/${STDERR_LOG}" < "${TMP_ERR}" && \ 141 echo "Successfully extracted and processed package ${PKG_VANITY_NAME}!" || \ 142 echo "Failed to extract or process package ${PKG_VANITY_NAME}!" 143 144 cd ${CLFS_SOURCES} 145 rm -rf ${PKG_DIR} 146 147 rm "${TMP_OUT}" "${TMP_ERR}" > /dev/null 148 cd $OLD 149 } 150 151 EOF 152 153 cat >> /home/clfs/.bashrc <<EOF 154 export CLFS=${CLFS} 155 export CLFS_BOOTSCRIPTS=${CLFS_BOOTSCRIPTS} 156 export CLFS_CONFIGS=${CLFS_CONFIGS} 157 export CLFS_LOGS=${CLFS_LOGS} 158 export CLFS_SCRIPTS=${CLFS_SCRIPTS} 159 export CLFS_SOURCES=${CLFS_SOURCES} 160 export CLFS_ROOT=${CLFS_ROOT} 161 export CLFS_BOOT_ROOT=${CLFS_BOOT_ROOT} 162 export CLFS_CROSS_ROOT=${CLFS_CROSS_ROOT} 163 164 export CLFS_HOSTNAME="${CLFS_HOSTNAME}" 165 export CLFS_TARGET="${CLFS_TARGET}" 166 export CLFS_ARCH="${CLFS_ARCH}" 167 export CLFS_DTS_LIST=(${CLFS_DTS_LIST[@]}) 168 export CLFS_KERNEL="${CLFS_KERNEL}" 169 export CLFS_GCC_ARCH="${CLFS_GCC_ARCH}" 170 export CLFS_GCC_OPTS="${CLFS_GCC_OPTS}" 171 172 export CFLAGS="${CLFS_CFLAGS}" 173 export CXXFLAGS="${CLFS_CXXFLAGS}" 174 export MAKEFLAGS="${CLFS_MAKEFLAGS}" 175 176 EOF 177 178 cat >> /home/clfs/.bashrc <<'EOF' 179 export CLFS_HOST="$(echo ${MACHTYPE} | sed "s/-[^-]*/-cross/")" 180 181 export CLFS_CROSS_SYSROOT=${CLFS_CROSS_ROOT}/${CLFS_TARGET} 182 183 LC_ALL=POSIX 184 PATH=${CLFS_CROSS_ROOT}/bin:/bin:/usr/bin 185 export LC_ALL PATH 186 187 EOF 188 189 chown -Rf clfs:clfs /home/clfs 190 191 192 su - clfs <<'CLFS_USER_EOF' 193 194 source ~/.bashrc 195 196 197 ################################################################################ 198 ### II) Setting package version variables ###################################### 199 ################################################################################ 200 ## Defines a package 201 ## $1 : The name of the package variable group (e.g. MUSL, LINUX, GCC) 202 ## $2 : The package source version 203 ## $3 : The package source archive compression (e.g. gz, bz2, xz) 204 ## $4 : The package source archive prefix 205 ## $5 : The package source directory prefix 206 DEFINE () { 207 local PKG_NAME=$1 208 local PKG_VER=$2 209 local PKG_COMPRESSION=$3 210 local PKG_ARCHIVE_PREFIX=$4 211 local PKG_DIR_PREFIX=$5 212 213 local PKG_DIR=${PKG_DIR_PREFIX}${PKG_VER} 214 local PKG_ARCHIVE=${PKG_ARCHIVE_PREFIX}${PKG_VER}.tar.${PKG_COMPRESSION} 215 216 [ -n "${PKG_VER}" ] && printf -v ${PKG_NAME}_VER ${PKG_VER} 217 printf -v ${PKG_NAME}_DIR ${PKG_DIR} 218 printf -v ${PKG_NAME}_ARCHIVE ${PKG_ARCHIVE} 219 220 export "${PKG_NAME}_VER" "${PKG_NAME}_DIR" "${PKG_NAME}_ARCHIVE" 221 } 222 223 224 ###### "NAME" "VERSION" "COMP" "ARCHIVE_PREFIX" "DIRECTORY_PREFIX" 225 #################################################################################################### 226 DEFINE "BINUTILS" "2.35.1" "xz" "binutils-" "binutils-" 227 DEFINE "BUSYBOX" "1.33.0" "bz2" "busybox-" "busybox-" 228 DEFINE "DROPBEAR" "2020.81" "bz2" "dropbear-" "dropbear-" 229 DEFINE "GCC" "10.2.0" "xz" "gcc-" "gcc-" 230 DEFINE "GMP" "6.2.1" "xz" "gmp-" "gmp-" 231 DEFINE "IANA_ETC" "20210106" "gz" "iana-etc-" "iana-etc-" 232 DEFINE "LIBRESSL" "3.3.1" "gz" "libressl-" "libressl-" 233 DEFINE "LINUX" "5.10.6" "xz" "linux-" "linux-" 234 DEFINE "MPC" "1.2.1" "gz" "mpc-" "mpc-" 235 DEFINE "MPFR" "4.1.0" "xz" "mpfr-" "mpfr-" 236 DEFINE "MUSL" "1.2.2" "gz" "musl-" "musl-" 237 DEFINE "UBOOT" "2020.10" "bz2" "u-boot-" "u-boot-" 238 DEFINE "WIRELESS_TOOLS" "29" "gz" "wireless_tools." "wireless_tools." 239 DEFINE "ZLIB" "1.2.11" "xz" "zlib-" "zlib-" 240 241 242 ################################################################################ 243 ### III) Preparation for the build ############################################# 244 ################################################################################ 245 ## Creating a FSH-compliant directory structure in CLFS_ROOT 246 mkdir -pv ${CLFS_ROOT}/{bin,boot,dev,etc,home,lib,media,mnt,opt,proc,root,run,sbin,srv,sys,tmp} 247 248 mkdir -pv ${CLFS_ROOT}/etc/{opt,} 249 mkdir -pv ${CLFS_ROOT}/lib/{modules,} 250 mkdir -pv ${CLFS_ROOT}/usr/{bin,include,lib,libexec,sbin,share,src} 251 mkdir -pv ${CLFS_ROOT}/usr/local/{bin,etc,games,include,lib,man,sbin,share,src} 252 mkdir -pv ${CLFS_ROOT}/usr/share/{man,misc} 253 mkdir -pv ${CLFS_ROOT}/var/{cache,lib,local,lock,log,mail,opt,spool,tmp} 254 255 ln -fsv ../proc/mounts ${CLFS_ROOT}/etc/mtab 256 ln -fsv ../run ${CLFS_ROOT}/var/run 257 ln -fsv ../mail ${CLFS_ROOT}/var/spool/mail 258 259 chmod 0750 ${CLFS_ROOT}/root 260 chmod 1777 ${CLFS_ROOT}/{var/,}tmp 261 262 263 ## Ensuring that ${CLFS_ROOT}, ${CLFS_BOOT_ROOT}, and ${CLFS_CROSS_(SYS)ROOT} exist 264 mkdir -pv ${CLFS_ROOT} ${CLFS_BOOT_ROOT} ${CLFS_CROSS_SYSROOT} 265 #### this allows us to treat ${CLFS_CROSS_SYSROOT} and ${CLFS_CROSS_SYSROOT}/usr identically 266 ln -fsv . ${CLFS_CROSS_SYSROOT}/usr 267 268 269 cd ${CLFS_SOURCES} 270 271 272 ################################################################################ 273 ### IV) Building the cross-compilation toolchain ############################### 274 ################################################################################ 275 ${CLFS_SCRIPTS}/build-cross-toolchain.sh 276 277 source ~/.bashrc 278 279 280 ################################################################################ 281 ### V) Building and installing system packages ################################# 282 ################################################################################ 283 ${CLFS_SCRIPTS}/build-base-packages.sh 284 ${CLFS_SCRIPTS}/build-core-packages.sh 285 #${CLFS_SCRIPTS}/build-extra-packages.sh 286 287 source ~/.bashrc 288 289 CLFS_USER_EOF 290 291 ################################################################################ 292 ### VII) Cleanup and packaging of finished system ############################## 293 ################################################################################ 294 chown -R root:root ${CLFS_ROOT} ${CLFS_BOOT_ROOT} 295 chgrp 13 ${CLFS_ROOT}/var/log/lastlog 296 297 BUILD_SUFFIX="$(date +'%Y%m%d')" 298 299 cd ${CLFS_ROOT} 300 tar cfj ${CLFS}/clfs-rootfs-${BUILD_SUFFIX}.tar.xz * 301 echo "Packaged CLFS rootfs: ${CLFS}/clfs-rootfs-${BUILD_SUFFIX}.tar.xz" 302 echo "Unpack with 'tar -pxf ${CLFS}/clfs-rootfs-${BUILD_SUFFIX}.tar.xz'" 303 304 cd ${CLFS_BOOT_ROOT} 305 tar cfj ${CLFS}/clfs-bootfs-${BUILD_SUFFIX}.tar.xz * 306 echo "Packaged CLFS bootfs: ${CLFS}/clfs-bootfs-${BUILD_SUFFIX}.tar.xz" 307 echo "Unpack with 'tar -pxf ${CLFS}/clfs-bootfs-${BUILD_SUFFIX}.tar.xz'" 308 309 chown -R clfs:clfs $CLFS_ROOT $CLFS_BOOT_ROOT 310 311 echo "Finished and packaged CLFS system!" 312