]> git.ipfire.org Git - ipfire-2.x.git/blob - make.sh
make.sh: Build zlib + zstd before binutils
[ipfire-2.x.git] / make.sh
1 #!/bin/bash
2 ############################################################################
3 # #
4 # This file is part of the IPFire Firewall. #
5 # #
6 # IPFire is free software; you can redistribute it and/or modify #
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 # #
11 # IPFire is distributed in the hope that it will be useful, #
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 #
17 # along with IPFire; if not, write to the Free Software #
18 # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA #
19 # #
20 # Copyright (C) 2007-2020 IPFire Team <info@ipfire.org>. #
21 # #
22 ############################################################################
23 #
24
25 NAME="IPFire" # Software name
26 SNAME="ipfire" # Short name
27 # If you update the version don't forget to update backupiso and add it to core update
28 VERSION="2.25" # Version number
29 CORE="158" # Core Level (Filename)
30 SLOGAN="www.ipfire.org" # Software slogan
31 CONFIG_ROOT=/var/ipfire # Configuration rootdir
32 MAX_RETRIES=1 # prefetch/check loop
33 BUILD_IMAGES=1 # Flash and Xen Downloader
34 KVER=`grep --max-count=1 VER lfs/linux | awk '{ print $3 }'`
35
36 # Information from Git
37 GIT_BRANCH="$(git rev-parse --abbrev-ref HEAD)" # Git Branch
38 GIT_TAG="$(git tag | tail -1)" # Git Tag
39 GIT_LASTCOMMIT="$(git rev-parse --verify HEAD)" # Last commit
40
41 TOOLCHAINVER=20210202
42
43 ZSTD_OPT=(
44 # Compress in parallel using all processor cores
45 -T0
46
47 # Compress as best as we can
48 --ultra -22
49 )
50
51 ###############################################################################
52 #
53 # Beautifying variables & presentation & input output interface
54 #
55 ###############################################################################
56
57 # Remember if the shell is interactive or not
58 if [ -t 0 ] && [ -t 1 ]; then
59 INTERACTIVE=true
60 else
61 INTERACTIVE=false
62 fi
63
64 # Sets or adjusts pretty formatting variables
65 resize_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
74
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
82 TIME_COL=$(( NAME_WIDTH + OPTIONS_WIDTH ))
83 STATUS_COL=$(( TIME_COL + TIME_WIDTH ))
84 }
85
86 # Initially setup terminal
87 resize_terminal
88
89 # Call resize_terminal when terminal is being resized
90 trap "resize_terminal" WINCH
91
92 # Define color for messages
93 BOLD="\\033[1;39m"
94 DONE="\\033[1;32m"
95 SKIP="\\033[1;34m"
96 WARN="\\033[1;35m"
97 FAIL="\\033[1;31m"
98 NORMAL="\\033[0;39m"
99
100 # New architecture variables
101 HOST_ARCH="$(uname -m)"
102
103 PWD=$(pwd)
104 BASENAME=$(basename $0)
105
106 # Debian specific settings
107 if [ ! -e /etc/debian_version ]; then
108 FULLPATH=`which $0`
109 else
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
116 fi
117
118 # This is the directory where make.sh is in
119 export BASEDIR=$(echo $FULLPATH | sed "s/\/$BASENAME//g")
120
121 LOGFILE=$BASEDIR/log/_build.preparation.log
122 export LOGFILE
123 DIR_CHK=$BASEDIR/cache/check
124 mkdir $BASEDIR/log/ 2>/dev/null
125
126 system_processors() {
127 getconf _NPROCESSORS_ONLN 2>/dev/null || echo "1"
128 }
129
130 system_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
144 configure_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"
156 CFLAGS_ARCH="-m64 -mtune=generic -fstack-clash-protection -fcf-protection"
157 ;;
158
159 i586)
160 BUILDTARGET="${build_arch}-pc-linux-gnu"
161 CROSSTARGET="${build_arch}-cross-linux-gnu"
162 BUILD_PLATFORM="x86"
163 CFLAGS_ARCH="-march=i586 -mtune=generic -fomit-frame-pointer"
164 ;;
165
166 aarch64)
167 BUILDTARGET="${build_arch}-unknown-linux-gnu"
168 CROSSTARGET="${build_arch}-cross-linux-gnu"
169 BUILD_PLATFORM="arm"
170 CFLAGS_ARCH="-fstack-clash-protection"
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
180 armv6l)
181 BUILDTARGET="${build_arch}-unknown-linux-gnueabi"
182 CROSSTARGET="${build_arch}-cross-linux-gnueabi"
183 BUILD_PLATFORM="arm"
184 CFLAGS_ARCH="-march=armv6 -mfpu=vfp -mfloat-abi=softfp -fomit-frame-pointer"
185 #RUSTFLAGS="-Ccodegen-units=1"
186 ;;
187
188 riscv64)
189 BUILDTARGET="${build_arch}-unknown-linux-gnu"
190 CROSSTARGET="${build_arch}-cross-linux-gnu"
191 BUILD_PLATFORM="riscv"
192 CFLAGS_ARCH="-fstack-clash-protection"
193 ;;
194
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
215 HARDENING_CFLAGS="-Wp,-D_FORTIFY_SOURCE=2 -Wp,-D_GLIBCXX_ASSERTIONS -fstack-protector-strong"
216
217 CFLAGS="-O2 -pipe -Wall -fexceptions -fPIC ${CFLAGS_ARCH}"
218 CXXFLAGS="${CFLAGS}"
219
220 # Determine parallelism
221 # We assume that each process consumes about
222 # 128MB of memory. Therefore we find out how
223 # many processes fit into memory.
224 local mem_max=$(( ${SYSTEM_MEMORY} / 128 ))
225 local cpu_max=$(( ${SYSTEM_PROCESSORS} ))
226
227 local parallelism
228 if [ ${mem_max} -lt ${cpu_max} ]; then
229 parallelism=${mem_max}
230 else
231 parallelism=${cpu_max}
232 fi
233
234 # Use this as default PARALLELISM
235 DEFAULT_PARALLELISM="${parallelism}"
236
237 # Limit lauched ninja build jobs to computed parallel value.
238 NINJAJOBS="${parallelism}"
239
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.
251 local xz_memory=$(( SYSTEM_MEMORY * 7 / 10 ))
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"
263 }
264
265 configure_build_guess() {
266 case "${HOST_ARCH}" in
267 x86_64)
268 echo "x86_64"
269 ;;
270 i?86)
271 echo "i586"
272 ;;
273
274 aarch64)
275 echo "aarch64"
276 ;;
277
278 armv7*|armv6*)
279 echo "armv6l"
280 ;;
281
282 riscv64)
283 echo "riscv64"
284 ;;
285
286 *)
287 exiterror "Cannot guess build architecture"
288 ;;
289 esac
290 }
291
292 stdumount() {
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;
306 umount $BASEDIR/build/usr/src/log 2>/dev/null;
307 umount $BASEDIR/build/usr/src/src 2>/dev/null;
308 umount $BASEDIR/build/usr/src 2>/dev/null;
309 umount $BASEDIR/build/tmp 2>/dev/null;
310 }
311
312 now() {
313 date -u "+%s"
314 }
315
316 format_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 ))"
328 else
329 printf "%d\n" "${seconds}"
330 fi
331 }
332
333 print_line() {
334 local line="$@"
335
336 printf "%-${LINE_WIDTH}s" "${line}"
337 }
338
339 _print_line() {
340 local status="${1}"
341 shift
342
343 if ${INTERACTIVE}; then
344 printf "${!status}"
345 fi
346
347 print_line "$@"
348
349 if ${INTERACTIVE}; then
350 printf "${NORMAL}"
351 fi
352 }
353
354 print_headline() {
355 _print_line BOLD "$@"
356 }
357
358 print_error() {
359 _print_line FAIL "$@"
360 }
361
362 print_package() {
363 local name="${1}"
364 shift
365
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}"
375 printf "%$(( ${OPTIONS_WIDTH} - 1 ))s " "${options}"
376 }
377
378 print_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}"
385 fi
386 }
387
388 print_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}"
397 fi
398 }
399
400 print_build_stage() {
401 print_headline "$@"
402
403 # end line
404 printf "\n"
405 }
406
407 print_build_summary() {
408 local runtime=$(format_runtime $@)
409
410 print_line "*** Build finished in ${runtime}"
411 print_status DONE
412 }
413
414 exiterror() {
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
422 # Dump logfile
423 if [ -n "${LOGFILE}" ] && [ -e "${LOGFILE}" ]; then
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
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
440 exit 1
441 }
442
443 prepareenv() {
444 # Are we running the right shell?
445 if [ -z "${BASH}" ]; then
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
456 # Checking if running as root user
457 if [ $(id -u) -ne 0 ]; then
458 exiterror "root privileges required for building"
459 fi
460
461 # Checking for necessary temporary space
462 print_line "Checking for necessary space on disk $BASE_DEV"
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
468 print_status FAIL
469 exiterror "Not enough temporary space available, need at least 2GB on $BASE_DEV"
470 fi
471 else
472 print_status DONE
473 fi
474
475 # Set umask
476 umask 022
477
478 # Set LFS Directory
479 LFS=$BASEDIR/build
480
481 # Setup environment
482 set +h
483 LC_ALL=POSIX
484 export LFS LC_ALL CFLAGS CXXFLAGS DEFAULT_PARALLELISM RUSTFLAGS NINJAJOBS
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}
491 mkdir -p $BASEDIR/{cache,ccache/${BUILD_ARCH}/${TOOLCHAINVER}} 2>/dev/null
492
493 if [ "${ENABLE_RAMDISK}" = "on" ]; then
494 mkdir -p $BASEDIR/build/usr/src
495 mount -t tmpfs tmpfs -o size=8G,nr_inodes=1M,mode=1777 $BASEDIR/build/usr/src
496
497 mkdir -p ${BASEDIR}/build/tmp
498 mount -t tmpfs tmpfs -o size=4G,nr_inodes=1M,mode=1777 ${BASEDIR}/build/tmp
499 fi
500
501 mkdir -p $BASEDIR/build/usr/src/{cache,config,doc,html,langs,lfs,log,src,ccache}
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
513 mount --bind $BASEDIR/ccache/${BUILD_ARCH}/${TOOLCHAINVER} $BASEDIR/build/usr/src/ccache
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
519 mount --bind $BASEDIR/log $BASEDIR/build/usr/src/log
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
524 export CCACHE_TEMPDIR="/tmp"
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.
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 *)
539 system_release="${system_release} - core${CORE} Development Build: ${GIT_BRANCH}/${GIT_LASTCOMMIT:0:8}"
540 ;;
541 esac
542
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
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
564 # Setup ccache cache size
565 enterchroot ccache --max-size="${CCACHE_CACHE_SIZE}" >/dev/null
566 }
567
568 enterchroot() {
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}" \
580 PAKFIRE_TREE="${PAKFIRE_TREE}" \
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}" \
590 RUSTFLAGS="${RUSTFLAGS}" \
591 BUILDTARGET="${BUILDTARGET}" \
592 CROSSTARGET="${CROSSTARGET}" \
593 BUILD_ARCH="${BUILD_ARCH}" \
594 BUILD_PLATFORM="${BUILD_PLATFORM}" \
595 CCACHE_DIR=/usr/src/ccache \
596 CCACHE_TEMPDIR="${CCACHE_TEMPDIR}" \
597 CCACHE_COMPRESS="${CCACHE_COMPRESS}" \
598 CCACHE_COMPILERCHECK="${CCACHE_COMPILERCHECK}" \
599 GOCACHE="/usr/src/ccache/go" \
600 KVER="${KVER}" \
601 XZ_OPT="${XZ_OPT}" \
602 DEFAULT_PARALLELISM="${DEFAULT_PARALLELISM}" \
603 SYSTEM_PROCESSORS="${SYSTEM_PROCESSORS}" \
604 SYSTEM_MEMORY="${SYSTEM_MEMORY}" \
605 $(fake_environ) \
606 $(qemu_environ) \
607 "$@"
608 }
609
610 entershell() {
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"
616 local PS1="ipfire build chroot (${BUILD_ARCH}) \u:\w\$ "
617
618 if enterchroot bash -i; then
619 stdumount
620 else
621 print_status FAIL
622 exiterror "chroot error"
623 fi
624 }
625
626 lfsmakecommoncheck() {
627 # Script present?
628 if [ ! -f $BASEDIR/lfs/$1 ]; then
629 exiterror "No such file or directory: $BASEDIR/$1"
630 fi
631
632 # Print package name and version
633 print_package $@
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
640 print_runtime 0
641 print_status SKIP
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
651 print_status SKIP
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
673 lfsmake1() {
674 lfsmakecommoncheck $*
675 [ $? == 1 ] && return 0
676
677 cd $BASEDIR/lfs && env -i \
678 PATH="${TOOLS_DIR}/ccache/bin:${TOOLS_DIR}/bin:$PATH" \
679 CCACHE_DIR="${CCACHE_DIR}" \
680 CCACHE_TEMPDIR="${CCACHE_TEMPDIR}" \
681 CCACHE_COMPRESS="${CCACHE_COMPRESS}" \
682 CCACHE_COMPILERCHECK="${CCACHE_COMPILERCHECK}" \
683 CFLAGS="${CFLAGS}" \
684 CXXFLAGS="${CXXFLAGS}" \
685 DEFAULT_PARALLELISM="${DEFAULT_PARALLELISM}" \
686 SYSTEM_PROCESSORS="${SYSTEM_PROCESSORS}" \
687 SYSTEM_MEMORY="${SYSTEM_MEMORY}" \
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}" \
698 install >> $LOGFILE 2>&1 &
699
700 if ! wait_until_finished $!; then
701 print_status FAIL
702 exiterror "Building $*"
703 fi
704
705 print_status DONE
706 }
707
708 lfsmake2() {
709 lfsmakecommoncheck $*
710 [ $? == 1 ] && return 0
711
712 local PS1='\u:\w$ '
713
714 enterchroot \
715 ${EXTRA_PATH}bash -x -c "cd /usr/src/lfs && \
716 make -f $* \
717 LFS_BASEDIR=/usr/src install" \
718 >> ${LOGFILE} 2>&1 &
719
720 if ! wait_until_finished $!; then
721 print_status FAIL
722 exiterror "Building $*"
723 fi
724
725 print_status DONE
726 }
727
728 ipfiredist() {
729 lfsmakecommoncheck $*
730 [ $? == 1 ] && return 0
731
732 local PS1='\u:\w$ '
733
734 enterchroot \
735 bash -x -c "cd /usr/src/lfs && make -f $* LFS_BASEDIR=/usr/src dist" \
736 >> ${LOGFILE} 2>&1 &
737
738 if ! wait_until_finished $!; then
739 print_status FAIL
740 exiterror "Packaging $*"
741 fi
742
743 print_status DONE
744 }
745
746 wait_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
764 fi
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}
775 }
776
777 fake_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.
784 env="${env} UTS_RELEASE=${KVER}-ipfire"
785
786 # Fake machine version.
787 env="${env} UTS_MACHINE=${BUILD_ARCH}"
788
789 echo "${env}"
790 }
791
792 qemu_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
815 qemu_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
823 x86_64,arm*|x86_64,aarch64|x86_64,riscv64|i?86,arm*|i?86,aarch64|i?86,x86_64)
824 return 0
825 ;;
826 *)
827 return 1
828 ;;
829 esac
830 }
831
832 qemu_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
876 qemu_find_build_helper_name() {
877 local build_arch="${1}"
878
879 local magic
880 case "${build_arch}" in
881 aarch64)
882 magic="7f454c460201010000000000000000000200b700"
883 ;;
884 arm*)
885 magic="7f454c4601010100000000000000000002002800"
886 ;;
887 riscv64)
888 magic="7f454c460201010000000000000000000200f300"
889 ;;
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
917 file_is_static() {
918 local file="${1}"
919
920 file ${file} 2>/dev/null | grep -q "statically linked"
921 }
922
923 update_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
933 contributors() {
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
941 update_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
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}"
955
956 print_status DONE
957 return 0
958 }
959
960 # Default settings
961 CCACHE_CACHE_SIZE="4G"
962 ENABLE_RAMDISK="auto"
963
964 # Load configuration file
965 if [ -f .config ]; then
966 . .config
967 fi
968
969 # TARGET_ARCH is BUILD_ARCH now
970 if [ -n "${TARGET_ARCH}" ]; then
971 BUILD_ARCH="${TARGET_ARCH}"
972 unset TARGET_ARCH
973 fi
974
975 # Get some information about the host system
976 SYSTEM_PROCESSORS="$(system_processors)"
977 SYSTEM_MEMORY="$(system_memory)"
978
979 if [ -n "${BUILD_ARCH}" ]; then
980 configure_build "${BUILD_ARCH}"
981 else
982 configure_build "default"
983 fi
984
985 # Automatically enable/disable ramdisk usage
986 if [ "${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
991 fi
992
993 buildtoolchain() {
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
1014 armv6l:armv6l|armv6l:armv7l|armv6l:aarch64)
1015 # These are working.
1016 ;;
1017 armv6l:*)
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
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
1043 LOGFILE="$BASEDIR/log/_build.toolchain.log"
1044 export LOGFILE
1045
1046 lfsmake1 stage1
1047 lfsmake1 binutils PASS=1
1048 lfsmake1 gcc PASS=1
1049 lfsmake1 linux KCFG="-headers"
1050 lfsmake1 glibc
1051 lfsmake1 libxcrypt
1052 lfsmake1 gcc PASS=L
1053 lfsmake1 zlib
1054 lfsmake1 zstd
1055 lfsmake1 binutils PASS=2
1056 lfsmake1 gcc PASS=2
1057 lfsmake1 ccache
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
1077 lfsmake1 python3
1078 lfsmake1 sed
1079 lfsmake1 tar
1080 lfsmake1 texinfo
1081 lfsmake1 xz
1082 lfsmake1 bison
1083 lfsmake1 flex
1084 lfsmake1 fake-environ
1085 lfsmake1 strip
1086 lfsmake1 cleanup-toolchain
1087 }
1088
1089 buildbase() {
1090 LOGFILE="$BASEDIR/log/_build.base.log"
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
1099 lfsmake2 zstd
1100 lfsmake2 autoconf
1101 lfsmake2 automake
1102 lfsmake2 libtool
1103 lfsmake2 binutils
1104 lfsmake2 gmp
1105 lfsmake2 mpfr
1106 lfsmake2 libmpc
1107 lfsmake2 libxcrypt
1108 lfsmake2 file
1109 lfsmake2 gcc
1110 lfsmake2 sed
1111 lfsmake2 berkeley
1112 lfsmake2 coreutils
1113 lfsmake2 iana-etc
1114 lfsmake2 m4
1115 lfsmake2 bison
1116 lfsmake2 ncurses
1117 lfsmake2 perl
1118 lfsmake2 readline
1119 lfsmake2 bzip2
1120 lfsmake2 xz
1121 lfsmake2 lzip
1122 lfsmake2 pcre
1123 lfsmake2 pcre2
1124 lfsmake2 gettext
1125 lfsmake2 attr
1126 lfsmake2 acl
1127 lfsmake2 bash
1128 lfsmake2 diffutils
1129 lfsmake2 ed
1130 lfsmake2 findutils
1131 lfsmake2 flex
1132 lfsmake2 gawk
1133 lfsmake2 go
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
1143 lfsmake2 pkg-config
1144 lfsmake2 procps
1145 lfsmake2 make
1146 lfsmake2 man
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
1156 lfsmake2 vim
1157 lfsmake2 e2fsprogs
1158 }
1159
1160 buildipfire() {
1161 LOGFILE="$BASEDIR/log/_build.ipfire.log"
1162 export LOGFILE
1163 lfsmake2 configroot
1164 lfsmake2 initscripts
1165 lfsmake2 backup
1166 lfsmake2 openssl
1167 lfsmake2 kmod
1168 lfsmake2 udev
1169 lfsmake2 popt
1170 lfsmake2 libedit
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
1179 lfsmake2 dvb-firmwares
1180 lfsmake2 xr819-firmware
1181 lfsmake2 zd1211-firmware
1182 lfsmake2 rpi-firmware
1183 lfsmake2 intel-microcode
1184 lfsmake2 pcengines-apu-firmware
1185 lfsmake2 bc
1186 lfsmake2 u-boot MKIMAGE=1
1187 lfsmake2 cpio
1188 lfsmake2 mdadm
1189 lfsmake2 dracut
1190 lfsmake2 libaio
1191 lfsmake2 lvm2
1192 lfsmake2 multipath-tools
1193 lfsmake2 freetype
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
1201 lfsmake2 screen
1202 lfsmake2 elfutils
1203
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"
1214 lfsmake2 libgpg-error
1215 lfsmake2 libgcrypt
1216 lfsmake2 libassuan
1217 lfsmake2 nettle
1218 lfsmake2 json-c
1219 lfsmake2 libconfig
1220 lfsmake2 libevent
1221 lfsmake2 libevent2
1222 lfsmake2 expat
1223 lfsmake2 apr
1224 lfsmake2 aprutil
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
1234 lfsmake2 c-ares
1235 lfsmake2 curl
1236 lfsmake2 tcl
1237 lfsmake2 sqlite
1238 lfsmake2 libffi
1239 lfsmake2 python
1240 lfsmake2 python3
1241 lfsmake2 gdb
1242 lfsmake2 grub
1243 lfsmake2 efivar
1244 lfsmake2 efibootmgr
1245 lfsmake2 ca-certificates
1246 lfsmake2 fireinfo
1247 lfsmake2 libnet
1248 lfsmake2 libnl
1249 lfsmake2 libnl-3
1250 lfsmake2 libidn
1251 lfsmake2 nasm
1252 lfsmake2 libarchive
1253 lfsmake2 cmake
1254 lfsmake2 ninja
1255 lfsmake2 meson
1256 lfsmake2 libjpeg
1257 lfsmake2 openjpeg
1258 lfsmake2 libexif
1259 lfsmake2 libpng
1260 lfsmake2 libtiff
1261 lfsmake2 libart
1262 lfsmake2 gd
1263 lfsmake2 slang
1264 lfsmake2 newt
1265 lfsmake2 libsmooth
1266 lfsmake2 libcap
1267 lfsmake2 libcap-ng
1268 lfsmake2 pciutils
1269 lfsmake2 usbutils
1270 lfsmake2 libxml2
1271 lfsmake2 libxslt
1272 lfsmake2 BerkeleyDB
1273 lfsmake2 cyrus-sasl
1274 lfsmake2 openldap
1275 lfsmake2 apache2
1276 lfsmake2 web-user-interface
1277 lfsmake2 flag-icons
1278 lfsmake2 jquery
1279 lfsmake2 bootstrap
1280 lfsmake2 arping
1281 lfsmake2 beep
1282 lfsmake2 libssh
1283 lfsmake2 libinih
1284 lfsmake2 cdrkit
1285 lfsmake2 dosfstools
1286 lfsmake2 reiserfsprogs
1287 lfsmake2 xfsprogs
1288 lfsmake2 sysfsutils
1289 lfsmake2 fuse
1290 lfsmake2 ntfs-3g
1291 lfsmake2 ethtool
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
1299 lfsmake2 perl-Parse-Yapp
1300 lfsmake2 perl-Data-UUID
1301 lfsmake2 gnupg
1302 lfsmake2 hdparm
1303 lfsmake2 sdparm
1304 lfsmake2 whatmask
1305 lfsmake2 libtirpc
1306 lfsmake2 conntrack-tools
1307 lfsmake2 ipaddr
1308 lfsmake2 iputils
1309 lfsmake2 l7-protocols
1310 lfsmake2 hwdata
1311 lfsmake2 logrotate
1312 lfsmake2 logwatch
1313 lfsmake2 misc-progs
1314 lfsmake2 nano
1315 lfsmake2 URI
1316 lfsmake2 perl-CGI
1317 lfsmake2 perl-Switch
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
1335 lfsmake2 Canary-Stability
1336 lfsmake2 Convert-TNEF
1337 lfsmake2 Convert-UUlib
1338 lfsmake2 Archive-Tar
1339 lfsmake2 Archive-Zip
1340 lfsmake2 Text-Tabs+Wrap
1341 lfsmake2 XML-Parser
1342 lfsmake2 Crypt-PasswdMD5
1343 lfsmake2 Net-Telnet
1344 lfsmake2 python-setuptools
1345 lfsmake2 python3-setuptools
1346 lfsmake2 python3-inotify
1347 lfsmake2 python3-docutils
1348 lfsmake2 python3-daemon
1349 lfsmake2 glib
1350 lfsmake2 ntp
1351 lfsmake2 openssh
1352 lfsmake2 fontconfig
1353 lfsmake2 dejavu-fonts-ttf
1354 lfsmake2 ubuntu-font-family
1355 lfsmake2 freefont
1356 lfsmake2 pixman
1357 lfsmake2 cairo
1358 lfsmake2 pango
1359 lfsmake2 rrdtool
1360 lfsmake2 setup
1361 lfsmake2 libdnet
1362 lfsmake2 rust
1363 lfsmake2 jansson
1364 lfsmake2 yaml
1365 lfsmake2 libhtp
1366 lfsmake2 colm
1367 lfsmake2 ragel
1368 lfsmake2 hyperscan
1369 lfsmake2 suricata
1370 lfsmake2 oinkmaster
1371 lfsmake2 ids-ruleset-sources
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
1381 lfsmake2 lz4
1382 lfsmake2 lzo
1383 lfsmake2 openvpn
1384 lfsmake2 mpage
1385 lfsmake2 dbus
1386 lfsmake2 intltool
1387 lfsmake2 libdaemon
1388 lfsmake2 avahi
1389 lfsmake2 cups
1390 lfsmake2 lcms2
1391 lfsmake2 ghostscript
1392 lfsmake2 qpdf
1393 lfsmake2 poppler
1394 lfsmake2 poppler-data
1395 lfsmake2 cups-filters
1396 lfsmake2 epson-inkjet-printer-escpr
1397 lfsmake2 foomatic
1398 lfsmake2 hplip
1399 lfsmake2 cifs-utils
1400 lfsmake2 krb5
1401 lfsmake2 rpcsvc-proto
1402 lfsmake2 samba
1403 lfsmake2 netatalk
1404 lfsmake2 sudo
1405 lfsmake2 mc
1406 lfsmake2 wget
1407 lfsmake2 bridge-utils
1408 lfsmake2 smartmontools
1409 lfsmake2 htop
1410 lfsmake2 chkconfig
1411 lfsmake2 postfix
1412 lfsmake2 fetchmail
1413 lfsmake2 clamav
1414 lfsmake2 perl-NetAddr-IP
1415 lfsmake2 dma
1416 lfsmake2 alsa
1417 lfsmake2 mpfire
1418 lfsmake2 guardian
1419 lfsmake2 libid3tag
1420 lfsmake2 libmad
1421 lfsmake2 libogg
1422 lfsmake2 libvorbis
1423 lfsmake2 flac
1424 lfsmake2 lame
1425 lfsmake2 sox
1426 lfsmake2 soxr
1427 lfsmake2 libshout
1428 lfsmake2 xvid
1429 lfsmake2 libmpeg2
1430 lfsmake2 gnump3d
1431 lfsmake2 rsync
1432 lfsmake2 rpcbind
1433 lfsmake2 keyutils
1434 lfsmake2 libnfsidmap
1435 lfsmake2 nfs
1436 lfsmake2 gnu-netcat
1437 lfsmake2 ncat
1438 lfsmake2 nmap
1439 lfsmake2 etherwake
1440 lfsmake2 bwm-ng
1441 lfsmake2 sysstat
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
1452 lfsmake2 opus
1453 lfsmake2 python3-pyparsing
1454 lfsmake2 spice-protocol
1455 lfsmake2 spice
1456 lfsmake2 sdl
1457 lfsmake2 libusbredir
1458 lfsmake2 libseccomp
1459 lfsmake2 qemu
1460 lfsmake2 netpbm
1461 lfsmake2 netsnmpd
1462 lfsmake2 nagios_nrpe
1463 lfsmake2 nagios-plugins
1464 lfsmake2 icinga
1465 lfsmake2 observium-agent
1466 lfsmake2 ebtables
1467 lfsmake2 faad2
1468 lfsmake2 alac
1469 lfsmake2 ffmpeg
1470 lfsmake2 vdr
1471 lfsmake2 vdr_streamdev
1472 lfsmake2 vdr_epgsearch
1473 lfsmake2 vdr_dvbapi
1474 lfsmake2 vdr_eepg
1475 lfsmake2 w_scan
1476 lfsmake2 mpd
1477 lfsmake2 libmpdclient
1478 lfsmake2 mpc
1479 lfsmake2 perl-Net-CIDR-Lite
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
1491 lfsmake2 syslinux
1492 lfsmake2 tftpd
1493 lfsmake2 cpufrequtils
1494 lfsmake2 gutenprint
1495 lfsmake2 apcupsd
1496 lfsmake2 fireperf
1497 lfsmake2 iperf
1498 lfsmake2 iperf3
1499 lfsmake2 7zip
1500 lfsmake2 lynis
1501 lfsmake2 sshfs
1502 lfsmake2 taglib
1503 lfsmake2 sslh
1504 lfsmake2 perl-gettext
1505 lfsmake2 perl-Sort-Naturally
1506 lfsmake2 vdradmin
1507 lfsmake2 perl-DBI
1508 lfsmake2 perl-DBD-SQLite
1509 lfsmake2 perl-File-ReadBackwards
1510 lfsmake2 openvmtools
1511 lfsmake2 joe
1512 lfsmake2 monit
1513 lfsmake2 nut
1514 lfsmake2 watchdog
1515 lfsmake2 libpri
1516 lfsmake2 usb_modeswitch
1517 lfsmake2 usb_modeswitch_data
1518 lfsmake2 zerofree
1519 lfsmake2 minicom
1520 lfsmake2 ddrescue
1521 lfsmake2 client175
1522 lfsmake2 powertop
1523 lfsmake2 parted
1524 lfsmake2 swig
1525 lfsmake2 u-boot
1526 lfsmake2 u-boot-friendlyarm
1527 lfsmake2 python-typing
1528 lfsmake2 python-m2crypto
1529 lfsmake2 wireless-regdb
1530 lfsmake2 crda
1531 lfsmake2 libsolv
1532 lfsmake2 ddns
1533 lfsmake2 python3-setuptools-scm
1534 lfsmake2 python3-six
1535 lfsmake2 python3-dateutil
1536 lfsmake2 python3-jmespath
1537 lfsmake2 python3-colorama
1538 lfsmake2 python3-yaml
1539 lfsmake2 python3-s3transfer
1540 lfsmake2 python3-rsa
1541 lfsmake2 python3-pyasn1
1542 lfsmake2 python3-urllib3
1543 lfsmake2 python3-botocore
1544 lfsmake2 python3-msgpack
1545 lfsmake2 aws-cli
1546 lfsmake2 transmission
1547 lfsmake2 mtr
1548 lfsmake2 minidlna
1549 lfsmake2 acpid
1550 lfsmake2 fping
1551 lfsmake2 telnet
1552 lfsmake2 xinetd
1553 lfsmake2 stress
1554 lfsmake2 libstatgrab
1555 lfsmake2 sarg
1556 lfsmake2 nginx
1557 lfsmake2 sysbench
1558 lfsmake2 strace
1559 lfsmake2 ltrace
1560 lfsmake2 ipfire-netboot
1561 lfsmake2 lcdproc
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
1571 lfsmake2 wavemon
1572 lfsmake2 iptraf-ng
1573 lfsmake2 iotop
1574 lfsmake2 stunnel
1575 lfsmake2 bacula
1576 lfsmake2 perl-Font-TTF
1577 lfsmake2 perl-IO-String
1578 lfsmake2 perl-PDF-API2
1579 lfsmake2 squid-accounting
1580 lfsmake2 pigz
1581 lfsmake2 tmux
1582 lfsmake2 perl-Text-CSV_XS
1583 lfsmake2 lua
1584 lfsmake2 haproxy
1585 lfsmake2 ipset
1586 lfsmake2 dnsdist
1587 lfsmake2 bird
1588 lfsmake2 frr
1589 lfsmake2 dmidecode
1590 lfsmake2 mcelog
1591 lfsmake2 util-macros
1592 lfsmake2 libpciaccess
1593 lfsmake2 libyajl
1594 lfsmake2 libvirt
1595 lfsmake2 libtalloc
1596 lfsmake2 freeradius
1597 lfsmake2 perl-common-sense
1598 lfsmake2 perl-inotify2
1599 lfsmake2 perl-Net-IP
1600 lfsmake2 wio
1601 lfsmake2 iftop
1602 lfsmake2 mdns-repeater
1603 lfsmake2 i2c-tools
1604 lfsmake2 nss-myhostname
1605 lfsmake2 dehydrated
1606 lfsmake2 shairport-sync
1607 lfsmake2 borgbackup
1608 lfsmake2 lmdb
1609 lfsmake2 knot
1610 lfsmake2 spectre-meltdown-checker
1611 lfsmake2 zabbix_agentd
1612 lfsmake2 flashrom
1613 lfsmake2 firmware-update
1614 lfsmake2 tshark
1615 lfsmake2 speedtest-cli
1616 lfsmake2 rfkill
1617 lfsmake2 amazon-ssm-agent
1618 lfsmake2 libloc
1619 lfsmake2 ncdu
1620 lfsmake2 lshw
1621 lfsmake2 socat
1622 lfsmake2 libcdada
1623 lfsmake2 pmacct
1624 }
1625
1626 buildinstaller() {
1627 # Run installer scripts one by one
1628 LOGFILE="$BASEDIR/log/_build.installer.log"
1629 export LOGFILE
1630 lfsmake2 memtest
1631 lfsmake2 installer
1632 # use toolchain bash for chroot to strip
1633 EXTRA_PATH=${TOOLS_DIR}/bin/ lfsmake2 strip
1634 }
1635
1636 buildpackages() {
1637 LOGFILE="$BASEDIR/log/_build.packages.log"
1638 export LOGFILE
1639 echo "... see detailed log in _build.*.log files" >> $LOGFILE
1640
1641
1642 # Generating list of packages used
1643 print_line "Generating packages list from logs"
1644 rm -f $BASEDIR/doc/packages-list
1645 for i in `ls -1tr $BASEDIR/log/[^_]*`; do
1646 if [ "$i" != "$BASEDIR/log/FILES" -a -n $i ]; then
1647 echo "* `basename $i`" >>$BASEDIR/doc/packages-list
1648 fi
1649 done
1650 echo "== List of softwares used to build $NAME Version: $VERSION ==" > $BASEDIR/doc/packages-list.txt
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$' \
1652 $BASEDIR/doc/packages-list | sort >> $BASEDIR/doc/packages-list.txt
1653 rm -f $BASEDIR/doc/packages-list
1654 # packages-list.txt is ready to be displayed for wiki page
1655 print_status DONE
1656
1657 # Update changelog
1658 cd $BASEDIR
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
1662
1663 # Create images for install
1664 lfsmake2 cdrom
1665
1666 # Check if there is a loop device for building in virtual environments
1667 modprobe loop 2>/dev/null
1668 if [ $BUILD_IMAGES == 1 ] && ([ -e /dev/loop/0 ] || [ -e /dev/loop0 ] || [ -e "/dev/loop-control" ]); then
1669 lfsmake2 flash-images
1670 fi
1671
1672 mv $LFS/install/images/{*.iso,*.img.xz,*.bz2} $BASEDIR >> $LOGFILE 2>&1
1673
1674 ipfirepackages
1675
1676 cd $BASEDIR
1677
1678 # remove not useable iso on armv6l (needed to build flash images)
1679 [ "${BUILD_ARCH}" = "armv6l" ] && rm -rf *.iso
1680
1681 for i in $(ls *.bz2 *.img.xz *.iso 2>/dev/null); do
1682 md5sum $i > $i.md5
1683 done
1684 cd $PWD
1685
1686 # Cleanup
1687 stdumount
1688 rm -rf $BASEDIR/build/tmp/*
1689
1690 cd $PWD
1691 }
1692
1693 ipfirepackages() {
1694 lfsmake2 core-updates
1695
1696 local i
1697 for i in $(find $BASEDIR/config/rootfiles/packages{/${BUILD_ARCH},} -maxdepth 1 -type f); do
1698 i=$(basename ${i})
1699 if [ -e $BASEDIR/lfs/$i ]; then
1700 ipfiredist $i
1701 else
1702 echo -n $i
1703 print_status SKIP
1704 fi
1705 done
1706 test -d $BASEDIR/packages || mkdir $BASEDIR/packages
1707 mv -f $LFS/install/packages/* $BASEDIR/packages >> $LOGFILE 2>&1
1708 rm -rf $BASEDIR/build/install/packages/*
1709 }
1710
1711 while [ $# -gt 0 ]; do
1712 case "${1}" in
1713 --target=*)
1714 configure_build "${1#--target=}"
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
1725 done
1726
1727 # See what we're supposed to do
1728 case "$1" in
1729 build)
1730 START_TIME=$(now)
1731
1732 # Clear screen
1733 ${INTERACTIVE} && clear
1734
1735 PACKAGE="$BASEDIR/cache/toolchains/$SNAME-$VERSION-toolchain-$TOOLCHAINVER-${BUILD_ARCH}.tar.zst"
1736 #only restore on a clean disk
1737 if [ ! -e "${BASEDIR}/build${TOOLS_DIR}/.toolchain-successful" ]; then
1738 if [ ! -n "$PACKAGE" ]; then
1739 print_build_stage "Full toolchain compilation"
1740 prepareenv
1741 buildtoolchain
1742 else
1743 PACKAGENAME=${PACKAGE%.tar.zst}
1744 print_build_stage "Packaged toolchain compilation"
1745 if [ `md5sum $PACKAGE | awk '{print $1}'` == `cat $PACKAGENAME.md5 | awk '{print $1}'` ]; then
1746 tar axf $PACKAGE
1747 prepareenv
1748 else
1749 exiterror "$PACKAGENAME md5 did not match, check downloaded package"
1750 fi
1751 fi
1752 else
1753 prepareenv
1754 fi
1755
1756 print_build_stage "Building LFS"
1757 buildbase
1758
1759 print_build_stage "Building IPFire"
1760 buildipfire
1761
1762 print_build_stage "Building installer"
1763 buildinstaller
1764
1765 print_build_stage "Building packages"
1766 buildpackages
1767
1768 print_build_stage "Checking Logfiles for new Files"
1769
1770 cd $BASEDIR
1771 tools/checknewlog.pl
1772 tools/checkrootfiles
1773 cd $PWD
1774
1775 print_build_summary $(( $(now) - ${START_TIME} ))
1776 ;;
1777 shell)
1778 # enter a shell inside LFS chroot
1779 # may be used to changed kernel settings
1780 prepareenv
1781 entershell
1782 ;;
1783 clean)
1784 print_line "Cleaning build directory..."
1785
1786 for i in `mount | grep $BASEDIR | sed 's/^.*loop=\(.*\))/\1/'`; do
1787 $LOSETUP -d $i 2>/dev/null
1788 done
1789 #for i in `mount | grep $BASEDIR | cut -d " " -f 1`; do
1790 # umount $i
1791 #done
1792 stdumount
1793 for i in `seq 0 7`; do
1794 if ( losetup /dev/loop${i} 2>/dev/null | grep -q "/install/images" ); then
1795 umount /dev/loop${i} 2>/dev/null;
1796 losetup -d /dev/loop${i} 2>/dev/null;
1797 fi;
1798 done
1799 rm -rf $BASEDIR/build
1800 rm -rf $BASEDIR/cdrom
1801 rm -rf $BASEDIR/packages
1802 rm -rf $BASEDIR/log
1803 if [ -h "${TOOLS_DIR}" ]; then
1804 rm -f "${TOOLS_DIR}"
1805 fi
1806 rm -f $BASEDIR/ipfire-*
1807 print_status DONE
1808 ;;
1809 docker)
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 ;;
1823 downloadsrc)
1824 if [ ! -d $BASEDIR/cache ]; then
1825 mkdir $BASEDIR/cache
1826 fi
1827 mkdir -p $BASEDIR/log
1828 echo -e "${BOLD}Preload all source files${NORMAL}" | tee -a $LOGFILE
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
1839 lfsmakecommoncheck ${i} || continue
1840
1841 make -s -f $i LFS_BASEDIR=$BASEDIR BUILD_ARCH="${BUILD_ARCH}" \
1842 MESSAGE="$i\t ($c/$MAX_RETRIES)" download >> $LOGFILE 2>&1
1843 if [ $? -ne 0 ]; then
1844 print_status FAIL
1845 FINISHED=0
1846 else
1847 if [ $c -eq 1 ]; then
1848 print_status DONE
1849 fi
1850 fi
1851 fi
1852 done
1853 done
1854 echo -e "${BOLD}***Verifying md5sums${NORMAL}"
1855 ERROR=0
1856 for i in *; do
1857 if [ -f "$i" -a "$i" != "Config" ]; then
1858 lfsmakecommoncheck ${i} > /dev/null || continue
1859 make -s -f $i LFS_BASEDIR=$BASEDIR BUILD_ARCH="${BUILD_ARCH}" \
1860 MESSAGE="$i\t " md5 >> $LOGFILE 2>&1
1861 if [ $? -ne 0 ]; then
1862 echo -ne "MD5 difference in lfs/$i"
1863 print_status FAIL
1864 ERROR=1
1865 fi
1866 fi
1867 done
1868 if [ $ERROR -eq 0 ]; then
1869 echo -ne "${BOLD}all files md5sum match${NORMAL}"
1870 print_status DONE
1871 else
1872 echo -ne "${BOLD}not all files were correctly download${NORMAL}"
1873 print_status FAIL
1874 fi
1875 cd - >/dev/null 2>&1
1876 ;;
1877 toolchain)
1878 # Clear screen
1879 ${INTERACTIVE} && clear
1880
1881 prepareenv
1882 print_build_stage "Toolchain compilation (${BUILD_ARCH})"
1883 buildtoolchain
1884 echo "`date -u '+%b %e %T'`: Create toolchain image for ${BUILD_ARCH}" | tee -a $LOGFILE
1885 test -d $BASEDIR/cache/toolchains || mkdir -p $BASEDIR/cache/toolchains
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 \
1889 > cache/toolchains/$SNAME-$VERSION-toolchain-$TOOLCHAINVER-${BUILD_ARCH}.md5
1890 stdumount
1891 ;;
1892 gettoolchain)
1893 # arbitrary name to be updated in case of new toolchain package upload
1894 PACKAGE=$SNAME-$VERSION-toolchain-$TOOLCHAINVER-${BUILD_ARCH}
1895 if [ ! -f $BASEDIR/cache/toolchains/$PACKAGE.tar.zst ]; then
1896 URL_TOOLCHAIN=`grep URL_TOOLCHAIN lfs/Config | awk '{ print $3 }'`
1897 test -d $BASEDIR/cache/toolchains || mkdir -p $BASEDIR/cache/toolchains
1898 echo "`date -u '+%b %e %T'`: Load toolchain image for ${BUILD_ARCH}" | tee -a $LOGFILE
1899 cd $BASEDIR/cache/toolchains
1900 wget -U "IPFireSourceGrabber/2.x" $URL_TOOLCHAIN/$PACKAGE.tar.zst $URL_TOOLCHAIN/$PACKAGE.md5 >& /dev/null
1901 if [ $? -ne 0 ]; then
1902 echo "`date -u '+%b %e %T'`: error downloading $PACKAGE toolchain for ${BUILD_ARCH} machine" | tee -a $LOGFILE
1903 else
1904 if [ "`md5sum $PACKAGE.tar.xz | awk '{print $1}'`" = "`cat $PACKAGE.md5 | awk '{print $1}'`" ]; then
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
1909 fi
1910 else
1911 echo "Toolchain is already downloaded. Exiting..."
1912 fi
1913 ;;
1914 uploadsrc)
1915 PWD=`pwd`
1916 if [ -z $IPFIRE_USER ]; then
1917 echo -n "You have to setup IPFIRE_USER first. See .config for details."
1918 print_status FAIL
1919 exit 1
1920 fi
1921
1922 URL_SOURCE=$(grep URL_SOURCE lfs/Config | awk '{ print $3 }')
1923 REMOTE_FILES=$(echo "ls -1" | sftp -C ${IPFIRE_USER}@${URL_SOURCE})
1924
1925 for file in ${BASEDIR}/cache/*; do
1926 [ -d "${file}" ] && continue
1927 grep -q "$(basename ${file})" <<<$REMOTE_FILES && continue
1928 NEW_FILES="$NEW_FILES $file"
1929 done
1930 [ -n "$NEW_FILES" ] && scp -2 $NEW_FILES ${IPFIRE_USER}@${URL_SOURCE}
1931 cd $BASEDIR
1932 cd $PWD
1933 exit 0
1934 ;;
1935 lang)
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
1951 $BASEDIR/tools/check_strings.pl pl > $BASEDIR/doc/language_issues.pl
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
1957 print_status DONE
1958
1959 echo -ne "Updating language lists..."
1960 update_language_list ${BASEDIR}/src/installer/po
1961 update_language_list ${BASEDIR}/src/setup/po
1962 print_status DONE
1963 ;;
1964 update-contributors)
1965 update_contributors
1966 ;;
1967 find-dependencies)
1968 shift
1969 exec "${BASEDIR}/tools/find-dependencies" "${BASEDIR}/build" "$@"
1970 ;;
1971 *)
1972 echo "Usage: $0 {build|changelog|clean|gettoolchain|downloadsrc|shell|sync|toolchain|update-contributors|find-dependencies}"
1973 cat doc/make.sh-usage
1974 ;;
1975 esac
1976