]>
Commit | Line | Data |
---|---|---|
ca8da28e MT |
1 | #!/bin/bash |
2 | ############################################################################### | |
3 | # # | |
4 | # IPFire.org - A linux based firewall # | |
acef7362 | 5 | # Copyright (C) 2008 Michael Tremer & Christian Schmidt # |
ca8da28e MT |
6 | # # |
7 | # This program is free software: you can redistribute it and/or modify # | |
8 | # it under the terms of the GNU General Public License as published by # | |
9 | # the Free Software Foundation, either version 3 of the License, or # | |
10 | # (at your option) any later version. # | |
11 | # # | |
12 | # This program is distributed in the hope that it will be useful, # | |
13 | # but WITHOUT ANY WARRANTY; without even the implied warranty of # | |
14 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # | |
15 | # GNU General Public License for more details. # | |
16 | # # | |
17 | # You should have received a copy of the GNU General Public License # | |
18 | # along with this program. If not, see <http://www.gnu.org/licenses/>. # | |
19 | # # | |
20 | ############################################################################### | |
21 | ############################################################################### | |
22 | # | |
23 | # System variables | |
24 | # | |
25 | ############################################################################### | |
26 | ||
1ded22cc MT |
27 | PWD=$(pwd) |
28 | BASENAME=$(basename $0) | |
ca8da28e MT |
29 | |
30 | # Debian specific settings | |
31 | if [ ! -e /etc/debian_version ]; then | |
1ded22cc | 32 | FULLPATH=$(which $0) |
ca8da28e MT |
33 | else |
34 | if [ -x /usr/bin/realpath ]; then | |
1ded22cc | 35 | FULLPATH=$(/usr/bin/realpath $0) |
ca8da28e MT |
36 | else |
37 | echo "ERROR: Need to do apt-get install realpath" | |
38 | exit 1 | |
39 | fi | |
40 | fi | |
41 | ||
1ded22cc | 42 | BASEDIR=$(echo $FULLPATH | sed "s/\/$BASENAME//g") |
ca8da28e | 43 | export BASEDIR |
ca8da28e | 44 | |
1ded22cc MT |
45 | . $BASEDIR/tools/make-constants # Load this very early |
46 | . $BASEDIR/tools/make-beautify | |
98be0467 | 47 | |
11f0ec61 | 48 | mkdir $BASEDIR/log_${TARGET}/ 2>/dev/null |
be472d5a | 49 | |
ca8da28e MT |
50 | ################################################################################ |
51 | # # | |
52 | # Necessary shell functions # | |
53 | # # | |
54 | ################################################################################ | |
55 | ||
0cba4dde | 56 | . $BASEDIR/tools/make-buildspy |
38e7c3ac MT |
57 | . $BASEDIR/tools/make-check |
58 | . $BASEDIR/tools/make-batch | |
59 | . $BASEDIR/tools/make-compilers | |
60 | . $BASEDIR/tools/make-git | |
aef37aba | 61 | . $BASEDIR/tools/make-packages |
b07899d1 | 62 | . $BASEDIR/tools/make-rootfiles |
95642cd9 | 63 | . $BASEDIR/tools/make-vm |
e694da34 | 64 | . $BASEDIR/tools/make-cron |
0cba4dde | 65 | |
ca8da28e | 66 | evaluate() { |
da1befdd MT |
67 | RETVAL=$? |
68 | if [ "$RETVAL" -eq "0" ]; then | |
ca8da28e MT |
69 | beautify message DONE |
70 | else | |
ca8da28e | 71 | beautify message FAIL |
ca8da28e | 72 | fi |
da1befdd | 73 | (exit $RETVAL) |
ca8da28e MT |
74 | } |
75 | ||
ca8da28e | 76 | stdumount() { |
4ce0b818 | 77 | sleep 0.3 # Wait one second for finish of processes |
11f0ec61 | 78 | for fs in $(mount | grep $BASEDIR/build_${TARGET} | awk '{print $3}'); do |
1ded22cc | 79 | umount $fs 2>/dev/null; |
ca8da28e MT |
80 | done |
81 | } # End of stdumount() | |
82 | ||
83 | exiterror() { | |
84 | stdumount | |
98be0467 | 85 | dialogerror $* |
4a792716 | 86 | build_spy state error |
5f85db01 MT |
87 | if [ -n "$LOGFILE" ]; then |
88 | echo "$(date -u '+%b %e %T') ERROR: $*" >> $LOGFILE | |
b1d2e219 | 89 | build_spy log $(tail -n16 $LOGFILE | $BASEDIR/tools/base64) |
5f85db01 | 90 | fi |
12b17e35 | 91 | build_spy exit |
98be0467 MT |
92 | touch $FAILED |
93 | rm -f $RUNNING 2>/dev/null | |
ca8da28e MT |
94 | exit 1 |
95 | } # End of exiterror() | |
96 | ||
469d71b4 MT |
97 | logger() { |
98 | local logfile=$LOGFILE | |
99 | case "$1" in | |
100 | --distcc) | |
101 | logfile=$BASEDIR/log_$TARGET/_build.00-distcc.log | |
102 | shift | |
103 | ;; | |
104 | esac | |
105 | echo "$(date -u '+%b %e %T') $*" >> $logfile | |
106 | } | |
107 | ||
ca8da28e MT |
108 | ################################################################################ |
109 | # This is the function that sets the environment of a chroot and enters it # | |
110 | ################################################################################ | |
111 | entershell() { | |
6e0756c3 | 112 | PATH=${TOOLS_DIR}/usr/bin:/bin:/usr/bin:/sbin:/usr/sbin:${TOOLS_DIR}/bin:/usr/${MACHINE_REAL}-linux/bin |
ca8da28e MT |
113 | |
114 | if [ ! -e $LFS/usr/src/lfs/ ]; then | |
115 | exiterror "No such file or directory: $LFS/usr/src/lfs/" | |
116 | fi | |
145db3c5 MT |
117 | |
118 | COMMAND=${@-bash} # Run command, given as parameters. | |
ca8da28e MT |
119 | |
120 | echo -ne "Entering ${BOLD}$MACHINE${NORMAL} LFS chroot, type exit to return to host environment\n" | |
121 | ||
122 | chroot $LFS $TOOLS_DIR/bin/env -i \ | |
123 | HOME=/root \ | |
124 | TERM=$TERM \ | |
acef7362 | 125 | PS1="${BOLD}[chroot-${TARGET}(${MACHINE})]${NORMAL} \u:\w\$ " \ |
ca8da28e MT |
126 | PATH=$PATH \ |
127 | CONFIG_ROOT=${CONFIG_ROOT} \ | |
128 | VERSION=${VERSION} \ | |
129 | NAME=${NAME} \ | |
130 | SNAME=${SNAME} \ | |
131 | SLOGAN="$SLOGAN" \ | |
132 | CCACHE_DIR=/usr/src/ccache \ | |
133 | CCACHE_PREFIX=${CCACHE_PREFIX} \ | |
134 | CCACHE_HASHDIR=${CCACHE_HASHDIR} \ | |
135 | DISTCC_DIR=/usr/src/distcc \ | |
3d84c75d | 136 | PARALLELISMFLAGS=$PARALLELISMFLAGS \ |
ca8da28e MT |
137 | LINKER=$LINKER \ |
138 | TOOLS_DIR=$TOOLS_DIR \ | |
139 | INSTALLER_DIR=$INSTALLER_DIR \ | |
140 | MACHINE="$MACHINE" \ | |
141 | MACHINE_REAL="$MACHINE_REAL" \ | |
acef7362 MT |
142 | CFLAGS="$CFLAGS" \ |
143 | CXXFLAGS="$CXXFLAGS" \ | |
144 | IFS_HOST="$IFS_HOST" \ | |
145 | IFS_TARGET="$IFS_TARGET" \ | |
ca8da28e MT |
146 | KVER=$KVER \ |
147 | STAGE=$STAGE \ | |
148 | STAGE_ORDER=$STAGE_ORDER \ | |
1ded22cc | 149 | LOGFILE=$(echo $LOGFILE | sed "s,$BASEDIR,/usr/src,g") \ |
145db3c5 | 150 | $COMMAND |
ca8da28e MT |
151 | |
152 | if [ $? -ne 0 ]; then | |
153 | exiterror "chroot error" | |
154 | else | |
155 | stdumount | |
156 | fi | |
157 | } # End of entershell() | |
158 | ||
159 | ||
160 | ||
161 | ################################################################################ | |
162 | # Common checking before entering the chroot and compilling # | |
163 | # Return:0 caller can continue # | |
a57b7dd3 MT |
164 | # :1 skip (nothing to do) # |
165 | # or fail if no script file found # | |
ca8da28e MT |
166 | ################################################################################ |
167 | lfsmakecommoncheck() | |
168 | { | |
47815f74 MT |
169 | logger "Building $*" |
170 | build_spy package $1 | |
171 | ||
ca8da28e MT |
172 | # Script present? |
173 | if [ ! -f $BASEDIR/lfs/$1 ]; then | |
a57b7dd3 | 174 | exiterror "No such file or directory: $BASEDIR/lfs/$1" |
ca8da28e MT |
175 | fi |
176 | ||
1ded22cc | 177 | local PKG_VER=$(get_pkg_ver $BASEDIR/lfs/$1) |
ca8da28e MT |
178 | beautify make_pkg "$PKG_VER $*" |
179 | ||
180 | # Script slipped? | |
181 | local i | |
1ded22cc | 182 | for i in $SKIP_PACKAGE_LIST; do |
ca8da28e MT |
183 | if [ "$i" == "$1" ]; then |
184 | beautify result SKIP | |
1ded22cc | 185 | return 1 |
ca8da28e MT |
186 | fi |
187 | done | |
188 | ||
497652cb | 189 | # On debug build, we don't strip |
e694da34 MT |
190 | if [ "$STAGE" != "toolchain" -a \ |
191 | "$1" == "strip" -a "$BUILD_DEBUG" == "1" ]; then | |
497652cb | 192 | beautify result SKIP |
1ded22cc | 193 | return 1 |
497652cb MT |
194 | fi |
195 | ||
4b9c6965 | 196 | # Don't create addons? |
1ded22cc | 197 | local EXTRA=$(grep ^EXTRA $BASEDIR/lfs/$1 | awk '{print $3}') |
05b1236d | 198 | if [ "$EXTRA" == "yes" ] && [ "$BUILD_EXTRAS" == "0" ]; then |
4b9c6965 MT |
199 | beautify result SKIP |
200 | return 1 | |
201 | fi | |
202 | ||
203 | # Don't create debugging tools? | |
1ded22cc | 204 | local DEBUG=$(grep ^DEBUG $BASEDIR/lfs/$1 | awk '{print $3}') |
05b1236d | 205 | if [ "$DEBUG" == "yes" ] && [ "$BUILD_DEBUG" == "0" ]; then |
4b9c6965 MT |
206 | beautify result SKIP |
207 | return 1 | |
208 | fi | |
209 | ||
2a5ec6a1 MT |
210 | # Searching for dependencies |
211 | local found message | |
212 | for dep in $(pkg_deps $1); do | |
213 | found=0 | |
214 | for package in $PACKAGES_DONE; do | |
215 | if [ "$dep" = "$package" ]; then | |
216 | found=1 | |
217 | break | |
218 | fi | |
219 | done | |
220 | [ "$found" = "0" ] && message="$message $dep" | |
221 | done | |
222 | if [ "$message" != "" ]; then | |
223 | message="Deps are missing: $message" | |
224 | if [ "$EXTRA" = "yes" ]; then | |
225 | echo -ne "${WARN}${message}${NORMAL}" | |
226 | beautify message SKIP | |
227 | return 1 | |
228 | else | |
229 | exiterror "$message" | |
230 | fi | |
231 | fi | |
232 | ||
ca8da28e MT |
233 | cd $BASEDIR/lfs && make -s -f $* MACHINE=$MACHINE LFS_BASEDIR=$BASEDIR MESSAGE="$1\t " download >> $LOGFILE 2>&1 |
234 | if [ $? -ne 0 ]; then | |
235 | exiterror "Download error in $1" | |
236 | fi | |
237 | ||
47815f74 | 238 | distcc_reload & |
98be0467 | 239 | |
ca8da28e MT |
240 | return 0 # pass all! |
241 | } # End of lfsmakecommoncheck() | |
242 | ||
243 | ################################################################################ | |
244 | # This is the function that builds every package in stage "toolchain" # | |
245 | ################################################################################ | |
246 | toolchain_make() { | |
247 | lfsmakecommoncheck $* | |
248 | [ $? == 1 ] && return 0 | |
249 | ||
1ded22cc | 250 | local PKG_VER=$(get_pkg_ver $BASEDIR/lfs/$1) |
ca8da28e MT |
251 | |
252 | local EXTRA_MAKE=$EXTRA_MAKE | |
253 | ||
1ded22cc | 254 | local PKG_TIME_START=$(date +%s) |
ca8da28e MT |
255 | cd $BASEDIR/lfs && $EXTRA_MAKE make -f $* \ |
256 | CONFIG_ROOT=$CONFIG_ROOT \ | |
257 | LINKER=$LINKER \ | |
258 | TOOLS_DIR=$TOOLS_DIR \ | |
259 | MACHINE="$MACHINE" \ | |
acef7362 MT |
260 | MACHINE_REAL="$MACHINE_REAL" \ |
261 | IFS_HOST="$IFS_HOST" \ | |
262 | IFS_TARGET="$IFS_TARGET" \ | |
25ff7c90 | 263 | TARGET="$TARGET" \ |
ca8da28e MT |
264 | LFS_BASEDIR=$BASEDIR \ |
265 | LFS=$LFS \ | |
6d18f164 MT |
266 | INSTALLER_DIR=$INSTALLER_DIR \ |
267 | PARALLELISMFLAGS=$PARALLELISMFLAGS \ | |
ca8da28e MT |
268 | KVER=$KVER \ |
269 | STAGE=$STAGE \ | |
270 | STAGE_ORDER=$STAGE_ORDER \ | |
271 | install >> $LOGFILE 2>&1 | |
272 | ||
273 | local COMPILE_SUCCESS=$? | |
1ded22cc | 274 | local PKG_TIME_END=$(date +%s) |
ca8da28e MT |
275 | |
276 | if [ $COMPILE_SUCCESS -ne 0 ]; then | |
277 | beautify result FAIL $[ $PKG_TIME_END - $PKG_TIME_START ] $1 $PKG_VER $STAGE_ORDER $STAGE | |
1ded22cc | 278 | exiterror "Building $*" |
ca8da28e MT |
279 | else |
280 | beautify result DONE $[ $PKG_TIME_END - $PKG_TIME_START ] $1 $PKG_VER $STAGE_ORDER $STAGE | |
7168fbb9 | 281 | PACKAGES_DONE="$PACKAGES_DONE $1" |
ca8da28e MT |
282 | fi |
283 | ||
284 | return 0 | |
285 | } # End of toolchain_make() | |
286 | ||
287 | ################################################################################ | |
10f9531b | 288 | # This is the function that builds every package in stage "base" and "ipfire" # |
ca8da28e MT |
289 | ################################################################################ |
290 | ipfire_make() { | |
291 | lfsmakecommoncheck $* | |
292 | [ $? == 1 ] && return 0 | |
293 | ||
1ded22cc | 294 | local PKG_VER=$(get_pkg_ver $BASEDIR/lfs/$1) |
ca8da28e MT |
295 | |
296 | local EXTRA_MAKE=$EXTRA_MAKE | |
297 | # When cross-compiling, make sure the kernel is compiled for the target | |
298 | [ "$MACHINE" != "$MACHINE_REAL" -a "$1" == "linux" ] && unset EXTRA_MAKE | |
299 | ||
300 | # Also, make sure external kernel modules are compiled 64bit | |
301 | if grep -qEi 'KERNEL_MOD = yes' $1 ; then | |
302 | unset EXTRA_MAKE | |
303 | fi | |
304 | ||
1ded22cc | 305 | local PKG_TIME_START=$(date +%s) |
ca8da28e MT |
306 | chroot $LFS $TOOLS_DIR/bin/env -i \ |
307 | HOME=/root \ | |
308 | TERM=$TERM \ | |
309 | PS1='\u:\w\$ ' \ | |
310 | PATH=$PATH \ | |
311 | CONFIG_ROOT=${CONFIG_ROOT} \ | |
312 | VERSION=${VERSION} \ | |
313 | NAME=${NAME} \ | |
314 | SNAME=${SNAME} \ | |
315 | SLOGAN="$SLOGAN" \ | |
316 | CCACHE_DIR=/usr/src/ccache \ | |
317 | CCACHE_PREFIX=${CCACHE_PREFIX} \ | |
318 | CCACHE_HASHDIR=${CCACHE_HASHDIR} \ | |
319 | DISTCC_DIR=/usr/src/distcc \ | |
3d84c75d | 320 | PARALLELISMFLAGS=$PARALLELISMFLAGS \ |
ca8da28e MT |
321 | LINKER=$LINKER \ |
322 | TOOLS_DIR=$TOOLS_DIR \ | |
323 | INSTALLER_DIR=$INSTALLER_DIR \ | |
31c59de6 MT |
324 | CDROM_DIR=$CDROM_DIR \ |
325 | IMAGES_DIR=$IMAGES_DIR \ | |
ca8da28e MT |
326 | MACHINE="$MACHINE" \ |
327 | MACHINE_REAL="$MACHINE_REAL" \ | |
08be8cf6 MT |
328 | CFLAGS="$CFLAGS" \ |
329 | CXXFLAGS="$CXXFLAGS" \ | |
acef7362 MT |
330 | IFS_HOST="$IFS_HOST" \ |
331 | IFS_TARGET="$IFS_TARGET" \ | |
25ff7c90 | 332 | TARGET="$TARGET" \ |
51d841ec MT |
333 | BUILD_DEBUG=$BUILD_DEBUG \ |
334 | BUILD_EXTRAS=$BUILD_EXTRAS \ | |
ca8da28e MT |
335 | KVER=$KVER \ |
336 | STAGE=$STAGE \ | |
337 | STAGE_ORDER=$STAGE_ORDER \ | |
283eab18 | 338 | EMB=$EMB \ |
0ad657e2 | 339 | IMAGENAME=$IMAGENAME \ |
1ded22cc | 340 | LOGFILE=$(echo $LOGFILE | sed "s,$BASEDIR,/usr/src,g") \ |
ca8da28e MT |
341 | bash -x -c "cd /usr/src/lfs && \ |
342 | $EXTRA_MAKE make -f $* LFS_BASEDIR=/usr/src install" >>$LOGFILE 2>&1 | |
343 | ||
344 | local COMPILE_SUCCESS=$? | |
1ded22cc | 345 | local PKG_TIME_END=$(date +%s) |
ca8da28e MT |
346 | |
347 | if [ $COMPILE_SUCCESS -ne 0 ]; then | |
348 | beautify result FAIL $[ $PKG_TIME_END - $PKG_TIME_START ] $1 $PKG_VER $STAGE_ORDER $STAGE | |
1ded22cc | 349 | exiterror "Building $*" |
ca8da28e MT |
350 | else |
351 | beautify result DONE $[ $PKG_TIME_END - $PKG_TIME_START ] $1 $PKG_VER $STAGE_ORDER $STAGE | |
2a5ec6a1 | 352 | PACKAGES_DONE="$PACKAGES_DONE $1" |
ca8da28e MT |
353 | fi |
354 | ||
355 | return 0 | |
356 | } # End of ipfire_make() | |
357 | ||
ca8da28e MT |
358 | ################################################################################ |
359 | # This prepares the build environment # | |
360 | ################################################################################ | |
361 | prepareenv() { | |
11f0ec61 | 362 | LOGFILE=$BASEDIR/log_${TARGET}/_build.00-preparation.log |
ca8da28e | 363 | export LOGFILE |
11f0ec61 MT |
364 | mkdir -p $BASEDIR/log_${TARGET}/01_toolchain 2>/dev/null |
365 | mkdir -p $BASEDIR/log_${TARGET}/02_base 2>/dev/null | |
366 | mkdir -p $BASEDIR/log_${TARGET}/03_${SNAME} 2>/dev/null | |
367 | mkdir -p $BASEDIR/log_${TARGET}/04_misc 2>/dev/null | |
368 | mkdir -p $BASEDIR/log_${TARGET}/05_installer 2>/dev/null | |
369 | mkdir -p $BASEDIR/log_${TARGET}/06_packages 2>/dev/null | |
ca8da28e MT |
370 | |
371 | ############################################################################# | |
372 | # Are we running the right shell? # | |
373 | ############################################################################# | |
374 | ||
375 | if [ ! "$BASH" ]; then | |
376 | exiterror "BASH environment variable is not set. You're probably running the wrong shell." | |
377 | fi | |
378 | ||
379 | if [ -z "${BASH_VERSION}" ]; then | |
380 | exiterror "Not running BASH shell." | |
381 | fi | |
382 | ||
383 | ############################################################################# | |
384 | # Trap on emergency exit # | |
385 | ############################################################################# | |
386 | trap "exiterror 'Build process interrupted'" SIGINT SIGTERM SIGKILL SIGSTOP SIGQUIT | |
387 | ||
388 | ||
389 | ############################################################################# | |
390 | # Resetting our nice level # | |
391 | ############################################################################# | |
e3d88b86 | 392 | echo -ne "Resetting our nice level to $NICE" |
ca8da28e | 393 | renice $NICE $$ > /dev/null |
1ded22cc | 394 | if [ $(nice) != "$NICE" ]; then |
ca8da28e MT |
395 | beautify message FAIL |
396 | exiterror "Failed to set correct nice level" | |
397 | else | |
398 | beautify message DONE | |
399 | fi | |
400 | ||
401 | # Set SCHED_BATCH | |
7de88c9f | 402 | if [ -x /usr/bin/schedtool ]; then |
7de88c9f | 403 | /usr/bin/schedtool -B $$ |
c90c0df9 MT |
404 | if [ $? -ne 0 ]; then |
405 | echo -ne "Setting kernel schedular to SCHED_BATCH" | |
7de88c9f MT |
406 | beautify message FAIL |
407 | fi | |
408 | fi | |
ca8da28e MT |
409 | |
410 | ############################################################################## | |
411 | # Checking if running as root user # | |
412 | ############################################################################## | |
1ded22cc | 413 | if [ $(id -u) != 0 ]; then |
c90c0df9 | 414 | echo -ne "Checking if we're running as root user" |
ca8da28e MT |
415 | beautify message FAIL |
416 | exiterror "Not building as root" | |
ca8da28e MT |
417 | fi |
418 | ||
419 | ||
420 | ############################################################################## | |
421 | # Checking for necessary temporary space # | |
422 | ############################################################################## | |
1ded22cc MT |
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 }') | |
ca8da28e | 425 | if (( 2048000 > $BASE_ASPACE )); then |
1ded22cc | 426 | BASE_USPACE=$(du -skx $BASEDIR | awk '{print $1}') |
ca8da28e | 427 | if (( 2048000 - $BASE_USPACE > $BASE_ASPACE )); then |
c90c0df9 | 428 | echo -ne "Checking for necessary space on disk $BASE_DEV" |
ca8da28e MT |
429 | beautify message FAIL |
430 | exiterror "Not enough temporary space available, need at least 2GB on $BASE_DEV" | |
431 | fi | |
ca8da28e MT |
432 | fi |
433 | ||
485f0a3b MT |
434 | ############################################################################## |
435 | # Embedded build # | |
436 | ############################################################################## | |
437 | ||
438 | echo -ne "Embedded build" | |
283eab18 | 439 | if [ $EMB -eq 1 ]; then |
485f0a3b MT |
440 | beautify message ON |
441 | check_loop || exiterror "Can't build flash images on this machine." | |
442 | else | |
443 | beautify message OFF | |
444 | fi | |
445 | ||
283eab18 | 446 | export EMB |
485f0a3b | 447 | |
c90c0df9 MT |
448 | ############################################################################## |
449 | # Checking CPU features # | |
450 | ############################################################################## | |
451 | ||
aac56982 MT |
452 | check_supported_target $TARGET || \ |
453 | exiterror "Your host doesn't have all needed cpu features for building \"$TARGET\"" | |
c90c0df9 | 454 | |
ca8da28e MT |
455 | ############################################################################## |
456 | # Building Linux From Scratch system configuration # | |
457 | ############################################################################## | |
458 | ||
459 | # Set umask | |
460 | umask 022 | |
461 | ||
462 | # Set LFS Directory | |
11f0ec61 | 463 | LFS=$BASEDIR/build_${TARGET}/${SNAME} |
ca8da28e MT |
464 | |
465 | # Check /tools symlink | |
466 | if [ -h $TOOLS_DIR ]; then | |
467 | rm -f $TOOLS_DIR | |
468 | fi | |
7de88c9f | 469 | if [ ! -a $TOOLS_DIR ]; then |
11f0ec61 | 470 | ln -s $BASEDIR/build_${TARGET}/$TOOLS_DIR / |
ca8da28e MT |
471 | fi |
472 | if [ ! -h $TOOLS_DIR ]; then | |
473 | exiterror "Could not create $TOOLS_DIR symbolic link." | |
474 | fi | |
475 | ||
476 | # Setup environment | |
477 | set +h | |
478 | LC_ALL=POSIX | |
479 | export LFS LC_ALL | |
480 | unset CC CXX CPP LD_LIBRARY_PATH LD_PRELOAD | |
481 | ||
482 | # Make some extra directories | |
11f0ec61 | 483 | mkdir -p $BASEDIR/build_${TARGET}/{$TOOLS_DIR,cdrom,$INSTALLER_DIR,$IMAGES_DIR} 2>/dev/null |
ca8da28e | 484 | mkdir -p $BASEDIR/{cache,ccache,distcc} 2>/dev/null |
1146889e MT |
485 | mkdir -p $BASEDIR/cache/{toolchains,patches,tarballs} 2>/dev/null |
486 | mkdir -p $LFS/{$TOOLS_DIR,usr/src} 2>/dev/null | |
3de07634 MT |
487 | mkdir -p $LFS/{dev,etc,proc,sys} 2>/dev/null |
488 | mkdir -p $LFS/dev/pts 2>/dev/null | |
11f0ec61 | 489 | mkdir -p $LFS/usr/src/{cache,config,doc,lfs,log_${TARGET},src,ccache,distcc} 2>/dev/null |
3de07634 | 490 | mkdir -p $LFS/{$INSTALLER_DIR,cdrom,images} 2>/dev/null |
ca8da28e MT |
491 | |
492 | mknod -m 600 $BASEDIR/build/dev/console c 5 1 2>/dev/null | |
493 | mknod -m 666 $BASEDIR/build/dev/null c 1 3 2>/dev/null | |
494 | ||
495 | # Make all sources and proc available under lfs build | |
10f9531b MT |
496 | mount --bind /dev $LFS/dev |
497 | mount --bind /proc $LFS/proc | |
3de07634 | 498 | mount --bind /sys $LFS/sys |
10f9531b MT |
499 | mount --bind $BASEDIR/cache $LFS/usr/src/cache |
500 | mount --bind $BASEDIR/ccache $LFS/usr/src/ccache | |
501 | mount --bind $BASEDIR/distcc $LFS/usr/src/distcc | |
502 | mount --bind $BASEDIR/config $LFS/usr/src/config | |
503 | mount --bind $BASEDIR/doc $LFS/usr/src/doc | |
504 | mount --bind $BASEDIR/lfs $LFS/usr/src/lfs | |
11f0ec61 | 505 | mount --bind $BASEDIR/log_${TARGET} $LFS/usr/src/log_${TARGET} |
10f9531b | 506 | mount --bind $BASEDIR/src $LFS/usr/src/src |
11f0ec61 MT |
507 | mount --bind $BASEDIR/build_${TARGET}/$TOOLS_DIR $LFS/$TOOLS_DIR |
508 | mount --bind $BASEDIR/build_${TARGET}/$CDROM_DIR $LFS/$CDROM_DIR | |
509 | mount --bind $BASEDIR/build_${TARGET}/$INSTALLER_DIR $LFS/$INSTALLER_DIR | |
510 | mount --bind $BASEDIR/build_${TARGET}/$IMAGES_DIR $LFS/$IMAGES_DIR | |
ca8da28e | 511 | |
ca8da28e MT |
512 | # Run LFS static binary creation scripts one by one |
513 | export CCACHE_DIR=$BASEDIR/ccache | |
514 | export CCACHE_HASHDIR=1 | |
469d71b4 MT |
515 | export CCACHE_PREFIX="distcc" |
516 | export DISTCC_DIR=$BASEDIR/distcc | |
517 | ||
ca8da28e MT |
518 | # Remove pre-install list of installed files in case user erase some files before rebuild |
519 | rm -f $LFS/usr/src/lsalr 2>/dev/null | |
520 | } | |
521 | ||
cfccf561 | 522 | build() { |
cfccf561 MT |
523 | #a prebuilt toolchain package is only used if found in cache |
524 | if [ ! -d $BASEDIR/cache ]; then | |
c90c0df9 | 525 | exiterror "Use make.sh source get first!" |
ca8da28e | 526 | fi |
cfccf561 | 527 | cd $BASEDIR/cache/toolchains |
1ded22cc | 528 | PACKAGE=$(ls -v -r $TOOLCHAINNAME.tar.bz2 2>/dev/null | head -n 1) |
cfccf561 | 529 | #only restore on a clean disk |
ca8da28e | 530 | |
1ded22cc | 531 | local BLD_TIME_START=$(date +%s) |
4a792716 | 532 | touch $RUNNING; rm -f $FAILED $BUILD_SPY_FILENAME 2>/dev/null |
fb86d09d | 533 | |
acef7362 | 534 | echo -ne "Building for ${BOLD}${TARGET} (${MACHINE}) on ${MACHINE_REAL}${NORMAL}\n" |
fb86d09d | 535 | |
4a792716 MT |
536 | build_spy_send_profile |
537 | build_spy state compiling | |
12b17e35 | 538 | build_spy start |
47eb4a27 MT |
539 | distcc_get_hosts |
540 | ||
11f0ec61 | 541 | if [ -f $BASEDIR/log_${TARGET}/02_base/stage2-LFS ]; then |
cfccf561 MT |
542 | prepareenv |
543 | echo "Using installed toolchain" >> $LOGFILE | |
544 | beautify message DONE "Stage toolchain already built or extracted" | |
545 | else | |
546 | if [ -z "$PACKAGE" ]; then | |
acef7362 | 547 | echo "Full toolchain compilation" |
cfccf561 | 548 | prepareenv |
38e7c3ac | 549 | |
cfccf561 MT |
550 | check_toolchain |
551 | ||
552 | beautify build_stage "Building toolchain" | |
553 | toolchain_build | |
554 | else | |
acef7362 | 555 | echo "Restore from $PACKAGE" |
d4155cdb MT |
556 | cd $BASEDIR && tar jxf $BASEDIR/cache/toolchains/$PACKAGE |
557 | prepareenv | |
cfccf561 MT |
558 | fi |
559 | fi | |
689314ee MT |
560 | |
561 | # Run distcc daemon | |
562 | distccd_start | |
563 | ||
cfccf561 MT |
564 | beautify build_stage "Building base" |
565 | base_build | |
ca8da28e | 566 | |
cfccf561 MT |
567 | beautify build_stage "Building $SNAME" |
568 | ipfire_build | |
ca8da28e | 569 | |
cfccf561 MT |
570 | beautify build_stage "Building miscellaneous" |
571 | misc_build | |
ca8da28e | 572 | |
ccdb935e | 573 | if [ "${EMB}" -eq "0" ]; then |
cfccf561 MT |
574 | beautify build_stage "Building installer" |
575 | installer_build | |
ccdb935e | 576 | fi |
ca8da28e | 577 | |
cfccf561 MT |
578 | beautify build_stage "Building packages" |
579 | packages_build | |
580 | ||
581 | echo "" | |
582 | echo "... and all this hard work for this:" | |
27eac87a | 583 | ls -sh $BASEDIR/${IMAGENAME}.iso |
fb86d09d | 584 | |
1ded22cc | 585 | local BLD_TIME_END=$(date +%s) |
4a792716 MT |
586 | build_spy duration $[ $BLD_TIME_END - $BLD_TIME_START ] |
587 | build_spy state idle | |
12b17e35 | 588 | build_spy exit |
da1befdd | 589 | rm -f $RUNNING |
ca8da28e | 590 | } |
3349c6c9 MT |
591 | |
592 | gettoolchain() { | |
da1befdd | 593 | check_user |
1ded22cc | 594 | DIR_TOOLCHAIN="$BASEDIR/cache/toolchains" |
eac267c0 | 595 | [ -d "${DIR_TOOLCHAIN}" ] || mkdir -p ${DIR_TOOLCHAIN} |
3349c6c9 MT |
596 | if [ ! -f $BASEDIR/cache/toolchains/$TOOLCHAINNAME.tar.bz2 ]; then |
597 | URL_TOOLCHAIN=$(grep URL_TOOLCHAIN lfs/Config | awk '{ print $3 }') | |
598 | DIR_TOOLCHAIN="$BASEDIR/cache/toolchains" | |
599 | ||
11f0ec61 | 600 | echo "Loading toolchain for $TARGET" |
1ded22cc | 601 | scp -2 ${IPFIRE_USER}@${URL_TOOLCHAIN}/$TOOLCHAINNAME.tar.bz2 \ |
da1befdd | 602 | ${DIR_TOOLCHAIN} |
3349c6c9 MT |
603 | else |
604 | echo -n "Toolchain \"$TOOLCHAINNAME\" is already existing" | |
605 | beautify message SKIP | |
606 | fi | |
607 | } | |
da1befdd MT |
608 | |
609 | puttoolchain() { | |
610 | check_user | |
611 | if [ -f $BASEDIR/cache/toolchains/$TOOLCHAINNAME.tar.bz2 ]; then | |
612 | URL_TOOLCHAIN=$(grep URL_TOOLCHAIN lfs/Config | awk '{ print $3 }') | |
613 | DIR_TOOLCHAIN="$BASEDIR/cache/toolchains" | |
614 | ||
11f0ec61 | 615 | echo "Pushing toolchain for $TARGET" |
1ded22cc | 616 | scp -2 ${DIR_TOOLCHAIN}/$TOOLCHAINNAME.tar.bz2 \ |
da1befdd MT |
617 | ${IPFIRE_USER}@${URL_TOOLCHAIN} |
618 | else | |
619 | echo -n "Toolchain \"$TOOLCHAINNAME\" is not existing. " | |
620 | echo -n "Run \"./make.sh build\", first" | |
621 | beautify message SKIP | |
622 | fi | |
623 | } | |
624 | ||
625 | getsource() { | |
626 | if [ ! -d $BASEDIR/cache ]; then | |
627 | mkdir -p $BASEDIR/cache/{tarballs,patches} | |
628 | fi | |
11f0ec61 | 629 | mkdir -p $BASEDIR/log_${TARGET} |
da1befdd MT |
630 | echo -e "${BOLD}Preload all source files${NORMAL}" |
631 | cd $BASEDIR/lfs | |
632 | for i in *; do | |
633 | if [ -f "$i" -a "$i" != "Config" ]; then | |
634 | make -s -f $i \ | |
635 | LFS_BASEDIR=$BASEDIR \ | |
636 | MESSAGE="$i\t" \ | |
dd26ccb3 | 637 | download 2>> $LOGFILE |
da1befdd MT |
638 | [ $? -ne 0 ] && beautify message FAIL |
639 | fi | |
640 | done | |
641 | cd $BASEDIR | |
642 | } | |
643 | ||
644 | putsource() { | |
645 | check_user | |
646 | URL_SOURCE=$(grep URL_SOURCE lfs/Config | awk '{ print $3 }') | |
647 | REMOTE_FILES=$(echo "ls -1" | sftp -C ${IPFIRE_USER}@${URL_SOURCE}) | |
648 | ||
649 | cd $BASEDIR/cache/tarballs/ | |
650 | for file in $(ls -1); do | |
651 | grep -q "$file" <<<$REMOTE_FILES && continue | |
652 | NEW_FILES="$NEW_FILES $file" | |
653 | done | |
1ded22cc | 654 | [ -n "$NEW_FILES" ] && scp -2 $NEW_FILES ${IPFIRE_USER}@${URL_SOURCE} |
da1befdd MT |
655 | cd $BASEDIR |
656 | } | |
e70deaa8 MT |
657 | |
658 | puttarget() { | |
659 | check_user | |
660 | URL_TARGET=$(grep URL_TARGET lfs/Config | awk '{ print $3 }') | |
fd2b3d14 | 661 | DIR="${BASEDIR}/${HOSTNAME}/$(date '+%Y%m%d-%0k')-${TARGET}/" |
e70deaa8 | 662 | |
47778a57 | 663 | # If there is no iso, we do nothing. |
0ad657e2 | 664 | ls ${BASEDIR}/${IMAGENAME}.* &>/dev/null || return 0 |
47778a57 MT |
665 | |
666 | rm -rf ${BASEDIR}/${HOSTNAME} 2>/dev/null | |
e70deaa8 MT |
667 | mkdir -p ${DIR} |
668 | ||
669 | [ -e "${BASEDIR}/packages" ] && cp -al ${BASEDIR}/packages ${DIR} | |
3554fded | 670 | [ -e "${BATCHLOG}" ] && \ |
93cb874d | 671 | python ${BASEDIR}/tools/alog2html < ${BATCHLOG} > ${DIR}/build_log.html |
12b17e35 MT |
672 | pkg_list_packages > ${DIR}/packages-list.txt |
673 | git_log >/dev/null; cp -l ${BASEDIR}/doc/ChangeLog ${DIR} | |
3554fded | 674 | git_export; cp -l ${BASEDIR}/${SNAME}-${VERSION}.source.tar.gz ${DIR} |
896427c7 | 675 | git_diff >/dev/null && cp -l ${DIFF_NAME} ${DIR} |
0ad657e2 | 676 | cp -l ${BASEDIR}/${IMAGENAME}.* ${DIR} |
e70deaa8 MT |
677 | |
678 | cd $BASEDIR && \ | |
1ded22cc | 679 | scp -2 -r ${HOSTNAME} ${IPFIRE_USER}@${URL_TARGET} || : |
e70deaa8 | 680 | |
47778a57 | 681 | rm -rf ${BASEDIR}/${HOSTNAME} 2>/dev/null |
e70deaa8 | 682 | } |