Merge pull request #119126 from fabaff/pycomfoconnect
[NixPkgs.git] / pkgs / development / compilers / roslyn / default.nix
blobf05b821676fcd6d4369d972c5505dc22e33d6937
1 { lib, stdenv
2 , fetchFromGitHub
3 , fetchurl
4 , mono
5 , dotnet-sdk_5
6 , makeWrapper
7 , dotnetPackages
8 , unzip
9 , writeText
10 , symlinkJoin
13 let
15   deps = map (package: stdenv.mkDerivation (with package; {
16     pname = name;
17     inherit version src;
19     buildInputs = [ unzip ];
20     unpackPhase = ''
21       unzip -o $src
22       chmod -R u+r .
23       function traverseRename () {
24         for e in *
25         do
26           t="$(echo "$e" | sed -e "s/%20/\ /g" -e "s/%2B/+/g")"
27           [ "$t" != "$e" ] && mv -vn "$e" "$t"
28           if [ -d "$t" ]
29           then
30             cd "$t"
31             traverseRename
32             cd ..
33           fi
34         done
35       }
37       traverseRename
38     '';
40     installPhase = ''
41       runHook preInstall
43       package=$out/lib/dotnet/${name}/${version}
44       mkdir -p $package
45       cp -r . $package
46       echo "{}" > $package/.nupkg.metadata
48       runHook postInstall
49     '';
51     dontFixup = true;
52   }))
53     (import ./deps.nix { inherit fetchurl; });
55   nuget-config = writeText "NuGet.Config" ''
56     <?xml version="1.0" encoding="utf-8"?>
57     <configuration>
58       <packageSources>
59         <clear />
60       </packageSources>
61     </configuration>
62   '';
64   packages = symlinkJoin { name = "roslyn-deps"; paths = deps; };
66   packageVersion = "3.10.0";
68 in stdenv.mkDerivation rec {
70   pname = "roslyn";
71   version = "${packageVersion}-1.21102.26";
73   src = fetchFromGitHub {
74     owner = "dotnet";
75     repo = "roslyn";
76     rev = "v${version}";
77     sha256 = "0yf4f4vpqn9lixr37lkp29m2mk51xcm3ysv2ag332xn6zm5zpm2b";
78   };
80   nativeBuildInputs = [ makeWrapper dotnet-sdk_5 unzip ];
82   buildPhase = ''
83     runHook preBuild
85     rm NuGet.config
86     install -m644 -D ${nuget-config} fake-home/.nuget/NuGet/NuGet.Config
87     ln -s ${packages}/lib/dotnet fake-home/.nuget/packages
88     HOME=$(pwd)/fake-home dotnet add \
89       src/NuGet/Microsoft.Net.Compilers.Toolset/Microsoft.Net.Compilers.Toolset.Package.csproj \
90       package -n -v 5.10.0-preview.2.7169 nuget.build.tasks.pack
91     HOME=$(pwd)/fake-home dotnet msbuild -r -v:m -t:pack \
92       -p:Configuration=Release \
93       -p:RepositoryUrl="${meta.homepage}" \
94       -p:RepositoryCommit="v${version}" \
95       src/NuGet/Microsoft.Net.Compilers.Toolset/Microsoft.Net.Compilers.Toolset.Package.csproj
97     runHook postBuild
98   '';
100   installPhase = ''
101     pkg=$out/lib/dotnet/microsoft.net.compilers.toolset/${packageVersion}
102     mkdir -p $out/bin $pkg
103     unzip -q artifacts/packages/Release/Shipping/Microsoft.Net.Compilers.Toolset.${packageVersion}-dev.nupkg \
104       -d $pkg
105     # nupkg has 0 permissions for a bunch of things
106     chmod -R +rw $pkg
108     makeWrapper ${mono}/bin/mono $out/bin/csc \
109       --add-flags "$pkg/tasks/net472/csc.exe"
110     makeWrapper ${mono}/bin/mono $out/bin/vbs \
111       --add-flags "$pkg/tasks/net472/vbs.exe"
112   '';
114   meta = with lib; {
115     description = ".NET C# and Visual Basic compiler";
116     homepage = "https://github.com/dotnet/roslyn";
117     platforms = platforms.linux;
118     license = licenses.mit;
119     maintainers = with maintainers; [ corngood ];
120   };