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