]> git.ipfire.org Git - ipfire-2.x.git/blame - make.sh
make.sh: Set parallelism to number of CPU cores
[ipfire-2.x.git] / make.sh
CommitLineData
df5e82b3 1#!/bin/bash
df5e82b3
MT
2############################################################################
3# #
f8e5510c 4# This file is part of the IPFire Firewall. #
df5e82b3 5# #
f8e5510c 6# IPFire is free software; you can redistribute it and/or modify #
df5e82b3
MT
7# it under the terms of the GNU General Public License as published by #
8# the Free Software Foundation; either version 2 of the License, or #
9# (at your option) any later version. #
10# #
f8e5510c 11# IPFire is distributed in the hope that it will be useful, #
df5e82b3
MT
12# but WITHOUT ANY WARRANTY; without even the implied warranty of #
13# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the #
14# GNU General Public License for more details. #
15# #
16# You should have received a copy of the GNU General Public License #
f8e5510c 17# along with IPFire; if not, write to the Free Software #
df5e82b3
MT
18# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA #
19# #
06fc566a 20# Copyright (C) 2007-2020 IPFire Team <info@ipfire.org>. #
df5e82b3
MT
21# #
22############################################################################
df5e82b3
MT
23#
24
e8ee3199
AF
25NAME="IPFire" # Software name
26SNAME="ipfire" # Short name
d12e3fcd 27# If you update the version don't forget to update backupiso and add it to core update
2f767b7b 28VERSION="2.25" # Version number
b4d83d1a 29CORE="158" # Core Level (Filename)
e8ee3199
AF
30SLOGAN="www.ipfire.org" # Software slogan
31CONFIG_ROOT=/var/ipfire # Configuration rootdir
e8ee3199 32MAX_RETRIES=1 # prefetch/check loop
305a7b38 33BUILD_IMAGES=1 # Flash and Xen Downloader
15679d9f 34KVER=`grep --max-count=1 VER lfs/linux | awk '{ print $3 }'`
36e2e992
MT
35
36# Information from Git
37GIT_BRANCH="$(git rev-parse --abbrev-ref HEAD)" # Git Branch
38GIT_TAG="$(git tag | tail -1)" # Git Tag
39GIT_LASTCOMMIT="$(git rev-parse --verify HEAD)" # Last commit
628e8c3a 40
0b54fdfe 41TOOLCHAINVER=20210202
03ad5f93 42
d66e6fa8
MT
43ZSTD_OPT=(
44 # Compress in parallel using all processor cores
45 -T0
46
47 # Compress as best as we can
48 --ultra -22
49)
50
69a6ec55
MT
51###############################################################################
52#
53# Beautifying variables & presentation & input output interface
54#
55###############################################################################
56
f9783277
MT
57# Remember if the shell is interactive or not
58if [ -t 0 ] && [ -t 1 ]; then
59 INTERACTIVE=true
60else
61 INTERACTIVE=false
62fi
63
401a1edc
MT
64# Sets or adjusts pretty formatting variables
65resize_terminal() {
66 ## Screen Dimentions
67 # Find current screen size
68 COLUMNS=$(tput cols)
69
70 # When using remote connections, such as a serial port, stty size returns 0
71 if ! ${INTERACTIVE} || [ "${COLUMNS}" = "0" ]; then
72 COLUMNS=80
73 fi
69a6ec55 74
401a1edc
MT
75 # Measurements for positioning result messages
76 OPTIONS_WIDTH=20
77 TIME_WIDTH=12
78 STATUS_WIDTH=8
79 NAME_WIDTH=$(( COLUMNS - OPTIONS_WIDTH - TIME_WIDTH - STATUS_WIDTH ))
80 LINE_WIDTH=$(( COLUMNS - STATUS_WIDTH ))
81
e9a57acd
MT
82 TIME_COL=$(( NAME_WIDTH + OPTIONS_WIDTH ))
83 STATUS_COL=$(( TIME_COL + TIME_WIDTH ))
401a1edc 84}
69a6ec55 85
401a1edc
MT
86# Initially setup terminal
87resize_terminal
f9783277 88
401a1edc
MT
89# Call resize_terminal when terminal is being resized
90trap "resize_terminal" WINCH
69a6ec55
MT
91
92# Define color for messages
93BOLD="\\033[1;39m"
94DONE="\\033[1;32m"
95SKIP="\\033[1;34m"
96WARN="\\033[1;35m"
97FAIL="\\033[1;31m"
98NORMAL="\\033[0;39m"
99
bcb9dc13 100# New architecture variables
dc7d6b20 101HOST_ARCH="$(uname -m)"
94571564 102
69a6ec55
MT
103PWD=$(pwd)
104BASENAME=$(basename $0)
105
15679d9f
MT
106# Debian specific settings
107if [ ! -e /etc/debian_version ]; then
df5e82b3 108 FULLPATH=`which $0`
15679d9f 109else
df5e82b3
MT
110 if [ -x /usr/bin/realpath ]; then
111 FULLPATH=`/usr/bin/realpath $0`
112 else
113 echo "ERROR: Need to do apt-get install realpath"
114 exit 1
115 fi
15679d9f 116fi
df5e82b3 117
69a6ec55 118# This is the directory where make.sh is in
aecbe123 119export BASEDIR=$(echo $FULLPATH | sed "s/\/$BASENAME//g")
69a6ec55 120
ebaecf2c
AF
121LOGFILE=$BASEDIR/log/_build.preparation.log
122export LOGFILE
15679d9f 123DIR_CHK=$BASEDIR/cache/check
ebaecf2c 124mkdir $BASEDIR/log/ 2>/dev/null
df5e82b3 125
69a6ec55
MT
126system_processors() {
127 getconf _NPROCESSORS_ONLN 2>/dev/null || echo "1"
128}
129
130system_memory() {
131 local key val unit
132
133 while read -r key val unit; do
134 case "${key}" in
135 MemTotal:*)
136 # Convert to MB
137 echo "$(( ${val} / 1024 ))"
138 break
139 ;;
140 esac
141 done < /proc/meminfo
142}
143
144configure_build() {
145 local build_arch="${1}"
146
147 if [ "${build_arch}" = "default" ]; then
148 build_arch="$(configure_build_guess)"
149 fi
150
151 case "${build_arch}" in
152 x86_64)
153 BUILDTARGET="${build_arch}-unknown-linux-gnu"
154 CROSSTARGET="${build_arch}-cross-linux-gnu"
155 BUILD_PLATFORM="x86"
5eec0f21 156 CFLAGS_ARCH="-m64 -mtune=generic -fstack-clash-protection -fcf-protection"
69a6ec55
MT
157 ;;
158
159 i586)
160 BUILDTARGET="${build_arch}-pc-linux-gnu"
161 CROSSTARGET="${build_arch}-cross-linux-gnu"
162 BUILD_PLATFORM="x86"
cf58f659 163 CFLAGS_ARCH="-march=i586 -mtune=generic -fomit-frame-pointer"
69a6ec55
MT
164 ;;
165
166 aarch64)
167 BUILDTARGET="${build_arch}-unknown-linux-gnu"
168 CROSSTARGET="${build_arch}-cross-linux-gnu"
169 BUILD_PLATFORM="arm"
87f3b1e5 170 CFLAGS_ARCH="-fstack-clash-protection"
69a6ec55
MT
171 ;;
172
173 armv7hl)
174 BUILDTARGET="${build_arch}-unknown-linux-gnueabi"
175 CROSSTARGET="${build_arch}-cross-linux-gnueabi"
176 BUILD_PLATFORM="arm"
177 CFLAGS_ARCH="-march=armv7-a -mfpu=vfpv3-d16 -mfloat-abi=hard"
178 ;;
179
aafdd71b 180 armv6l)
69a6ec55
MT
181 BUILDTARGET="${build_arch}-unknown-linux-gnueabi"
182 CROSSTARGET="${build_arch}-cross-linux-gnueabi"
183 BUILD_PLATFORM="arm"
aafdd71b
AF
184 CFLAGS_ARCH="-march=armv6 -mfpu=vfp -mfloat-abi=softfp -fomit-frame-pointer"
185 #RUSTFLAGS="-Ccodegen-units=1"
69a6ec55
MT
186 ;;
187
161eb15d
MT
188 riscv64)
189 BUILDTARGET="${build_arch}-unknown-linux-gnu"
190 CROSSTARGET="${build_arch}-cross-linux-gnu"
191 BUILD_PLATFORM="riscv"
0c304b7b 192 CFLAGS_ARCH="-fstack-clash-protection"
161eb15d
MT
193 ;;
194
69a6ec55
MT
195 *)
196 exiterror "Cannot build for architure ${build_arch}"
197 ;;
198 esac
199
200 # Check if the QEMU helper is available if needed.
201 if qemu_is_required "${build_arch}"; then
202 local qemu_build_helper="$(qemu_find_build_helper_name "${build_arch}")"
203
204 if [ -n "${qemu_build_helper}" ]; then
205 QEMU_TARGET_HELPER="${qemu_build_helper}"
206 else
207 exiterror "Could not find a binfmt_misc helper entry for ${build_arch}"
208 fi
209 fi
210
211 BUILD_ARCH="${build_arch}"
212 TOOLS_DIR="/tools_${BUILD_ARCH}"
213
214 # Enables hardening
54114eb0 215 HARDENING_CFLAGS="-Wp,-D_FORTIFY_SOURCE=2 -Wp,-D_GLIBCXX_ASSERTIONS -fstack-protector-strong"
69a6ec55
MT
216
217 CFLAGS="-O2 -pipe -Wall -fexceptions -fPIC ${CFLAGS_ARCH}"
218 CXXFLAGS="${CFLAGS}"
219
220 # Determine parallelism
eeee108f 221 # We assume that each process consumes about
297473d5 222 # 128MB of memory. Therefore we find out how
eeee108f 223 # many processes fit into memory.
297473d5 224 local mem_max=$(( ${SYSTEM_MEMORY} / 128 ))
72c39057 225 local cpu_max=$(( ${SYSTEM_PROCESSORS} ))
eeee108f
MT
226
227 local parallelism
228 if [ ${mem_max} -lt ${cpu_max} ]; then
229 parallelism=${mem_max}
230 else
231 parallelism=${cpu_max}
69a6ec55 232 fi
212f17c1 233
eeee108f
MT
234 # Use this as default PARALLELISM
235 DEFAULT_PARALLELISM="${parallelism}"
236
e1616eb4
SS
237 # Limit lauched ninja build jobs to computed parallel value.
238 NINJAJOBS="${parallelism}"
239
212f17c1
MT
240 # Compression parameters
241 # We use mode 8 for reasonable memory usage when decompressing
242 # but with overall good compression
243 XZ_OPT="-8"
244
245 # We try to use as many cores as possible
246 XZ_OPT="${XZ_OPT} -T0"
247
248 # We need to limit memory because XZ uses too much when running
249 # in parallel and it isn't very smart in limiting itself.
250 # We allow XZ to use up to 70% of all system memory.
deffc275 251 local xz_memory=$(( SYSTEM_MEMORY * 7 / 10 ))
212f17c1
MT
252
253 # XZ memory cannot be larger than 2GB on 32 bit systems
254 case "${build_arch}" in
255 i*86|armv*)
256 if [ ${xz_memory} -gt 2048 ]; then
257 xz_memory=2048
258 fi
259 ;;
260 esac
261
262 XZ_OPT="${XZ_OPT} --memory=${xz_memory}MiB"
69a6ec55
MT
263}
264
265configure_build_guess() {
266 case "${HOST_ARCH}" in
87487585
MT
267 x86_64)
268 echo "x86_64"
269 ;;
270 i?86)
69a6ec55
MT
271 echo "i586"
272 ;;
273
274 aarch64)
275 echo "aarch64"
276 ;;
277
aafdd71b
AF
278 armv7*|armv6*)
279 echo "armv6l"
69a6ec55
MT
280 ;;
281
161eb15d
MT
282 riscv64)
283 echo "riscv64"
284 ;;
285
69a6ec55
MT
286 *)
287 exiterror "Cannot guess build architecture"
288 ;;
289 esac
290}
291
f9783277
MT
292stdumount() {
293 umount $BASEDIR/build/sys 2>/dev/null;
294 umount $BASEDIR/build/dev/shm 2>/dev/null;
295 umount $BASEDIR/build/dev/pts 2>/dev/null;
296 umount $BASEDIR/build/dev 2>/dev/null;
297 umount $BASEDIR/build/proc 2>/dev/null;
298 umount $BASEDIR/build/install/mnt 2>/dev/null;
299 umount $BASEDIR/build/usr/src/cache 2>/dev/null;
300 umount $BASEDIR/build/usr/src/ccache 2>/dev/null;
301 umount $BASEDIR/build/usr/src/config 2>/dev/null;
302 umount $BASEDIR/build/usr/src/doc 2>/dev/null;
303 umount $BASEDIR/build/usr/src/html 2>/dev/null;
304 umount $BASEDIR/build/usr/src/langs 2>/dev/null;
305 umount $BASEDIR/build/usr/src/lfs 2>/dev/null;
ebaecf2c 306 umount $BASEDIR/build/usr/src/log 2>/dev/null;
f9783277 307 umount $BASEDIR/build/usr/src/src 2>/dev/null;
7c984de6 308 umount $BASEDIR/build/usr/src 2>/dev/null;
cb658c8c 309 umount $BASEDIR/build/tmp 2>/dev/null;
f9783277
MT
310}
311
312now() {
313 date -u "+%s"
69a6ec55
MT
314}
315
f9783277
MT
316format_runtime() {
317 local seconds=${1}
318
319 if [ ${seconds} -ge 3600 ]; then
320 printf "%d:%02d:%02d\n" \
321 "$(( seconds / 3600 ))" \
322 "$(( seconds % 3600 / 60 ))" \
323 "$(( seconds % 3600 % 60 ))"
324 elif [ ${seconds} -ge 60 ]; then
325 printf "%d:%02d\n" \
326 "$(( seconds / 60 ))" \
327 "$(( seconds % 60 ))"
69a6ec55 328 else
f9783277 329 printf "%d\n" "${seconds}"
69a6ec55 330 fi
f9783277 331}
69a6ec55 332
f9783277
MT
333print_line() {
334 local line="$@"
69a6ec55 335
f9783277 336 printf "%-${LINE_WIDTH}s" "${line}"
69a6ec55
MT
337}
338
f9783277
MT
339_print_line() {
340 local status="${1}"
341 shift
69a6ec55 342
f9783277
MT
343 if ${INTERACTIVE}; then
344 printf "${!status}"
345 fi
69a6ec55 346
f9783277
MT
347 print_line "$@"
348
349 if ${INTERACTIVE}; then
350 printf "${NORMAL}"
351 fi
352}
353
354print_headline() {
355 _print_line BOLD "$@"
69a6ec55
MT
356}
357
f9783277
MT
358print_error() {
359 _print_line FAIL "$@"
360}
361
362print_package() {
363 local name="${1}"
364 shift
69a6ec55 365
f9783277
MT
366 local version="$(grep -E "^VER |^VER=|^VER " $BASEDIR/lfs/${name} | awk '{ print $3 }')"
367 local options="$@"
368
369 local string="${name}"
370 if [ -n "${version}" ] && [ "${version}" != "ipfire" ]; then
371 string="${string} (${version})"
372 fi
373
374 printf "%-$(( ${NAME_WIDTH} - 1 ))s " "${string}"
fa8c758e 375 printf "%$(( ${OPTIONS_WIDTH} - 1 ))s " "${options}"
f9783277
MT
376}
377
378print_runtime() {
379 local runtime=$(format_runtime $@)
380
381 if ${INTERACTIVE}; then
382 printf "\\033[${TIME_COL}G[ ${BOLD}%$(( ${TIME_WIDTH} - 4 ))s${NORMAL} ]" "${runtime}"
383 else
384 printf "[ %$(( ${TIME_WIDTH} - 4 ))s ]" "${runtime}"
69a6ec55 385 fi
f9783277
MT
386}
387
388print_status() {
389 local status="${1}"
390
391 local color="${!status}"
392
393 if ${INTERACTIVE}; then
394 printf "\\033[${STATUS_COL}G[${color-${BOLD}} %-$(( ${STATUS_WIDTH} - 4 ))s ${NORMAL}]\n" "${status}"
395 else
396 printf "[ %-$(( ${STATUS_WIDTH} - 4 ))s ]\n" "${status}"
69a6ec55 397 fi
f9783277 398}
69a6ec55 399
f9783277
MT
400print_build_stage() {
401 print_headline "$@"
402
403 # end line
404 printf "\n"
69a6ec55
MT
405}
406
f9783277
MT
407print_build_summary() {
408 local runtime=$(format_runtime $@)
409
410 print_line "*** Build finished in ${runtime}"
411 print_status DONE
69a6ec55
MT
412}
413
414exiterror() {
415 stdumount
416 for i in `seq 0 7`; do
417 if ( losetup /dev/loop${i} 2>/dev/null | grep -q "/install/images" ); then
418 losetup -d /dev/loop${i} 2>/dev/null
419 fi;
420 done
421
f9783277 422 # Dump logfile
66028310 423 if [ -n "${LOGFILE}" ] && [ -e "${LOGFILE}" ]; then
69a6ec55
MT
424 echo # empty line
425
426 local line
427 while read -r line; do
428 echo " ${line}"
429 done <<< "$(tail -n30 ${LOGFILE})"
430 fi
431
f9783277
MT
432 echo # empty line
433
434 local line
435 for line in "ERROR: $@" " Check ${LOGFILE} for errors if applicable"; do
436 print_error "${line}"
437 print_status FAIL
438 done
439
69a6ec55
MT
440 exit 1
441}
442
aecbe123
MT
443prepareenv() {
444 # Are we running the right shell?
54328605 445 if [ -z "${BASH}" ]; then
aecbe123
MT
446 exiterror "BASH environment variable is not set. You're probably running the wrong shell."
447 fi
448
449 if [ -z "${BASH_VERSION}" ]; then
450 exiterror "Not running BASH shell."
451 fi
452
453 # Trap on emergency exit
454 trap "exiterror 'Build process interrupted'" SIGINT SIGTERM SIGKILL SIGSTOP SIGQUIT
455
aecbe123 456 # Checking if running as root user
658232a6 457 if [ $(id -u) -ne 0 ]; then
df7f30a1 458 exiterror "root privileges required for building"
aecbe123
MT
459 fi
460
461 # Checking for necessary temporary space
f9783277 462 print_line "Checking for necessary space on disk $BASE_DEV"
aecbe123
MT
463 BASE_DEV=`df -P -k $BASEDIR | tail -n 1 | awk '{ print $1 }'`
464 BASE_ASPACE=`df -P -k $BASEDIR | tail -n 1 | awk '{ print $4 }'`
465 if (( 2048000 > $BASE_ASPACE )); then
466 BASE_USPACE=`du -skx $BASEDIR | awk '{print $1}'`
467 if (( 2048000 - $BASE_USPACE > $BASE_ASPACE )); then
f9783277 468 print_status FAIL
aecbe123
MT
469 exiterror "Not enough temporary space available, need at least 2GB on $BASE_DEV"
470 fi
471 else
f9783277 472 print_status DONE
aecbe123
MT
473 fi
474
475 # Set umask
476 umask 022
477
478 # Set LFS Directory
479 LFS=$BASEDIR/build
480
aecbe123
MT
481 # Setup environment
482 set +h
483 LC_ALL=POSIX
e1616eb4 484 export LFS LC_ALL CFLAGS CXXFLAGS DEFAULT_PARALLELISM RUSTFLAGS NINJAJOBS
aecbe123
MT
485 unset CC CXX CPP LD_LIBRARY_PATH LD_PRELOAD
486
487 # Make some extra directories
488 mkdir -p "${BASEDIR}/build${TOOLS_DIR}" 2>/dev/null
489 mkdir -p $BASEDIR/build/{etc,usr/src} 2>/dev/null
490 mkdir -p $BASEDIR/build/{dev/{shm,pts},proc,sys}
380aa6e5 491 mkdir -p $BASEDIR/{cache,ccache/${BUILD_ARCH}/${TOOLCHAINVER}} 2>/dev/null
7c984de6
MT
492
493 if [ "${ENABLE_RAMDISK}" = "on" ]; then
494 mkdir -p $BASEDIR/build/usr/src
815ca15d 495 mount -t tmpfs tmpfs -o size=8G,nr_inodes=1M,mode=1777 $BASEDIR/build/usr/src
ad853b56
MT
496
497 mkdir -p ${BASEDIR}/build/tmp
498 mount -t tmpfs tmpfs -o size=4G,nr_inodes=1M,mode=1777 ${BASEDIR}/build/tmp
7c984de6
MT
499 fi
500
ebaecf2c 501 mkdir -p $BASEDIR/build/usr/src/{cache,config,doc,html,langs,lfs,log,src,ccache}
aecbe123
MT
502
503 mknod -m 600 $BASEDIR/build/dev/console c 5 1 2>/dev/null
504 mknod -m 666 $BASEDIR/build/dev/null c 1 3 2>/dev/null
505
506 # Make all sources and proc available under lfs build
507 mount --bind /dev $BASEDIR/build/dev
508 mount --bind /dev/pts $BASEDIR/build/dev/pts
509 mount --bind /dev/shm $BASEDIR/build/dev/shm
510 mount --bind /proc $BASEDIR/build/proc
511 mount --bind /sys $BASEDIR/build/sys
512 mount --bind $BASEDIR/cache $BASEDIR/build/usr/src/cache
380aa6e5 513 mount --bind $BASEDIR/ccache/${BUILD_ARCH}/${TOOLCHAINVER} $BASEDIR/build/usr/src/ccache
aecbe123
MT
514 mount --bind $BASEDIR/config $BASEDIR/build/usr/src/config
515 mount --bind $BASEDIR/doc $BASEDIR/build/usr/src/doc
516 mount --bind $BASEDIR/html $BASEDIR/build/usr/src/html
517 mount --bind $BASEDIR/langs $BASEDIR/build/usr/src/langs
518 mount --bind $BASEDIR/lfs $BASEDIR/build/usr/src/lfs
ebaecf2c 519 mount --bind $BASEDIR/log $BASEDIR/build/usr/src/log
aecbe123
MT
520 mount --bind $BASEDIR/src $BASEDIR/build/usr/src/src
521
522 # Run LFS static binary creation scripts one by one
523 export CCACHE_DIR=$BASEDIR/ccache
36065e42 524 export CCACHE_TEMPDIR="/tmp"
aecbe123
MT
525 export CCACHE_COMPRESS=1
526 export CCACHE_COMPILERCHECK="string:toolchain-${TOOLCHAINVER} ${BUILD_ARCH}"
527
528 # Remove pre-install list of installed files in case user erase some files before rebuild
529 rm -f $BASEDIR/build/usr/src/lsalr 2>/dev/null
530
531 # Prepare string for /etc/system-release.
f48643e5
MT
532 local system_release="${NAME} ${VERSION} (${BUILD_ARCH})"
533
534 case "${GIT_BRANCH}" in
535 core*|beta?|rc?)
536 system_release="${system_release} - ${GIT_BRANCH}"
537 ;;
538 *)
9ff65bfa 539 system_release="${system_release} - core${CORE} Development Build: ${GIT_BRANCH}/${GIT_LASTCOMMIT:0:8}"
f48643e5 540 ;;
aecbe123 541 esac
4e54a8e2 542
f48643e5
MT
543 # Append -dirty tag for local changes
544 if [ "$(git status -s | wc -l)" != "0" ]; then
545 system_release="${system_release}-dirty"
546 fi
547
548 # Export variable
549 SYSTEM_RELEASE="${system_release}"
550
040160c7
MT
551 # Decide on PAKFIRE_TREE
552 case "${GIT_BRANCH}" in
553 core*)
554 PAKFIRE_TREE="stable"
555 ;;
556 master)
557 PAKFIRE_TREE="testing"
558 ;;
559 *)
560 PAKFIRE_TREE="unstable"
561 ;;
562 esac
563
4e54a8e2
MT
564 # Setup ccache cache size
565 enterchroot ccache --max-size="${CCACHE_CACHE_SIZE}" >/dev/null
aecbe123
MT
566}
567
69a6ec55
MT
568enterchroot() {
569 # Install QEMU helper, if needed
570 qemu_install_helper
571
572 local PATH="${TOOLS_DIR}/ccache/bin:/bin:/usr/bin:/sbin:/usr/sbin:${TOOLS_DIR}/bin"
573
574 PATH="${PATH}" chroot ${LFS} env -i \
575 HOME="/root" \
576 TERM="${TERM}" \
577 PS1="${PS1}" \
578 PATH="${PATH}" \
579 SYSTEM_RELEASE="${SYSTEM_RELEASE}" \
040160c7 580 PAKFIRE_TREE="${PAKFIRE_TREE}" \
69a6ec55
MT
581 NAME="${NAME}" \
582 SNAME="${SNAME}" \
583 VERSION="${VERSION}" \
584 CORE="${CORE}" \
585 SLOGAN="${SLOGAN}" \
586 TOOLS_DIR="${TOOLS_DIR}" \
587 CONFIG_ROOT="${CONFIG_ROOT}" \
588 CFLAGS="${CFLAGS} ${HARDENING_CFLAGS}" \
589 CXXFLAGS="${CXXFLAGS} ${HARDENING_CFLAGS}" \
82454983 590 RUSTFLAGS="${RUSTFLAGS}" \
69a6ec55
MT
591 BUILDTARGET="${BUILDTARGET}" \
592 CROSSTARGET="${CROSSTARGET}" \
593 BUILD_ARCH="${BUILD_ARCH}" \
594 BUILD_PLATFORM="${BUILD_PLATFORM}" \
595 CCACHE_DIR=/usr/src/ccache \
36065e42 596 CCACHE_TEMPDIR="${CCACHE_TEMPDIR}" \
69a6ec55
MT
597 CCACHE_COMPRESS="${CCACHE_COMPRESS}" \
598 CCACHE_COMPILERCHECK="${CCACHE_COMPILERCHECK}" \
486112ad 599 GOCACHE="/usr/src/ccache/go" \
69a6ec55 600 KVER="${KVER}" \
0d7a6f03 601 XZ_OPT="${XZ_OPT}" \
77c863a2 602 DEFAULT_PARALLELISM="${DEFAULT_PARALLELISM}" \
85560933
MT
603 SYSTEM_PROCESSORS="${SYSTEM_PROCESSORS}" \
604 SYSTEM_MEMORY="${SYSTEM_MEMORY}" \
69a6ec55
MT
605 $(fake_environ) \
606 $(qemu_environ) \
607 "$@"
608}
609
610entershell() {
611 if [ ! -e $BASEDIR/build/usr/src/lfs/ ]; then
612 exiterror "No such file or directory: $BASEDIR/build/usr/src/lfs/"
613 fi
614
615 echo "Entering to a shell inside LFS chroot, go out with exit"
ab8464f4 616 local PS1="ipfire build chroot (${BUILD_ARCH}) \u:\w\$ "
69a6ec55
MT
617
618 if enterchroot bash -i; then
619 stdumount
620 else
f9783277 621 print_status FAIL
69a6ec55
MT
622 exiterror "chroot error"
623 fi
624}
625
626lfsmakecommoncheck() {
627 # Script present?
628 if [ ! -f $BASEDIR/lfs/$1 ]; then
629 exiterror "No such file or directory: $BASEDIR/$1"
630 fi
631
f9783277
MT
632 # Print package name and version
633 print_package $@
69a6ec55
MT
634
635 # Check if this package is supported by our architecture.
636 # If no SUP_ARCH is found, we assume the package can be built for all.
637 if grep "^SUP_ARCH" ${BASEDIR}/lfs/${1} >/dev/null; then
638 # Check if package supports ${BUILD_ARCH} or all architectures.
639 if ! grep -E "^SUP_ARCH.*${BUILD_ARCH}|^SUP_ARCH.*all" ${BASEDIR}/lfs/${1} >/dev/null; then
405ee2b4 640 print_runtime 0
f9783277 641 print_status SKIP
69a6ec55
MT
642 return 1
643 fi
644 fi
645
646 # Script slipped?
647 local i
648 for i in $SKIP_PACKAGE_LIST
649 do
650 if [ "$i" == "$1" ]; then
f9783277 651 print_status SKIP
69a6ec55
MT
652 return 1;
653 fi
654 done
655
656 echo -ne "`date -u '+%b %e %T'`: Building $* " >> $LOGFILE
657
658 cd $BASEDIR/lfs && make -s -f $* LFS_BASEDIR=$BASEDIR BUILD_ARCH="${BUILD_ARCH}" \
659 MESSAGE="$1\t " download >> $LOGFILE 2>&1
660 if [ $? -ne 0 ]; then
661 exiterror "Download error in $1"
662 fi
663
664 cd $BASEDIR/lfs && make -s -f $* LFS_BASEDIR=$BASEDIR BUILD_ARCH="${BUILD_ARCH}" \
665 MESSAGE="$1\t md5sum" md5 >> $LOGFILE 2>&1
666 if [ $? -ne 0 ]; then
667 exiterror "md5sum error in $1, check file in cache or signature"
668 fi
669
670 return 0 # pass all!
671}
672
673lfsmake1() {
674 lfsmakecommoncheck $*
675 [ $? == 1 ] && return 0
676
69a6ec55
MT
677 cd $BASEDIR/lfs && env -i \
678 PATH="${TOOLS_DIR}/ccache/bin:${TOOLS_DIR}/bin:$PATH" \
679 CCACHE_DIR="${CCACHE_DIR}" \
36065e42 680 CCACHE_TEMPDIR="${CCACHE_TEMPDIR}" \
69a6ec55
MT
681 CCACHE_COMPRESS="${CCACHE_COMPRESS}" \
682 CCACHE_COMPILERCHECK="${CCACHE_COMPILERCHECK}" \
683 CFLAGS="${CFLAGS}" \
684 CXXFLAGS="${CXXFLAGS}" \
77c863a2 685 DEFAULT_PARALLELISM="${DEFAULT_PARALLELISM}" \
85560933
MT
686 SYSTEM_PROCESSORS="${SYSTEM_PROCESSORS}" \
687 SYSTEM_MEMORY="${SYSTEM_MEMORY}" \
69a6ec55
MT
688 make -f $* \
689 TOOLCHAIN=1 \
690 TOOLS_DIR="${TOOLS_DIR}" \
691 CROSSTARGET="${CROSSTARGET}" \
692 BUILDTARGET="${BUILDTARGET}" \
693 BUILD_ARCH="${BUILD_ARCH}" \
694 BUILD_PLATFORM="${BUILD_PLATFORM}" \
695 LFS_BASEDIR="${BASEDIR}" \
696 ROOT="${LFS}" \
697 KVER="${KVER}" \
f9783277 698 install >> $LOGFILE 2>&1 &
69a6ec55 699
f9783277
MT
700 if ! wait_until_finished $!; then
701 print_status FAIL
702 exiterror "Building $*"
69a6ec55
MT
703 fi
704
f9783277 705 print_status DONE
69a6ec55
MT
706}
707
708lfsmake2() {
709 lfsmakecommoncheck $*
710 [ $? == 1 ] && return 0
711
69a6ec55
MT
712 local PS1='\u:\w$ '
713
714 enterchroot \
ce9264a1 715 ${EXTRA_PATH}bash -x -c "cd /usr/src/lfs && \
69a6ec55
MT
716 make -f $* \
717 LFS_BASEDIR=/usr/src install" \
f9783277 718 >> ${LOGFILE} 2>&1 &
69a6ec55 719
f9783277
MT
720 if ! wait_until_finished $!; then
721 print_status FAIL
722 exiterror "Building $*"
69a6ec55
MT
723 fi
724
f9783277 725 print_status DONE
69a6ec55
MT
726}
727
728ipfiredist() {
729 lfsmakecommoncheck $*
730 [ $? == 1 ] && return 0
731
69a6ec55
MT
732 local PS1='\u:\w$ '
733
734 enterchroot \
735 bash -x -c "cd /usr/src/lfs && make -f $* LFS_BASEDIR=/usr/src dist" \
f9783277 736 >> ${LOGFILE} 2>&1 &
69a6ec55 737
f9783277
MT
738 if ! wait_until_finished $!; then
739 print_status FAIL
740 exiterror "Packaging $*"
741 fi
69a6ec55 742
f9783277
MT
743 print_status DONE
744}
745
746wait_until_finished() {
747 local pid=${1}
748
749 local start_time=$(now)
750
751 # Show progress
752 if ${INTERACTIVE}; then
753 # Wait a little just in case the process
754 # has finished very quickly.
755 sleep 0.1
756
757 local runtime
758 while kill -0 ${pid} 2>/dev/null; do
759 print_runtime $(( $(now) - ${start_time} ))
760
761 # Wait a little
762 sleep 1
763 done
69a6ec55 764 fi
f9783277
MT
765
766 # Returns the exit code of the child process
767 wait ${pid}
768 local ret=$?
769
770 if ! ${INTERACTIVE}; then
771 print_runtime $(( $(now) - ${start_time} ))
772 fi
773
774 return ${ret}
69a6ec55
MT
775}
776
777fake_environ() {
778 [ -e "${BASEDIR}/build${TOOLS_DIR}/lib/libpakfire_preload.so" ] || return
779
780 local env="LD_PRELOAD=${TOOLS_DIR}/lib/libpakfire_preload.so"
781
782 # Fake kernel version, because some of the packages do not compile
783 # with kernel 3.0 and later.
8634797e 784 env="${env} UTS_RELEASE=${KVER}-ipfire"
69a6ec55
MT
785
786 # Fake machine version.
787 env="${env} UTS_MACHINE=${BUILD_ARCH}"
788
789 echo "${env}"
790}
791
792qemu_environ() {
793 local env
794
795 # Don't add anything if qemu is not used.
796 if ! qemu_is_required; then
797 return
798 fi
799
800 # Set default qemu options
801 case "${BUILD_ARCH}" in
802 arm*)
803 QEMU_CPU="${QEMU_CPU:-cortex-a9}"
804
805 env="${env} QEMU_CPU=${QEMU_CPU}"
806 ;;
807 esac
808
809 # Enable QEMU strace
810 #env="${env} QEMU_STRACE=1"
811
812 echo "${env}"
813}
814
815qemu_is_required() {
816 local build_arch="${1}"
817
818 if [ -z "${build_arch}" ]; then
819 build_arch="${BUILD_ARCH}"
820 fi
821
822 case "${HOST_ARCH},${build_arch}" in
161eb15d 823 x86_64,arm*|x86_64,aarch64|x86_64,riscv64|i?86,arm*|i?86,aarch64|i?86,x86_64)
69a6ec55
MT
824 return 0
825 ;;
826 *)
827 return 1
828 ;;
829 esac
830}
831
832qemu_install_helper() {
833 # Do nothing, if qemu is not required
834 if ! qemu_is_required; then
835 return 0
836 fi
837
838 if [ ! -e /proc/sys/fs/binfmt_misc/status ]; then
839 exiterror "binfmt_misc not mounted. QEMU_TARGET_HELPER not useable."
840 fi
841
842 if [ ! $(cat /proc/sys/fs/binfmt_misc/status) = 'enabled' ]; then
843 exiterror "binfmt_misc not enabled. QEMU_TARGET_HELPER not useable."
844 fi
845
846
847 if [ -z "${QEMU_TARGET_HELPER}" ]; then
848 exiterror "QEMU_TARGET_HELPER not set"
849 fi
850
851 # Check if the helper is already installed.
852 if [ -x "${LFS}${QEMU_TARGET_HELPER}" ]; then
853 return 0
854 fi
855
856 # Try to find a suitable binary that we can install
857 # to the build environment.
858 local file
859 for file in "${QEMU_TARGET_HELPER}" "${QEMU_TARGET_HELPER}-static"; do
860 # file must exist and be executable.
861 [ -x "${file}" ] || continue
862
863 # Must be static.
864 file_is_static "${file}" || continue
865
866 local dirname="${LFS}$(dirname "${file}")"
867 mkdir -p "${dirname}"
868
869 install -m 755 "${file}" "${LFS}${QEMU_TARGET_HELPER}"
870 return 0
871 done
872
873 exiterror "Could not find a statically-linked QEMU emulator: ${QEMU_TARGET_HELPER}"
874}
875
876qemu_find_build_helper_name() {
877 local build_arch="${1}"
878
879 local magic
880 case "${build_arch}" in
0db0f7fa
AF
881 aarch64)
882 magic="7f454c460201010000000000000000000200b700"
883 ;;
4576ca4c
MT
884 arm*)
885 magic="7f454c4601010100000000000000000002002800"
886 ;;
161eb15d
MT
887 riscv64)
888 magic="7f454c460201010000000000000000000200f300"
889 ;;
69a6ec55
MT
890 x86_64)
891 magic="7f454c4602010100000000000000000002003e00"
892 ;;
893 esac
894
895 [ -z "${magic}" ] && return 1
896
897 local file
898 for file in /proc/sys/fs/binfmt_misc/*; do
899 # skip write only register entry
900 [ $(basename "${file}") = "register" ] && continue
901 # Search for the file with the correct magic value.
902 grep -qE "^magic ${magic}$" "${file}" || continue
903
904 local interpreter="$(grep "^interpreter" "${file}" | awk '{ print $2 }')"
905
906 [ -n "${interpreter}" ] || continue
907 [ "${interpreter:0:1}" = "/" ] || continue
908 [ -x "${interpreter}" ] || continue
909
910 echo "${interpreter}"
911 return 0
912 done
913
914 return 1
915}
916
917file_is_static() {
918 local file="${1}"
919
920 file ${file} 2>/dev/null | grep -q "statically linked"
921}
922
923update_language_list() {
924 local path="${1}"
925
926 local lang
927 for lang in ${path}/*.po; do
928 lang="$(basename "${lang}")"
929 echo "${lang%*.po}"
930 done | sort -u > "${path}/LINGUAS"
931}
932
1fb7f56e
MT
933contributors() {
934 local commits name
935
936 git shortlog --summary --numbered | while read -r commits name; do
937 echo "${name}"
938 done | grep -vE -e "^(alpha197|morlix|root|ummeegge)$" -e "via Development$" -e "@" -e "#$"
939}
940
941update_contributors() {
942 echo -n "Updating list of contributors"
943
944 local contributors="$(contributors | paste -sd , - | sed -e "s/,/&\\\\n/g")"
945
946 # Edit contributors into credits.cgi
e2338aa7
MT
947 local tmp="$(mktemp)"
948
949 awk "/<!-- CONTRIBUTORS -->/{ p=1; print; printf \"${contributors}\n\"}/<!-- END -->/{ p=0 } !p" \
950 < "${BASEDIR}/html/cgi-bin/credits.cgi" > "${tmp}"
951
952 # Copy back modified content
953 cat "${tmp}" > "${BASEDIR}/html/cgi-bin/credits.cgi"
954 unlink "${tmp}"
1fb7f56e
MT
955
956 print_status DONE
957 return 0
958}
959
15b005d8 960# Default settings
99597de7 961CCACHE_CACHE_SIZE="4G"
15b005d8
MT
962ENABLE_RAMDISK="auto"
963
a98ab1d7
MT
964# Load configuration file
965if [ -f .config ]; then
966 . .config
967fi
968
813659f2
MT
969# TARGET_ARCH is BUILD_ARCH now
970if [ -n "${TARGET_ARCH}" ]; then
971 BUILD_ARCH="${TARGET_ARCH}"
972 unset TARGET_ARCH
973fi
974
85560933
MT
975# Get some information about the host system
976SYSTEM_PROCESSORS="$(system_processors)"
977SYSTEM_MEMORY="$(system_memory)"
978
dc7d6b20
MT
979if [ -n "${BUILD_ARCH}" ]; then
980 configure_build "${BUILD_ARCH}"
949544f5 981else
dc7d6b20 982 configure_build "default"
949544f5
MT
983fi
984
15b005d8
MT
985# Automatically enable/disable ramdisk usage
986if [ "${ENABLE_RAMDISK}" = "auto" ]; then
987 # Enable only when the host system has 4GB of RAM or more
988 if [ ${SYSTEM_MEMORY} -ge 3900 ]; then
989 ENABLE_RAMDISK="on"
990 fi
991fi
992
df5e82b3 993buildtoolchain() {
69a6ec55
MT
994 local error=false
995 case "${BUILD_ARCH}:${HOST_ARCH}" in
996 # x86_64
997 x86_64:x86_64)
998 # This is working.
999 ;;
1000
1001 # x86
1002 i586:i586|i586:i686|i586:x86_64)
1003 # These are working.
1004 ;;
1005 i586:*)
1006 error=true
1007 ;;
1008
1009 # ARM
1010 arvm7hl:armv7hl|armv7hl:armv7l)
1011 # These are working.
1012 ;;
1013
aafdd71b 1014 armv6l:armv6l|armv6l:armv7l|armv6l:aarch64)
69a6ec55
MT
1015 # These are working.
1016 ;;
aafdd71b 1017 armv6l:*)
69a6ec55
MT
1018 error=true
1019 ;;
1020 esac
1021
1022 ${error} && \
1023 exiterror "Cannot build ${BUILD_ARCH} toolchain on $(uname -m). Please use the download if any."
1024
1025 local gcc=$(type -p gcc)
1026 if [ -z "${gcc}" ]; then
1027 exiterror "Could not find GCC. You will need a working build enviroment in order to build the toolchain."
1028 fi
1029
6bd3a131
MT
1030 # Check ${TOOLS_DIR} symlink
1031 if [ -h "${TOOLS_DIR}" ]; then
1032 rm -f "${TOOLS_DIR}"
1033 fi
1034
1035 if [ ! -e "${TOOLS_DIR}" ]; then
1036 ln -s "${BASEDIR}/build${TOOLS_DIR}" "${TOOLS_DIR}"
1037 fi
1038
1039 if [ ! -h "${TOOLS_DIR}" ]; then
1040 exiterror "Could not create ${TOOLS_DIR} symbolic link"
1041 fi
1042
ebaecf2c 1043 LOGFILE="$BASEDIR/log/_build.toolchain.log"
69a6ec55
MT
1044 export LOGFILE
1045
1046 lfsmake1 stage1
69a6ec55
MT
1047 lfsmake1 binutils PASS=1
1048 lfsmake1 gcc PASS=1
1049 lfsmake1 linux KCFG="-headers"
1050 lfsmake1 glibc
178c7a6a 1051 lfsmake1 libxcrypt
69a6ec55
MT
1052 lfsmake1 gcc PASS=L
1053 lfsmake1 binutils PASS=2
1054 lfsmake1 gcc PASS=2
54d54148 1055 lfsmake1 zlib
2d29899d 1056 lfsmake1 zstd
74ee1c7a 1057 lfsmake1 ccache
69a6ec55
MT
1058 lfsmake1 tcl
1059 lfsmake1 expect
1060 lfsmake1 dejagnu
1061 lfsmake1 pkg-config
1062 lfsmake1 ncurses
1063 lfsmake1 bash
1064 lfsmake1 bzip2
1065 lfsmake1 automake
1066 lfsmake1 coreutils
1067 lfsmake1 diffutils
1068 lfsmake1 findutils
1069 lfsmake1 gawk
1070 lfsmake1 gettext
1071 lfsmake1 grep
1072 lfsmake1 gzip
1073 lfsmake1 m4
1074 lfsmake1 make
1075 lfsmake1 patch
1076 lfsmake1 perl
46bbc13b 1077 lfsmake1 python3
69a6ec55
MT
1078 lfsmake1 sed
1079 lfsmake1 tar
1080 lfsmake1 texinfo
1081 lfsmake1 xz
85439ac7 1082 lfsmake1 bison
11b5e5cb 1083 lfsmake1 flex
69a6ec55 1084 lfsmake1 fake-environ
7b93b62b 1085 lfsmake1 strip
69a6ec55 1086 lfsmake1 cleanup-toolchain
df5e82b3
MT
1087}
1088
1089buildbase() {
ebaecf2c 1090 LOGFILE="$BASEDIR/log/_build.base.log"
69a6ec55
MT
1091 export LOGFILE
1092 lfsmake2 stage2
1093 lfsmake2 linux KCFG="-headers"
1094 lfsmake2 man-pages
1095 lfsmake2 glibc
1096 lfsmake2 tzdata
1097 lfsmake2 cleanup-toolchain
1098 lfsmake2 zlib
b14c24ca 1099 lfsmake2 zstd
cf6c8e67
MT
1100 lfsmake2 autoconf
1101 lfsmake2 automake
1102 lfsmake2 libtool
69a6ec55
MT
1103 lfsmake2 binutils
1104 lfsmake2 gmp
69a6ec55
MT
1105 lfsmake2 mpfr
1106 lfsmake2 libmpc
cf6c8e67 1107 lfsmake2 libxcrypt
69a6ec55
MT
1108 lfsmake2 file
1109 lfsmake2 gcc
1110 lfsmake2 sed
69a6ec55
MT
1111 lfsmake2 berkeley
1112 lfsmake2 coreutils
1113 lfsmake2 iana-etc
1114 lfsmake2 m4
1115 lfsmake2 bison
69a6ec55 1116 lfsmake2 ncurses
69a6ec55
MT
1117 lfsmake2 perl
1118 lfsmake2 readline
69a6ec55 1119 lfsmake2 bzip2
3ece7859 1120 lfsmake2 xz
f407f05a 1121 lfsmake2 lzip
69a6ec55 1122 lfsmake2 pcre
b0c37190 1123 lfsmake2 pcre2
d701756a 1124 lfsmake2 gettext
241bf919
MT
1125 lfsmake2 attr
1126 lfsmake2 acl
69a6ec55
MT
1127 lfsmake2 bash
1128 lfsmake2 diffutils
69a6ec55
MT
1129 lfsmake2 ed
1130 lfsmake2 findutils
1131 lfsmake2 flex
1132 lfsmake2 gawk
d2315d00 1133 lfsmake2 go
69a6ec55
MT
1134 lfsmake2 grep
1135 lfsmake2 groff
1136 lfsmake2 gperf
1137 lfsmake2 gzip
1138 lfsmake2 hostname
1139 lfsmake2 iproute2
1140 lfsmake2 jwhois
1141 lfsmake2 kbd
1142 lfsmake2 less
4720fa0d 1143 lfsmake2 pkg-config
50992c73 1144 lfsmake2 procps
69a6ec55
MT
1145 lfsmake2 make
1146 lfsmake2 man
69a6ec55
MT
1147 lfsmake2 net-tools
1148 lfsmake2 patch
1149 lfsmake2 psmisc
1150 lfsmake2 shadow
1151 lfsmake2 sysklogd
1152 lfsmake2 sysvinit
1153 lfsmake2 tar
1154 lfsmake2 texinfo
1155 lfsmake2 util-linux
69a6ec55 1156 lfsmake2 vim
69b3d63b 1157 lfsmake2 e2fsprogs
df5e82b3
MT
1158}
1159
15679d9f 1160buildipfire() {
ebaecf2c 1161 LOGFILE="$BASEDIR/log/_build.ipfire.log"
df5e82b3 1162 export LOGFILE
489145db
MT
1163 lfsmake2 configroot
1164 lfsmake2 initscripts
1165 lfsmake2 backup
c38f55fe 1166 lfsmake2 openssl
1ece41ec 1167 lfsmake2 kmod
e1c6cd05 1168 lfsmake2 udev
3755e358 1169 lfsmake2 popt
d4767896 1170 lfsmake2 libedit
489145db
MT
1171 lfsmake2 libusb
1172 lfsmake2 libusb-compat
1173 lfsmake2 libpcap
1174 lfsmake2 ppp
1175 lfsmake2 pptp
1176 lfsmake2 unzip
1177 lfsmake2 which
1178 lfsmake2 linux-firmware
489145db 1179 lfsmake2 dvb-firmwares
37b86fa9 1180 lfsmake2 xr819-firmware
489145db
MT
1181 lfsmake2 zd1211-firmware
1182 lfsmake2 rpi-firmware
26796f3a 1183 lfsmake2 intel-microcode
0e54ca26 1184 lfsmake2 pcengines-apu-firmware
489145db 1185 lfsmake2 bc
2a0947f2 1186 lfsmake2 u-boot MKIMAGE=1
489145db
MT
1187 lfsmake2 cpio
1188 lfsmake2 mdadm
1189 lfsmake2 dracut
de18b4de 1190 lfsmake2 libaio
489145db
MT
1191 lfsmake2 lvm2
1192 lfsmake2 multipath-tools
1193 lfsmake2 freetype
489145db
MT
1194 lfsmake2 libmnl
1195 lfsmake2 libnfnetlink
1196 lfsmake2 libnetfilter_queue
1197 lfsmake2 libnetfilter_conntrack
1198 lfsmake2 libnetfilter_cthelper
1199 lfsmake2 libnetfilter_cttimeout
1200 lfsmake2 iptables
0245f3b6 1201 lfsmake2 screen
54ead8ef 1202 lfsmake2 elfutils
8e6fb99d 1203
efafef16
AF
1204 # Kernelbuild ... current we have no platform that need
1205 # multi kernel builds so KCFG is empty
1206 lfsmake2 linux KCFG=""
1207 lfsmake2 rtl8189es KCFG=""
1208 lfsmake2 rtl8812au KCFG=""
1209 lfsmake2 xradio KCFG=""
1210 lfsmake2 xtables-addons KCFG=""
1211 lfsmake2 linux-initrd KCFG=""
1212
1213 lfsmake2 xtables-addons USPACE="1"
489145db
MT
1214 lfsmake2 libgpg-error
1215 lfsmake2 libgcrypt
1216 lfsmake2 libassuan
1217 lfsmake2 nettle
1a7db134 1218 lfsmake2 json-c
f3e62301 1219 lfsmake2 libconfig
489145db
MT
1220 lfsmake2 libevent
1221 lfsmake2 libevent2
1222 lfsmake2 expat
c8e9a7a8
WA
1223 lfsmake2 apr
1224 lfsmake2 aprutil
489145db
MT
1225 lfsmake2 unbound
1226 lfsmake2 gnutls
1227 lfsmake2 bind
1228 lfsmake2 dhcp
1229 lfsmake2 dhcpcd
1230 lfsmake2 boost
1231 lfsmake2 linux-atm
1232 lfsmake2 gdbm
1233 lfsmake2 pam
d44ce7d4 1234 lfsmake2 c-ares
489145db
MT
1235 lfsmake2 curl
1236 lfsmake2 tcl
1237 lfsmake2 sqlite
1238 lfsmake2 libffi
1239 lfsmake2 python
1240 lfsmake2 python3
8a4495a4 1241 lfsmake2 gdb
b3ce3510
MT
1242 lfsmake2 grub
1243 lfsmake2 efivar
1244 lfsmake2 efibootmgr
489145db
MT
1245 lfsmake2 ca-certificates
1246 lfsmake2 fireinfo
1247 lfsmake2 libnet
1248 lfsmake2 libnl
1249 lfsmake2 libnl-3
1250 lfsmake2 libidn
1251 lfsmake2 nasm
4f516b87
MF
1252 lfsmake2 libarchive
1253 lfsmake2 cmake
814a33ff
SS
1254 lfsmake2 ninja
1255 lfsmake2 meson
489145db 1256 lfsmake2 libjpeg
58d965fe 1257 lfsmake2 openjpeg
489145db
MT
1258 lfsmake2 libexif
1259 lfsmake2 libpng
1260 lfsmake2 libtiff
1261 lfsmake2 libart
1262 lfsmake2 gd
489145db
MT
1263 lfsmake2 slang
1264 lfsmake2 newt
1265 lfsmake2 libsmooth
489145db 1266 lfsmake2 libcap
b051eb68 1267 lfsmake2 libcap-ng
489145db
MT
1268 lfsmake2 pciutils
1269 lfsmake2 usbutils
1270 lfsmake2 libxml2
1271 lfsmake2 libxslt
1272 lfsmake2 BerkeleyDB
489145db
MT
1273 lfsmake2 cyrus-sasl
1274 lfsmake2 openldap
1275 lfsmake2 apache2
489145db
MT
1276 lfsmake2 web-user-interface
1277 lfsmake2 flag-icons
1278 lfsmake2 jquery
6033b271 1279 lfsmake2 bootstrap
489145db
MT
1280 lfsmake2 arping
1281 lfsmake2 beep
1df47cc9 1282 lfsmake2 libssh
ff075def 1283 lfsmake2 libinih
8a960584 1284 lfsmake2 cdrkit
489145db
MT
1285 lfsmake2 dosfstools
1286 lfsmake2 reiserfsprogs
1287 lfsmake2 xfsprogs
1288 lfsmake2 sysfsutils
1289 lfsmake2 fuse
1290 lfsmake2 ntfs-3g
1291 lfsmake2 ethtool
489145db
MT
1292 lfsmake2 fcron
1293 lfsmake2 perl-GD
1294 lfsmake2 GD-Graph
1295 lfsmake2 GD-TextUtil
1296 lfsmake2 perl-Device-SerialPort
1297 lfsmake2 perl-Device-Modem
1298 lfsmake2 perl-Apache-Htpasswd
bbcaca56 1299 lfsmake2 perl-Parse-Yapp
46426b69 1300 lfsmake2 perl-Data-UUID
489145db
MT
1301 lfsmake2 gnupg
1302 lfsmake2 hdparm
1303 lfsmake2 sdparm
489145db 1304 lfsmake2 whatmask
29370584 1305 lfsmake2 libtirpc
489145db 1306 lfsmake2 conntrack-tools
489145db
MT
1307 lfsmake2 ipaddr
1308 lfsmake2 iputils
1309 lfsmake2 l7-protocols
489145db
MT
1310 lfsmake2 hwdata
1311 lfsmake2 logrotate
1312 lfsmake2 logwatch
1313 lfsmake2 misc-progs
1314 lfsmake2 nano
1315 lfsmake2 URI
294aa009
AF
1316 lfsmake2 perl-CGI
1317 lfsmake2 perl-Switch
489145db
MT
1318 lfsmake2 HTML-Tagset
1319 lfsmake2 HTML-Parser
1320 lfsmake2 HTML-Template
1321 lfsmake2 Compress-Zlib
1322 lfsmake2 Digest
1323 lfsmake2 Digest-SHA1
1324 lfsmake2 Digest-HMAC
1325 lfsmake2 libwww-perl
1326 lfsmake2 Net-DNS
1327 lfsmake2 Net-IPv4Addr
1328 lfsmake2 Net_SSLeay
1329 lfsmake2 IO-Stringy
1330 lfsmake2 IO-Socket-SSL
1331 lfsmake2 Unix-Syslog
1332 lfsmake2 Mail-Tools
1333 lfsmake2 MIME-Tools
1334 lfsmake2 Net-Server
a7492c0f 1335 lfsmake2 Canary-Stability
489145db
MT
1336 lfsmake2 Convert-TNEF
1337 lfsmake2 Convert-UUlib
1338 lfsmake2 Archive-Tar
1339 lfsmake2 Archive-Zip
1340 lfsmake2 Text-Tabs+Wrap
489145db
MT
1341 lfsmake2 XML-Parser
1342 lfsmake2 Crypt-PasswdMD5
1343 lfsmake2 Net-Telnet
1344 lfsmake2 python-setuptools
398669f7 1345 lfsmake2 python3-setuptools
d55a968a 1346 lfsmake2 python3-inotify
05fed717 1347 lfsmake2 python3-docutils
0882b3e4 1348 lfsmake2 python3-daemon
489145db 1349 lfsmake2 glib
489145db
MT
1350 lfsmake2 ntp
1351 lfsmake2 openssh
1352 lfsmake2 fontconfig
1353 lfsmake2 dejavu-fonts-ttf
70f6cba4 1354 lfsmake2 ubuntu-font-family
489145db
MT
1355 lfsmake2 freefont
1356 lfsmake2 pixman
1357 lfsmake2 cairo
1358 lfsmake2 pango
1359 lfsmake2 rrdtool
489145db
MT
1360 lfsmake2 setup
1361 lfsmake2 libdnet
59fe9735 1362 lfsmake2 rust
616395f3 1363 lfsmake2 jansson
91cc908f 1364 lfsmake2 yaml
3498300d 1365 lfsmake2 libhtp
1a5f0649 1366 lfsmake2 colm
2348cfff 1367 lfsmake2 ragel
52ebc66b 1368 lfsmake2 hyperscan
67752a95 1369 lfsmake2 suricata
489145db 1370 lfsmake2 oinkmaster
ef640882 1371 lfsmake2 ids-ruleset-sources
489145db
MT
1372 lfsmake2 squid
1373 lfsmake2 squidguard
1374 lfsmake2 calamaris
1375 lfsmake2 tcpdump
1376 lfsmake2 traceroute
1377 lfsmake2 vlan
1378 lfsmake2 wireless
1379 lfsmake2 pakfire
1380 lfsmake2 spandsp
adf3f4f4 1381 lfsmake2 lz4
489145db
MT
1382 lfsmake2 lzo
1383 lfsmake2 openvpn
489145db
MT
1384 lfsmake2 mpage
1385 lfsmake2 dbus
1386 lfsmake2 intltool
1387 lfsmake2 libdaemon
6064cd87 1388 lfsmake2 avahi
489145db 1389 lfsmake2 cups
489145db 1390 lfsmake2 lcms2
56170c2a 1391 lfsmake2 ghostscript
489145db
MT
1392 lfsmake2 qpdf
1393 lfsmake2 poppler
d3dabd4b 1394 lfsmake2 poppler-data
489145db
MT
1395 lfsmake2 cups-filters
1396 lfsmake2 epson-inkjet-printer-escpr
1397 lfsmake2 foomatic
1398 lfsmake2 hplip
1399 lfsmake2 cifs-utils
1400 lfsmake2 krb5
95849177 1401 lfsmake2 rpcsvc-proto
489145db 1402 lfsmake2 samba
18d000c4 1403 lfsmake2 netatalk
489145db
MT
1404 lfsmake2 sudo
1405 lfsmake2 mc
1406 lfsmake2 wget
1407 lfsmake2 bridge-utils
489145db
MT
1408 lfsmake2 smartmontools
1409 lfsmake2 htop
1410 lfsmake2 chkconfig
1411 lfsmake2 postfix
1412 lfsmake2 fetchmail
489145db 1413 lfsmake2 clamav
294aa009 1414 lfsmake2 perl-NetAddr-IP
489145db
MT
1415 lfsmake2 dma
1416 lfsmake2 alsa
1417 lfsmake2 mpfire
1418 lfsmake2 guardian
1419 lfsmake2 libid3tag
1420 lfsmake2 libmad
1421 lfsmake2 libogg
1422 lfsmake2 libvorbis
489145db
MT
1423 lfsmake2 flac
1424 lfsmake2 lame
1425 lfsmake2 sox
41f8d642 1426 lfsmake2 soxr
489145db
MT
1427 lfsmake2 libshout
1428 lfsmake2 xvid
1429 lfsmake2 libmpeg2
489145db
MT
1430 lfsmake2 gnump3d
1431 lfsmake2 rsync
489145db 1432 lfsmake2 rpcbind
14fb55a5 1433 lfsmake2 keyutils
8af744bc 1434 lfsmake2 libnfsidmap
489145db
MT
1435 lfsmake2 nfs
1436 lfsmake2 gnu-netcat
1437 lfsmake2 ncat
1438 lfsmake2 nmap
489145db
MT
1439 lfsmake2 etherwake
1440 lfsmake2 bwm-ng
1441 lfsmake2 sysstat
489145db
MT
1442 lfsmake2 strongswan
1443 lfsmake2 rng-tools
1444 lfsmake2 lsof
1445 lfsmake2 br2684ctl
1446 lfsmake2 pcmciautils
1447 lfsmake2 lm_sensors
1448 lfsmake2 liboping
1449 lfsmake2 collectd
1450 lfsmake2 elinks
1451 lfsmake2 igmpproxy
489145db 1452 lfsmake2 opus
495cf3e0 1453 lfsmake2 python3-pyparsing
489145db
MT
1454 lfsmake2 spice-protocol
1455 lfsmake2 spice
1456 lfsmake2 sdl
1457 lfsmake2 libusbredir
43c3a386 1458 lfsmake2 libseccomp
489145db 1459 lfsmake2 qemu
489145db 1460 lfsmake2 netpbm
489145db 1461 lfsmake2 netsnmpd
489145db 1462 lfsmake2 nagios_nrpe
2af354c2 1463 lfsmake2 nagios-plugins
489145db 1464 lfsmake2 icinga
01c2ea6b 1465 lfsmake2 observium-agent
489145db 1466 lfsmake2 ebtables
489145db 1467 lfsmake2 faad2
e91ceed6 1468 lfsmake2 alac
489145db
MT
1469 lfsmake2 ffmpeg
1470 lfsmake2 vdr
1471 lfsmake2 vdr_streamdev
489145db
MT
1472 lfsmake2 vdr_epgsearch
1473 lfsmake2 vdr_dvbapi
1474 lfsmake2 vdr_eepg
1475 lfsmake2 w_scan
489145db
MT
1476 lfsmake2 mpd
1477 lfsmake2 libmpdclient
1478 lfsmake2 mpc
985741db 1479 lfsmake2 perl-Net-CIDR-Lite
489145db
MT
1480 lfsmake2 perl-Net-SMTP-SSL
1481 lfsmake2 perl-MIME-Base64
1482 lfsmake2 perl-Authen-SASL
1483 lfsmake2 perl-MIME-Lite
1484 lfsmake2 perl-Email-Date-Format
1485 lfsmake2 git
1486 lfsmake2 squidclamav
1487 lfsmake2 vnstat
1488 lfsmake2 iw
1489 lfsmake2 wpa_supplicant
1490 lfsmake2 hostapd
489145db
MT
1491 lfsmake2 syslinux
1492 lfsmake2 tftpd
1493 lfsmake2 cpufrequtils
489145db
MT
1494 lfsmake2 gutenprint
1495 lfsmake2 apcupsd
67fbd255 1496 lfsmake2 fireperf
489145db
MT
1497 lfsmake2 iperf
1498 lfsmake2 iperf3
1499 lfsmake2 7zip
1500 lfsmake2 lynis
489145db
MT
1501 lfsmake2 sshfs
1502 lfsmake2 taglib
489145db
MT
1503 lfsmake2 sslh
1504 lfsmake2 perl-gettext
1505 lfsmake2 perl-Sort-Naturally
1506 lfsmake2 vdradmin
489145db 1507 lfsmake2 perl-DBI
489145db
MT
1508 lfsmake2 perl-DBD-SQLite
1509 lfsmake2 perl-File-ReadBackwards
489145db 1510 lfsmake2 openvmtools
489145db
MT
1511 lfsmake2 joe
1512 lfsmake2 monit
1513 lfsmake2 nut
1514 lfsmake2 watchdog
1515 lfsmake2 libpri
489145db
MT
1516 lfsmake2 usb_modeswitch
1517 lfsmake2 usb_modeswitch_data
1518 lfsmake2 zerofree
489145db
MT
1519 lfsmake2 minicom
1520 lfsmake2 ddrescue
489145db
MT
1521 lfsmake2 client175
1522 lfsmake2 powertop
1523 lfsmake2 parted
1524 lfsmake2 swig
2a0947f2 1525 lfsmake2 u-boot
6836e528 1526 lfsmake2 u-boot-friendlyarm
5c82a9f0 1527 lfsmake2 python-typing
489145db
MT
1528 lfsmake2 python-m2crypto
1529 lfsmake2 wireless-regdb
1530 lfsmake2 crda
1531 lfsmake2 libsolv
489145db 1532 lfsmake2 ddns
662b2a81 1533 lfsmake2 python3-setuptools-scm
5996c281 1534 lfsmake2 python3-six
e0a05a80 1535 lfsmake2 python3-dateutil
d48ea6b5 1536 lfsmake2 python3-jmespath
a33ca4cc 1537 lfsmake2 python3-colorama
d2da17a1 1538 lfsmake2 python3-yaml
953f6f73 1539 lfsmake2 python3-s3transfer
d45d5247 1540 lfsmake2 python3-rsa
faa5472a 1541 lfsmake2 python3-pyasn1
05be1c64 1542 lfsmake2 python3-urllib3
4ab80c5d 1543 lfsmake2 python3-botocore
def9f4a3 1544 lfsmake2 python3-msgpack
280ee7e7 1545 lfsmake2 aws-cli
489145db 1546 lfsmake2 transmission
489145db 1547 lfsmake2 mtr
489145db
MT
1548 lfsmake2 minidlna
1549 lfsmake2 acpid
1550 lfsmake2 fping
1551 lfsmake2 telnet
1552 lfsmake2 xinetd
489145db
MT
1553 lfsmake2 stress
1554 lfsmake2 libstatgrab
1555 lfsmake2 sarg
489145db 1556 lfsmake2 nginx
489145db
MT
1557 lfsmake2 sysbench
1558 lfsmake2 strace
489145db
MT
1559 lfsmake2 ltrace
1560 lfsmake2 ipfire-netboot
1561 lfsmake2 lcdproc
489145db
MT
1562 lfsmake2 keepalived
1563 lfsmake2 ipvsadm
1564 lfsmake2 perl-Carp-Clan
1565 lfsmake2 perl-Date-Calc
1566 lfsmake2 perl-Date-Manip
1567 lfsmake2 perl-File-Tail
1568 lfsmake2 perl-TimeDate
1569 lfsmake2 swatch
1570 lfsmake2 tor
489145db
MT
1571 lfsmake2 wavemon
1572 lfsmake2 iptraf-ng
1573 lfsmake2 iotop
1574 lfsmake2 stunnel
489145db 1575 lfsmake2 bacula
b62c826f
MT
1576 lfsmake2 perl-Font-TTF
1577 lfsmake2 perl-IO-String
489145db
MT
1578 lfsmake2 perl-PDF-API2
1579 lfsmake2 squid-accounting
1580 lfsmake2 pigz
1581 lfsmake2 tmux
1582 lfsmake2 perl-Text-CSV_XS
09b09b85 1583 lfsmake2 lua
489145db
MT
1584 lfsmake2 haproxy
1585 lfsmake2 ipset
489145db
MT
1586 lfsmake2 dnsdist
1587 lfsmake2 bird
1a7db134 1588 lfsmake2 frr
489145db
MT
1589 lfsmake2 dmidecode
1590 lfsmake2 mcelog
489145db
MT
1591 lfsmake2 util-macros
1592 lfsmake2 libpciaccess
1593 lfsmake2 libyajl
1594 lfsmake2 libvirt
42fca290 1595 lfsmake2 libtalloc
489145db
MT
1596 lfsmake2 freeradius
1597 lfsmake2 perl-common-sense
1598 lfsmake2 perl-inotify2
1599 lfsmake2 perl-Net-IP
0d6cc79d 1600 lfsmake2 wio
773caa66 1601 lfsmake2 iftop
ddcd60f7 1602 lfsmake2 mdns-repeater
429af178 1603 lfsmake2 i2c-tools
4e9000b4 1604 lfsmake2 nss-myhostname
014b235a 1605 lfsmake2 dehydrated
c708fa15 1606 lfsmake2 shairport-sync
46114d79 1607 lfsmake2 borgbackup
50483167 1608 lfsmake2 lmdb
2397e513 1609 lfsmake2 knot
e1982c69 1610 lfsmake2 spectre-meltdown-checker
06fc6170 1611 lfsmake2 zabbix_agentd
82d176d3 1612 lfsmake2 flashrom
2aca6aa0 1613 lfsmake2 firmware-update
ffcef39d 1614 lfsmake2 tshark
9875e9f2 1615 lfsmake2 speedtest-cli
0db643ce 1616 lfsmake2 rfkill
44cc9a3d 1617 lfsmake2 amazon-ssm-agent
d938509e 1618 lfsmake2 libloc
4d275bcd 1619 lfsmake2 ncdu
76c5f3e0 1620 lfsmake2 lshw
68fbcc0e 1621 lfsmake2 socat
7300386b
AB
1622 lfsmake2 libcdada
1623 lfsmake2 pmacct
d0817963 1624}
df5e82b3
MT
1625
1626buildinstaller() {
1627 # Run installer scripts one by one
ebaecf2c 1628 LOGFILE="$BASEDIR/log/_build.installer.log"
df5e82b3 1629 export LOGFILE
489145db
MT
1630 lfsmake2 memtest
1631 lfsmake2 installer
ce9264a1
AF
1632 # use toolchain bash for chroot to strip
1633 EXTRA_PATH=${TOOLS_DIR}/bin/ lfsmake2 strip
df5e82b3
MT
1634}
1635
1636buildpackages() {
ebaecf2c 1637 LOGFILE="$BASEDIR/log/_build.packages.log"
df5e82b3
MT
1638 export LOGFILE
1639 echo "... see detailed log in _build.*.log files" >> $LOGFILE
0fbb45e9 1640
df5e82b3
MT
1641
1642 # Generating list of packages used
dc4ae0b7 1643 print_line "Generating packages list from logs"
df5e82b3 1644 rm -f $BASEDIR/doc/packages-list
ebaecf2c
AF
1645 for i in `ls -1tr $BASEDIR/log/[^_]*`; do
1646 if [ "$i" != "$BASEDIR/log/FILES" -a -n $i ]; then
7471f6ab 1647 echo "* `basename $i`" >>$BASEDIR/doc/packages-list
df5e82b3
MT
1648 fi
1649 done
7471f6ab 1650 echo "== List of softwares used to build $NAME Version: $VERSION ==" > $BASEDIR/doc/packages-list.txt
4fe9acb2 1651 grep -v 'configroot$\|img$\|initrd$\|initscripts$\|installer$\|install$\|setup$\|pakfire$\|stage2$\|smp$\|tools$\|tools1$\|tools2$\|.tgz$\|-config$\|_missing_rootfile$\|install1$\|install2$\|pass1$\|pass2$\|pass3$' \
df5e82b3
MT
1652 $BASEDIR/doc/packages-list | sort >> $BASEDIR/doc/packages-list.txt
1653 rm -f $BASEDIR/doc/packages-list
c9673262 1654 # packages-list.txt is ready to be displayed for wiki page
f9783277 1655 print_status DONE
4b06f504
MT
1656
1657 # Update changelog
e49f7f0d 1658 cd $BASEDIR
c43b07fd
AF
1659 [ -z $GIT_TAG ] || LAST_TAG=$GIT_TAG
1660 [ -z $LAST_TAG ] || EXT="$LAST_TAG..HEAD"
1661 git log -n 500 --no-merges --pretty=medium --shortstat $EXT > $BASEDIR/doc/ChangeLog
df5e82b3 1662
9607771a 1663 # Create images for install
489145db 1664 lfsmake2 cdrom
bada0832 1665
4dc82852 1666 # Check if there is a loop device for building in virtual environments
841663e7
MT
1667 modprobe loop 2>/dev/null
1668 if [ $BUILD_IMAGES == 1 ] && ([ -e /dev/loop/0 ] || [ -e /dev/loop0 ] || [ -e "/dev/loop-control" ]); then
489145db 1669 lfsmake2 flash-images
4dc82852 1670 fi
c9673262 1671
c4dd9dfc 1672 mv $LFS/install/images/{*.iso,*.img.xz,*.bz2} $BASEDIR >> $LOGFILE 2>&1
c9673262 1673
0d909a4a 1674 ipfirepackages
e67a57fe 1675
b307417f 1676 cd $BASEDIR
744a04ea 1677
aafdd71b
AF
1678 # remove not useable iso on armv6l (needed to build flash images)
1679 [ "${BUILD_ARCH}" = "armv6l" ] && rm -rf *.iso
744a04ea 1680
5336aaa6 1681 for i in $(ls *.bz2 *.img.xz *.iso 2>/dev/null); do
b307417f
AF
1682 md5sum $i > $i.md5
1683 done
1684 cd $PWD
1685
e67a57fe
MT
1686 # Cleanup
1687 stdumount
1688 rm -rf $BASEDIR/build/tmp/*
1689
e67a57fe 1690 cd $PWD
e67a57fe
MT
1691}
1692
1693ipfirepackages() {
489145db 1694 lfsmake2 core-updates
5596077b
MT
1695
1696 local i
dc7d6b20 1697 for i in $(find $BASEDIR/config/rootfiles/packages{/${BUILD_ARCH},} -maxdepth 1 -type f); do
5596077b 1698 i=$(basename ${i})
453b418b
MT
1699 if [ -e $BASEDIR/lfs/$i ]; then
1700 ipfiredist $i
1701 else
1702 echo -n $i
f9783277 1703 print_status SKIP
453b418b 1704 fi
fe7fe395 1705 done
78331e30 1706 test -d $BASEDIR/packages || mkdir $BASEDIR/packages
5c8cfc99 1707 mv -f $LFS/install/packages/* $BASEDIR/packages >> $LOGFILE 2>&1
483f59cd 1708 rm -rf $BASEDIR/build/install/packages/*
df5e82b3
MT
1709}
1710
bcb9dc13
MT
1711while [ $# -gt 0 ]; do
1712 case "${1}" in
1713 --target=*)
c2e810de 1714 configure_build "${1#--target=}"
bcb9dc13
MT
1715 ;;
1716 -*)
1717 exiterror "Unknown configuration option: ${1}"
1718 ;;
1719 *)
1720 # Found a command, so exit options parsing.
1721 break
1722 ;;
1723 esac
1724 shift
1725done
1726
df5e82b3
MT
1727# See what we're supposed to do
1728case "$1" in
1729build)
f9783277
MT
1730 START_TIME=$(now)
1731
1732 # Clear screen
1733 ${INTERACTIVE} && clear
1734
d66e6fa8 1735 PACKAGE="$BASEDIR/cache/toolchains/$SNAME-$VERSION-toolchain-$TOOLCHAINVER-${BUILD_ARCH}.tar.zst"
df5e82b3 1736 #only restore on a clean disk
6c4cc7ea 1737 if [ ! -e "${BASEDIR}/build${TOOLS_DIR}/.toolchain-successful" ]; then
df5e82b3 1738 if [ ! -n "$PACKAGE" ]; then
f9783277 1739 print_build_stage "Full toolchain compilation"
df5e82b3
MT
1740 prepareenv
1741 buildtoolchain
1742 else
d66e6fa8 1743 PACKAGENAME=${PACKAGE%.tar.zst}
f9783277 1744 print_build_stage "Packaged toolchain compilation"
df5e82b3 1745 if [ `md5sum $PACKAGE | awk '{print $1}'` == `cat $PACKAGENAME.md5 | awk '{print $1}'` ]; then
f74072a2 1746 tar axf $PACKAGE
df5e82b3
MT
1747 prepareenv
1748 else
1749 exiterror "$PACKAGENAME md5 did not match, check downloaded package"
1750 fi
1751 fi
1752 else
df5e82b3
MT
1753 prepareenv
1754 fi
5cfe86e6 1755
f9783277 1756 print_build_stage "Building LFS"
df5e82b3 1757 buildbase
15679d9f 1758
f9783277 1759 print_build_stage "Building IPFire"
15679d9f 1760 buildipfire
5cfe86e6 1761
f9783277 1762 print_build_stage "Building installer"
df5e82b3 1763 buildinstaller
15679d9f 1764
f9783277 1765 print_build_stage "Building packages"
df5e82b3 1766 buildpackages
7a5ed24e 1767
f9783277 1768 print_build_stage "Checking Logfiles for new Files"
b307417f
AF
1769
1770 cd $BASEDIR
7a5ed24e 1771 tools/checknewlog.pl
e0c923f4 1772 tools/checkrootfiles
b307417f 1773 cd $PWD
a23731d1 1774
f9783277 1775 print_build_summary $(( $(now) - ${START_TIME} ))
df5e82b3
MT
1776 ;;
1777shell)
1778 # enter a shell inside LFS chroot
1779 # may be used to changed kernel settings
1780 prepareenv
1781 entershell
1782 ;;
df5e82b3 1783clean)
f9783277
MT
1784 print_line "Cleaning build directory..."
1785
df5e82b3
MT
1786 for i in `mount | grep $BASEDIR | sed 's/^.*loop=\(.*\))/\1/'`; do
1787 $LOSETUP -d $i 2>/dev/null
1788 done
b0c37190
MT
1789 #for i in `mount | grep $BASEDIR | cut -d " " -f 1`; do
1790 # umount $i
1791 #done
df5e82b3
MT
1792 stdumount
1793 for i in `seq 0 7`; do
69a6ec55 1794 if ( losetup /dev/loop${i} 2>/dev/null | grep -q "/install/images" ); then
df5e82b3
MT
1795 umount /dev/loop${i} 2>/dev/null;
1796 losetup -d /dev/loop${i} 2>/dev/null;
69a6ec55 1797 fi;
df5e82b3
MT
1798 done
1799 rm -rf $BASEDIR/build
1800 rm -rf $BASEDIR/cdrom
f9315063 1801 rm -rf $BASEDIR/packages
ebaecf2c 1802 rm -rf $BASEDIR/log
6c4cc7ea
MT
1803 if [ -h "${TOOLS_DIR}" ]; then
1804 rm -f "${TOOLS_DIR}"
df5e82b3 1805 fi
b307417f 1806 rm -f $BASEDIR/ipfire-*
f9783277 1807 print_status DONE
df5e82b3 1808 ;;
4e432799
MT
1809docker)
1810 # Build the docker image if it does not exist, yet
1811 if ! docker images -a | grep -q ^ipfire-builder; then
1812 if docker build -t ipfire-builder ${BASEDIR}/tools/docker; then
1813 print_status DONE
1814 else
1815 print_status FAIL
1816 exit 1
1817 fi
1818 fi
1819
1820 # Run the container and enter a shell
1821 docker run -it --privileged -v "${BASEDIR}:/build" -w "/build" ipfire-builder bash -l
1822 ;;
c3db995c 1823downloadsrc)
df5e82b3
MT
1824 if [ ! -d $BASEDIR/cache ]; then
1825 mkdir $BASEDIR/cache
1826 fi
ebaecf2c 1827 mkdir -p $BASEDIR/log
857d9bf2 1828 echo -e "${BOLD}Preload all source files${NORMAL}" | tee -a $LOGFILE
df5e82b3
MT
1829 FINISHED=0
1830 cd $BASEDIR/lfs
1831 for c in `seq $MAX_RETRIES`; do
1832 if (( FINISHED==1 )); then
1833 break
1834 fi
1835 FINISHED=1
1836 cd $BASEDIR/lfs
1837 for i in *; do
1838 if [ -f "$i" -a "$i" != "Config" ]; then
846e756e
MT
1839 lfsmakecommoncheck ${i} || continue
1840
dc7d6b20 1841 make -s -f $i LFS_BASEDIR=$BASEDIR BUILD_ARCH="${BUILD_ARCH}" \
51f9e7ac 1842 MESSAGE="$i\t ($c/$MAX_RETRIES)" download >> $LOGFILE 2>&1
df5e82b3 1843 if [ $? -ne 0 ]; then
f9783277 1844 print_status FAIL
df5e82b3
MT
1845 FINISHED=0
1846 else
1847 if [ $c -eq 1 ]; then
f9783277 1848 print_status DONE
df5e82b3
MT
1849 fi
1850 fi
1851 fi
1852 done
1853 done
e22c7973 1854 echo -e "${BOLD}***Verifying md5sums${NORMAL}"
df5e82b3
MT
1855 ERROR=0
1856 for i in *; do
1857 if [ -f "$i" -a "$i" != "Config" ]; then
a4130265 1858 lfsmakecommoncheck ${i} > /dev/null || continue
dc7d6b20 1859 make -s -f $i LFS_BASEDIR=$BASEDIR BUILD_ARCH="${BUILD_ARCH}" \
51f9e7ac 1860 MESSAGE="$i\t " md5 >> $LOGFILE 2>&1
df5e82b3 1861 if [ $? -ne 0 ]; then
e22c7973 1862 echo -ne "MD5 difference in lfs/$i"
f9783277 1863 print_status FAIL
df5e82b3
MT
1864 ERROR=1
1865 fi
1866 fi
1867 done
1868 if [ $ERROR -eq 0 ]; then
e22c7973 1869 echo -ne "${BOLD}all files md5sum match${NORMAL}"
f9783277 1870 print_status DONE
e22c7973
MT
1871 else
1872 echo -ne "${BOLD}not all files were correctly download${NORMAL}"
f9783277 1873 print_status FAIL
df5e82b3 1874 fi
e22c7973 1875 cd - >/dev/null 2>&1
df5e82b3 1876 ;;
df5e82b3 1877toolchain)
f9783277
MT
1878 # Clear screen
1879 ${INTERACTIVE} && clear
1880
df5e82b3 1881 prepareenv
f3b7cf47 1882 print_build_stage "Toolchain compilation (${BUILD_ARCH})"
df5e82b3 1883 buildtoolchain
f74072a2 1884 echo "`date -u '+%b %e %T'`: Create toolchain image for ${BUILD_ARCH}" | tee -a $LOGFILE
11104bfe 1885 test -d $BASEDIR/cache/toolchains || mkdir -p $BASEDIR/cache/toolchains
d66e6fa8
MT
1886 cd $BASEDIR && tar -cf- --exclude='log/_build.*.log' build/${TOOLS_DIR} build/bin/sh log \
1887 | zstd ${ZSTD_OPT} > cache/toolchains/$SNAME-$VERSION-toolchain-$TOOLCHAINVER-${BUILD_ARCH}.tar.zst
1888 md5sum cache/toolchains/$SNAME-$VERSION-toolchain-$TOOLCHAINVER-${BUILD_ARCH}.tar.zst \
dc7d6b20 1889 > cache/toolchains/$SNAME-$VERSION-toolchain-$TOOLCHAINVER-${BUILD_ARCH}.md5
df5e82b3
MT
1890 stdumount
1891 ;;
1892gettoolchain)
df5e82b3 1893 # arbitrary name to be updated in case of new toolchain package upload
dc7d6b20 1894 PACKAGE=$SNAME-$VERSION-toolchain-$TOOLCHAINVER-${BUILD_ARCH}
d66e6fa8 1895 if [ ! -f $BASEDIR/cache/toolchains/$PACKAGE.tar.zst ]; then
5bd13f01 1896 URL_TOOLCHAIN=`grep URL_TOOLCHAIN lfs/Config | awk '{ print $3 }'`
11104bfe 1897 test -d $BASEDIR/cache/toolchains || mkdir -p $BASEDIR/cache/toolchains
f74072a2 1898 echo "`date -u '+%b %e %T'`: Load toolchain image for ${BUILD_ARCH}" | tee -a $LOGFILE
712d859c 1899 cd $BASEDIR/cache/toolchains
d66e6fa8 1900 wget -U "IPFireSourceGrabber/2.x" $URL_TOOLCHAIN/$PACKAGE.tar.zst $URL_TOOLCHAIN/$PACKAGE.md5 >& /dev/null
712d859c 1901 if [ $? -ne 0 ]; then
dc7d6b20 1902 echo "`date -u '+%b %e %T'`: error downloading $PACKAGE toolchain for ${BUILD_ARCH} machine" | tee -a $LOGFILE
40a4ea4c 1903 else
f74072a2 1904 if [ "`md5sum $PACKAGE.tar.xz | awk '{print $1}'`" = "`cat $PACKAGE.md5 | awk '{print $1}'`" ]; then
712d859c
MT
1905 echo "`date -u '+%b %e %T'`: toolchain md5 ok" | tee -a $LOGFILE
1906 else
1907 exiterror "$PACKAGE.md5 did not match, check downloaded package"
1908 fi
40a4ea4c 1909 fi
712d859c
MT
1910 else
1911 echo "Toolchain is already downloaded. Exiting..."
df5e82b3
MT
1912 fi
1913 ;;
15679d9f
MT
1914uploadsrc)
1915 PWD=`pwd`
661d9388
CS
1916 if [ -z $IPFIRE_USER ]; then
1917 echo -n "You have to setup IPFIRE_USER first. See .config for details."
f9783277 1918 print_status FAIL
661d9388
CS
1919 exit 1
1920 fi
ae23a606 1921
661d9388 1922 URL_SOURCE=$(grep URL_SOURCE lfs/Config | awk '{ print $3 }')
15e38431 1923 REMOTE_FILES=$(echo "ls -1" | sftp -C ${IPFIRE_USER}@${URL_SOURCE})
661d9388 1924
15e38431
MT
1925 for file in ${BASEDIR}/cache/*; do
1926 [ -d "${file}" ] && continue
1927 grep -q "$(basename ${file})" <<<$REMOTE_FILES && continue
661d9388 1928 NEW_FILES="$NEW_FILES $file"
0eab8e84 1929 done
661d9388
CS
1930 [ -n "$NEW_FILES" ] && scp -2 $NEW_FILES ${IPFIRE_USER}@${URL_SOURCE}
1931 cd $BASEDIR
15679d9f
MT
1932 cd $PWD
1933 exit 0
0eab8e84 1934 ;;
bf7c473f 1935lang)
69a6ec55
MT
1936 echo -ne "Checking the translations for missing or obsolete strings..."
1937 chmod 755 $BASEDIR/tools/{check_strings.pl,sort_strings.pl,check_langs.sh}
1938 $BASEDIR/tools/sort_strings.pl en
1939 $BASEDIR/tools/sort_strings.pl de
1940 $BASEDIR/tools/sort_strings.pl fr
1941 $BASEDIR/tools/sort_strings.pl es
1942 $BASEDIR/tools/sort_strings.pl pl
1943 $BASEDIR/tools/sort_strings.pl ru
1944 $BASEDIR/tools/sort_strings.pl nl
1945 $BASEDIR/tools/sort_strings.pl tr
1946 $BASEDIR/tools/sort_strings.pl it
1947 $BASEDIR/tools/check_strings.pl en > $BASEDIR/doc/language_issues.en
1948 $BASEDIR/tools/check_strings.pl de > $BASEDIR/doc/language_issues.de
1949 $BASEDIR/tools/check_strings.pl fr > $BASEDIR/doc/language_issues.fr
1950 $BASEDIR/tools/check_strings.pl es > $BASEDIR/doc/language_issues.es
72c8478e 1951 $BASEDIR/tools/check_strings.pl pl > $BASEDIR/doc/language_issues.pl
69a6ec55
MT
1952 $BASEDIR/tools/check_strings.pl ru > $BASEDIR/doc/language_issues.ru
1953 $BASEDIR/tools/check_strings.pl nl > $BASEDIR/doc/language_issues.nl
1954 $BASEDIR/tools/check_strings.pl tr > $BASEDIR/doc/language_issues.tr
1955 $BASEDIR/tools/check_strings.pl it > $BASEDIR/doc/language_issues.it
1956 $BASEDIR/tools/check_langs.sh > $BASEDIR/doc/language_missings
f9783277 1957 print_status DONE
69a6ec55
MT
1958
1959 echo -ne "Updating language lists..."
1960 update_language_list ${BASEDIR}/src/installer/po
1961 update_language_list ${BASEDIR}/src/setup/po
f9783277 1962 print_status DONE
bf7c473f 1963 ;;
1fb7f56e
MT
1964update-contributors)
1965 update_contributors
1966 ;;
ba137dd8
MT
1967find-dependencies)
1968 shift
1969 exec "${BASEDIR}/tools/find-dependencies" "${BASEDIR}/build" "$@"
1970 ;;
6b8cff41 1971*)
ba137dd8 1972 echo "Usage: $0 {build|changelog|clean|gettoolchain|downloadsrc|shell|sync|toolchain|update-contributors|find-dependencies}"
6b8cff41
MT
1973 cat doc/make.sh-usage
1974 ;;
3ea75603 1975esac
98329972 1976