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