diff options
Diffstat (limited to 'src/civetweb/build')
-rwxr-xr-x | src/civetweb/build | 138 |
1 files changed, 138 insertions, 0 deletions
diff --git a/src/civetweb/build b/src/civetweb/build new file mode 100755 index 00000000..2b423108 --- /dev/null +++ b/src/civetweb/build @@ -0,0 +1,138 @@ +#!/bin/sh +set -euo pipefail +IFS=$'\n\t' + +stdout() { + cat <<< "$@" +} + +stderr() { + cat <<< "$@" 1>&2 +} + +prereqs () { + local E_BADARGS=65 + if [ $# -eq 0 ]; then + stderr "Usage: $(basename $0) [prerequisite_program] [another_program...]" + return $E_BADARGS + fi + for prog in $@; do + hash $prog 2>&- + if [ $? -ne 0 ]; then + return 1 + fi + done +} + +usage() { + if [ $# -ne 0 ]; then + stdout $@ + fi + stdout "Usage: $(basename $0) [options]" + stdout + stdout "A convenience script to quickly build the library with CMake." + stdout + stdout "Options:" + stdout " [--shared|(--static)] Builds either a static or a shared library" + stdout " [--debug|(--release)] Builds a certain variant of the library" + stdout " -g,--generator name The CMake generator to use ('Unix Makefiles')" + stdout " -o,--output folder The place to output the build files (./output)" + stdout + stdout "Examples:" + stdout " ./build" + stdout " ./build --shared --debug" + stdout " ./build --static --release -o ~/my-output-folder" +} + +check() { + local E_BADARGS=65 + if [ $# -ne 1 ]; then + stderr "Usage: check prerequisite_program" + return $E_BADARGS + fi + prereqs $1 + if [ $? -ne 0 ]; then + stderr "Failed to find `$1` on the command line:" + stderr "Please install it with your package manager" + return 1 + fi +} + +sanitize() { + local E_BADARGS=65 + if [ $# -ne 1 ]; then + stderr "Usage: sanitize string_to_clean" + return $E_BADARGS + fi + echo $(echo "$1" | sed "s|[^A-Za-z]\+|-|g" | tr '[:upper:]' '[:lower:]') + return 0 +} + +build () { + # Get the build locations + local src_dir=$(cd $(dirname $0); pwd -P) + + # Arguments + local E_BADARGS=65 + local generator="Unix Makefiles" + local shared=NO + local build_type=Release + local output_dir="${src_dir}/output" + while (( "$#" )); do + case "$1" in + --debug) build_type=Release;; + --release) build_type=Debug;; + --shared) shared=YES;; + --static) shared=NO;; + --output) shift; out="$1";; + -o) shift; output_dir="$1";; + --generator) shift; generator="$1";; + -g) shift; generator="$1";; + --help) usage; return 0;; + --) shift; break;; + -*) usage "Bad argument $1"; return ${E_BADARGS};; + *) break;; + esac + shift + done + + # Update the build folder + local build_dir=${output_dir}/build + local install_dir=${output_dir}/install + + # Create the build folder + mkdir -p ${build_dir} + + # Enter the build folder + cd ${build_dir} + trap 'cd ${src_dir}' INT TERM EXIT + + # Do the CMake configuration + check cmake + cmake -G ${generator} -DCMAKE_BUILD_TYPE=${build_type} -DBUILD_SHARED_LIBS:BOOL=${shared} ${src_dir} + + # Do the build + if [ "${generator}" = "Unix Makefiles" ]; then + check make + make all test + else + stderr "Unknown build system for ${generator}, go to ${build_dir} and run the correct build program" + fi + + # Do the install + cmake -DCMAKE_INSTALL_PREFIX="${install_dir}" -P "${build_dir}/cmake_install.cmake" + + # Return to the correct folder + trap - INT TERM EXIT + cd ${src_dir} + + # Notify the user + stdout "Built files are available at ${install_dir}" +} + +# If the script was not sourced we need to run the function +case "$0" in + *"build") + build "$@" + ;; +esac |