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