#1775: Add Boost to ET
Reporter: Erik Schnetter Status: new Milestone: ET_2026_05 Version: development version Type: enhancement Priority: minor Component: EinsteinToolkit thorn
Comment (by Roland Haas):
It is possible to interact with make's parallel build system (somewhat): https://www.gnu.org/software/make/manual/html_node/POSIX-Jobserver.html (note that Cactus requires GNU make).
``` #!/bin/bash
# fail on errors, error on unset variable reference set -u -e
# verobse output? if [ ${VERBOSE-no} = yes ]; then set -x fi
# handle -n option to make (do nothing), since make thinks we are a sub-make set -- $MAKEFLAGS if [[ ${#*} -ge 1 ]] && [[ $1 = *n* ]]; then # -n flag passed to make, do nothing exit 0 fi
# parse remaining make arguments MAX_JOBS=1 JOBSERVER_AUTH= for o in "$@"; do case $o in ( --jobserver-auth=* ) JOBSERVER_AUTH=${o#--jobserver-auth=} ;; ( -j* ) MAX_JOBS=${o#-j*} ;; ( -- ) break ;; esac done
# functions to get some job tokens from make function return_tokens() { local JOBSERVER_FILE= if [ -n "$JOBSERVER_AUTH" ] && [ -n "$JOBSERVER_TOKENS" ]; then case $JOBSERVER_AUTH in ( fifo:* ) JOBSERVER_FILE=${JOBSERVER_AUTH#fifo:} ;; ( *,* ) # /dev/fd/ emulated by bash (if not by the OS) JOBSERVER_FILE=/dev/fd/${JOBSERVER_AUTH#*,} # read handle of pipe ;; esac if [ -n "$JOBSERVER_FILE" ]; then echo -n $JOBSERVER_TOKENS >$JOBSERVER_FILE fi fi }
function maybe_get_tokens() { local JOBSERVER_FILE= if [ -n "$JOBSERVER_AUTH" ]; then case $JOBSERVER_AUTH in ( fifo:* ) JOBSERVER_FILE=${JOBSERVER_AUTH#fifo:} ;; ( *,* ) # /dev/fd/ emulated by bash (if not by the OS) JOBSERVER_FILE=/dev/fd/${JOBSERVER_AUTH#%,*} # write handle of pipe ;; esac if [ -n "$JOBSERVER_FILE" ]; then set +e # read sets error code on timeout, which is not an error read -r -N $MAX_JOBS -t 5 JOBSERVER_TOKENS <$JOBSERVER_FILE set -e fi fi }
if [ -n "$MAX_JOBS" ]; then JOBSERVER_TOKENS= # wait for 5 seconds to get up MAX_JOBS tokens (or 1024 if MAX_JOBS is empty) trap return_tokens EXIT maybe_get_tokens # one job is for "free" since it represents this process JOBS_OPT=-j$(( ${#JOBSERVER_TOKENS} + 1 )) else # no maximum JOBS_OPT=-j fi
echo $JOBS_OPT tokens: ${JOBSERVER_TOKENS:-} ```
when declaring the script above a sub-make to make using:
``` all: +@./bjam-test.sh ```
which then produces:
``` haengie2: ~/.../Boost/dist$ make -j5 -f GNUMakefile all -j5 tokens: ++++ haengie2: ~/.../Boost/dist$ make -j1 -f GNUMakefile all -j1 tokens: haengie2: ~/.../Boost/dist$ make -j -f GNUMakefile all -j tokens: haengie2: ~/.../Boost/dist$ make -f GNUMakefile all -j1 tokens: ```
ie constructs a `-j` option for bjam reflection (a subset of) the jobs available to make.
As for tar file size, the best I can do right now is to remove Boost examples, docs, tests etc. then re-compress with `gzip`'s `--rsyncable` option for a ~30MB file size which git can hopefully diff:
``` #!/bin/bash
# this script removes "extra" files from Boost distribution archive to try and # reduce its size. It creates a new zipped archive that may be diff-able for git.
if [ ${#@} -ne 1 ]; then echo >&2 "usage: $0 <tar-file>" exit 1 fi
set -e
FN="$1"
TEMPDIR=`mktemp -d` function cleanup() { rm -r $TEMPDIR } trap cleanup EXIT
tar -xf "$FN" -C $TEMPDIR find $TEMPDIR -depth '(' -name examples -or -name doc -or -name test ')' -print0 | xargs --null rm -r # use gzip's --rsyncable option in hopes that this will let git diff versions # of the tar archive ( cd $TEMPDIR ; tar -c * ) | gzip --rsyncable >${FN%.tar*}-stripped.tar.gz ```
-- Ticket URL: https://bitbucket.org/einsteintoolkit/tickets/issues/1775/add-boost-to-et