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