#!/bin/sh set -e this_script_path=$(readlink -f "$0") this_script_dir=$(dirname "$this_script_path") source_files=$(readlink -f $(find "$this_script_dir/src" -name "*.c")) if [ -z "$CC" ]; then CC=cc fi CFLAGS="" LIBS="" if [ ! -z "$SANITIZE_ADDRESS" ]; then CFLAGS+="-fsanitize=address " elif [ ! -z "$SANITIZE_THREAD" ]; then CFLAGS+="-fsanitize=thread " fi if [ ! -z "$PEDANTIC" ]; then CFLAGS+="-DAMAL_PEDANTIC -pedantic " fi build_test() { CFLAGS+="-Wall -Wextra -Werror -Wno-format-security -g -O0 -DDEBUG -std=c89 -D_GNU_SOURCE" LIBS+="-pthread" BUILD_ARGS="$source_files $CFLAGS $LIBS -shared -fpic -o "$this_script_dir/libamalgam.so"" set -x time $CC $BUILD_ARGS if [ ! -z "$SCAN_BUILD" ]; then scan-build $CC $BUILD_ARGS fi set +x if [ -z "$NO_TEST" ]; then source_files_tests=$(readlink -f $(find "$this_script_dir/tests" -name "*.c")) set -x time $CC $source_files_tests $CFLAGS $LIBS -o test "$this_script_dir/libamalgam.so" fi set +x compile_commands=$( first=0 echo "[" for source_file in $source_files $source_files_tests; do if [ $first == 1 ]; then echo " ," fi first=1 o_file="${source_file}.o" echo " {" echo " \"file\": \"$source_file\"," echo " \"directory\": \"$this_script_dir\"," echo " \"command\": \"$CC -o $o_file $CFLAGS $LIBS -c $source_file\"" echo " }" done echo "]") echo "$compile_commands" > "$this_script_dir/compile_commands.json" } build_release() { CFLAGS+="-Wall -Wextra -Werror -Wno-format-security -O2 -DNDEBUG -std=c89 -D_GNU_SOURCE -s" LIBS+="-pthread" BUILD_ARGS="$source_files $CFLAGS $LIBS -shared -fpic -o "$this_script_dir/libamalgam.so"" set -x time $CC $BUILD_ARGS if [ ! -z "$SCAN_BUILD" ]; then scan-build $CC $BUILD_ARGS fi set +x set +x compile_commands=$( first=0 echo "[" for source_file in $source_files; do if [ $first == 1 ]; then echo " ," fi first=1 o_file="${source_file}.o" echo " {" echo " \"file\": \"$source_file\"," echo " \"directory\": \"$this_script_dir\"," echo " \"command\": \"$CC -o $o_file $CFLAGS $LIBS -c $source_file\"" echo " }" done echo "]") echo "$compile_commands" > "$this_script_dir/compile_commands.json" } case "$1" in "test") build_test ;; "release") build_release ;; *) echo "usage: build.sh COMMAND" echo "COMMANDS:" echo " test Build tests" echo " release Build as a release package, enabling all optimizations and stripping of binary" exit 1 ;; esac