aboutsummaryrefslogtreecommitdiffhomepage
path: root/nix-overlays/ldc/package.nix
diff options
context:
space:
mode:
Diffstat (limited to 'nix-overlays/ldc/package.nix')
-rw-r--r--nix-overlays/ldc/package.nix180
1 files changed, 180 insertions, 0 deletions
diff --git a/nix-overlays/ldc/package.nix b/nix-overlays/ldc/package.nix
new file mode 100644
index 0000000..112a9ee
--- /dev/null
+++ b/nix-overlays/ldc/package.nix
@@ -0,0 +1,180 @@
+{ lib
+, stdenv
+, fetchFromGitHub
+, cmake
+, ninja
+, llvm_18
+, curl
+, tzdata
+, lit
+, gdb
+, unzip
+, darwin
+, callPackage
+, makeWrapper
+, runCommand
+, writeText
+, targetPackages
+
+, ldcBootstrap ? callPackage ./bootstrap.nix { }
+}:
+
+let
+ pathConfig = runCommand "ldc-lib-paths" {} ''
+ mkdir $out
+ echo ${tzdata}/share/zoneinfo/ > $out/TZDatabaseDirFile
+ echo ${curl.out}/lib/libcurl${stdenv.hostPlatform.extensions.sharedLibrary} > $out/LibcurlPathFile
+ '';
+
+in
+
+stdenv.mkDerivation (finalAttrs: {
+ pname = "ldc";
+ version = "1.39.0";
+
+ src = fetchFromGitHub {
+ owner = "ldc-developers";
+ repo = "ldc";
+ rev = "v${finalAttrs.version}";
+ hash = "sha256-ZiG0ATsY6Asu2nus3Y404fvqIwtKYoHl1JRUDU5A6mo=";
+ fetchSubmodules = true;
+ };
+
+ # https://issues.dlang.org/show_bug.cgi?id=19553
+ hardeningDisable = [ "fortify" ];
+
+ postPatch = ''
+ patchShebangs runtime tools tests
+
+ rm tests/dmd/fail_compilation/mixin_gc.d
+ rm tests/dmd/runnable/xtest46_gc.d
+ rm tests/dmd/runnable/testptrref_gc.d
+
+ # test depends on current year
+ rm tests/dmd/compilable/ddocYear.d
+ '' + lib.optionalString stdenv.hostPlatform.isLinux ''
+ substituteInPlace runtime/phobos/std/socket.d --replace-fail "assert(ih.addrList[0] == 0x7F_00_00_01);" ""
+ '' + lib.optionalString stdenv.hostPlatform.isDarwin ''
+ substituteInPlace runtime/phobos/std/socket.d --replace-fail "foreach (name; names)" "names = []; foreach (name; names)"
+
+ # https://github.com/NixOS/nixpkgs/issues/34817
+ rm -r tests/plugins/addFuncEntryCall
+ '';
+
+ nativeBuildInputs = [
+ cmake ldcBootstrap lit lit.python llvm_18.dev makeWrapper ninja unzip
+ ] ++ lib.optionals stdenv.hostPlatform.isDarwin [
+ darwin.apple_sdk.frameworks.Foundation
+ ] ++ lib.optionals (!stdenv.hostPlatform.isDarwin) [
+ # https://github.com/NixOS/nixpkgs/pull/36378#issuecomment-385034818
+ gdb
+ ];
+
+ buildInputs = [ curl tzdata ];
+
+ outputs = [ "out" "include" ];
+ outputInclude = "include";
+
+ cmakeFlags = [
+ "-DD_FLAGS=-d-version=TZDatabaseDir;-d-version=LibcurlPath;-J${pathConfig}"
+ "-DINCLUDE_INSTALL_DIR=${placeholder "include"}/include/d"
+ ];
+
+ postConfigure = ''
+ export DMD=$PWD/bin/ldmd2
+ '';
+
+ makeFlags = [ "DMD=$DMD" ];
+
+ fixNames = lib.optionalString stdenv.hostPlatform.isDarwin ''
+ fixDarwinDylibNames() {
+ local flags=()
+
+ for fn in "$@"; do
+ flags+=(-change "$(basename "$fn")" "$fn")
+ done
+
+ for fn in "$@"; do
+ if [ -L "$fn" ]; then continue; fi
+ echo "$fn: fixing dylib"
+ install_name_tool -id "$fn" "''${flags[@]}" "$fn"
+ done
+ }
+
+ fixDarwinDylibNames $(find "$(pwd)/lib" -name "*.dylib")
+ export DYLD_LIBRARY_PATH=$(pwd)/lib
+ '';
+
+ # https://github.com/ldc-developers/ldc/issues/2497#issuecomment-459633746
+ additionalExceptions = lib.optionalString stdenv.hostPlatform.isDarwin
+ "|druntime-test-shared";
+
+ checkPhase = ''
+ # Build default lib test runners
+ ninja -j$NIX_BUILD_CORES all-test-runners
+
+ ${finalAttrs.fixNames}
+
+ # Run dmd testsuite
+ export DMD_TESTSUITE_MAKE_ARGS="-j$NIX_BUILD_CORES DMD=$DMD"
+ ctest -V -R "dmd-testsuite"
+
+ # Build and run LDC D unittests.
+ ctest --output-on-failure -R "ldc2-unittest"
+
+ # Run LIT testsuite.
+ ctest -V -R "lit-tests"
+
+ # Run default lib unittests
+ ctest -j$NIX_BUILD_CORES --output-on-failure -E "ldc2-unittest|lit-tests|dmd-testsuite${finalAttrs.additionalExceptions}"
+ '';
+
+ postInstall = ''
+ wrapProgram $out/bin/ldc2 \
+ --prefix PATH : ${targetPackages.stdenv.cc}/bin \
+ --set-default CC ${targetPackages.stdenv.cc}/bin/cc
+ '';
+
+ meta = with lib; {
+ description = "LLVM-based D compiler";
+ homepage = "https://github.com/ldc-developers/ldc";
+ changelog = "https://github.com/ldc-developers/ldc/releases/tag/v${finalAttrs.version}";
+ # from https://github.com/ldc-developers/ldc/blob/master/LICENSE
+ license = with licenses; [ bsd3 boost mit ncsa gpl2Plus ];
+ mainProgram = "ldc2";
+ maintainers = with maintainers; [ lionello jtbx ];
+ platforms = [ "x86_64-linux" "i686-linux" "aarch64-linux" "x86_64-darwin" "aarch64-darwin" ];
+ };
+
+ passthru.ldcBootstrap = ldcBootstrap;
+ passthru.tests = let
+ ldc = finalAttrs.finalPackage;
+ helloWorld = stdenv.mkDerivation (finalAttrs: {
+ name = "ldc-hello-world";
+ src = writeText "hello_world.d" ''
+ module hello_world;
+ import std.stdio;
+ void main() {
+ writeln("Hello, world!");
+ }
+ '';
+ dontUnpack = true;
+ buildInputs = [ ldc ];
+ dFlags = [];
+ buildPhase = ''
+ ldc2 ${lib.escapeShellArgs finalAttrs.dFlags} -of=test $src
+ '';
+ installPhase = ''
+ mkdir -p $out/bin
+ mv test $out/bin
+ '';
+ });
+ in {
+ # Without -shared, built binaries should not contain
+ # references to the compiler binaries.
+ no-references-to-compiler = helloWorld.overrideAttrs {
+ disallowedReferences = [ ldc ];
+ dFlags = ["-g"];
+ };
+ };
+})