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