source: jhalfs@ 950470d

ablfs-more trunk
Last change on this file since 950470d was 4ba94ad, checked in by Pierre Labastie <pierre.labastie@…>, 18 months ago

Update copyright year

  • Property mode set to 100755
File size: 11.7 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-2023, 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}
159STRIP=${STRIP:=n}
160REPORT=${REPORT:=n}
161NCURSES5=${NCURSES5:-n}
162DEL_LA_FILES=${DEL_LA_FILES:-n}
163FULL_LOCALE=${FULL_LOCALE:-n}
164GRSECURITY_HOST=${GRSECURITY_HOST:-n}
165CUSTOM_TOOLS=${CUSTOM_TOOLS:-n}
166REBUILD_MAKEFILE=${REBUILD_MAKEFILE:-n}
167INSTALL_LOG=${INSTALL_LOG:-n}
168CLEAN=${CLEAN:=n}
169SET_SSP=${SET_SSP:=n}
170SET_ASLR=${SET_ASLR:=n}
171SET_PAX=${SET_PAX:=n}
172SET_HARDENED_TMP=${SET_HARDENED_TMP:=n}
173SET_WARNINGS=${SET_WARNINGS:=n}
174SET_MISC=${SET_MISC:=n}
175SET_BLOWFISH=${SET_BLOWFISH:=n}
176UNICODE=${UNICODE:=n}
177LOCAL=${LOCAL:=n}
178REALSBU=${REALSBU:=n}
179SAVE_CH5=${SAVE_CH5:=n}
180
181if [[ "${NO_PROGRESS_BAR}" = "y" ]] ; then
182# shellcheck disable=SC2034
183 NO_PROGRESS="#"
184fi
185
186# Sanity check on the location of $BUILDDIR / $JHALFSDIR
187CWD="$(cd "$(dirname "$0")" && pwd)"
188if [[ $JHALFSDIR == "$CWD" ]]; then
189 echo " The jhalfs source directory conflicts with the jhalfs build directory."
190 echo " Please move the source directory or change the build directory."
191 exit 2
192fi
193
194# Set the document location...
195BOOK=${BOOK:=$JHALFSDIR/book-source}
196
197
198#--- Envars not sourced from configuration
199# shellcheck disable=SC2034
200declare -r REPO=https://git.linuxfromscratch.org/lfs.git
201declare -r LOG=000-masterscript.log
202declare -r COMMANDS=lfs-commands
203
204# Set true internal variables
205COMMON_DIR="common"
206PACKAGE_DIR=LFS
207MODULE=$PACKAGE_DIR/master.sh
208PKGMNGTDIR="pkgmngt"
209# The name packageManager.xml is hardcoded in *.xsl, so no variable.
210
211for file in \
212 "$COMMON_DIR/common-functions" \
213 "$COMMON_DIR/libs/func_book_parser" \
214 "$COMMON_DIR/libs/func_download_pkgs" \
215 "$COMMON_DIR/libs/func_wrt_Makefile" \
216 "$MODULE" ; do
217 load_file "$file"
218done
219
220simple_message "${SD_BORDER}${nl_}"
221
222
223#*******************************************************************#
224LASTERR=2
225for file in \
226 "$COMMON_DIR/libs/func_check_version.sh" \
227 "$COMMON_DIR/libs/func_validate_configs.sh" \
228 "$COMMON_DIR/libs/func_custom_pkgs" ; do
229 load_file "$file"
230done
231unset LASTERR
232
233simple_message "${SD_BORDER}${nl_}"
234simple_message "Checking tools required for jhalfs${nl_}"
235check_alfs_tools
236simple_message "${SD_BORDER}${nl_}"
237
238# blfs-tool envars
239BLFS_TOOL=${BLFS_TOOL:-n}
240if [[ "${BLFS_TOOL}" = "y" ]] ; then
241#not needed now that the check is in alfs_tools
242# simple_message 'Checking supplementary tools for installing BLFS'
243# check_blfs_tools
244 simple_message "${SD_BORDER}${nl_}"
245 BLFS_BRANCH=${BLFS_BRANCH:-n}
246 BLFS_WORKING_COPY=${BLFS_WORKING_COPY:-n}
247 if [[ "${BLFS_WORKING_COPY}" = "y" ]] &&
248 [[ ! -d "$BLFS_WC_LOCATION/postlfs" ]] ; then
249 echo " BLFS tools: This is not a working copy: $BLFS_WC_LOCATION."
250 echo " Please rerun make and fix the configuration."
251 exit 2
252 fi
253 load_file "${COMMON_DIR}/libs/func_install_blfs"
254fi
255
256###################################
257### MAIN ###
258###################################
259
260
261validate_config
262echo "${SD_BORDER}${nl_}"
263echo -n "Are you happy with these settings? yes/no (no): "
264read -r ANSWER
265if [ "x$ANSWER" != "xyes" ] ; then
266 echo "${nl_}Rerun make to fix the configuration options.${nl_}"
267 exit
268fi
269echo "${nl_}${SD_BORDER}${nl_}"
270
271# Load additional modules or configuration files based on global settings
272# compare module
273if [[ "$COMPARE" = "y" ]]; then
274 load_file "${COMMON_DIR}/libs/func_compare.sh" 'Loading compare module'
275fi
276#
277# save module
278if [[ "$SAVE_CH5" = "y" ]]; then
279 load_file "${COMMON_DIR}/libs/func_save.sh" 'Loading save module'
280fi
281#
282# optimize module
283# the optimize_functions file is needed for wrt_makeflags even
284# if optimize=0, because we need to pass NINJAJOBS=1
285load_file optimize/optimize_functions 'Loading optimization module'
286if [[ "$OPTIMIZE" != "0" ]]; then
287 #
288 # optimize configurations
289 load_file optimize/opt_config 'Loading optimization config'
290 # The number of parallel jobs is taken from configuration now
291 # shellcheck disable=SC2034
292 JH_MAKEFLAGS="-j${N_PARALLEL}"
293 # Validate optimize settings, if required
294 validate_opt_settings
295fi
296#
297
298if [[ "$REBUILD_MAKEFILE" = "n" ]] ; then
299
300# If requested, clean the build directory
301 clean_builddir
302
303 if [[ ! -d $JHALFSDIR ]]; then
304 sudo mkdir -p "$JHALFSDIR"
305# Do not assume there is a group named as $USER, do not use
306# $USER:$USER...
307 sudo chown "$USER" "$JHALFSDIR"
308 fi
309
310# Create $BUILDDIR/sources even though it could be created by get_sources()
311 if [[ ! -d $BUILDDIR/sources ]]; then
312 sudo mkdir -p "$BUILDDIR/sources"
313 sudo chmod a+wt "$BUILDDIR/sources"
314 fi
315
316# Create the log directory
317 if [[ ! -d $LOGDIR ]]; then
318 mkdir "$LOGDIR"
319 fi
320 true >"$LOGDIR/$LOG"
321
322# Copy common helper files
323 cp "$COMMON_DIR"/{makefile-functions,progress_bar.sh} "$JHALFSDIR/"
324
325# Copy needed stylesheets
326 cp "$COMMON_DIR"/{packages.xsl,chroot.xsl,kernfs.xsl} "$JHALFSDIR/"
327 cp "$PACKAGE_DIR/$XSL" "$JHALFSDIR/"
328
329 export XSL=$JHALFSDIR/${XSL}
330
331# Copy packageManager.xml, if needed
332 [[ "$PKGMNGT" = "y" ]] && {
333 sed s@BOOK@"$BOOK"@ "$PKGMNGTDIR/packageManager.xml" > \
334 "$JHALFSDIR/"packageManager.xml
335 cp "$PKGMNGTDIR/packInstall.sh" "$JHALFSDIR/"
336 }
337
338# Copy urls.xsl, if needed
339 [[ "$GETPKG" = "y" ]] && cp "$COMMON_DIR/urls.xsl" "$JHALFSDIR/"
340
341# Always create the test-log directory to allow user to "uncomment" test
342# instructions
343 install -d -m 1777 "$TESTLOGDIR"
344
345# Create the installed-files directory, if needed
346 [[ "$INSTALL_LOG" = "y" ]] && [[ ! -d $FILELOGDIR ]] && install -d -m 1777 "$FILELOGDIR"
347
348# Prepare report creation, if needed
349 if [[ "$REPORT" = "y" ]]; then
350 cp $COMMON_DIR/create-sbu_du-report.sh "$JHALFSDIR/"
351 # After making sure that all looks sane, dump the settings to a file
352 # This file will be used to create the REPORT header
353 validate_config >"$JHALFSDIR/jhalfs.config"
354 fi
355
356# Copy optimize files, if needed
357 [[ "$OPTIMIZE" != "0" ]] && cp optimize/opt_override "$JHALFSDIR/"
358
359# Copy compare files, if needed
360 if [[ "$COMPARE" = "y" ]]; then
361 mkdir -p "$JHALFSDIR/extras"
362 cp extras/* "$JHALFSDIR/extras"
363 fi
364
365# Copy custom tools config files, if requested
366 if [[ "${CUSTOM_TOOLS}" = "y" ]]; then
367 echo "Copying custom tool scripts to $JHALFSDIR"
368 mkdir -p "$JHALFSDIR/custom-commands"
369 cp -f custom/config/* "$JHALFSDIR/custom-commands"
370 fi
371
372# Download or updates the book source
373# Note that all customization to $JHALFSDIR have to be done before this.
374# But the LFS book is needed for BLFS tools.
375 get_book
376 extract_commands
377 echo "${SD_BORDER}${nl_}"
378 cd "$CWD" # the functions above change directory
379
380# Install blfs-tool, if requested.
381 if [[ "${BLFS_TOOL}" = "y" ]] ; then
382 echo Installing BLFS book and tools
383 install_blfs_tools 2>&1 | tee -a "$LOGDIR/$LOG"
384 [[ ${PIPESTATUS[0]} != 0 ]] && exit 1
385 fi
386
387fi
388
389# shellcheck disable=SC2034
390if [[ "$REBUILD_MAKEFILE" = "y" ]] ; then
391# Sanity check: users tend to tick "rebuild Makefile"
392# without generating one first. Check we have one:
393 if [ ! -f $MKFILE ]; then
394 set -e
395 error_message "You cannot \"rebuild Makefile\" without first building one"
396 fi
397# When regenerating the Makefile, we need to know also the
398# canonical book version
399VERSION=$(grep 'echo.*lfs-release' "$JHALFSDIR/prbook.xml" | sed 's/.*echo[ ]*\([^ ]*\).*/\1/')
400fi
401
402build_Makefile
403
404echo "${SD_BORDER}${nl_}"
405
406# Check for build prerequisites.
407 echo
408 cd "$CWD"
409 check_prerequisites
410 echo "${SD_BORDER}${nl_}"
411# All is well, run the build (if requested)
412run_make
Note: See TracBrowser for help on using the repository browser.