source: jhalfs@ 782a77b

ablfs-more legacy trunk
Last change on this file since 782a77b was f7c6c3c, checked in by Pierre Labastie <pierre@…>, 4 years ago

Allow versions up to 19 for lfs

  • Property mode set to 100755
File size: 14.9 KB
Line 
1#!/bin/bash
2# $Id$
3set -e
4# Pass trap handlers to functions
5set -E
6
7# VT100 colors
8declare -r RED=$'\e[31m'
9declare -r GREEN=$'\e[32m'
10declare -r YELLOW=$'\e[33m'
11
12# shellcheck disable=SC2034
13declare -r BLUE=$'\e[34m'
14declare -r OFF=$'\e[0m'
15declare -r BOLD=$'\e[1m'
16declare -r tab_=$'\t'
17declare -r nl_=$'\n'
18
19# shellcheck disable=SC2034
20declare -r DD_BORDER="${BOLD}==============================================================================${OFF}"
21# shellcheck disable=SC2034
22declare -r SD_BORDER="${BOLD}------------------------------------------------------------------------------${OFF}"
23# shellcheck disable=SC2034
24declare -r STAR_BORDER="${BOLD}******************************************************************************${OFF}"
25
26# bold yellow > < pair
27declare -r R_arrow=$'\e[1;33m>\e[0m'
28declare -r L_arrow=$'\e[1;33m<\e[0m'
29
30
31#>>>>>>>>>>>>>>>ERROR TRAPPING >>>>>>>>>>>>>>>>>>>>
32#-----------------------#
33simple_error() { # Basic error trap.... JUST DIE
34#-----------------------#
35 LASTLINE="$1"
36 LASTERR="$2"
37 LASTSOURCE="$4"
38 error_message "${GREEN} Error $LASTERR at $LASTSOURCE line ${LASTLINE}!"
39}
40
41see_ya() {
42 printf '\n%b%bjhalfs%b exit%b\n' "$L_arrow" "$BOLD" "$R_arrow" "$OFF"
43}
44##### Simple error TRAPS
45# ctrl-c SIGINT
46# ctrl-y
47# ctrl-z SIGTSTP
48# SIGHUP 1 HANGUP
49# SIGINT 2 INTRERRUPT FROM KEYBOARD Ctrl-C
50# SIGQUIT 3
51# SIGKILL 9 KILL
52# SIGTERM 15 TERMINATION
53# SIGSTOP 17,18,23 STOP THE PROCESS
54#####
55set -e
56trap see_ya 0
57trap 'simple_error "${LINENO}" "$?" "${FUNCNAME}" "${BASH_SOURCE}"' ERR
58trap 'echo -e "\n\n${RED}INTERRUPT${OFF} trapped\n" && exit 2' \
59 HUP INT QUIT TERM # STOP stops tterminal output and does not seem to
60 # execute the handler
61#>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
62
63simple_message() {
64 # Prevents having to check $VERBOSITY everywhere
65 if [ "$VERBOSITY" -ne 0 ] ; then
66 # shellcheck disable=SC2059
67 printf "$*"
68 fi
69}
70
71warning_message() {
72 simple_message "${YELLOW}\\nWARNING:${OFF} $*\\n\\n"
73}
74
75error_message() {
76 # Prints an error message and exits with LASTERR or 1
77 if [ -n "$LASTERR" ] ; then
78 LASTERR=$(printf '%d' "$LASTERR")
79 else
80 LASTERR=1
81 fi
82 # If +e then disable text output
83 if [[ "$-" =~ e ]]; then
84 printf '\n\n%bERROR:%b %s\n' "$RED" "$OFF" "$*" >&2
85 fi
86 exit "$LASTERR"
87}
88
89load_file() {
90 # source files in a consistent way with an optional message
91 file="$1"
92 shift
93 msg="Loading file ${file}..."
94 [ -z "$*" ] || msg="$*..."
95 simple_message "$msg"
96
97 # shellcheck disable=SC1090
98 source "$file" 2>/dev/null || error_message "$file did not load"
99 simple_message "OK\\n"
100}
101
102version="
103${BOLD} \"jhalfs\"${OFF} builder tool (development) \$Rev$
104 \$Date$
105
106 Copyright (C) 2005-2019, the jhalfs team:
107 Jeremy Huntwork
108 George Boudreau
109 Manuel Canales Esparcia
110 Thomas Pegg
111 Matthew Burgess
112 Pierre Labastie
113
114 Unless specified, all the files in this directory and its sub-directories
115 are subjected to the ${BOLD}MIT license${OFF}. See the ${BOLD}LICENSE${OFF} file.
116
117 The files in the ${BOLD}menu${OFF} directory are subjected to the ${BOLD}ISC License${OFF}.
118 See ${BOLD}LICENSE.txt${OFF} and ${BOLD}README${OFF} in that directory.
119"
120
121usage="${nl_}${tab_}${BOLD}${RED}This script cannot be called directly${OFF}
122${tab_}Type ${BOLD}make${OFF} to run the tool, or
123${tab_}Type ${BOLD}./jhalfs -v${OFF} to display version information."
124
125case $1 in
126 -v ) echo "$version" && exit ;;
127 run ) : ;;
128 * ) echo "$usage" && exit 1 ;;
129esac
130
131# If the user has not saved his configuration file, let's ask
132# if he or she really wants to run this stuff
133time_current=$(stat -c '%Y' configuration 2>/dev/null || date +%s)
134time_old=$(stat -c '%Y' configuration.old 2>/dev/null || printf '%s' "$time_current")
135if [ "$(printf '%d' "$time_old")" -ge "$(printf '%d' "$time_current")" ] ; then
136 printf 'Do you want to run jhalfs? yes/no (yes): '
137 read -r ANSWER
138 case ${ANSWER:0:1} in
139 n|N) printf "\nExiting gracefully.\n"; exit ;;
140 esac
141fi
142
143# Change this to 0 to suppress almost all messages
144VERBOSITY=1
145
146load_file configuration "Loading config params from <configuration>"
147
148# These are boolean vars generated from Config.in.
149# ISSUE: If a boolean parameter is not set to y(es) there
150# is no variable defined by the menu app. This can
151# cause a headache if you are not aware.
152# The following variables MUST exist. If they don't, the
153# default value is n(o).
154RUNMAKE=${RUNMAKE:-n}
155GETPKG=${GETPKG:-n}
156COMPARE=${COMPARE:-n}
157RUN_ICA=${RUN_ICA:-n}
158PKGMNGT=${PKGMNGT:-n}
159WRAP_INSTALL=${WRAP_INSTALL:-n}
160BOMB_TEST=${BOMB_TEST:-n}
161STRIP=${STRIP:=n}
162REPORT=${REPORT:=n}
163NCURSES5=${NCURSES5:-n}
164DEL_LA_FILES=${DEL_LA_FILES:-n}
165FULL_LOCALE=${FULL_LOCALE:-n}
166GRSECURITY_HOST=${GRSECURITY_HOST:-n}
167CUSTOM_TOOLS=${CUSTOM_TOOLS:-n}
168REBUILD_MAKEFILE=${REBUILD_MAKEFILE:-n}
169INSTALL_LOG=${INSTALL_LOG:-n}
170CLEAN=${CLEAN:=n}
171SET_SSP=${SET_SSP:=n}
172SET_ASLR=${SET_ASLR:=n}
173SET_PAX=${SET_PAX:=n}
174SET_HARDENED_TMP=${SET_HARDENED_TMP:=n}
175SET_WARNINGS=${SET_WARNINGS:=n}
176SET_MISC=${SET_MISC:=n}
177SET_BLOWFISH=${SET_BLOWFISH:=n}
178UNICODE=${UNICODE:=n}
179LOCAL=${LOCAL:=n}
180REALSBU=${REALSBU:=n}
181SAVE_CH5=${SAVE_CH5:=n}
182
183if [[ "${NO_PROGRESS_BAR}" = "y" ]] ; then
184# shellcheck disable=SC2034
185 NO_PROGRESS="#"
186fi
187
188# Sanity check on the location of $BUILDDIR / $JHALFSDIR
189CWD="$(cd "$(dirname "$0")" && pwd)"
190if [[ $JHALFSDIR == "$CWD" ]]; then
191 echo " The jhalfs source directory conflicts with the jhalfs build directory."
192 echo " Please move the source directory or change the build directory."
193 exit 2
194fi
195
196# Book sources envars
197BRANCH_ID=${BRANCH_ID:=development}
198
199case $BRANCH_ID in
200 development )
201 case $PROGNAME in
202 clfs* ) TREE="" ;;
203 * ) TREE=trunk/BOOK ;;
204 esac
205 LFSVRS=development
206 ;;
207 *EDIT* ) echo " You forgot to set the branch or stable book version."
208 echo " Please rerun make and fix the configuration."
209 exit 2 ;;
210 branch-* )
211 case $PROGNAME in
212 lfs )
213 LFSVRS=${BRANCH_ID}
214 TREE=branches/${BRANCH_ID#branch-}
215 if [ ${BRANCH_ID:7:1} = 6 ]; then
216 TREE=${TREE}/BOOK
217 fi
218 ;;
219 clfs* )
220 LFSVRS=${BRANCH_ID}
221 TREE=${BRANCH_ID#branch-}
222 ;;
223 esac
224 ;;
225 * )
226 case $PROGNAME in
227 lfs )
228 LFSVRS=${BRANCH_ID}
229 TREE=tags/${BRANCH_ID}
230 case ${BRANCH_ID:0:2} in
231 [1-9][0-9]) ;;
232 [789]*) ;;
233 *) TREE=${TREE}/BOOK ;;
234 esac
235 ;;
236 hlfs )
237 LFSVRS=${BRANCH_ID}
238 TREE=tags/${BRANCH_ID}/BOOK
239 ;;
240 clfs* )
241 LFSVRS=${BRANCH_ID}
242 TREE=clfs-${BRANCH_ID}
243 ;;
244 * )
245 esac
246 ;;
247esac
248
249# Set the document location...
250BOOK=${BOOK:=$JHALFSDIR/$PROGNAME-$LFSVRS}
251
252
253#--- Envars not sourced from configuration
254# shellcheck disable=SC2034
255case $PROGNAME in
256 clfs ) declare -r GIT="git://git.clfs.org/cross-lfs" ;;
257 clfs2 ) declare -r GIT="git://git.clfs.org/clfs-sysroot" ;;
258 clfs3 ) declare -r GIT="git://git.clfs.org/clfs-embedded" ;;
259 *) declare -r SVN="svn://svn.linuxfromscratch.org" ;;
260esac
261
262declare -r LOG=000-masterscript.log
263# Needed for fetching BLFS book sources when building CLFS
264# shellcheck disable=SC2034
265declare -r SVN_2="svn://svn.linuxfromscratch.org"
266
267# Set true internal variables
268COMMON_DIR="common"
269PACKAGE_DIR=$(echo "$PROGNAME" | tr '[:lower:]' '[:upper:]')
270MODULE=$PACKAGE_DIR/master.sh
271PKGMNGTDIR="pkgmngt"
272# The name packageManager.xml is hardcoded in *.xsl, so no variable.
273
274for file in \
275 "$COMMON_DIR/common-functions" \
276 "$COMMON_DIR/libs/func_book_parser" \
277 "$COMMON_DIR/libs/func_download_pkgs" \
278 "$COMMON_DIR/libs/func_wrt_Makefile" \
279 "$MODULE" ; do
280 load_file "$file"
281done
282
283simple_message "${SD_BORDER}${nl_}"
284
285
286#*******************************************************************#
287LASTERR=2
288for file in \
289 "$COMMON_DIR/libs/func_check_version.sh" \
290 "$COMMON_DIR/libs/func_validate_configs.sh" \
291 "$COMMON_DIR/libs/func_custom_pkgs" ; do
292 load_file "$file"
293done
294unset LASTERR
295
296simple_message "${SD_BORDER}${nl_}"
297simple_message "Checking tools required for jhalfs${nl_}"
298check_alfs_tools
299simple_message "${SD_BORDER}${nl_}"
300
301# blfs-tool envars
302BLFS_TOOL=${BLFS_TOOL:-n}
303if [[ "${BLFS_TOOL}" = "y" ]] ; then
304 simple_message 'Checking supplementary tools for installing BLFS'
305 check_blfs_tools
306 simple_message "${SD_BORDER}${nl_}"
307 BLFS_SVN=${BLFS_SVN:-n}
308 BLFS_WORKING_COPY=${BLFS_WORKING_COPY:-n}
309 BLFS_BRANCH=${BLFS_BRANCH:-n}
310 if [[ "${BLFS_SVN}" = "y" ]]; then
311 BLFS_BRANCH_ID=development
312 BLFS_TREE=trunk/BOOK
313 elif [[ "${BLFS_WORKING_COPY}" = "y" ]]; then
314 if [[ ! -d "$BLFS_WC_LOCATION/postlfs" ]] ; then
315 echo " BLFS tools: This is not a working copy: $BLFS_WC_LOCATION."
316 echo " Please rerun make and fix the configuration."
317 exit 2
318 fi
319 BLFS_TREE=$(cd "$BLFS_WC_LOCATION"; svn info | grep '^URL' | sed 's@.*BLFS/@@')
320 BLFS_BRANCH_ID=$(echo "$BLFS_TREE" | sed -e 's@trunk/BOOK@development@' \
321 -e 's@branches/@branch-@' \
322 -e 's@tags/@@' \
323 -e 's@/BOOK@@')
324 elif [[ "${BLFS_BRANCH}" = "y" ]] ; then
325 case $BLFS_BRANCH_ID in
326 *EDIT* ) echo " You forgot to set the BLFS branch or stable book version."
327 echo " Please rerun make and fix the configuration."
328 exit 2 ;;
329 branch-6.* ) BLFS_TREE=branches/${BLFS_BRANCH_ID#branch-}/BOOK ;;
330 branch-* ) BLFS_TREE=branches/${BLFS_BRANCH_ID#branch-} ;;
331 [isv]* | 6.3* ) BLFS_TREE=tags/${BLFS_BRANCH_ID}/BOOK ;;
332 * ) BLFS_TREE=tags/${BLFS_BRANCH_ID} ;;
333 esac
334 fi
335 load_file "${COMMON_DIR}/libs/func_install_blfs"
336fi
337
338###################################
339### MAIN ###
340###################################
341
342
343validate_config
344echo "${SD_BORDER}${nl_}"
345echo -n "Are you happy with these settings? yes/no (no): "
346read -r ANSWER
347if [ "x$ANSWER" != "xyes" ] ; then
348 echo "${nl_}Rerun make to fix the configuration options.${nl_}"
349 exit
350fi
351echo "${nl_}${SD_BORDER}${nl_}"
352
353# Load additional modules or configuration files based on global settings
354# compare module
355if [[ "$COMPARE" = "y" ]]; then
356 load_file "${COMMON_DIR}/libs/func_compare.sh" 'Loading compare module'
357fi
358#
359# save module
360if [[ "$SAVE_CH5" = "y" ]]; then
361 load_file "${COMMON_DIR}/libs/func_save.sh" 'Loading save module'
362fi
363#
364# optimize module
365if [[ "$OPTIMIZE" != "0" ]]; then
366 load_file optimize/optimize_functions 'Loading optimization module'
367 #
368 # optimize configurations
369 load_file optimize/opt_config 'Loading optimization config'
370 # The number of parallel jobs is taken from configuration now
371 # shellcheck disable=SC2034
372 JH_MAKEFLAGS="-j${N_PARALLEL}"
373 # Validate optimize settings, if required
374 validate_opt_settings
375fi
376#
377
378if [[ "$REBUILD_MAKEFILE" = "n" ]] ; then
379
380# If requested, clean the build directory
381 clean_builddir
382
383 if [[ ! -d $JHALFSDIR ]]; then
384 sudo mkdir -p "$JHALFSDIR"
385 sudo chown "$USER":"$USER" "$JHALFSDIR"
386 fi
387
388# Create $BUILDDIR/sources even though it could be created by get_sources()
389 if [[ ! -d $BUILDDIR/sources ]]; then
390 sudo mkdir -p "$BUILDDIR/sources"
391 sudo chmod a+wt "$BUILDDIR/sources"
392 fi
393
394# Create the log directory
395 if [[ ! -d $LOGDIR ]]; then
396 mkdir "$LOGDIR"
397 fi
398 true >"$LOGDIR/$LOG"
399
400# Copy common helper files
401 cp "$COMMON_DIR"/{makefile-functions,progress_bar.sh} "$JHALFSDIR/"
402
403# Copy needed stylesheets
404 cp "$COMMON_DIR"/{packages.xsl,chroot.xsl,kernfs.xsl} "$JHALFSDIR/"
405
406# Fix the XSL book parser
407 case $PROGNAME in
408 clfs* ) sed 's,FAKEDIR,'"${BOOK}/BOOK"',' "${PACKAGE_DIR}/${XSL}" > "${JHALFSDIR}/${XSL}" ;;
409 lfs | hlfs ) sed 's,FAKEDIR,'"$BOOK"',' "${PACKAGE_DIR}/${XSL}" > "${JHALFSDIR}/${XSL}" ;;
410 * ) ;;
411 esac
412 export XSL=$JHALFSDIR/${XSL}
413
414# Copy packageManager.xml, if needed
415 [[ "$PKGMNGT" = "y" ]] && [[ "$PROGNAME" = "lfs" ]] && {
416 sed s@BOOK@"$BOOK"@ "$PKGMNGTDIR/packageManager.xml" > \
417 "$JHALFSDIR/"packageManager.xml
418 cp "$PKGMNGTDIR/packInstall.sh" "$JHALFSDIR/"
419 }
420
421# Copy urls.xsl, if needed
422 [[ "$GETPKG" = "y" ]] && cp "$COMMON_DIR/urls.xsl" "$JHALFSDIR/"
423
424# Always create the test-log directory to allow user to "uncomment" test
425# instructions
426 install -d -m 1777 "$TESTLOGDIR"
427
428# Create the installed-files directory, if needed
429 [[ "$INSTALL_LOG" = "y" ]] && [[ ! -d $FILELOGDIR ]] && install -d -m 1777 "$FILELOGDIR"
430
431# Prepare report creation, if needed
432 if [[ "$REPORT" = "y" ]]; then
433 cp $COMMON_DIR/create-sbu_du-report.sh "$JHALFSDIR/"
434 # After making sure that all looks sane, dump the settings to a file
435 # This file will be used to create the REPORT header
436 validate_config >"$JHALFSDIR/jhalfs.config"
437 fi
438
439# Copy optimize files, if needed
440 [[ "$OPTIMIZE" != "0" ]] && cp optimize/opt_override "$JHALFSDIR/"
441
442# Copy compare files, if needed
443 if [[ "$COMPARE" = "y" ]]; then
444 mkdir -p "$JHALFSDIR/extras"
445 cp extras/* "$JHALFSDIR/extras"
446 fi
447
448# Copy custom tools config files, if requested
449 if [[ "${CUSTOM_TOOLS}" = "y" ]]; then
450 echo "Copying custom tool scripts to $JHALFSDIR"
451 mkdir -p "$JHALFSDIR/custom-commands"
452 cp -f custom/config/* "$JHALFSDIR/custom-commands"
453 fi
454
455# Download or updates the book source
456# Note that all customization to $JHALFSDIR have to be done before this.
457# But the LFS book is needed for BLFS tools.
458 get_book
459# At this point, we should have a way to know whether we have a cross
460# or regular book... In case of cross, prohibite TEST=3
461# the position of gcc-pass2 (chapter 6 or 5) tells us (not valid for
462# cross-chap5 branch).
463 if (( TEST == 3 )) && \
464 [ -f "$BOOK/chapter06/gcc-pass2.xml" ]; then
465 TEST=2
466 fi
467 extract_commands
468 echo "${SD_BORDER}${nl_}"
469 cd "$CWD" # the functions above change directory
470
471# Install blfs-tool, if requested.
472 if [[ "${BLFS_TOOL}" = "y" ]] ; then
473 echo Installing BLFS book and tools
474 install_blfs_tools 2>&1 | tee -a "$LOGDIR/$LOG"
475 [[ ${PIPESTATUS[0]} != 0 ]] && exit 1
476 fi
477
478fi
479
480# shellcheck disable=SC2034
481if [[ "$REBUILD_MAKEFILE" = "y" ]] ; then
482# Sanity check: users tend to tick "rebuild Makefile"
483# without generating one first. Check we have one:
484 if [ ! -f $MKFILE ]; then
485 set -e
486 error_message "You cannot \"rebuild Makefile\" without first building one"
487 fi
488# When regenerating the Makefile, we need to know also the
489# canonical book version
490 case $PROGNAME in
491 clfs* )
492 VERSION=$(xmllint --noent "$BOOK/prologue/$ARCH/bookinfo.xml" 2>/dev/null | grep subtitle | sed -e 's/^.*ion //' -e 's/<\/.*//') ;;
493 lfs)
494 if [[ "$INITSYS" = "sysv" ]] ; then
495 VERSION=$(grep 'ENTITY version ' "$BOOK/general.ent" | cut -d\" -f2)
496 else
497 VERSION=$(grep 'ENTITY versiond' "$BOOK/general.ent" | cut -d\" -f2)
498 fi
499 ;;
500 *)
501 VERSION=$(xmllint --noent "$BOOK/prologue/bookinfo.xml" 2>/dev/null | grep subtitle | sed -e 's/^.*ion //' -e 's/<\/.*//') ;;
502 esac
503fi
504
505build_Makefile
506
507echo "${SD_BORDER}${nl_}"
508
509# Check for build prerequisites.
510 echo
511 cd "$CWD"
512 check_prerequisites
513 echo "${SD_BORDER}${nl_}"
514# All is well, run the build (if requested)
515run_make
Note: See TracBrowser for help on using the repository browser.