set -e
set -u
set -f
_program_path_find()
{
if [ "${_program_fattening_program_path+set}" = 'set' ]; then
printf '%s\n' "$_program_fattening_program_path"
elif [ "${0%/*}" = "$0" ]; then
if [ -r "$0" ]; then
pwd -P
else
printf '\n'
fi
else
_program_path_find_parentPath()
{
parentPath="${scriptPath%/*}"
if [ -z "$parentPath" ]; then
parentPath='/'
fi
cd "$parentPath" 1>/dev/null
}
if [ "${CDPATH+set}" = 'set' ]; then
unset CDPATH
fi
if command -v realpath 1>/dev/null 2>/dev/null; then
(
scriptPath="$(realpath "$0")"
_program_path_find_parentPath
pwd -P
)
elif command -v readlink 1>/dev/null 2>/dev/null; then
(
scriptPath="$0"
while [ -L "$scriptPath" ]
do
_program_path_find_parentPath
scriptPath="$(readlink "$scriptPath")"
done
_program_path_find_parentPath
pwd -P
)
else
(
scriptPath="$0"
_program_path_find_parentPath
pwd -P
)
fi
fi
}
compile_fail()
{
local message="$1"
printf 'compile-rdma-core:FAIL:%s\n' "$message" 1>&2
exit 1
}
compile_ensureRequiredBinariesArePresent()
{
local reason="$1"
shift 1
local binary
local missing=false
for binary in "$@"
do
if ! command -v "$binary" 1>/dev/null 2>/dev/null; then
printf 'compile-rdma-core:%s\n' "The binary '$binary' needs to be in the path" 1>&2
missing=true
fi
done
if $missing; then
compile_fail "Please make sure that the missing binaries are installed because '$reason'"
fi
}
_compile_prepareForMacOSX_brewInstall()
{
compile_ensureRequiredBinariesArePresent brew
local packageName="$1"
if ! brew ls --versions "$packageName" 1>/dev/null 2>/dev/null; then
brew install "$packageName" 1>&2
fi
}
compile_prepareForMacOSX()
{
_compile_prepareForMacOSX_brewInstall gnu-sed
_compile_prepareForMacOSX_brewInstall grep
_compile_prepareForMacOSX_brewInstall make
_compile_prepareForMacOSX_brewInstall libelf
_compile_prepareForMacOSX_brewInstall coreutils
_compile_prepareForMacOSX_brewInstall lemonrock/musl-cross/musl-cross
_compile_prepareForMacOSX_brewInstall autoconf@2.69
_compile_prepareForMacOSX_brewInstall automake
}
compile_parseCommandLine()
{
case "$#" in
0)
:
;;
1)
case "$1" in
-h|--help)
printf './compile\n'
printf './compile -h|--help\n'
printf 'Pass the environment variable NUM_JOBS to control the number of make jobs\n'
exit 0
;;
*)
compile_fail "Does not take any arguments"
;;
esac
;;
*)
compile_fail "Does not take any arguments"
;;
esac
}
compile_findFolderPaths()
{
programFolderPath="$(_program_path_find)"
cd "$programFolderPath"/../.. 1>/dev/null 2>/dev/null
homeFolderPath="$(pwd)"
cd - 1>/dev/null 2>/dev/null
if [ -z "${CARGO_MANIFEST_DIR+is_unset}" ]; then
export CARGO_MANIFEST_DIR="$homeFolderPath"
printf 'build-under-cargo:%s\n' "Whilst this script (compile) is designed to be run under cargo, it can run independently. We're setting CARGO_MANIFEST_DIR to '$CARGO_MANIFEST_DIR'" 1>&2
fi
compileConfDFolderPath="$CARGO_MANIFEST_DIR"/compile.conf.d
bindgenWrapperConfDFolderPath="$CARGO_MANIFEST_DIR"/bindgen-wrapper.conf.d
if [ -z "${OUT_DIR+is_unset}" ]; then
export OUT_DIR="$bindgenWrapperConfDFolderPath"/temporary
printf 'build-under-cargo:%s\n' "Whilst this script (compile) is designed to be run under cargo, it can run independently. We're setting OUT_DIR to '$OUT_DIR'" 1>&2
fi
}
compile_createRootOutputFolderPath()
{
rootOutputFolderPath="$OUT_DIR"/root
rm -rf "$rootOutputFolderPath"
mkdir -m 0700 -p "$rootOutputFolderPath"/
}
compile_createTemporaryBinariesPath()
{
rm -rf "$additionalPath"
mkdir -m 0700 -p "$additionalPath"
export PATH="$additionalPath":"$PATH"
}
compile_platformSpecificPreparation()
{
compile_ensureRequiredBinariesArePresent uname
platform="$(uname)"
if [ -z "${NUM_JOBS+undefined}" ]; then
numberOfMakeJobs=0
else
numberOfMakeJobs="$NUM_JOBS"
fi
case "$platform" in
Darwin)
compile_prepareForMacOSX
compile_ensureRequiredBinariesArePresent brew
export PATH="$(brew --prefix coreutils)"/libexec/gnubin:"$(brew --prefix gnu-sed)"/libexec/gnubin:"$PATH"
local binary
for binary in grep egrep fgrep
do
ln -s "$(brew --prefix grep)"/bin/g"${binary}" "$additionalPath"/"$binary"
done
muslIncludeFolderPath="$(brew --prefix lemonrock/musl-cross/musl-cross)"/libexec/x86_64-linux-musl/include
targetSysRootFolderPath="$(brew --prefix lemonrock/musl-cross/musl-cross)"/libexec/"$configureHost"
if [ $numberOfMakeJobs -eq 0 ]; then
compile_ensureRequiredBinariesArePresent sysctl
numberOfMakeJobs="$(sysctl -n hw.ncpu)"
fi
;;
Linux)
compile_ensureRequiredBinariesArePresent make sed x86_64-linux-musl-gcc x86_64-linux-musl-ar rm mkdir rsync cat
muslIncludeFolderPath='/usr/include'
targetSysRootFolderPath='/usr'
if [ $numberOfMakeJobs -eq 0 ]; then
compile_ensureRequiredBinariesArePresent grep
numberOfMakeJobs="$(grep -c '^processor' /proc/cpuinfo)"
fi
;;
*)
compile_fail "Only Darwin (Mac OS X) and Linux (specifically, Alpine Linux) are supported at this time"
;;
esac
}
compile_sourceConfigurationFile()
{
local configurationFilePath="$compileConfDFolderPath"/compile.configuration.sh
if [ ! -s "$configurationFilePath" ]; then
build_under_cargo_fail "Configuration file '$configurationFilePath' is not present, not readable or empty"
fi
. "$configurationFilePath"
}
compile_makeCopyToAlter()
{
rsync --archive --quiet --exclude=.git "$CARGO_MANIFEST_DIR"/lib/"$compile_library_name"/ "$rootOutputFolderPath"/
}
compile_patch()
{
if [ -e "$compileConfDFolderPath"/patches ]; then
rsync --archive --quiet "$compileConfDFolderPath"/patches/ "$rootOutputFolderPath"/
fi
}
compile_finish()
{
printf '' >"$rootOutputFolderPath"/.compiled
printf '\n\n\n\nCOMPILE FINISHED\n\n\n' 1>&2
}
compile_main()
{
local configureHost='x86_64-linux-musl'
local compilerPrefix="${configureHost}"-
compile_parseCommandLine "$@"
local programFolderPath
local homeFolderPath
local compileConfDFolderPath
compile_findFolderPaths
local rootOutputFolderPath
compile_createRootOutputFolderPath
local additionalPath="$rootOutputFolderPath"/PATH
compile_createTemporaryBinariesPath
local platform
local muslIncludeFolderPath
local targetSysRootFolderPath
local numberOfMakeJobs
compile_platformSpecificPreparation
local compile_library_name
compile_sourceConfigurationFile
compile_makeCopyToAlter
compile_patch
compile_library
compile_finish
}
compile_main "$@"