compiler/filc.nix
λpkgs, filc0, yolo, compiler-rt, yolounwind, libpizlo?, filc-libc?, filc-libcxx?, sources?
| pkgs | |
| filc0 | |
| yolo | |
| compiler-rt | |
| yolounwind | |
| libpizlo | default null |
| filc-libc | default null |
| filc-libcxx | default null |
| sources | default import../lib/sources.nix inherit pkgs; |
let
Extract just the resource directory to avoid depending on the entire filc0 build
Build CRT library directory
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
mkdir -p $out/bin
# Base wrapper for C compiler
--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-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