75 lines
2.4 KiB
Bash
Executable File
75 lines
2.4 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
# SPDX-License-Identifier: GPL-2.0-or-later
|
|
|
|
# This script ensures:
|
|
# - One dependency is built at a time.
|
|
# - That dependency uses all available cores.
|
|
#
|
|
# Without this, simply calling `make -j$(nproc)` from the `${CMAKE_BUILD_DIR}/deps/`
|
|
# directory will build many projects at once.
|
|
#
|
|
# This is undesirable for the following reasons:
|
|
#
|
|
# - The output from projects is mixed together,
|
|
# making it difficult to track down the cause of a build failure.
|
|
#
|
|
# - Larger dependencies such as LLVM can bottleneck the build process,
|
|
# making it necessary to cancel the build and manually run build commands in each directory.
|
|
#
|
|
# - Building many projects at once means canceling (Control-C) can lead to the build being in an undefined state.
|
|
# It's possible canceling happens as a patch is being applied or files are being copied.
|
|
# (steps that aren't part of the compilation process where it's typically safe to cancel).
|
|
|
|
if [[ -z "$MY_MAKE_CALL_LEVEL" ]]; then
|
|
export MY_MAKE_CALL_LEVEL=0
|
|
export MY_MAKEFLAGS=$MAKEFLAGS
|
|
|
|
# Extract the jobs argument (`-jN`, `-j N`, `--jobs=N`).
|
|
add_next=0
|
|
for i in "$@"; do
|
|
case $i in
|
|
-j*)
|
|
export MY_JOBS_ARG=$i
|
|
if [ "$MY_JOBS_ARG" = "-j" ]; then
|
|
add_next=1
|
|
fi
|
|
;;
|
|
--jobs=*)
|
|
shift # past argument=value
|
|
MY_JOBS_ARG=$i
|
|
;;
|
|
*)
|
|
if (( add_next == 1 )); then
|
|
MY_JOBS_ARG="$MY_JOBS_ARG $i"
|
|
add_next=0
|
|
fi
|
|
;;
|
|
esac
|
|
done
|
|
unset i add_next
|
|
|
|
if [[ -z "$MY_JOBS_ARG" ]]; then
|
|
MY_JOBS_ARG="-j$(nproc)"
|
|
fi
|
|
export MY_JOBS_ARG
|
|
# Support user defined `MAKEFLAGS`.
|
|
export MAKEFLAGS="$MY_MAKEFLAGS -j1"
|
|
else
|
|
export MY_MAKE_CALL_LEVEL=$(( MY_MAKE_CALL_LEVEL + 1 ))
|
|
if (( MY_MAKE_CALL_LEVEL == 1 )); then
|
|
# Important to set jobs to 1, otherwise user defined jobs argument is used.
|
|
export MAKEFLAGS="$MY_MAKEFLAGS -j1"
|
|
elif (( MY_MAKE_CALL_LEVEL == 2 )); then
|
|
# This is the level used by each sub-project.
|
|
export MAKEFLAGS="$MY_MAKEFLAGS $MY_JOBS_ARG"
|
|
fi
|
|
# Else leave `MY_MAKEFLAGS` flags as-is, avoids setting a high number of jobs on recursive
|
|
# calls (which may easily run out of memory). Let the job-server handle the rest.
|
|
fi
|
|
|
|
# Useful for troubleshooting the wrapper.
|
|
# echo "Call level: $MY_MAKE_CALL_LEVEL, args=$@".
|
|
|
|
# Call actual make but ensure recursive calls run via this script.
|
|
exec make MAKE="$0" "$@"
|