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