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