2024-02-21 03:21:08 +00:00
{ clangStdenv
, stdenvNoCC
, lib
, fetchurl
, fetchFromGitHub
, dotnetCorePackages
, jq
, curl
, git
, cmake
, pkg-config
, llvm
, zlib
, icu
, lttng-ust_2_12
, libkrb5
, glibcLocales
, ensureNewerSourcesForZipFilesHook
, darwin
, xcbuild
, swiftPackages
, openssl
, getconf
, makeWrapper
, python3
, xmlstarlet
, callPackage
, dotnetSdk
, releaseManifestFile
, tarballHash
} :
let
stdenv = if clangStdenv . isDarwin
then swiftPackages . stdenv
else clangStdenv ;
inherit ( stdenv )
isLinux
isDarwin
buildPlatform
targetPlatform ;
inherit ( darwin ) cctools ;
inherit ( swiftPackages ) apple_sdk swift ;
releaseManifest = lib . importJSON releaseManifestFile ;
inherit ( releaseManifest ) release sourceRepository tag ;
buildRid = dotnetCorePackages . systemToDotnetRid buildPlatform . system ;
targetRid = dotnetCorePackages . systemToDotnetRid targetPlatform . system ;
targetArch = lib . elemAt ( lib . splitString " - " targetRid ) 1 ;
sigtool = callPackage ./sigtool.nix { } ;
# we need dwarfdump from cctools, but can't have e.g. 'ar' overriding stdenv
dwarfdump = stdenvNoCC . mkDerivation {
name = " d w a r f d u m p - w r a p p e r " ;
dontUnpack = true ;
installPhase = ''
mkdir - p " $ o u t / b i n "
ln - s " ${ cctools } / b i n / d w a r f d u m p " " $ o u t / b i n "
'' ;
} ;
_icu = if isDarwin then darwin . ICU else icu ;
in stdenv . mkDerivation rec {
pname = " d o t n e t - v m r " ;
version = release ;
# TODO: fix this in the binary sdk packages
preHook = lib . optionalString stdenv . isDarwin ''
addToSearchPath DYLD_LIBRARY_PATH " ${ _icu } / l i b "
export DYLD_LIBRARY_PATH
'' ;
src = fetchurl {
url = " ${ sourceRepository } / a r c h i v e / r e f s / t a g s / ${ tag } . t a r . g z " ;
hash = tarballHash ;
} ;
nativeBuildInputs = [
ensureNewerSourcesForZipFilesHook
jq
curl . bin
git
cmake
pkg-config
python3
xmlstarlet
]
++ lib . optionals isDarwin [
getconf
] ;
buildInputs = [
# this gets copied into the tree, but we still want the hooks to run
dotnetSdk
# the propagated build inputs in llvm.dev break swift compilation
llvm . out
zlib
_icu
openssl
]
++ lib . optionals isLinux [
libkrb5
lttng-ust_2_12
]
++ lib . optionals isDarwin ( with apple_sdk . frameworks ; [
xcbuild . xcrun
swift
( libkrb5 . overrideAttrs ( old : {
# the propagated build inputs break swift compilation
buildInputs = old . buildInputs ++ old . propagatedBuildInputs ;
propagatedBuildInputs = [ ] ;
} ) )
dwarfdump
sigtool
Foundation
CoreFoundation
CryptoKit
System
] ) ;
# This is required to fix the error:
# > CSSM_ModuleLoad(): One or more parameters passed to a function were not valid.
# The error occurs during
# AppleCryptoNative_X509ImportCollection -> ReadX509 -> SecItemImport
# while importing trustedroots/codesignctl.pem. This happens during any dotnet
# restore operation.
# Enabling com.apple.system.opendirectoryd.membership causes swiftc to use
# /var/folders for its default cache path, so the swiftc -module-cache-path
# patch below is required.
sandboxProfile = ''
( allow file-read * ( subpath " / p r i v a t e / v a r / d b / m d s / s y s t e m " ) )
( allow mach-lookup ( global-name " c o m . a p p l e . S e c u r i t y S e r v e r " )
( global-name " c o m . a p p l e . s y s t e m . o p e n d i r e c t o r y d . m e m b e r s h i p " ) )
'' ;
patches = [
./fix-aspnetcore-portable-build.patch
./fix-tmp-path.patch
]
++ lib . optionals isDarwin [
./stop-passing-bare-sdk-arg-to-swiftc.patch
] ;
postPatch = ''
# set the sdk version in global.json to match the bootstrap sdk
jq ' ( . tools . dotnet = $ dotnet ) ' global . json - - arg dotnet " $ ( ${ dotnetSdk } / b i n / d o t n e t - - v e r s i o n ) " > global . json ~
mv global . json { ~ , }
patchShebangs $ ( find - name \ * . sh - type f - executable )
# I'm not sure why this is required, but these files seem to use the wrong
# property name.
# TODO: not needed in 9.0?
[ [ ! - f src/xliff-tasks/eng/Versions.props ] ] || \
sed - i ' s : \ bVersionBase \ b:VersionPrefix:g' \
src/xliff-tasks/eng/Versions.props
# at least in 9.0 preview 1, this package depends on a specific beta build
# of System.CommandLine
xmlstarlet ed \
- - inplace \
- s // Project - t elem - n PropertyGroup \
- s \ $ prev - t elem - n NoWarn - v ' $ ( NoWarn ) ; NU1603' \
src/nuget-client/src/NuGet.Core/NuGet.CommandLine.XPlat/NuGet.CommandLine.XPlat.csproj
# AD0001 crashes intermittently in source-build-reference-packages with
# CSC : error AD0001: Analyzer 'Microsoft.NetCore.CSharp.Analyzers.Runtime.CSharpDetectPreviewFeatureAnalyzer' threw an exception of type 'System.NullReferenceException' with message 'Object reference not set to an instance of an object.'.
# possibly related to https://github.com/dotnet/runtime/issues/90356
xmlstarlet ed \
- - inplace \
- s // Project - t elem - n PropertyGroup \
- s \ $ prev - t elem - n NoWarn - v ' $ ( NoWarn ) ; AD0001' \
src/source-build-reference-packages/src/referencePackages/Directory.Build.props
# https://github.com/microsoft/ApplicationInsights-dotnet/issues/2848
xmlstarlet ed \
- - inplace \
- u // _ : Project/_ : PropertyGroup/_ : BuildNumber - v 0 \
src/source-build-externals/src/application-insights/.props/_GlobalStaticVersion.props
# this fixes compile errors with clang 15 (e.g. darwin)
substituteInPlace \
src/runtime/src/native/libs/CMakeLists.txt \
- - replace-fail ' add_compile_options ( - Weverything ) ' ' add_compile_options ( - Wall ) '
2024-03-09 21:32:31 +00:00
# strip native symbols in runtime
# see: https://github.com/dotnet/source-build/issues/2543
xmlstarlet ed \
- - inplace \
- s // Project - t elem - n PropertyGroup \
- s \ $ prev - t elem - n KeepNativeSymbols - v false \
src/runtime/Directory.Build.props
2024-02-21 03:21:08 +00:00
''
+ lib . optionalString isLinux ''
substituteInPlace \
src/runtime/src/native/libs/System.Security.Cryptography.Native/opensslshim.c \
- - replace-fail ' " l i b s s l . s o " ' ' " ${ openssl . out } / l i b / l i b s s l . s o " '
substituteInPlace \
src/runtime/src/native/libs/System.Net.Security.Native/pal_gssapi.c \
- - replace-fail ' " l i b g s s a p i _ k r b 5 . s o . 2 " ' ' " ${ libkrb5 } / l i b / l i b g s s a p i _ k r b 5 . s o . 2 " '
substituteInPlace \
src/runtime/src/native/libs/System.Globalization.Native/pal_icushim.c \
- - replace-fail ' " l i b i c u i 1 8 n . s o " ' ' " ${ icu } / l i b / l i b i c u i 1 8 n . s o " ' \
- - replace-fail ' " l i b i c u u c . s o " ' ' " ${ icu } / l i b / l i b i c u u c . s o " '
# TODO: we should really make sure the first one (9.0) or the rest (8.0)
# works, but --replace-fail results in an empty file
substituteInPlace \
src/runtime/src/native/libs/System.Globalization.Native/pal_icushim.c \
- - replace-warn ' #define VERSIONED_LIB_NAME_LEN 64' '#define VERSIONED_LIB_NAME_LEN 256' \
- - replace-warn ' libicuucName [ 64 ] ' ' libicuucName [ 256 ] ' \
- - replace-warn ' libicui18nName [ 64 ] ' ' libicui18nName [ 256 ] '
''
+ lib . optionalString isDarwin ''
substituteInPlace \
src/runtime/src/mono/CMakeLists.txt \
src/runtime/src/native/libs/System.Globalization.Native/CMakeLists.txt \
- - replace-fail ' /usr/lib/libicucore.dylib ' ' $ { darwin . ICU } /lib/libicucore.dylib '
substituteInPlace \
src/runtime/src/installer/managed/Microsoft.NET.HostModel/HostModelUtils.cs \
src/sdk/src/Tasks/Microsoft.NET.Build.Tasks/targets/Microsoft.NET.Sdk.targets \
- - replace-fail ' /usr/bin/codesign ' ' $ { sigtool } /bin/codesign '
# [...]/build.proj(123,5): error : Did not find PDBs for the following SDK files:
# [...]/build.proj(123,5): error : sdk/8.0.102/System.Resources.Extensions.dll
# [...]/build.proj(123,5): error : sdk/8.0.102/System.CodeDom.dll
# [...]/build.proj(123,5): error : sdk/8.0.102/FSharp/System.Resources.Extensions.dll
# [...]/build.proj(123,5): error : sdk/8.0.102/FSharp/System.CodeDom.dll
substituteInPlace \
build . proj \
- - replace-warn ' FailOnMissingPDBs = " t r u e " ' ' FailOnMissingPDBs = " f a l s e " '
# [...]/installer.singlerid.targets(434,5): error MSB3073: The command "pkgbuild [...]" exited with code 127
xmlstarlet ed \
- - inplace \
- s // Project - t elem - n PropertyGroup \
- s \ $ prev - t elem - n InnerBuildArgs - v ' $ ( InnerBuildArgs ) /p : SkipInstallerBuild = true' \
src/runtime/eng/SourceBuild.props
# fixes swift errors, see sandboxProfile
# <unknown>:0: error: unable to open output file '/var/folders/[...]/C/clang/ModuleCache/[...]/SwiftShims-[...].pcm': 'Operation not permitted'
# <unknown>:0: error: could not build Objective-C module 'SwiftShims'
substituteInPlace \
src/runtime/src/native/libs/System.Security.Cryptography.Native.Apple/CMakeLists.txt \
- - replace-fail ' xcrun swiftc' ' xcrun swiftc - module-cache-path " $ E N V { H O M E } / . c a c h e / m o d u l e - c a c h e " '
'' ;
prepFlags = [
" - - n o - a r t i f a c t s "
" - - n o - p r e b u i l t s "
] ;
configurePhase = ''
runHook preConfigure
# The build process tries to overwrite some things in the sdk (e.g.
# SourceBuild.MSBuildSdkResolver.dll), so it needs to be mutable.
cp - Tr $ { dotnetSdk } . dotnet
chmod - R + w . dotnet
./prep.sh $ prepFlags
runHook postConfigure
'' ;
dontUseCmakeConfigure = true ;
# https://github.com/NixOS/nixpkgs/issues/38991
# bash: warning: setlocale: LC_ALL: cannot change locale (en_US.UTF-8)
LOCALE_ARCHIVE = lib . optionalString isLinux
" ${ glibcLocales } / l i b / l o c a l e / l o c a l e - a r c h i v e " ;
buildFlags = [
" - - w i t h - p a c k a g e s " dotnetSdk . artifacts
" - - c l e a n - w h i l e - b u i l d i n g "
" - - r e l e a s e - m a n i f e s t " releaseManifestFile
" - - "
" - p : P o r t a b l e B u i l d = t r u e "
] ++ lib . optional ( targetRid != buildRid ) " - p : T a r g e t R i d = ${ targetRid } " ;
buildPhase = ''
runHook preBuild
# on darwin, in a sandbox, this causes:
# CSSM_ModuleLoad(): One or more parameters passed to a function were not valid.
export DOTNET_GENERATE_ASPNET_CERTIFICATE = 0
# CLR_CC/CXX need to be set to stop the build system from using clang-11,
# which is unwrapped
version = \
CLR_CC = $ ( command - v clang ) \
CLR_CXX = $ ( command - v clang ++ ) \
./build.sh $ buildFlags
runHook postBuild
'' ;
installPhase = ''
runHook preInstall
mkdir " $ o u t "
pushd " a r t i f a c t s / ${ targetArch } / R e l e a s e "
for archive in * . tar . gz ; do
target = $ out / '' ${ archive % . tar . gz }
mkdir " $ t a r g e t "
tar - C " $ t a r g e t " - xzf " $ P W D / $ a r c h i v e "
done
popd
runHook postInstall
'' ;
2024-03-12 01:32:42 +00:00
# dotnet cli is in the root, so we need to strip from there
# TODO: should we install in $out/share/dotnet?
stripDebugList = [ " . " ] ;
# stripping dlls results in:
# Failed to load System.Private.CoreLib.dll (error code 0x8007000B)
stripExclude = [ " * . d l l " ] ;
2024-02-21 03:21:08 +00:00
passthru = {
inherit releaseManifest buildRid targetRid ;
icu = _icu ;
} ;
meta = with lib ; {
description = " C o r e f u n c t i o n a l i t y n e e d e d t o c r e a t e . N E T C o r e p r o j e c t s , t h a t i s s h a r e d b e t w e e n V i s u a l S t u d i o a n d C L I " ;
homepage = " h t t p s : / / d o t n e t . g i t h u b . i o / " ;
license = licenses . mit ;
maintainers = with maintainers ; [ corngood ] ;
mainProgram = " d o t n e t " ;
platforms = [
" x 8 6 _ 6 4 - l i n u x "
" a a r c h 6 4 - l i n u x "
" x 8 6 _ 6 4 - d a r w i n "
" a a r c h 6 4 - d a r w i n "
] ;
} ;
}