Fil-C on Nix

Filnix wiki

mbrock/filnix

lib/default.nix

λpkgs
let
5join=
lib.concatStringsSep
uses lib used by mkFilcLLVMBuild

Toolchain versions

8gcc=
pkgs.gcc14
used by gcc-lib
9llvm=
pkgs.llvmPackages_20
10llvmMajor=
lib.versions.majorllvm.release_version
11targetPlatform=
pkgs.stdenv.targetPlatform.config
used by gcc-lib
12gcc-lib=
"${gcc.cc}/lib/gcc/${targetPlatform}/${gcc.version}"

The architecture Fil-C builds for; upstream's libpas/common.sh.

15platform=
pkgs.stdenv.hostPlatform
used by filcArch
16filcArch=
platform.isx86_64
→
"x86_64"
platform.isAarch64
→
"aarch64"
else
throw"Fil-C supports x86_64-linux and aarch64-linux, not ${platform.system}"
23llvmTarget=
x86_64 = "X86"; aarch64 = "AArch64";.${filcArch}
29elfFormat=
x86_64 = "elf64-x86-64"; aarch64 = "elf64-littleaarch64";.${filcArch}
uses filcArch
35dynamicLinker=
"ld-fil1-${filcArch}.so"
uses filcArch

glibc's aclocal.m4 insists on exactly this Autoconf release.

38autoconf272=
pkgs.autoconf.overrideAttrs
λold
rec
39version=
"2.72"
40src=
pkgs.fetchurl
41url=
"mirror://gnu/autoconf/autoconf-${version}.tar.xz"
42hash=
"sha256-uohcExlXjWyU1G6bDc60AUyq/iSQ5Deg28o/JwoiP1o="

Standard ccache setup for all builds

47setupCcache=
if [ -w "/nix/var/cache/ccache" ]; then
export CCACHE_DIR=/nix/var/cache/ccache
export CCACHE_COMPRESS=1
export CCACHE_SLOPPINESS=random_seed
export CCACHE_UMASK=007
else
export CCACHE_DISABLE=1
fi
58commonLLVMOptions=
59CMAKE_BUILD_TYPE=
"RelWithDebInfo"
60LLVM_ENABLE_ASSERTIONS=
true
61LLVM_ENABLE_WARNINGS=
false
62LLVM_ENABLE_ZSTD=
false
63LLVM_TARGETS_TO_BUILD=
64LLVM_ENABLE_LIBXML2=
false
65LLVM_ENABLE_LIBEDIT=
false
66LLVM_ENABLE_LIBPFM=
false
67LLVM_ENABLE_ZLIB=
false
68LLVM_ENABLE_CURL=
false
69LLVM_ENABLE_HTTPLIB=
false
70LLVM_STATIC_LINK_CXX_STDLIB=
true
71CMAKE_EXE_LINKER_FLAGS=
"-static-libgcc"
72CMAKE_INSTALL_PREFIX=
"$out"
73LLVM_USE_LINKER=
"lld"
uses llvmTarget used by allOptions

Convert attribute set to CMake flags

77cmakeFlags=
λopts
lib.mapAttrsToList
λk v
let
82val=
if lib.isBoolv then if v then "ON" else "OFF" else toStringv
uses lib
in
"-D${k}=${val}"
uses lib used by mkFilcLLVMBuild

This is just a function that abstracts some common stuff for doing CMake/ninja/ccache builds.

89mkFilcLLVMBuild=
λpname, cmakeOptions?, cmakeSource, buildDir?, ninjaTargets?, installTargets?, preConfigure?, postBuild?, customInstall?, meta?
pname
cmakeOptionsdefault { }
cmakeSource
buildDirdefault "build"
ninjaTargetsdefault [ ]
installTargetsdefault "install"
preConfiguredefault ""
postBuilddefault ""
customInstalldefault null
metadefault { }
pkgs.ccacheStdenv.mkDerivation
103inherit
pname meta
104version=
"git"

Let Nix decide how many cores to use.

107enableParallelBuilding=
true
109nativeBuildInputs=
with pkgs; cmake ninja python3 git patchelf ccache lld
119configurePhase=
let
in
export HOME=$TMPDIR
export HOSTNAME=nix-build
mkdir -p ${buildDir}
cmake -B ${buildDir} -S ${cmakeSource} -G Ninja ${join" " cmakeFlagsallOptions}
134buildPhase=
NINJA_STATUS="[B %f/%t %es] " ninja -v -C ${buildDir} ${join" " ninjaTargets}
139installPhase=
else
NINJA_STATUS="[I %f/%t %es] " ninja -v -C ${buildDir} ${join" " installTargets}

Merge multiple derivations into one (layers applied in order)

149mergeLayers=
λname layers
pkgs.runCommandname nativeBuildInputs = pkgs.rsync;
mkdir -p $out/{lib,include,bin}
${lib.concatMapStringsSep"\n" layer: '' [ -d ${layer}/lib ] && rsync -a ${layer}/lib/ $out/lib/ || true [ -d ${layer}/include ] && rsync -a ${layer}/include/ $out/include/ || true [ -d ${layer}/bin ] && rsync -a ${layer}/bin/ $out/bin/ || true '' layers}
chmod -R u+w $out
uses lib

Add nixpkgs libc contract metadata to a sysroot

166addLibcMetadata=
λsysroot
λdynamicLinker, crts?
dynamicLinker
crtsdefault "crt1.o" "crti.o" "crtn.o"
pkgs.runCommand"${sysroot.name}-with-metadata" { }
cp -r ${sysroot} $out
chmod -R u+w $out
mkdir -p $out/nix-support
echo "$out/lib/${dynamicLinker}" > $out/nix-support/dynamic-linker
${lib.concatMapStringsSep"\n" crt: '' [ -f "$out/lib/${crt}" ] && echo "$out/lib/${crt}" > "$out/nix-support/${crt}" '' crts}
uses lib
in
188inherit
lib join
189inherit
gcc llvm llvmMajor targetPlatform gcc-lib filcArch llvmTarget elfFormat dynamicLinker
200inherit
autoconf272 setupCcache commonLLVMOptions cmakeFlags
206inherit
mkFilcLLVMBuild mergeLayers addLibcMetadata

Define a version of the host Clang that doesn't have any automatic stuff, to build libpizlo in a clean and consistent way.

210clang-rsrc=
pkgs.lib.getLibllvm.clang.cc
uses llvm
211clang-include=
"${pkgs.lib.getLibllvm.clang.cc}/lib/clang/${llvmMajor}/include"
212base-clang=
pkgs.writeShellScriptBin"clang"
exec ${llvm.clang.cc}/bin/clang -isystem ${pkgs.lib.getLibllvm.clang.cc}/lib/clang/${llvmMajor}/include "$@"