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