summary refs log tree commit diff
path: root/pkgs/development/compilers/roslyn/default.nix
diff options
context:
space:
mode:
Diffstat (limited to 'pkgs/development/compilers/roslyn/default.nix')
-rw-r--r--pkgs/development/compilers/roslyn/default.nix121
1 files changed, 121 insertions, 0 deletions
diff --git a/pkgs/development/compilers/roslyn/default.nix b/pkgs/development/compilers/roslyn/default.nix
new file mode 100644
index 00000000000..f05b821676f
--- /dev/null
+++ b/pkgs/development/compilers/roslyn/default.nix
@@ -0,0 +1,121 @@
+{ lib, stdenv
+, fetchFromGitHub
+, fetchurl
+, mono
+, dotnet-sdk_5
+, makeWrapper
+, dotnetPackages
+, unzip
+, writeText
+, symlinkJoin
+}:
+
+let
+
+  deps = map (package: stdenv.mkDerivation (with package; {
+    pname = name;
+    inherit version src;
+
+    buildInputs = [ unzip ];
+    unpackPhase = ''
+      unzip -o $src
+      chmod -R u+r .
+      function traverseRename () {
+        for e in *
+        do
+          t="$(echo "$e" | sed -e "s/%20/\ /g" -e "s/%2B/+/g")"
+          [ "$t" != "$e" ] && mv -vn "$e" "$t"
+          if [ -d "$t" ]
+          then
+            cd "$t"
+            traverseRename
+            cd ..
+          fi
+        done
+      }
+
+      traverseRename
+    '';
+
+    installPhase = ''
+      runHook preInstall
+
+      package=$out/lib/dotnet/${name}/${version}
+      mkdir -p $package
+      cp -r . $package
+      echo "{}" > $package/.nupkg.metadata
+
+      runHook postInstall
+    '';
+
+    dontFixup = true;
+  }))
+    (import ./deps.nix { inherit fetchurl; });
+
+  nuget-config = writeText "NuGet.Config" ''
+    <?xml version="1.0" encoding="utf-8"?>
+    <configuration>
+      <packageSources>
+        <clear />
+      </packageSources>
+    </configuration>
+  '';
+
+  packages = symlinkJoin { name = "roslyn-deps"; paths = deps; };
+
+  packageVersion = "3.10.0";
+
+in stdenv.mkDerivation rec {
+
+  pname = "roslyn";
+  version = "${packageVersion}-1.21102.26";
+
+  src = fetchFromGitHub {
+    owner = "dotnet";
+    repo = "roslyn";
+    rev = "v${version}";
+    sha256 = "0yf4f4vpqn9lixr37lkp29m2mk51xcm3ysv2ag332xn6zm5zpm2b";
+  };
+
+  nativeBuildInputs = [ makeWrapper dotnet-sdk_5 unzip ];
+
+  buildPhase = ''
+    runHook preBuild
+
+    rm NuGet.config
+    install -m644 -D ${nuget-config} fake-home/.nuget/NuGet/NuGet.Config
+    ln -s ${packages}/lib/dotnet fake-home/.nuget/packages
+    HOME=$(pwd)/fake-home dotnet add \
+      src/NuGet/Microsoft.Net.Compilers.Toolset/Microsoft.Net.Compilers.Toolset.Package.csproj \
+      package -n -v 5.10.0-preview.2.7169 nuget.build.tasks.pack
+    HOME=$(pwd)/fake-home dotnet msbuild -r -v:m -t:pack \
+      -p:Configuration=Release \
+      -p:RepositoryUrl="${meta.homepage}" \
+      -p:RepositoryCommit="v${version}" \
+      src/NuGet/Microsoft.Net.Compilers.Toolset/Microsoft.Net.Compilers.Toolset.Package.csproj
+
+    runHook postBuild
+  '';
+
+  installPhase = ''
+    pkg=$out/lib/dotnet/microsoft.net.compilers.toolset/${packageVersion}
+    mkdir -p $out/bin $pkg
+    unzip -q artifacts/packages/Release/Shipping/Microsoft.Net.Compilers.Toolset.${packageVersion}-dev.nupkg \
+      -d $pkg
+    # nupkg has 0 permissions for a bunch of things
+    chmod -R +rw $pkg
+
+    makeWrapper ${mono}/bin/mono $out/bin/csc \
+      --add-flags "$pkg/tasks/net472/csc.exe"
+    makeWrapper ${mono}/bin/mono $out/bin/vbs \
+      --add-flags "$pkg/tasks/net472/vbs.exe"
+  '';
+
+  meta = with lib; {
+    description = ".NET C# and Visual Basic compiler";
+    homepage = "https://github.com/dotnet/roslyn";
+    platforms = platforms.linux;
+    license = licenses.mit;
+    maintainers = with maintainers; [ corngood ];
+  };
+}