#!/usr/bin/env bash C_FLAGS=('-Wall' '-Wextra') runc() ( set -o errexit -o nounset -o pipefail local -a c_flags=("${C_FLAGS[@]+"${C_FLAGS[@]}"}") local -a src_files local -a prog_flags while [ "$#" -gt 0 ]; do case "$1" in -c|--c-flags) if [ "$#" -le 1 ]; then echo "${FUNCNAME[0]}: missing argument for parameter: $1" >&2 return 1 fi shift c_flags+=("$1") shift ;; -h|--help) echo "usage: ${FUNCNAME[0]} [-h|--help] [-c|--c-flags FLAG]" return 0 ;; --) shift break ;; *) src_files+=("$( realpath "$1" )") shift ;; esac done prog_flags=("$@") local build_dir build_dir="$( mktemp --directory )" trap "$( printf 'popd > /dev/null && rm -rf %q' "$build_dir" )" 0 pushd "$build_dir" > /dev/null local output_name output_name="$( mktemp --tmpdir=. "${FUNCNAME[0]}XXX.exe" )" gcc -o "$output_name" \ "${c_flags[@]+"${c_flags[@]}"}" \ "${src_files[@]+"${src_files[@]}"}" "$output_name" "${prog_flags[@]+"${prog_flags[@]}"}" ) CXX_FLAGS=('-Wall' '-Wextra' '-std=c++14') runcxx() ( set -o errexit -o nounset -o pipefail local -a cxx_flags=("${CXX_FLAGS[@]+"${CXX_FLAGS[@]}"}") local -a src_files local -a prog_flags while [ "$#" -gt 0 ]; do case "$1" in -c|--cxx-flags) if [ "$#" -le 1 ]; then echo "${FUNCNAME[0]}: missing argument for parameter: $1" >&2 return 1 fi shift cxx_flags+=("$1") shift ;; -h|--help) echo "usage: ${FUNCNAME[0]} [-h|--help] [-c|--cxx-flags FLAG]" return 0 ;; --) shift break ;; *) src_files+=("$( realpath "$1" )") shift ;; esac done prog_flags=("$@") local build_dir build_dir="$( mktemp --directory )" trap "$( printf 'popd > /dev/null && rm -rf %q' "$build_dir" )" 0 pushd "$build_dir" > /dev/null local output_name output_name="$( mktemp --tmpdir=. "${FUNCNAME[0]}XXX.exe" )" g++ -o "$output_name" \ "${cxx_flags[@]+"${cxx_flags[@]}"}" \ "${src_files[@]+"${src_files[@]}"}" "$output_name" "${prog_flags[@]+"${prog_flags[@]}"}" )