yes=0 no=255 function get-reason() { case "$1" in (0) echo "success";; (127) echo "command not found";; (132) echo "illegal instruction";; (136) echo "floating point exception";; (137) echo "process killed";; (139) echo "segment fault";; (140) echo "bad system call";; (141) echo "broken pipe";; (142) echo "alarm signal";; (143) echo "process terminate";; (*) echo "failure";; esac } [ "@$MENES_CXX" = '@' ] && case "$(cfg:get 'kernel name')" in (MINGW32_NT-5.1) MENES_CXX='cl.exe';; (*) MENES_CXX='c++';; esac cxx="$MENES_CXX" cfg:set '$' 'c++' "$cxx" cfg:set '$' 'c++ class' "$( line="$($cxx 2>&1 | head -n 1)" if echo "$line" | grep -E 'Microsoft \(R\) 32-bit C/C\+\+ Optimizing Compiler' >/dev/null; then echo 'cl.exe' elif echo "$line" | grep -E ': [Nn]o input files' >/dev/null; then echo 'gcc' elif echo "$line" | grep -E ': Command line error: no files specified' >/dev/null; then echo 'icc' else fatal 'unknown c++:class' fi )" cfg:set '$' 'c++ version' "$( case "$(cfg:get 'c++ class')" in (cl.exe) echo "$($cxx 2>&1 | tr '\r' '\n' | head -n 1 | sed -e 's/^Microsoft (R) 32-bit C\/C++ Optimizing Compiler Version \([0-9.]*\) for 80x86/\1/')";; (gcc) echo "$($cxx -dumpversion)";; (icc) echo "$($cxx --version)";; esac )" if [[ ${MENES_INCLUDE_PATH:+@} ]]; then hi_cflags="$hi_cflags $(echo ":$MENES_INCLUDE_PATH" | sed -e 's/::*/:/g; s/^:/-I/; s/\([^\\]\):/\1 -I/g; s/\\:/:/g')" fi if [[ ${MENES_LIBRARY_PATH:+@} ]]; then hi_lflags="$hi_lflags $(echo ":$MENES_LIBRARY_PATH" | sed -e 's/::*/:/g; s/^:/-L/; s/\([^\\]\):/\1 -L/g; s/\\:/:/g')" fi function c++:compile_() { cat >.mak.compile.cpp << EOF $1 EOF shift result=0 "$menes/make.sh/run-$(cfg:get 'c++ class').sh" "$(cfg:get 'c++')" $hi_cflags $hi_lflags -C.mak.compile.exe "$@" $lo_cflags $lo_lflags .mak.compile.cpp >/dev/null 2>/dev/null && { assert test -x ./.mak.compile.exe value="$($MENES_RUN ./.mak.compile.exe)" result=${PIPESTATUS%% *} value="${value%$'\r'}" if [[ $result -eq $yes ]]; then [[ -z ${value:+@} ]] && echo '!true' || echo "$value" elif [[ $result -eq 127 ]]; then fatal 'binary disappeared' elif [[ $result -lt 127 || $result -eq $no ]]; then echo '!false' else echo "!%execute: $(get-reason $result)" fi } || { result=$? echo "!%compile: $(get-reason $result)" } rm -f .mak.compile.* return $result } function c++:compile() { # XXX: this should check for -- in the flag list if [[ $# -lt 2 ]]; then c++:compile_ "$@" -- else c++:compile_ "$@" fi } function cflags_() { c++:pre-compile '' "$@" } function define() { success c++:compile " $(for h in $2; do echo "#include \"$h\"" done) int main() { #ifdef $1 return $yes; #else return $no; #endif } " } function name-define() { echo "define $1" } function framework() { hi-cflag "-f$1" } function hi-cflag() { cflags_ "$1" -- } function include() { c++:pre-compile " #include \"$1\" " } function link() { hi-cflag "-l$1" } function lo-cflag() { cflags_ -- "$1" } function c++:pre-compile() { code="$1" shift success c++:compile " $code int main() { return $yes; } " "$@" } function symbol() { name="$1" shift c++:pre-compile " extern \"C\" void *$name; void *value($name); " "$@" } function name-symbol() { echo "symbol $1" } function value() { c++:compile " #include $2 int main() { printf(\"#%d\\n\", $1); return 0; } " } function name-value() { echo "value $1" }