Ver Fonte

Build script for Unix systems

A helper script to get n00bs going with CMake
Matt Clarkson há 10 anos atrás
pai
commit
17532cb843
1 ficheiros alterados com 138 adições e 0 exclusões
  1. 138 0
      build

+ 138 - 0
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