Fil-C on Nix

Filnix wiki

mbrock/filnix

runtime/libpizlo.nix

λpkgs, filc, compiler-rt, sources?, llvmjit?
pkgs
filc
compiler-rt
sourcesdefault import../lib/sources.nix inherit pkgs;

The LLVM JIT shim (runtime/llvmjit.nix), for pins that have the JIT.

llvmjitdefault null
let
11lib=
import../lib inherit pkgs;
used by libpizlo
12inherit lib
setupCcache base-clang
in

Build libpizlo (Fil-C runtime library - GC + memory safety) Use the original Makefile - it knows which files to build

19libpizlo=
pkgs.stdenv.mkDerivation
20pname=
"libpizlo"
21version=
"git"
22src=
sources.libpas-src
23patches=

prctl's capability options returned ENOSYS, so systemd could start no service.

Staging already has this fix; the official releases do not.

++

zsys_brk reports the program break, so sbrk(0) works as it does natively.

Proof of concept: zclosure_new_sealed (docs/sealed-closures.md).

++
pkgs.lib.optionalsources.variant ≡ "staging" ../patches/fil-c/sealed-closures.patch

zmark_shared: shared mappings whose pointers hold addresses only (docs/zmark-shared.md). Staging only; the pass half is in compiler/filc0.nix.

++
pkgs.lib.optionalsources.variant ≡ "staging" ../patches/fil-c/runtime-zmark-shared.patch
43nativeBuildInputs=
pkgs.gnumake pkgs.ruby base-clang filc pkgs.ccache ++ pkgs.lib.optionalsources.llvmjit-src ≢ null pkgs.python3

Under glibc, libpas includes filc/llvmjit/filc_llvm_jit_api.h, which is generated from LLVM's C API headers.

54preConfigure=
pkgs.lib.optionalStringsources.llvmjit-src ≢ null
cp -r --no-preserve=mode ${sources.llvmjit-src}/. .
python3 filc/llvmjit/gen_filc_llvm_jit_header.py
+
cd libpas
export CC="ccache clang"
export FILC_CLANG="${filc}/bin/clang"
# These env vars are for the Makefile to find libraries/headers
export FILC_YOLO_INCLUDE="${filc.libyolo-impl}/include"
export FILC_OS_INCLUDE="${pkgs.linuxHeaders}/include"
export FILC_STDFIL_INCLUDE="$PWD/../filc/include"
export FILC_INCLUDE_DIR="${filc.libyolo-impl}/include"
export FILC_YOLO_LIB_DIR="${filc.libyolo}/lib"
export FILC_DYNAMIC_LINKER="${filc.libyolo}/lib/${lib.dynamicLinker}"
PIZFIX_OUT="$PWD/pizfix"
export FILC_LIB_DIR="$PIZFIX_OUT/lib"
export FILC_LIB_TEST_DIR="$PIZFIX_OUT/lib_test"
export FILC_LIB_GCVERIFY_DIR="$PIZFIX_OUT/lib_gcverify"
export FILC_LIB_TEST_GCVERIFY_DIR="$PIZFIX_OUT/lib_test_gcverify"
mkdir -p "$FILC_LIB_DIR" "$FILC_LIB_TEST_DIR" "$FILC_LIB_GCVERIFY_DIR" "$FILC_LIB_TEST_GCVERIFY_DIR"
cp ${compiler-rt}/lib/crtbegin.o "$FILC_LIB_DIR"/
cp ${compiler-rt}/lib/crtend.o "$FILC_LIB_DIR"/
cp ${compiler-rt}/lib/libyolort.a "$FILC_LIB_DIR"/
patchShebangs .
83buildPhase=
mkdir -p build
${pkgs.ruby}/bin/ruby src/libpas/generate_pizlonated_forwarders.rb src/libpas/filc_native.h
make -j$NIX_BUILD_CORES FILCFLAGS="-O3 -g -W -Werror -Wno-unused-command-line-argument -MD -I../filc/include"${pkgs.lib.optionalStringllvmjit ≢ null " \"HOST_CLANG=clang -DFILC_LLVMJIT_SO_PATH='\\\"${llvmjit}/lib/libfilcllvmjit.so\\\"'\""}
92installPhase=
mkdir -p $out/lib $out/include
cp "$FILC_LIB_DIR"/libpizlo.so $out/lib/
cp "$FILC_LIB_DIR"/libpizlo.a $out/lib/
cp "$FILC_LIB_DIR"/filc_crt.o $out/lib/
cp "$FILC_LIB_DIR"/filc_mincrt.o $out/lib/
+
pkgs.lib.optionalStringllvmjit ≢ null
cp "$FILC_LIB_DIR"/filc_jit_crt.o $out/lib/
cp "$FILC_LIB_DIR"/filc_jit_mincrt.o $out/lib/
+
cp ../filc/include/*.h $out/include/
107enableParallelBuilding=
true
108passthru=
inherit llvmjit;
109meta.description=
"Fil-C runtime library (libpizlo)"