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