clfs-bootstrap

clfs-bootstrap.git
git clone git://git.lenczewski.org/clfs-bootstrap.git
Log | Files | Refs | README | LICENSE

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