source: jhalfs@ 9f89fae

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

LFS: Simplify git repo management

Use inly one variable, REPO, containing the LFS git repo url. The
BLFS Makefile hardcodes the LFS and BLFS git repo urls, so no need
to pass them.

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