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