source: jhalfs@ 16cef03

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

Remove legacy: First run of CLFS removal

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