Newer
Older
#!/bin/bash
BUILD_THREADS="$(grep -c processor /proc/cpuinfo)"
BUILD_DIR=
BUILD_MODE=
BUILD_SYSTEM=
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
is_installed() {
FOUND=0
for dep in "$@"; do
if command -v "$dep" >/dev/null 2>/dev/null; then
FOUND=1
break
fi
done
if [[ $FOUND -eq 0 ]]; then
echo "Could not find (at least one of) the following dependencies: $@" >&2
return 1
else
return 0
fi
}
installed_or_exit() {
if ! is_installed "$@"; then
exit 1
fi
}
get_buildsystem() {
is_installed "ninja" && { echo "ninja"; return 0; }
is_installed "make" && { echo "make"; return 0; }
}
usage_and_exit() {
cat >&2 << EOF
Usage: $0 -d DIRECTORY -m MODE [-j THREADS]
$0 debug [-j THREADS] ( shortcut for => $0 -d debug -m Debug [-j THREADS] )
$0 release [-j THREADS] ( shortcut for => $0 -d release -m Release [-j THREADS] )
$0 snapshot [-j THREADS] ( shortcut for => $0 -d snapshot -m Snapshot [-j THREADS] )
Algorithms Library Core builder helper script.
Arguments:
-d DIRECTORY Build directory (relative to ALT root)
-m MODE 'Release' or 'Debug' or 'Snapshot'
-j THREADS Number of build threads. Default: Number of CPU cores ($(grep -c processor /proc/cpuinfo))
EOF
exit 1
}
installed_or_exit "python3"
installed_or_exit "cmake"
installed_or_exit "make" "ninja"
# check if shortcut
ARGS_SHORTCUT=
if [[ $# -ge 1 ]] && [[ $1 == "release" || $1 == "debug" || $1 == "snapshot" ]]; then
if [[ $1 == "release" ]]; then
BUILD_DIR="release"
BUILD_MODE="Release"
elif [[ $1 == "snapshot" ]]; then
BUILD_DIR="snapshot"
BUILD_MODE="Snapshot"
elif [[ $1 == "debug" ]]; then
BUILD_DIR="debug"
BUILD_MODE="Debug"
fi
shift
fi
case "$arg" in
d)
[[ ! -z $ARGS_SHORTCUT ]] && usage_and_exit
BUILD_DIR=${OPTARG}
;;
m)
[[ ! -z $ARGS_SHORTCUT ]] && usage_and_exit
TMP=$(echo "$OPTARG" | tr '[:upper:]' '[:lower:]')
if [[ "$TMP" == "debug" ]]; then
BUILD_MODE="Debug"
elif [[ "$TMP" == "release" ]]; then
BUILD_MODE="Release"
elif [[ "$TMP" == "snapshot" ]]; then
BUILD_MODE="Snapshot"
else
usage_and_exit
fi
;;
j)
if [[ "${OPTARG}" =~ ^[1-9][0-9]* ]]; then
BUILD_THREADS="${OPTARG}"
else
usage_and_exit
fi
;;
n)
[[ ! -z $ARGS_SHORTCUT ]] && usage_and_exit
RUN_TESTS=0
;;
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
?)
usage_and_exit
;;
esac
done
if [[ -z $BUILD_DIR || -z $BUILD_MODE ]]; then
usage_and_exit
fi
BUILD_SYSTEM=$(get_buildsystem)
[[ -L $0 ]] && SCRIPT_PATH=$(readlink $0) || SCRIPT_PATH="$0"
ROOT=$(realpath $(dirname $SCRIPT_PATH)/../..)
cd $ROOT
# show what will be done:
BUILD_DIR_SYMLINK=$([[ -L $BUILD_DIR ]] && echo "-> $(realpath $(readlink ${BUILD_DIR}))" || echo "")
cat >&2 << EOF
------------------------------------------------------------------------------
Building Algorithms Library Core from $ROOT:
- Mode: $BUILD_MODE
- Into: $ROOT/$BUILD_DIR $BUILD_DIR_SYMLINK
- Threads: $BUILD_THREADS
- Builder: $BUILD_SYSTEM
------------------------------------------------------------------------------
EOF
# generate cmakefiles
./CMake/generate.py -wm || exit 1
# create build dir if nonexistent
if [ ! -d "$BUILD_DIR" ] && [ ! -L "$BUILD_DIR" ]; then
mkdir "$BUILD_DIR"
fi
# if build_dir is a link...
if [ -L "${BUILD_DIR}" ]; then
LINK=$(readlink "${BUILD_DIR}")
if [ ! -d ${LINK} ]; then
mkdir -p ${LINK}
fi
cd ${LINK}
else
cd "${ROOT}/${BUILD_DIR}"
fi
CMAKE_FLAGS="-DBUILD_TYPE=$BUILD_MODE -DCMAKE_EXPORT_COMPILE_COMMANDS=ON"
if [[ $BUILD_SYSTEM == "ninja" ]]; then
CMAKE_FLAGS="$CMAKE_FLAGS -GNinja"
fi
cmake $CMAKE_FLAGS ${ROOT}
# build and test
if [[ $BUILD_SYSTEM == "ninja" ]]; then
ninja -j${BUILD_THREADS} || exit 1
if [[ $RUN_TESTS -ne 0 ]]; then
ctest . --output-on-failure -j ${BUILD_THREADS} || exit 1
fi
else
make -j${BUILD_THREADS} || exit 1
if [[ $RUN_TESTS -ne 0 ]]; then
make test ARGS="-j${BUILD_THREADS} --output-on-failure" || exit 1
fi