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