#!/usr/bin/env bash # per-engine static archives for mag/elec/heat/curr with internal symbols localized via ld -exported_symbols_list. set -euo pipefail ROOT=$(cd "$(dirname "$0")/../.." && pwd) BUILD=${BUILD:-"$ROOT/build/ffi"} CXX=${CXX:-clang++} LD=${LD:-ld} AR=${AR:-ar} case "${PROFILE:-release}" in release) DEFAULT_CXXFLAGS="-std=c++17 -fno-exceptions -fno-rtti -O3 -DNDEBUG -w" ;; *) DEFAULT_CXXFLAGS="-std=c++17 -fno-exceptions -fno-rtti -O0 -g -w" ;; esac CXXFLAGS=${CXXFLAGS:-$DEFAULT_CXXFLAGS} mkdir -p "$BUILD"/{fkn,liblua,belasolv,csolv,hsolv,ffi} compile() { local incs="$1"; shift local outdir="$1"; shift for src in "$@"; do local base base=$(basename "$src") base=${base%.cpp} base=${base%.CPP} $CXX $CXXFLAGS $incs -c "$src" -o "$outdir/${base}.o" done } # liblua compiled against fkn's complex.h. compile "-I $ROOT/fkn -I $ROOT/liblua -I $ROOT/compat" \ "$BUILD/liblua" \ "$ROOT/liblua/lapi.cpp" "$ROOT/liblua/lauxlib.cpp" "$ROOT/liblua/lbaselib.cpp" \ "$ROOT/liblua/lcode.cpp" "$ROOT/liblua/ldblib.cpp" "$ROOT/liblua/ldebug.cpp" \ "$ROOT/liblua/ldo.cpp" "$ROOT/liblua/lfunc.cpp" "$ROOT/liblua/lgc.cpp" \ "$ROOT/liblua/liolib.cpp" "$ROOT/liblua/llex.cpp" "$ROOT/liblua/lmathlib.cpp" \ "$ROOT/liblua/lmem.cpp" "$ROOT/liblua/lobject.cpp" "$ROOT/liblua/lparser.cpp" \ "$ROOT/liblua/lstate.cpp" "$ROOT/liblua/lstring.cpp" "$ROOT/liblua/lstrlib.cpp" \ "$ROOT/liblua/ltable.cpp" "$ROOT/liblua/ltests.cpp" "$ROOT/liblua/ltm.cpp" \ "$ROOT/liblua/lundump.cpp" "$ROOT/liblua/lvm.cpp" "$ROOT/liblua/lzio.cpp" compile "-I $ROOT/fkn -I $ROOT/compat" \ "$BUILD/fkn" \ "$ROOT/fkn/complex.cpp" "$ROOT/fkn/cspars.cpp" "$ROOT/fkn/cuthill.cpp" \ "$ROOT/fkn/femmedoccore.cpp" "$ROOT/fkn/fullmatrix.cpp" "$ROOT/fkn/matprop.cpp" \ "$ROOT/fkn/prob1big.cpp" "$ROOT/fkn/prob2big.cpp" "$ROOT/fkn/prob3big.cpp" \ "$ROOT/fkn/prob4big.cpp" "$ROOT/fkn/spars.cpp" compile "-I $ROOT/belasolv -I $ROOT/compat" \ "$BUILD/belasolv" \ "$ROOT/belasolv/cuthill.cpp" "$ROOT/belasolv/femmedoccore.cpp" \ "$ROOT/belasolv/prob1big.cpp" "$ROOT/belasolv/spars.cpp" compile "-I $ROOT/csolv -I $ROOT/compat" \ "$BUILD/csolv" \ "$ROOT/csolv/complex.cpp" "$ROOT/csolv/cspars.cpp" "$ROOT/csolv/CUTHILL.CPP" \ "$ROOT/csolv/femmedoccore.cpp" "$ROOT/csolv/PROB1BIG.CPP" compile "-I $ROOT/hsolv -I $ROOT/compat" \ "$BUILD/hsolv" \ "$ROOT/hsolv/complex.cpp" "$ROOT/hsolv/CUTHILL.CPP" "$ROOT/hsolv/hsolvdoc.cpp" \ "$ROOT/hsolv/prob1big.cpp" "$ROOT/hsolv/SPARS.CPP" # ffi translation units, one per engine plus the liblua complex-op shim. $CXX $CXXFLAGS -I "$ROOT/fkn" -I "$ROOT/compat" -c "$ROOT/ffi/femm_mag.cpp" -o "$BUILD/ffi/femm_mag.o" $CXX $CXXFLAGS -I "$ROOT/belasolv" -I "$ROOT/compat" -c "$ROOT/ffi/femm_elec.cpp" -o "$BUILD/ffi/femm_elec.o" $CXX $CXXFLAGS -I "$ROOT/hsolv" -I "$ROOT/compat" -c "$ROOT/ffi/femm_heat.cpp" -o "$BUILD/ffi/femm_heat.o" $CXX $CXXFLAGS -I "$ROOT/csolv" -I "$ROOT/compat" -c "$ROOT/ffi/femm_curr.cpp" -o "$BUILD/ffi/femm_curr.o" $CXX $CXXFLAGS -I "$ROOT/liblua" -I "$ROOT/compat" -c "$ROOT/ffi/femm_lua_complex_ops.cpp" -o "$BUILD/ffi/femm_lua_complex_ops.o" # per-engine exported-symbols lists. exports_for() { local prefix="$1" nm "$BUILD/ffi/femm_${prefix}.o" | awk -v p="$prefix" ' $2=="T" && $3 ~ ("^_femm_" p "_") { print $3 } ' } mkdir -p "$BUILD/exports" exports_for mag > "$BUILD/exports/mag.txt" exports_for elec > "$BUILD/exports/elec.txt" exports_for heat > "$BUILD/exports/heat.txt" exports_for curr > "$BUILD/exports/curr.txt" # merges each engine into a relocatable object and archives it. $LD -r "$BUILD"/fkn/*.o "$BUILD"/liblua/*.o "$BUILD"/ffi/femm_mag.o "$BUILD"/ffi/femm_lua_complex_ops.o \ -exported_symbols_list "$BUILD/exports/mag.txt" -o "$BUILD/femm_mag_merged.o" $LD -r "$BUILD"/belasolv/*.o "$BUILD"/ffi/femm_elec.o \ -exported_symbols_list "$BUILD/exports/elec.txt" -o "$BUILD/femm_elec_merged.o" $LD -r "$BUILD"/hsolv/*.o "$BUILD"/ffi/femm_heat.o \ -exported_symbols_list "$BUILD/exports/heat.txt" -o "$BUILD/femm_heat_merged.o" $LD -r "$BUILD"/csolv/*.o "$BUILD"/ffi/femm_curr.o \ -exported_symbols_list "$BUILD/exports/curr.txt" -o "$BUILD/femm_curr_merged.o" rm -f "$BUILD"/libfemm_*.a $AR rcs "$BUILD/libfemm_mag.a" "$BUILD/femm_mag_merged.o" $AR rcs "$BUILD/libfemm_elec.a" "$BUILD/femm_elec_merged.o" $AR rcs "$BUILD/libfemm_heat.a" "$BUILD/femm_heat_merged.o" $AR rcs "$BUILD/libfemm_curr.a" "$BUILD/femm_curr_merged.o" echo "built:" ls -lh "$BUILD"/libfemm_*.a