source: jhalfs@ 1242857

ablfs-more trunk
Last change on this file since 1242857 was 8825e69, checked in by Pierre Labastie <pierre.labastie@…>, 3 years ago

Get completely rid of PROGNAME

There is only one PROGNAME: lfs, so no need for a variable.

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