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