1
0
Fork 0
mirror of https://github.com/notwa/rc synced 2024-11-05 02:19:03 -08:00
rc/sh/compile

71 lines
2 KiB
Text
Raw Normal View History

#!/usr/bin/env zsh
compile() {
if [ $# -lt 2 ]; then
echo "usage: compile [clang|gcc] {debug|release} [flags...] {source file}" >&2
return 1
fi
local sepples=0
local CC=gcc
local CXX=g++
local our_flags=(-I.)
maybe_include() {
[ -d "$1" ] && our_flags+=("-I$1")
}
maybe_include "-I$HOME/opt/local/include"
maybe_include "-I$HOME/src/ustl"
local debug_flags=(-O1 -g);
local release_flags=(-Ofast -march=native -g0 -fomit-frame-pointer -s -DNDEBUG)
local dr_flags=(-Ofast -march=native -g -fomit-frame-pointer -DNDEBUG)
if [ -e /usr/bin/pprof ]; then
local malloc=(-ltcmalloc -fno-builtin-malloc -fno-builtin-calloc -fno-builtin-realloc -fno-builtin-free)
debug_flags+=($malloc[@])
derelease_flags+=($malloc[@])
derelease_flags+=(-lprofiler)
fi
local file=${@[-1]}
2017-03-30 18:09:26 -07:00
[ "${file##*.}" = "c" ] || [ "${file##*.}" = "h" ] || sepples=1
{ [ $1 = clang ] && CC="clang" && CXX="clang++" && shift } || \
{ [ $1 = gcc ] && CC="gcc" && CXX="g++" && shift }
2017-03-30 18:09:26 -07:00
if [ CC=clang ]; then
debug_flags+=(-ftrapv)
if [ -z $MSYSTEM ]; then # only available on linux
debug_flags+=(-fsanitize=undefined) # this SHOULD work with mingw,
# but it fails to link.
debug_flags+=(-fsanitize=address)
debug_flags+=(-flto -fsanitize=cfi)
fi
fi
{ [ $1 = debug ] && our_flags+=($debug_flags) && shift } || \
{ [ $1 = release ] && our_flags+=($release_flags) && shift } || \
{ [ $1 = derelease ] && our_flags+=($dr_flags) && shift } || \
{ echo "please specify either debug or (de)release" >&2; return 1 }
# TODO add static option
local compiler=
if [ $sepples -eq 1 ]; then
compiler=$CXX
std="-std=gnu++1z"
else
compiler=$CC
std="-std=gnu11"
fi
local flags=(${@[1,-2]})
local out=/tmp/${${file%%.*}##*/}
$compiler $std ${our_flags[@]} ${flags[@]} $file -o $out && echo "$out"
}
compile "$@"