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_libfabric_fail()
{
local message="$1"
printf 'compile-libfabric:FAIL:%s\n' "$message" 1>&2
exit 1
}
compile_libfabric_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-libfabric:%s\n' "The binary '$binary' needs to be in the path" 1>&2
missing=true
fi
done
if $missing; then
compile_libfabric_fail "Please make sure that the missing binaries are installed because '$reason'"
fi
}
_compile_libfabric_prepareForMacOSX_brewInstall()
{
compile_libfabric_ensureRequiredBinariesArePresent brew
local packageName="$1"
if ! brew ls --versions "$packageName" 1>/dev/null 2>/dev/null; then
brew install "$packageName" 1>&2
fi
}
compile_libfabric_prepareForMacOSX()
{
_compile_libfabric_prepareForMacOSX_brewInstall gnu-sed
_compile_libfabric_prepareForMacOSX_brewInstall make
_compile_libfabric_prepareForMacOSX_brewInstall libelf
_compile_libfabric_prepareForMacOSX_brewInstall coreutils
_compile_libfabric_prepareForMacOSX_brewInstall FiloSottile/musl-cross/musl-cross
_compile_libfabric_prepareForMacOSX_brewInstall autoconf@2.69
_compile_libfabric_prepareForMacOSX_brewInstall automake@1.15
}
compile_libfabric_parseCommandLine()
{
case "$#" in
0)
:
;;
1)
case "$1" in
-h|--help)
printf './compile-libfabric\n'
printf './compile-libfabric -h|--help\n'
printf 'Pass the environment variable NUM_JOBS to control the number of make jobs\n'
exit 0
;;
*)
compile_libfabric_fail "Does not take any arguments"
;;
esac
;;
*)
compile_libfabric_fail "Does not take any arguments"
;;
esac
}
compile_libfabric_findFolderPaths()
{
programFolderPath="$(_program_path_find)"
cd "$programFolderPath"/.. 1>/dev/null 2>/dev/null
homeFolderPath="$(pwd)"
cd - 1>/dev/null 2>/dev/null
configurationFolderPath="$homeFolderPath"/compile-libfabric.conf.d
}
compile_libfabric_createTemporaryFolder()
{
temporaryFolderPath="$configurationFolderPath"/temporary
rm -rf "$temporaryFolderPath"
mkdir -m 0700 -p "$temporaryFolderPath"
}
compile_libfabric_createTemporaryBinariesPath()
{
rm -rf "$additionalPath"
mkdir -m 0700 -p "$additionalPath"
export PATH="$additionalPath":"$PATH"
}
compile_libfabric_platformSpecificPreparation()
{
compile_libfabric_ensureRequiredBinariesArePresent uname
platform="$(uname)"
if [ -z "${NUM_JOBS+undefined}" ]; then
numberOfMakeJobs=0
else
numberOfMakeJobs="$NUM_JOBS"
fi
case "$platform" in
Darwin)
compile_libfabric_prepareForMacOSX
compile_libfabric_ensureRequiredBinariesArePresent brew
export PATH="$(brew --prefix coreutils)"/libexec/gnubin:"$(brew --prefix gnu-sed)"/libexec/gnubin:"$PATH"
muslIncludeFolderPath="$(brew --prefix musl-cross)"/libexec/x86_64-linux-musl/include
if [ $numberOfMakeJobs -eq 0 ]; then
compile_libfabric_ensureRequiredBinariesArePresent sysctl
numberOfMakeJobs="$(sysctl -n hw.ncpu)"
fi
;;
Linux)
compile_libfabric_ensureRequiredBinariesArePresent make sed x86_64-linux-musl-gcc x86_64-linux-musl-ar rm mkdir rsync cat
muslIncludeFolderPath='/usr/include'
if [ $numberOfMakeJobs -eq 0 ]; then
compile_libfabric_ensureRequiredBinariesArePresent grep
numberOfMakeJobs="$(grep -c '^processor' /proc/cpuinfo)"
fi
;;
*)
compile_libfabric_fail "Only Darwin (Mac OS X) and Linux (specifically, Alpine Linux) are supported at this time"
;;
esac
}
compile_libfabric_makeCopyToAlter()
{
rsync --archive --quiet --exclude=.git "$homeFolderPath"/lib/libfabric/ "$temporaryFolderPath"/
}
compile_libfabric_autoreconf()
{
cd "$temporaryFolderPath" 1>/dev/null 2>/dev/null
autoreconf -ivf
cd - 1>/dev/null 2>/dev/null
}
compile_libfabric_configure()
{
cd "$temporaryFolderPath" 1>/dev/null 2>/dev/null
./configure --prefix=/usr --host="$configureHost" --disable-shared --enable-static --disable-dependency-tracking --enable-embedded --enable-direct=sockets
cd - 1>/dev/null 2>/dev/null
}
compile_libfabric_make()
{
cd "$temporaryFolderPath" 1>/dev/null 2>/dev/null
make -j "$numberOfMakeJobs" 1>&2
make -j "$numberOfMakeJobs" install DESTDIR="$temporaryFolderPath" 1>&2
cd - 1>/dev/null 2>/dev/null
}
compile_libfabric_main()
{
local configureHost='x86_64-linux-musl'
local compilerPrefix="${configureHost}"-
compile_libfabric_parseCommandLine "$@"
local programFolderPath
local homeFolderPath
local configurationFolderPath
compile_libfabric_findFolderPaths
local temporaryFolderPath
compile_libfabric_createTemporaryFolder
local additionalPath="$temporaryFolderPath"/PATH
compile_libfabric_createTemporaryBinariesPath
local platform
local muslIncludeFolderPath
local numberOfMakeJobs
compile_libfabric_platformSpecificPreparation
compile_libfabric_makeCopyToAlter
compile_libfabric_autoreconf
compile_libfabric_configure
compile_libfabric_make
printf '\n\n\nFINISHED\n\n\n' 1>&2
}
compile_libfabric_main "$@"