include ../build/Makefile-vars
# NOTE: original upstream is https://netlib.org/f2c/, and that does still get maintained.
# However, the maintenance is minimal, I don't trust the host, and MOST IMPORTANTLY, it is
# impossible to get a *specific known point in time version*. A fundamental rule of
# downloading sources is that they have to be versioned and all versions stay available.
# See https://github.com/sagemathinc/f2c/releases
VERSION=2022-09-09
URL = https://github.com/sagemathinc/f2c/archive/refs/tags/${VERSION}.tar.gz
TARBALL = ${UPSTREAM}/f2c-${VERSION}.tar.gz
all: native wasm
include ../build/Makefile-rules
###########
# NATIVE
###########
${DIST_NATIVE}/.built: ${DIST_NATIVE}/bin/f2c ${DIST_NATIVE}/lib/libf2c.a ${DIST_NATIVE}/include/f2c.h
touch ${DIST_NATIVE}/.built
# NOTES:
# - The zig built f2c crashes if you use -O0, but NOT with -O2!
${DIST_NATIVE}/bin/f2c: ${BUILD_NATIVE}/.build
cd ../build && make zig
cd ${BUILD_NATIVE}/f2c \
&& make CC="zig cc ${ZIG_NATIVE_CFLAGS_GNU} " CFLAGS="-O2" -j8 -f makefile.u \
&& mkdir -p ${DIST_NATIVE}/bin \
&& cp f2c ${DIST_NATIVE}/bin
${DIST_NATIVE}/lib/libf2c.a: ${BUILD_NATIVE}/.build
cd ${BUILD_NATIVE}/libf2c \
&& make CC="zig cc ${ZIG_NATIVE_CFLAGS_GNU} " CFLAGS="-O2" -j8 -f makefile.u \
&& mkdir -p ${DIST_NATIVE}/lib \
&& cp libf2c.a ${DIST_NATIVE}/lib
${DIST_NATIVE}/include/f2c.h: ${DIST_NATIVE}/bin/f2c
mkdir -p ${DIST_NATIVE}/include/
cp ${BUILD_NATIVE}/f2c/f2c.h ${DIST_NATIVE}/include/
# TODO/WARNING: The test actually fails with "zig cc" right now in numerous ways with
# malloc crashes and segfaults.
# These are clearly due to a bunch of bugs in zig cc that I haven't hit elsewhere.
# Hopefully these will go away someday when we update to a newer version of zig.
# We test with gcc below, which works.
# That said, this does NOT matter, since we only need to use the result of f2c
# on WebAssembly, and there fully using zig completely works fine below.
test-native: native
rm -rf ${BUILD_NATIVE}/test
mkdir -p ${BUILD_NATIVE}/test
cp src/hello.f ${BUILD_NATIVE}/test
cd ${BUILD_NATIVE}/test \
&& ${DIST_NATIVE}/bin/f2c hello.f \
&& gcc hello.c -w -o hello -I${DIST_NATIVE}/include -lf2c -L${DIST_NATIVE}/lib \
&& ./hello | grep Hello # would fail if "Hello" not in output.
###########
# WASM
###########
${DIST_WASM}/.built: ${DIST_WASM}/lib/libf2c.a ${DIST_WASM}/include/f2c.h
touch ${DIST_WASM}/.built
${BUILD_WASM}/.patched: ${BUILD_WASM}/.build
cd ${BUILD_WASM}/libf2c && cat ${CWD}/src/00-wasm-makefile-ld.patch | patch -p2
touch ${BUILD_WASM}/.patched
# The file arith.h is autogenerated by creating and running a C program.
# It works if we build it directly using zcc, but NOT using cowasm-cc (our -fPIC variant),
# which is why we run make twice below.
${DIST_WASM}/lib/libf2c.a: ${BUILD_WASM}/.patched
cd ../build && make zig
cd ${BUILD_WASM}/libf2c \
&& make CC="zcc" CFLAGS="-Oz" arith.h -f makefile.u \
&& make CC="cowasm-cc" CFLAGS="-Oz" -f makefile.u -j8 \
&& mkdir -p ${DIST_WASM}/lib \
&& cp libf2c.a ${DIST_WASM}/lib
${DIST_WASM}/include/f2c.h: ${DIST_WASM}/lib/libf2c.a
mkdir -p ${DIST_WASM}/include/
cp ${BUILD_WASM}/f2c/f2c.h ${DIST_WASM}/include/
# with clang5 the f2c's main ends up as __main_argc_argv, and standalone
# f2c has main_ which doesn't work. This also avoids the fake signal code.
echo '#define main_ main' >> ${DIST_WASM}/include/f2c.h
test-wasm: wasm native node_modules
cd ../build && make zig
rm -rf ${BUILD_WASM}/test
mkdir -p ${BUILD_WASM}/test
cp src/hello.f ${BUILD_WASM}/test
cd ${BUILD_WASM}/test \
&& ${DIST_NATIVE}/bin/f2c hello.f \
&& zcc hello.c -o hello -lc -I${DIST_WASM}/include -lf2c -L${DIST_WASM}/lib \
&& ./hello | grep "Hello, world!" # would fail if "Hello" not in output.
# only care about wasm test passing
test: test-wasm