source: jhalfs@ 7e0a1b8

ablfs-more legacy trunk
Last change on this file since 7e0a1b8 was f5ecc28, checked in by Pierre Labastie <pierre@…>, 5 years ago

Add code to save work at the end of chapter 5
(and finish the rebuild-makefile change)

  • Property mode set to 100755
File size: 14.3 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
189# Sanity check on the location of $BUILDDIR / $JHALFSDIR
190CWD="$(cd "$(dirname "$0")" && pwd)"
191if [[ $JHALFSDIR == "$CWD" ]]; then
192 echo " The jhalfs source directory conflicts with the jhalfs build directory."
193 echo " Please move the source directory or change the build directory."
194 exit 2
195fi
196
197# Book sources envars
198BRANCH_ID=${BRANCH_ID:=development}
199
200case $BRANCH_ID in
201 development )
202 case $PROGNAME in
203 clfs* ) TREE="" ;;
204 * ) TREE=trunk/BOOK ;;
205 esac
206 LFSVRS=development
207 ;;
208 *EDIT* ) echo " You forgot to set the branch or stable book version."
209 echo " Please rerun make and fix the configuration."
210 exit 2 ;;
211 branch-* )
212 case $PROGNAME in
213 lfs )
214 LFSVRS=${BRANCH_ID}
215 TREE=branches/${BRANCH_ID#branch-}
216 if [ ${BRANCH_ID:7:1} = 6 ]; then
217 TREE=${TREE}/BOOK
218 fi
219 ;;
220 clfs* )
221 LFSVRS=${BRANCH_ID}
222 TREE=${BRANCH_ID#branch-}
223 ;;
224 esac
225 ;;
226 * )
227 case $PROGNAME in
228 lfs )
229 LFSVRS=${BRANCH_ID}
230 TREE=tags/${BRANCH_ID}
231 if (( ${BRANCH_ID:0:1} < 7 )) ; then
232 TREE=${TREE}/BOOK
233 fi
234 ;;
235 hlfs )
236 LFSVRS=${BRANCH_ID}
237 TREE=tags/${BRANCH_ID}/BOOK
238 ;;
239 clfs* )
240 LFSVRS=${BRANCH_ID}
241 TREE=clfs-${BRANCH_ID}
242 ;;
243 * )
244 esac
245 ;;
246esac
247
248# Set the document location...
249BOOK=${BOOK:=$JHALFSDIR/$PROGNAME-$LFSVRS}
250
251
252#--- Envars not sourced from configuration
253# shellcheck disable=SC2034
254case $PROGNAME in
255 clfs ) declare -r GIT="git://git.clfs.org/cross-lfs" ;;
256 clfs2 ) declare -r GIT="git://git.clfs.org/clfs-sysroot" ;;
257 clfs3 ) declare -r GIT="git://git.clfs.org/clfs-embedded" ;;
258 *) declare -r SVN="svn://svn.linuxfromscratch.org" ;;
259esac
260
261declare -r LOG=000-masterscript.log
262# Needed for fetching BLFS book sources when building CLFS
263# shellcheck disable=SC2034
264declare -r SVN_2="svn://svn.linuxfromscratch.org"
265
266# Set true internal variables
267COMMON_DIR="common"
268PACKAGE_DIR=$(echo "$PROGNAME" | tr '[:lower:]' '[:upper:]')
269MODULE=$PACKAGE_DIR/master.sh
270PKGMNGTDIR="pkgmngt"
271# The name packageManager.xml is hardcoded in *.xsl, so no variable.
272
273for file in \
274 "$COMMON_DIR/common-functions" \
275 "$COMMON_DIR/libs/func_book_parser" \
276 "$COMMON_DIR/libs/func_download_pkgs" \
277 "$COMMON_DIR/libs/func_wrt_Makefile" \
278 "$MODULE" ; do
279 load_file "$file"
280done
281
282simple_message "${SD_BORDER}${nl_}"
283
284
285#*******************************************************************#
286LASTERR=2
287for file in \
288 "$COMMON_DIR/libs/func_check_version.sh" \
289 "$COMMON_DIR/libs/func_validate_configs.sh" \
290 "$COMMON_DIR/libs/func_custom_pkgs" ; do
291 load_file "$file"
292done
293unset LASTERR
294
295simple_message "${SD_BORDER}${nl_}"
296simple_message "Checking tools required for jhalfs${nl_}"
297check_alfs_tools
298simple_message "${SD_BORDER}${nl_}"
299
300# blfs-tool envars
301BLFS_TOOL=${BLFS_TOOL:-n}
302if [[ "${BLFS_TOOL}" = "y" ]] ; then
303 simple_message 'Checking supplementary tools for installing BLFS'
304 check_blfs_tools
305 simple_message "${SD_BORDER}${nl_}"
306 BLFS_SVN=${BLFS_SVN:-n}
307 BLFS_WORKING_COPY=${BLFS_WORKING_COPY:-n}
308 BLFS_BRANCH=${BLFS_BRANCH:-n}
309 if [[ "${BLFS_SVN}" = "y" ]]; then
310 BLFS_BRANCH_ID=development
311 BLFS_TREE=trunk/BOOK
312 elif [[ "${BLFS_WORKING_COPY}" = "y" ]]; then
313 if [[ ! -d "$BLFS_WC_LOCATION/postlfs" ]] ; then
314 echo " BLFS tools: This is not a working copy: $BLFS_WC_LOCATION."
315 echo " Please rerun make and fix the configuration."
316 exit 2
317 fi
318 BLFS_TREE=$(cd "$BLFS_WC_LOCATION"; svn info | grep '^URL' | sed 's@.*BLFS/@@')
319 BLFS_BRANCH_ID=$(echo "$BLFS_TREE" | sed -e 's@trunk/BOOK@development@' \
320 -e 's@branches/@branch-@' \
321 -e 's@tags/@@' \
322 -e 's@/BOOK@@')
323 elif [[ "${BLFS_BRANCH}" = "y" ]] ; then
324 case $BLFS_BRANCH_ID in
325 *EDIT* ) echo " You forgot to set the BLFS branch or stable book version."
326 echo " Please rerun make and fix the configuration."
327 exit 2 ;;
328 branch-6.* ) BLFS_TREE=branches/${BLFS_BRANCH_ID#branch-}/BOOK ;;
329 branch-* ) BLFS_TREE=branches/${BLFS_BRANCH_ID#branch-} ;;
330 [isv]* | 6.3* ) BLFS_TREE=tags/${BLFS_BRANCH_ID}/BOOK ;;
331 * ) BLFS_TREE=tags/${BLFS_BRANCH_ID} ;;
332 esac
333 fi
334 load_file "${COMMON_DIR}/libs/func_install_blfs"
335fi
336
337###################################
338### MAIN ###
339###################################
340
341
342validate_config
343echo "${SD_BORDER}${nl_}"
344echo -n "Are you happy with these settings? yes/no (no): "
345read -r ANSWER
346if [ "x$ANSWER" != "xyes" ] ; then
347 echo "${nl_}Rerun make to fix the configuration options.${nl_}"
348 exit
349fi
350echo "${nl_}${SD_BORDER}${nl_}"
351
352# Load additional modules or configuration files based on global settings
353# compare module
354if [[ "$COMPARE" = "y" ]]; then
355 load_file "${COMMON_DIR}/libs/func_compare.sh" 'Loading compare module'
356fi
357#
358# save module
359if [[ "$SAVE_CH5" = "y" ]]; then
360 load_file "${COMMON_DIR}/libs/func_save.sh" 'Loading save module'
361fi
362#
363# optimize module
364if [[ "$OPTIMIZE" != "0" ]]; then
365 load_file optimize/optimize_functions 'Loading optimization module'
366 #
367 # optimize configurations
368 load_file optimize/opt_config 'Loading optimization config'
369 # The number of parallel jobs is taken from configuration now
370 # shellcheck disable=SC2034
371 MAKEFLAGS="-j${N_PARALLEL}"
372 # Validate optimize settings, if required
373 validate_opt_settings
374fi
375#
376
377if [[ "$REBUILD_MAKEFILE" = "n" ]] ; then
378
379# If requested, clean the build directory
380 clean_builddir
381
382 if [[ ! -d $JHALFSDIR ]]; then
383 sudo mkdir -p "$JHALFSDIR"
384 sudo chown "$USER":"$USER" "$JHALFSDIR"
385 fi
386
387# Create $BUILDDIR/sources even though it could be created by get_sources()
388 if [[ ! -d $BUILDDIR/sources ]]; then
389 sudo mkdir -p "$BUILDDIR/sources"
390 sudo chmod a+wt "$BUILDDIR/sources"
391 fi
392
393# Create the log directory
394 if [[ ! -d $LOGDIR ]]; then
395 mkdir "$LOGDIR"
396 fi
397 true >"$LOGDIR/$LOG"
398
399# Copy common helper files
400 cp "$COMMON_DIR"/{makefile-functions,progress_bar.sh} "$JHALFSDIR/"
401
402# Copy needed stylesheets
403 cp "$COMMON_DIR"/{packages.xsl,chroot.xsl,kernfs.xsl} "$JHALFSDIR/"
404
405# Fix the XSL book parser
406 case $PROGNAME in
407 clfs* ) sed 's,FAKEDIR,'"${BOOK}/BOOK"',' "${PACKAGE_DIR}/${XSL}" > "${JHALFSDIR}/${XSL}" ;;
408 lfs | hlfs ) sed 's,FAKEDIR,'"$BOOK"',' "${PACKAGE_DIR}/${XSL}" > "${JHALFSDIR}/${XSL}" ;;
409 * ) ;;
410 esac
411 export XSL=$JHALFSDIR/${XSL}
412
413# Copy packageManager.xml, if needed
414 [[ "$PKGMNGT" = "y" ]] && [[ "$PROGNAME" = "lfs" ]] && {
415 cp "$PKGMNGTDIR/packageManager.xml" "$JHALFSDIR/"
416 cp "$PKGMNGTDIR/packInstall.sh" "$JHALFSDIR/"
417 }
418
419# Copy urls.xsl, if needed
420 [[ "$GETPKG" = "y" ]] && cp "$COMMON_DIR/urls.xsl" "$JHALFSDIR/"
421
422# Always create the test-log directory to allow user to "uncomment" test
423# instructions
424 install -d -m 1777 "$TESTLOGDIR"
425
426# Create the installed-files directory, if needed
427 [[ "$INSTALL_LOG" = "y" ]] && [[ ! -d $FILELOGDIR ]] && install -d -m 1777 "$FILELOGDIR"
428
429# Prepare report creation, if needed
430 if [[ "$REPORT" = "y" ]]; then
431 cp $COMMON_DIR/create-sbu_du-report.sh "$JHALFSDIR/"
432 # After making sure that all looks sane, dump the settings to a file
433 # This file will be used to create the REPORT header
434 validate_config >"$JHALFSDIR/jhalfs.config"
435 fi
436
437# Copy optimize files, if needed
438 [[ "$OPTIMIZE" != "0" ]] && cp optimize/opt_override "$JHALFSDIR/"
439
440# Copy compare files, if needed
441 if [[ "$COMPARE" = "y" ]]; then
442 mkdir -p "$JHALFSDIR/extras"
443 cp extras/* "$JHALFSDIR/extras"
444 fi
445
446# Copy custom tools config files, if requested
447 if [[ "${CUSTOM_TOOLS}" = "y" ]]; then
448 echo "Copying custom tool scripts to $JHALFSDIR"
449 mkdir -p "$JHALFSDIR/custom-commands"
450 cp -f custom/config/* "$JHALFSDIR/custom-commands"
451 fi
452
453# Download or updates the book source
454# Note that all customization to $JHALFSDIR have to be done before this.
455# But the LFS book is needed for BLFS tools.
456 get_book
457 extract_commands
458 echo "${SD_BORDER}${nl_}"
459 cd "$CWD" # the functions above change directory
460
461# Install blfs-tool, if requested.
462 if [[ "${BLFS_TOOL}" = "y" ]] ; then
463 echo Installing BLFS book and tools
464 install_blfs_tools 2>&1 | tee -a "$LOGDIR/$LOG"
465 [[ ${PIPESTATUS[0]} != 0 ]] && exit 1
466 fi
467
468fi
469
470# When regenerating the Makefile, we need to know also the
471# canonical book version
472# shellcheck disable=SC2034
473if [[ "$REBUILD_MAKEFILE" = "y" ]] ; then
474 case $PROGNAME in
475 clfs* )
476 VERSION=$(xmllint --noent "$BOOK/prologue/$ARCH/bookinfo.xml" 2>/dev/null | grep subtitle | sed -e 's/^.*ion //' -e 's/<\/.*//') ;;
477 lfs)
478 if [[ "$INITSYS" = "sysv" ]] ; then
479 VERSION=$(grep 'ENTITY version ' "$BOOK/general.ent" | cut -d\" -f2)
480 else
481 VERSION=$(grep 'ENTITY versiond' "$BOOK/general.ent" | cut -d\" -f2)
482 fi
483 ;;
484 *)
485 VERSION=$(xmllint --noent "$BOOK/prologue/bookinfo.xml" 2>/dev/null | grep subtitle | sed -e 's/^.*ion //' -e 's/<\/.*//') ;;
486 esac
487fi
488
489build_Makefile
490
491echo "${SD_BORDER}${nl_}"
492
493# Check for build prerequisites.
494 echo
495 cd "$CWD"
496 check_prerequisites
497 echo "${SD_BORDER}${nl_}"
498# All is well, run the build (if requested)
499run_make
Note: See TracBrowser for help on using the repository browser.