123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138 |
- #!/usr/bin/env bash
- 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=Debug;;
- --release) build_type=Release;;
- --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
|