aboutsummaryrefslogtreecommitdiff
path: root/project
diff options
context:
space:
mode:
Diffstat (limited to 'project')
-rwxr-xr-xproject96
1 files changed, 79 insertions, 17 deletions
diff --git a/project b/project
index 0c65211..c30bfbf 100755
--- a/project
+++ b/project
@@ -3,8 +3,8 @@
# High-level script to manage the project.
# Run './project --help' for a description of how to use it.
#
-# Copyright (C) 2019-2023 Mohammad Akhlaghi <mohammad@akhlaghi.org>
-# Copyright (C) 2021-2023 Raul Infante-Sainz <infantesainz@gmail.com>
+# Copyright (C) 2019-2025 Mohammad Akhlaghi <mohammad@akhlaghi.org>
+# Copyright (C) 2021-2025 Raul Infante-Sainz <infantesainz@gmail.com>
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
@@ -33,10 +33,13 @@ set -e
jobs=0 # 0 is for the default for the 'configure.sh' script.
group=
debug=
+timing=0
host_cc=0
+offline=
operation=
build_dir=
input_dir=
+keep_going=
check_config=
make_targets=
software_dir=
@@ -87,7 +90,7 @@ RECOMMENDATION: If this is the first time you are configuring this
template, please don't use the options and let the script explain each
parameter in full detail by simply running './project configure'.
-Project 'make' special features.
+Project 'make' special tagets
./project make Build the project on one thread
./project make -jN Built the project in parallel on N threads.
./project make clean Clean all files generated by 'make' (not software).
@@ -118,15 +121,18 @@ Configure options:
Configure and Make options:
-d, --debug[=FLAGS] In configure: use -j1, no -k, and no Zenodo check.
In make: 'FLAGS' will be directly passed to 'make'.
+ -k, --keep-going Keep going when some targets can't be made.
-g, --group=STR Build and run with write permissions for a group.
-j, --jobs=INT Number of threads to build/run the software.
-?, --help Print this help list.
Make (analysis) options:
-p, --prepare-redo Re-do preparation (only done automatically once).
+ -t, --timing Starting and ending times written in 'timing.txt'.
Make (final PDF) options:
--refresh-bib Force refresh the bibliography.
+ --highlight-all Activate '--highlight-new' & '--highlight-notes'.
--highlight-new Highlight '\new' parts of text as green.
--highlight-notes Show '\tonote' regions as red text in PDF.
@@ -181,6 +187,8 @@ do
-e*|--existing-conf=*) on_off_option_error --existing-conf -e;;
--host-cc) host_cc=1; shift;;
--host-cc=*) on_off_option_error --host-cc;;
+ --offline) offline=1; shift;;
+ --offline=*) on_off_option_error --offline;;
-i|--input-dir) input_dir="$2"; check_v "$1" "$input_dir"; shift;shift;;
-i=*|--input-dir=*) input_dir="${1#*=}"; check_v "$1" "$input_dir"; shift;;
-i*) input_dir=$(echo "$1" | sed -e's/-i//'); check_v "$1" "$input_dir"; shift;;
@@ -201,15 +209,22 @@ do
-j|--jobs) jobs="$2"; check_v jobs "$jobs"; shift;shift;;
-j=*|--jobs=*) jobs="${1#*=}"; check_v jobs "$jobs"; shift;;
-j*) jobs=$(echo "$1" | sed -e's/-j//'); check_v jobs "$jobs"; shift;;
+ -k|--keep-going) keep_going="--keep-going"; shift;;
+ -k=*|--keep-going=*) on_off_option_error --keep-going -k;;
+ -k*) on_off_option_error --keep-going -k;;
-'?'|--help) print_help; exit 0;;
-'?'*|--help=*) on_off_option_error --help -?;;
- # Make options
- # ------------
- #
- # Note that Make's 'debug' can take values, but when called without any
- # value, it is like giving it a value of 'a'):
+ # Make options (analysis):
+ -p|--prepare-redo) prepare_redo=1; shift;;
+ -p=*|--prepare-redo=*) on_off_option_error --prepare-redo; shift;;
+ -t|--timing) timing=1; shift;;
+ -t=*|--timing=*) on_off_option_error --timing; shift;;
+
+ # Make options (final PDF):
--refresh-bib) [ -f tex/src/references.tex ] && touch tex/src/references.tex; shift;;
+ --highlight-all) highlightnew=1; highlightnotes=1; shift;;
+ --highlight-all=*) on_off_option_error --highlight-new;;
--highlight-new) highlightnew=1; shift;;
--highlight-new=*) on_off_option_error --highlight-new;;
--highlight-notes) highlightnotes=1; shift;;
@@ -218,15 +233,14 @@ do
echo "Please set the operation before calling '--debug'"; exit 1
elif [ x$operation = xconfigure ]; then debug=a; shift;
elif [ x$operation = xmake ]; then
- if [ x"$2" = x ]; then echo "In make-mode, '--debug' needs a value"; exit 1
+ if [ x"$2" = x ]; then
+ echo "In make-mode, '--debug' needs a value; see GNU Make manual"; exit 1
else debug="$2"; check_v debug "$debug"; shift;shift; fi
else
echo "Operation '$operation' not recognized, please use 'configure' or 'make'"
fi;;
-d=*|--debug=*) debug="${1#*=}"; check_v debug "$debug"; shift;;
-d*) debug=$(echo "$1" | sed -e's/-d//'); check_v debug "$debug"; shift;;
- -p|--prepare-redo) prepare_redo=1; shift;;
- -p=*|--prepare-redo=*) on_off_option_error --prepare-redo; shift;;
# Unrecognized option:
-*) echo "$scriptname: unknown option '$1'"; exit 1;;
@@ -379,6 +393,7 @@ EOF
# Run operations in controlled environment
# ----------------------------------------
+perms="u+r,u+w,g+r,g+w,o-r,o-w,o-x"
controlled_env() {
# Get the full address of the build directory:
@@ -390,6 +405,7 @@ controlled_env() {
envmake="$envmake highlightnew=$highlightnew"
envmake="$envmake highlightnotes=$highlightnotes .local/bin/make"
envmake="$envmake --no-builtin-rules --no-builtin-variables -f $1"
+ envmake="$envmake $keep_going"
if ! [ x"$debug" = x ]; then envmake="$envmake --debug=$debug"; fi
# Set the number of jobs. Note that for the 'configure.sh' script the
@@ -412,7 +428,6 @@ controlled_env() {
# Do requested operation
# ----------------------
-perms="u+r,u+w,g+r,g+w,o-r,o-w,o-x"
configscript=./reproduce/software/shell/configure.sh
case $operation in
@@ -433,8 +448,11 @@ case $operation in
# to make sure they have them, we are activating the executable
# flags by default here every time './project configure' is run. If
# any other file in your project needs such flags, add them here.
- chmod +x reproduce/software/shell/* reproduce/software/config/*.sh \
- reproduce/analysis/bash/*
+ if ! [ -x reproduce/software/shell/configure.sh ]; then
+ chmod +x reproduce/analysis/bash/* \
+ reproduce/software/shell/* \
+ reproduce/software/config/*.sh
+ fi
# If the user requested, clean the TeX directory from the extra
# (to-be-built) directories that may already be there (and will not
@@ -447,6 +465,7 @@ case $operation in
export jobs=$jobs
export debug=$debug
export host_cc=$host_cc
+ export offline=$offline
export build_dir=$build_dir
export input_dir=$input_dir
export scriptname=$scriptname
@@ -487,22 +506,62 @@ case $operation in
configuration_necessary
fi
+ # Make sure that the necessary analysis directories directory exist
+ # in the build directory. These will be necessary in various phases
+ # of hte analysis and having them inside the lower-level Make steps
+ # will require setting them as prerequisites for many basic jobs
+ # (thus making the Makefiles harder to read and add potentials for
+ # bugs: forgetting to add them for example). Also, we don't want
+ # the configure phase to make any edits in the analysis directory,
+ # so they are not built there.
+ badir=.build/analysis
+ texdir=$badir/tex
+ mtexdir=$texdir/macros
+ if ! [ -d $badir ]; then mkdir $badir; fi
+ if ! [ -d $texdir ]; then mkdir $texdir; fi
+ if ! [ -d $mtexdir ]; then mkdir $mtexdir; fi
+
+ # TeX build directory. If built in a group scenario, the TeX build
+ # directory must be separate for each member (so they can work on their
+ # relevant parts of the paper without conflicting with each other).
+ if [ "x$maneage_group_name" = x ]; then
+ texbdir="$texdir"/build
+ else
+ user=$(whoami)
+ texbdir="$texdir"/build-$user
+ fi
+ tikzdir="$texbdir"/tikz
+ if ! [ -L tex/build ]; then ln -s "$(pwd -P)/$texdir" tex/build; fi
+ if ! [ -L tex/tikz ]; then ln -s "$(pwd -P)/$tikzdir" tex/tikz; fi
+
+ # Register the start of this run (we are appending the new
+ # information so previous information is preserved until the user
+ # intentionally deletes/cleans it).
+ if [ $timing = 1 ]; then echo "start: $(date)" >> timing.txt; fi
+
# Run data preparation phase (optionally build Makefiles with
# special values for optimizing the main 'top-make.mk'). But note
# that data preparation is only done automatically the first time
- # the project is built (when '.build/software/preparation-done.mk'
+ # the project is built (when '.build/analysis/preparation-done.mk'
# doesn't yet exist). After that, if the user wants to re-do the
# preparation they have to use the '--prepare-redo' option.
- if ! [ -f .build/software/preparation-done.mk ] \
+ if ! [ -f .build/analysis/preparation-done.mk ] \
|| [ x"$prepare_redo" = x1 ]; then
controlled_env reproduce/analysis/make/top-prepare.mk
fi
- # Run the actual project.
+ # Call top-make (highest level analysis Makefile).
controlled_env reproduce/analysis/make/top-make.mk
+
+ # Register the time of the project's ending.
+ if [ $timing = 1 ]; then echo "end: $(date)" >> timing.txt; fi
;;
+
+
+
+ # Interactive shell of Maneage.
shell)
# Make sure the configure script has been completed properly
@@ -538,6 +597,9 @@ case $operation in
;;
+
+
+
# Operation not specified.
*)
cat <<EOF