Fil-C on Nix

Filnix wiki

mbrock/filnix

compiler/filc.nix

λpkgs, filc0, yolo, compiler-rt, yolounwind, libpizlo?, filc-libc?, filc-libcxx?, sources?
pkgs
filc0
yolo
compiler-rt
yolounwind
libpizlodefault null
filc-libcdefault null
filc-libcxxdefault null
sourcesdefault import../lib/sources.nix inherit pkgs;
let
14lib=
import../lib inherit pkgs;
used by wrapper
15inherit lib
gcc llvmMajor
20inherit yolo
yolo-glibc yolo-glibc-impl
22sarcasm=
import../packages/sarcasm.nix inherit pkgs sources;
used by wrapper
24filc-stdfil-headers=
libpizlo ≡ null
→
"${sources.libpas-src}/filc/include"
else
"${libpizlo}/include"
used by wrapper

Extract just the resource directory to avoid depending on the entire filc0 build

31filc0-resource-dir=
pkgs.runCommand"filc0-resource-dir" { }
mkdir -p $out/lib
cp -r ${filc0}/lib/clang $out/lib/
used by wrapper

Build CRT library directory

37crtLib=
pkgs.runCommand"filc-crt-lib" nativeBuildInputs = pkgs.rsync;
mkdir -p $out
# Base: yolo-glibc libs
rsync -a ${yolo-glibc}/lib/ $out/
chmod -R u+w $out
# CRT files and builtins from compiler-rt
cp ${compiler-rt}/lib/crtbegin.o $out/
cp ${compiler-rt}/lib/crtend.o $out/
cp ${compiler-rt}/lib/libyolort.a $out/
# Stub unwind library
cp ${yolounwind}/lib/libyolounwind.a $out/
# Add libpizlo if available
${pkgs.lib.optionalStringlibpizlo ≢ null '' cp ${libpizlo}/lib/filc_crt.o $out/ || true cp ${libpizlo}/lib/filc_mincrt.o $out/ || true cp ${libpizlo}/lib/libpizlo.so $out/ || true cp ${libpizlo}/lib/libpizlo.a $out/ || true '' + pkgs.lib.optionalStringlibpizlo.llvmjit or null ≢ null '' cp ${libpizlo}/lib/filc_jit_crt.o ${libpizlo}/lib/filc_jit_mincrt.o $out/ ''}
uses yolo-glibc used by wrapper

Assemble the wrapper with appropriate flags

72wrapper=
pkgs.runCommand"filc" nativeBuildInputs = pkgs.makeWrapper;
mkdir -p $out/bin
# Base wrapper for C compiler
makeWrapper ${filc0}/bin/clang-${llvmMajor} $out/bin/clang \
--add-flags "--filc-resource-dir=${sarcasm}" \
--add-flags "-Wno-unused-command-line-argument" \
--add-flags "--gcc-toolchain=${gcc.cc}" \
--add-flags "-resource-dir ${filc0-resource-dir}/lib/clang/${llvmMajor}" \
--add-flags "--filc-dynamic-linker=${crtLib}/${lib.dynamicLinker}" \
--add-flags "--filc-crt-path=${crtLib}" \
--add-flags "--filc-stdfil-include=${filc-stdfil-headers}" \
--add-flags "--filc-os-include=${pkgs.linuxHeaders}/include" \
--add-flags "--filc-include=${yolo-glibc-impl}/include" \
${pkgs.lib.optionalStringfilc-libc ≢ null '' --add-flags "-isystem ${filc-libc}/include" \ --add-flags "-L${filc-libc}/lib" ''}
# C++ wrapper
${if filc-libcxx ≢ null then '' # The wrapper execs clang-${llvmMajor}, whose name selects the C # driver; request the C++ one, which also links libm. makeWrapper ${filc0}/bin/clang-${llvmMajor} $out/bin/clang++ \ --add-flags "--driver-mode=g++" \ --add-flags "--filc-resource-dir=${sarcasm}" \ --add-flags "-Wno-unused-command-line-argument" \ --add-flags "--gcc-toolchain=${gcc.cc}" \ --add-flags "-resource-dir ${filc0-resource-dir}/lib/clang/${llvmMajor}" \ --add-flags "--filc-dynamic-linker=${crtLib}/${lib.dynamicLinker}" \ --add-flags "--filc-crt-path=${crtLib}" \ --add-flags "--filc-stdfil-include=${filc-stdfil-headers}" \ --add-flags "--filc-os-include=${pkgs.linuxHeaders}/include" \ --add-flags "--filc-include=${yolo-glibc-impl}/include" \ ${pkgs.lib.optionalStringfilc-libc ≢ null '' --add-flags "-isystem ${filc-libc}/include" \ --add-flags "-L${filc-libc}/lib" \ ''}\ --add-flags "-nostdinc++" \ --add-flags "-I${filc-libcxx}/include/c++" \ --add-flags "-L${filc-libcxx}/lib" '' else '' ln -s clang $out/bin/clang++ ''}
in
//

Expose yolo for modules that need it (like libpizlo's Makefile) Use generic names so switching to musl later doesn't break the interface

136libyolo-impl=