#!/bin/bash todo() { << TODO - Continue with adding platform(s) - Add support for other platforms such as x86. - Add support for Release | Debug | DebugInfo etc. - If generating CodeBlocks support... - Parse the source and for each CMakeLists found add it to the workspace TODO } load_opts() { GETOPT=$( getopt -o bcdDfhiru \ --long build,cmakehelp,debug,dry-run,fbver:,fresh,help,info,reset,usecodeblocks,verbose \ -n "$0" -- "$@" ) } ShowHelp(){ tabs 3,5,9,13,17,21,25,29,33,37,41,45,49,53,57,61,65,69,73,77 DOCNOTE=$(cat << MSG > ${BASENAME}-readme.md # CMake wrapper script This script encapsulates the necessary calls to the CMake binary to configure and generate the makefiles required to build this application. Optionally a full build can also be executed. ### Options - (boolean) help Outputs this help screen and quits. - (boolean) build Will execute make in the build dir if makefile generation was successful. - (boolean) cmakehelp Outputs the CMake help screen and quits. - (string) --fbver The firebird version to build against. This must be in the format 'fb4', 'fb5' etc. The script will exit if this parameter is not supplied. NOTE: Currently this application does not need to know the firebird version. This setting is just a formality. However, firebird __MUST__ be installed. - (boolean) --fresh Pass --fresh to cmake, removing existing cache files. - (boolean) --reset Delete the Build dir. Recommended if thinks start to go wrong after successive runs of CMake but should not usually be required. - (boolean) --usecodeblocks Generates CodeBlocks project files in addition to standard make files These will be placed under the Build dir. (Not tested.) ### Examples - Configure and Generate make files for all platforms CMake.sh --fbver fb4 - Check the CMake Help screen CMake.sh --cmakehelp - Configure, Generate and build all platforms CMake.sh --fbver fb4 -build MSG ) cat ${BASENAME}-readme.md } ######################### START OF GENERIC FUNCTIONS ######################### Pause(){ local _aprompt="" if [ "${1:-}" = "" ]; then _aprompt="Press any key to continue..." else _aprompt="$*" fi #shellcheck disable=SC2162 read -p "$_aprompt" } GetTime(){ export LOGSTAMP=$(date "+%Y-%m-%d %H:%M:%S") export DATESTAMP=$(date +%Y%m%d) export TIMESTAMP=$(date +%Y%m%d-%H%M%S) export TAGSTAMP=$(date +:%Y%m%d%H%M) case "${1:-}" in LOGSTAMP) echo LOGSTAMP is "$LOGSTAMP" ;; DATESTAMP) echo DATE is "$DATESTAMP" ;; TIMESTAMP) echo TIMESTAMP is "$TIMESTAMP" ;; TAGSTAMP) echo TAGSTAMP is "$TAGSTAMP" ;; esac } GetLogStamp() { GetTime "LOGSTAMP" } Debug() { # Debug is intended for printing values assigned to variables etc. if [ "${DEBUG:-}" == "1" ]; then GetTime local FUNC=$1 shift echo -e $LOGSTAMP $FUNC "-" "$@" fi } Verbose() { # Verbose is intended to give the user a more # detailed narrative of programm execution. # shellcheck disable=SC2166 if [ "${VERBOSE:-}" == "1" -o "${DEBUG:-}" == "1" ]; then GetTime if [ "${2:-}" = "" ]; then echo -e $LOGSTAMP "$@" else local FUNC=${1:-} shift echo -e $LOGSTAMP $FUNC "-" "$@" fi fi } EchoSpacer() { set +x # Echo a divider line to output if [ -z ${1:-} ]; then _spacer="-" else _spacer=$1 fi if [ -z ${2:-} ]; then _repeat="80" else _repeat=$2 fi echo -e "\n" for a in $(seq 1 ${_repeat} ) do echo -n "$_spacer" done echo -e "\n" } WriteLog() { # Param 1 - Logfile # Param 2 - FUNCNAME # We automatically call Verbose after shifting LOGFILE # We then shift FUNCNAME and write out to the log. GetTime local LOGFILE=${1:-} shift Verbose "$@" # shellcheck disable=SC2166 if [ ! "${VERBOSE:-}" = 1 -o ! "${DEBUG:-}" = 1 ]; then shift fi if [ ! "${LOGFILE:-}" = "" ]; then echo -e $LOGSTAMP "-" "$@" >> $LOGFILE fi } Stop() { # echo an error code and a message and stop execution. local _err=0 if [ "${1:-}" -ge 0 ] 2>/dev/null ; then _err=$1 shift fi echo "$@" exit $_err } Error(){ local _err=0 if [ "${1:-}" -ge 0 ] 2>/dev/null ; then _err=$1 shift fi EchoSpacer echo "" echo " Error in $0" echo " $* " echo "" EchoSpacer return $_err << COMMENT Use Error on its own thus: Error 1 A remark about the error In this case it is up to the caller to test the error code Or use it with Stop: Error 1 A remark about the error Stop $? COMMENT } ######################### END OF GENERIC FUNCTIONS ######################### ResetVars() { unset BUILD unset CMAKEHELP unset DEBUG unset DRYRUN unset FRESH unset FBVER unset RESET unset SHOWINFO unset USECODEBLOCKS BASENAME=$(basename "$0" .sh) GENERATOR="Unix Makefiles" SCRIPTPATH="$( cd -- "$(dirname "$0")" >/dev/null 2>&1 ; pwd -P )" } ParseCommandLine() { #set -x if [ $# -le 0 ]; then ShowHelp return 1 fi eval set -- "$GETOPT" while true; do case "${1:-}" in -h|--help) return 1 ;; -b|--build) BUILD=" --build "; shift; ;; -c|--cmakehelp) CMAKEHELP=" --help "; shift; ;; -d|--debug) DEBUG=1; shift; ;; -D|--dry-run) DRYRUN=1; shift; ;; -f|--fresh) FRESH=" --fresh "; shift; ;; --fbver) if [ "$2" ] > /dev/null 2>&1; then FBVER="$2"; fi shift; shift; ;; -i|--info) SHOWINFO=1; shift; ;; -r|--reset) RESET=1; shift; ;; -u|--usecodeblocks) GENERATOR="CodeBlocks - Unix Makefiles"; shift; ;; -v|--verbose) VERBOSE=1; shift; ;; --) shift; break; ;; *) echo "Invalid Option ${1:-}"; #ShowHelp shift; shift; return 1; ;; esac done } RemoveBuildDir() { if [ -d $SCRIPTPATH/Build ]; then Verbose Removing $SCRIPTPATH/Build directory rm $SCRIPTPATH/Build --recursive else Verbose $SCRIPTPATH/Build directory does not exist. fi } CheckParams() { if [ "${RESET:-}" == "1" ]; then RemoveBuildDir fi if [ ! "${CMAKEHELP:-}" == "" ]; then cmake $CMAKEHELP Stop $? fi } ShowInfo() { Debug Entering FUNCNAME "$FUNCNAME" if [ "${SHOWINFO:-}" == "1" ]; then echo echo g++ version is...........$(g++ --version) | cut -c1-80 echo cmake version is ........$(cmake --version) | cut -c1-80 echo make version is..........$(make --version) | cut -c1-80 echo fi return 0 } Generate() { Debug Entering FUNCNAME "$FUNCNAME" local _err=0 # Be sure that we are actually in the root of our repo. pushd $SCRIPTPATH > /dev/null _cmdstr='cmake ${FRESH:-} -G "${GENERATOR}" -S . -B Build ' Verbose Executing "$_cmdstr" eval "$_cmdstr" _err=$? popd > /dev/null return $_err } Build() { if [ "${BUILD:-}" != "" ]; then pushd $SCRIPTPATH/Build > /dev/null make popd > /dev/null fi } main () { EchoSpacer "=" ResetVars load_opts "$@" #set -x ParseCommandLine "$@" || return 1 CheckParams ShowInfo Generate || return $? Build EchoSpacer "=" } main "$@" if [ $? -ne 0 ]; then echo "An error occurred."; fi set +x