{ lib, llvmPackages, cmake, curl, libxml2, libffi, xar, rev, debug ? false, checks ? false, }: let inherit (builtins) readFile elemAt; # inherit (lib.sources) cleanSourceWith cleanSource; inherit (lib.lists) findFirst; inherit (lib.asserts) assertMsg; inherit (lib.strings) hasInfix splitString removeSuffix removePrefix optionalString; in llvmPackages.stdenv.mkDerivation (_: { pname = "c3c${optionalString debug "-debug"}"; version = let foundLine = findFirst (x: hasInfix "COMPILER_VERSION" x) "none" ( splitString "\n" ( readFile ../src/version.h ) ); in assert assertMsg (foundLine != "none") "No COMPILER_VERSION substring was found in version.h"; removeSuffix "\"" ( removePrefix "\"" ( elemAt ( splitString " " foundLine ) 2 ) ); src = ../.; # See https://github.com/symphorien/nixseparatedebuginfod for usage separateDebugInfo = true; # Here we substitute GIT_HASH which is not set for cmake in nix builds. # Similar situation is with __DATE__ and __TIME__ macros, which are # set to "Jan 01 1980 00:00:00" by default. postPatch = '' substituteInPlace git_hash.cmake --replace-fail "\''${GIT_HASH}" "${rev}" local FILE_NAMES="$(find src -type f)" substituteInPlace $FILE_NAMES --replace-quiet "__DATE__" "\"$(date '+%b %d %Y')\"" substituteInPlace $FILE_NAMES --replace-quiet "__TIME__" "\"$(date '+%T')\"" patchShebangs scripts/tools/ci_tests.sh # Skip library tests (dynlib/staticlib). substituteInPlace scripts/tools/ci_tests.sh \ --replace-fail "run_dynlib_tests() {" "run_dynlib_tests() { return 0;" \ --replace-fail "run_staticlib_tests() {" "run_staticlib_tests() { return 0;" # Remove '--linker=builtin' from run_testproject so it uses the working system linker. substituteInPlace scripts/tools/ci_tests.sh \ --replace-fail 'ARGS="$ARGS --linker=builtin"' 'ARGS="$ARGS"' ''; cmakeBuildType = if debug then "Debug" else "Release"; # Only set LLVM_CRT_LIBRARY_DIR for Darwin. cmakeFlags = [ "-DC3_ENABLE_CLANGD_LSP=${if debug then "ON" else "OFF"}" "-DC3_LLD_DIR=${llvmPackages.lld.lib}/lib" ] ++ lib.optionals llvmPackages.stdenv.hostPlatform.isDarwin [ "-DLLVM_CRT_LIBRARY_DIR=${llvmPackages.compiler-rt}/lib/darwin" ]; nativeBuildInputs = [ cmake llvmPackages.llvm llvmPackages.lld llvmPackages.compiler-rt ]; buildInputs = [ curl libxml2 libffi ] ++ lib.optionals llvmPackages.stdenv.hostPlatform.isDarwin [ xar ]; doCheck = checks && lib.elem llvmPackages.stdenv.system [ "x86_64-linux" "x86_64-darwin" "aarch64-darwin" ]; # In check phase we preserve BUILD directory as # we need to return to it before install phase checkPhase = '' runHook preCheck local BUILD_DIR=$(pwd) export SKIP_NETWORK_TESTS=1 ../scripts/tools/ci_tests.sh $(pwd)/c3c cd $BUILD_DIR runHook postCheck ''; meta = with lib; { description = "Compiler for the C3 language"; homepage = "https://github.com/c3lang/c3c"; license = licenses.lgpl3Only; maintainers = with maintainers; [ luc65r anas vssukharev ]; platforms = platforms.all; mainProgram = "c3c"; }; })