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