Merge pull request #268619 from tweag/lib-descriptions
[NixPkgs.git] / pkgs / development / compilers / dotnet / build-dotnet.nix
blob91eba8f8dd776b799a0954a79433ba7a8cc4aa13
1 { type
2 , version
3 , srcs
4 , packages ? null
5 }:
7 assert builtins.elem type [ "aspnetcore" "runtime" "sdk" ];
8 assert if type == "sdk" then packages != null else true;
10 { lib
11 , stdenv
12 , fetchurl
13 , writeText
14 , autoPatchelfHook
15 , makeWrapper
16 , libunwind
17 , icu
18 , libuuid
19 , zlib
20 , libkrb5
21 , curl
22 , lttng-ust_2_12
23 , testers
24 , runCommand
25 , writeShellScript
26 , mkNugetDeps
29 let
30   pname =
31     if type == "aspnetcore" then
32       "aspnetcore-runtime"
33     else if type == "runtime" then
34       "dotnet-runtime"
35     else
36       "dotnet-sdk";
38   descriptions = {
39     aspnetcore = "ASP.NET Core Runtime ${version}";
40     runtime = ".NET Runtime ${version}";
41     sdk = ".NET SDK ${version}";
42   };
44   packageDeps = if type == "sdk" then mkNugetDeps {
45     name = "${pname}-${version}-deps";
46     nugetDeps = packages;
47   } else null;
50 stdenv.mkDerivation (finalAttrs: rec {
51   inherit pname version;
53   # Some of these dependencies are `dlopen()`ed.
54   nativeBuildInputs = [
55     makeWrapper
56   ] ++ lib.optional stdenv.isLinux autoPatchelfHook;
58   buildInputs = [
59     stdenv.cc.cc
60     zlib
61     icu
62     libkrb5
63     curl
64   ] ++ lib.optional stdenv.isLinux lttng-ust_2_12;
66   src = fetchurl (
67     srcs."${stdenv.hostPlatform.system}" or (throw
68       "Missing source (url and hash) for host system: ${stdenv.hostPlatform.system}")
69   );
71   sourceRoot = ".";
73   dontPatchELF = true;
74   noDumpEnvVars = true;
76   installPhase = ''
77     runHook preInstall
79     mkdir -p $out/bin
80     cp -r ./ $out
82     mkdir -p $out/share/doc/$pname/$version
83     mv $out/LICENSE.txt $out/share/doc/$pname/$version/
84     mv $out/ThirdPartyNotices.txt $out/share/doc/$pname/$version/
86     ln -s $out/dotnet $out/bin/dotnet
88     runHook postInstall
89   '';
91   doInstallCheck = true;
92   installCheckPhase = ''
93     $out/bin/dotnet --info
94   '';
96   # Tell autoPatchelf about runtime dependencies.
97   # (postFixup phase is run before autoPatchelfHook.)
98   postFixup = lib.optionalString stdenv.isLinux ''
99     patchelf \
100       --add-needed libicui18n.so \
101       --add-needed libicuuc.so \
102       $out/shared/Microsoft.NETCore.App/*/libcoreclr.so \
103       $out/shared/Microsoft.NETCore.App/*/*System.Globalization.Native.so \
104       $out/packs/Microsoft.NETCore.App.Host.linux-x64/*/runtimes/linux-x64/native/singlefilehost
105     patchelf \
106       --add-needed libgssapi_krb5.so \
107       $out/shared/Microsoft.NETCore.App/*/*System.Net.Security.Native.so \
108       $out/packs/Microsoft.NETCore.App.Host.linux-x64/*/runtimes/linux-x64/native/singlefilehost
109     patchelf \
110       --add-needed libssl.so \
111       $out/shared/Microsoft.NETCore.App/*/*System.Security.Cryptography.Native.OpenSsl.so \
112       $out/packs/Microsoft.NETCore.App.Host.linux-x64/*/runtimes/linux-x64/native/singlefilehost
113   '';
115   setupHook = writeText "dotnet-setup-hook" ''
116     if [ ! -w "$HOME" ]; then
117       export HOME=$(mktemp -d) # Dotnet expects a writable home directory for its configuration files
118     fi
120     export DOTNET_SKIP_FIRST_TIME_EXPERIENCE=1 # Dont try to expand NuGetFallbackFolder to disk
121     export DOTNET_NOLOGO=1 # Disables the welcome message
122     export DOTNET_CLI_TELEMETRY_OPTOUT=1
123   '';
125   passthru = {
126     inherit icu;
127     packages = packageDeps;
129     updateScript =
130       if type == "sdk" then
131       let
132         majorVersion =
133           with lib;
134           concatStringsSep "." (take 2 (splitVersion version));
135       in
136       writeShellScript "update-dotnet-${majorVersion}" ''
137         pushd pkgs/development/compilers/dotnet
138         exec ${./update.sh} "${majorVersion}"
139       '' else null;
141     tests = {
142       version = testers.testVersion {
143         package = finalAttrs.finalPackage;
144       };
146       smoke-test = runCommand "dotnet-sdk-smoke-test" {
147         nativeBuildInputs = [ finalAttrs.finalPackage ];
148       } ''
149         HOME=$(pwd)/fake-home
150         dotnet new console
151         dotnet build
152         output="$(dotnet run)"
153         # yes, older SDKs omit the comma
154         [[ "$output" =~ Hello,?\ World! ]] && touch "$out"
155       '';
156     };
157   };
159   meta = with lib; {
160     description = builtins.getAttr type descriptions;
161     homepage = "https://dotnet.github.io/";
162     license = licenses.mit;
163     maintainers = with maintainers; [ kuznero mdarocha ];
164     mainProgram = "dotnet";
165     platforms = attrNames srcs;
166   };