Files
nixpkgs/pkgs/development/compilers/dotnet/vmr.nix
Ihar Hrachyshka dd0f03a56c treewide: remove usage of deprecated apple_sdk framework stubs
They are not doing anything right now. This is in preparation for their
complete removal from the tree.

Note: several changes that affect the derivation inputs (e.g. removal of
references to stub paths in build instructions) were left out. They will
be cleaned up the next iteration and will require special care.

Note: this PR is a result of a mix of ugly regex (not AST) based
automation and some manual labor. For reference, the regex automation
part was hacked in: https://github.com/booxter/nix-clean-apple_sdk

Signed-off-by: Ihar Hrachyshka <ihar.hrachyshka@gmail.com>
2025-04-19 20:28:20 -04:00

498 lines
17 KiB
Nix

{
clangStdenv,
lib,
fetchurl,
dotnetCorePackages,
jq,
curl,
git,
cmake,
pkg-config,
llvm,
zlib,
icu,
lttng-ust_2_12,
krb5,
glibcLocales,
ensureNewerSourcesForZipFilesHook,
darwin,
xcbuild,
swiftPackages,
openssl,
getconf,
python3,
xmlstarlet,
nodejs,
cpio,
callPackage,
unzip,
yq,
installShellFiles,
baseName ? "dotnet",
bootstrapSdk,
releaseManifestFile,
tarballHash,
}:
let
stdenv = if clangStdenv.hostPlatform.isDarwin then swiftPackages.stdenv else clangStdenv;
inherit (stdenv)
isLinux
isDarwin
buildPlatform
targetPlatform
;
inherit (swiftPackages) 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 { };
_icu = if isDarwin then darwin.ICU else icu;
in
stdenv.mkDerivation rec {
pname = "${baseName}-vmr";
version = release;
# TODO: fix this in the binary sdk packages
preHook = lib.optionalString stdenv.hostPlatform.isDarwin ''
addToSearchPath DYLD_LIBRARY_PATH "${_icu}/lib"
export DYLD_LIBRARY_PATH
'';
src = fetchurl {
url = "${sourceRepository}/archive/refs/tags/${tag}.tar.gz";
hash = tarballHash;
};
nativeBuildInputs =
[
ensureNewerSourcesForZipFilesHook
jq
curl.bin
git
cmake
pkg-config
python3
xmlstarlet
unzip
yq
installShellFiles
]
++ lib.optionals (lib.versionAtLeast version "9") [
nodejs
]
++ lib.optionals (lib.versionAtLeast version "10") [
cpio
]
++ lib.optionals isDarwin [
getconf
];
buildInputs =
[
# this gets copied into the tree, but we still need the sandbox profile
bootstrapSdk
# the propagated build inputs in llvm.dev break swift compilation
llvm.out
zlib
_icu
openssl
]
++ lib.optionals isLinux [
krb5
lttng-ust_2_12
]
++ lib.optionals isDarwin [
xcbuild
swift
krb5
sigtool
];
# 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 "/private/var/db/mds/system"))
(allow mach-lookup (global-name "com.apple.SecurityServer")
(global-name "com.apple.system.opendirectoryd.membership"))
'';
patches =
lib.optionals (lib.versionAtLeast version "9" && lib.versionOlder version "10") [
./UpdateNuGetConfigPackageSourcesMappings-don-t-add-em.patch
]
++ lib.optionals (lib.versionOlder version "9") [
./fix-aspnetcore-portable-build.patch
];
postPatch =
''
# set the sdk version in global.json to match the bootstrap sdk
sdk_version=$(HOME=$(mktemp -d) ${bootstrapSdk}/bin/dotnet --version)
jq '(.tools.dotnet=$dotnet)' global.json --arg dotnet "$sdk_version" > 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)'
# 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
''
+ lib.optionalString (lib.versionAtLeast version "9") ''
# repro.csproj fails to restore due to missing freebsd packages
xmlstarlet ed \
--inplace \
-s //Project -t elem -n PropertyGroup \
-s \$prev -t elem -n RuntimeIdentifiers -v ${targetRid} \
src/runtime/src/coreclr/tools/aot/ILCompiler/repro/repro.csproj
# https://github.com/dotnet/runtime/pull/98559#issuecomment-1965338627
xmlstarlet ed \
--inplace \
-s //Project -t elem -n PropertyGroup \
-s \$prev -t elem -n NoWarn -v '$(NoWarn);CS9216' \
src/runtime/Directory.Build.props
# patch packages installed from npm cache
xmlstarlet ed \
--inplace \
-s //Project -t elem -n Import \
-i \$prev -t attr -n Project -v "${./patch-npm-packages.proj}" \
src/aspnetcore/eng/DotNetBuild.props
# https://github.com/dotnet/source-build/issues/3131#issuecomment-2030215805
substituteInPlace \
src/aspnetcore/eng/Dependencies.props \
--replace-fail \
"'\$(DotNetBuildSourceOnly)' == 'true'" \
"'\$(DotNetBuildSourceOnly)' == 'true' and \$(PortableBuild) == 'false'"
# https://github.com/dotnet/source-build/issues/4325
xmlstarlet ed \
--inplace \
-r '//Target[@Name="UnpackTarballs"]/Move' -v Copy \
eng/init-source-only.proj
# error: _FORTIFY_SOURCE requires compiling with optimization (-O) [-Werror,-W#warnings]
substituteInPlace \
src/runtime/src/coreclr/ilasm/CMakeLists.txt \
--replace-fail 'set_source_files_properties( prebuilt/asmparse.cpp PROPERTIES COMPILE_FLAGS "-O0" )' ""
# https://github.com/dotnet/source-build/issues/4444
xmlstarlet ed \
--inplace \
-s '//Project/Target/MSBuild[@Targets="Restore"]' \
-t attr -n Properties -v "NUGET_PACKAGES='\$(CurrentRepoSourceBuildPackageCache)'" \
src/aspnetcore/eng/Tools.props
''
+ lib.optionalString isLinux (
''
substituteInPlace \
src/runtime/src/native/libs/System.Security.Cryptography.Native/opensslshim.c \
--replace-fail '"libssl.so"' '"${openssl.out}/lib/libssl.so"'
substituteInPlace \
src/runtime/src/native/libs/System.Net.Security.Native/pal_gssapi.c \
--replace-fail '"libgssapi_krb5.so.2"' '"${lib.getLib krb5}/lib/libgssapi_krb5.so.2"'
substituteInPlace \
src/runtime/src/native/libs/System.Globalization.Native/pal_icushim.c \
--replace-fail '"libicui18n.so"' '"${icu}/lib/libicui18n.so"' \
--replace-fail '"libicuuc.so"' '"${icu}/lib/libicuuc.so"'
''
+ lib.optionalString (lib.versionAtLeast version "9") ''
substituteInPlace \
src/runtime/src/native/libs/System.Globalization.Native/pal_icushim.c \
--replace-fail '#define VERSIONED_LIB_NAME_LEN 64' '#define VERSIONED_LIB_NAME_LEN 256'
''
+ lib.optionalString (lib.versionOlder version "9") ''
substituteInPlace \
src/runtime/src/native/libs/System.Globalization.Native/pal_icushim.c \
--replace-warn 'libicuucName[64]' 'libicuucName[256]' \
--replace-warn 'libicui18nName[64]' 'libicui18nName[256]'
''
)
+ lib.optionalString isDarwin (
''
substituteInPlace \
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 \
''
+ lib.optionalString (lib.versionAtLeast version "10") " src/runtime/src/installer/managed/Microsoft.NET.HostModel/Bundle/Codesign.cs \\\n"
+ lib.optionalString (lib.versionOlder version "10") " src/sdk/src/Tasks/Microsoft.NET.Build.Tasks/targets/Microsoft.NET.Sdk.targets \\\n"
+ ''
--replace-fail '/usr/bin/codesign' '${sigtool}/bin/codesign'
# fix: strip: error: unknown argument '-n'
substituteInPlace \
src/runtime/eng/native/functions.cmake \
--replace-fail ' -no_code_signature_warning' ""
# [...]/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 SkipInstallerBuild -v true \
src/runtime/Directory.Build.props
''
+ lib.optionalString (lib.versionAtLeast version "10") ''
xmlstarlet ed \
--inplace \
-s //Project -t elem -n PropertyGroup \
-s \$prev -t elem -n SkipInstallerBuild -v true \
src/aspnetcore/Directory.Build.props
''
+ ''
# stop passing -sdk without a path
# stop using xcrun
# add -module-cache-path to fix 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 ' -sdk ''${CMAKE_OSX_SYSROOT}' "" \
--replace-fail 'xcrun swiftc' 'swiftc -module-cache-path "$ENV{HOME}/.cache/module-cache"'
# fix: strip: error: unknown argument '-n'
substituteInPlace \
src/runtime/src/coreclr/nativeaot/BuildIntegration/Microsoft.NETCore.Native.targets \
''
+ lib.optionalString (lib.versionAtLeast version "9") " src/runtime/src/native/managed/native-library.targets \\\n"
+ ''
--replace-fail ' -no_code_signature_warning' ""
# ld: library not found for -ld_classic
substituteInPlace \
src/runtime/src/coreclr/nativeaot/BuildIntegration/Microsoft.NETCore.Native.Unix.targets \
''
+ lib.optionalString (lib.versionOlder version "10") " src/runtime/src/coreclr/tools/aot/ILCompiler/ILCompiler.csproj \\\n"
+ " --replace-fail 'Include=\"-ld_classic\"' \"\"\n"
+ lib.optionalString (lib.versionOlder version "9") ''
# [...]/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-fail 'FailOnMissingPDBs="true"' 'FailOnMissingPDBs="false"'
substituteInPlace \
src/runtime/src/mono/CMakeLists.txt \
--replace-fail '/usr/lib/libicucore.dylib' '${darwin.ICU}/lib/libicucore.dylib'
''
);
prepFlags = [
"--no-artifacts"
"--no-prebuilts"
"--with-packages"
bootstrapSdk.artifacts
];
configurePhase =
let
prepScript = if (lib.versionAtLeast version "9") then "./prep-source-build.sh" else "./prep.sh";
in
''
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 ${bootstrapSdk}/share/dotnet .dotnet
chmod -R +w .dotnet
export HOME=$(mktemp -d)
${prepScript} $prepFlags
runHook postConfigure
'';
postConfigure = lib.optionalString (lib.versionAtLeast version "9") ''
# see patch-npm-packages.proj
typeset -f isScript patchShebangs > src/aspnetcore/patch-shebangs.sh
'';
dontConfigureNuget = true; # NUGET_PACKAGES breaks the build
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}/lib/locale/locale-archive";
buildFlags =
[
"--with-packages"
bootstrapSdk.artifacts
"--clean-while-building"
"--release-manifest"
releaseManifestFile
]
++ lib.optionals (lib.versionAtLeast version "9") [
"--source-build"
]
++ [
"--"
"-p:PortableBuild=true"
]
++ lib.optional (targetRid != buildRid) "-p:TargetRid=${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
# dotnet needs to be in PATH to fix:
# src/sdk/eng/restore-toolset.sh: line 114: /nix/store/[...]-dotnet-sdk-9.0.100-preview.2.24157.14//.version: Read-only file system
version= \
CLR_CC=$(command -v clang) \
CLR_CXX=$(command -v clang++) \
PATH=$PWD/.dotnet:$PATH \
./build.sh $buildFlags
runHook postBuild
'';
outputs = [
"out"
"man"
];
installPhase =
let
assets = if (lib.versionAtLeast version "9") then "assets" else targetArch;
in
''
runHook preInstall
mkdir "$out"
pushd "artifacts/${assets}/Release"
find . -name \*.tar.gz | while read archive; do
target=$out/$(basename "$archive" .tar.gz)
# dotnet 9 currently has two copies of the sdk tarball
[[ ! -e "$target" ]] || continue
mkdir "$target"
tar -C "$target" -xzf "$PWD/$archive"
done
popd
local -r unpacked="$PWD/.unpacked"
for nupkg in $out/Private.SourceBuilt.Artifacts.*.${targetRid}/{,SourceBuildReferencePackages/}*.nupkg; do
rm -rf "$unpacked"
unzip -qd "$unpacked" "$nupkg"
chmod -R +rw "$unpacked"
rm "$nupkg"
mv "$unpacked" "$nupkg"
# TODO: should we fix executable flags here? see dotnetInstallHook
done
installManPage src/sdk/documentation/manpages/sdk/*
runHook postInstall
'';
${if stdenv.isDarwin && lib.versionAtLeast version "10" then "postInstall" else null} = ''
mkdir -p "$out"/nix-support
echo ${sigtool} > "$out"/nix-support/manual-sdk-deps
'';
# 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)
# stripped crossgen2 results in:
# Failure processing application bundle; possible file corruption.
# this needs to be a bash array
preFixup = ''
stripExclude=(\*.dll crossgen2)
'';
passthru = {
inherit releaseManifest buildRid targetRid;
icu = _icu;
# ilcompiler is currently broken: https://github.com/dotnet/source-build/issues/1215
hasILCompiler = lib.versionAtLeast version "9";
};
meta = with lib; {
description = "Core functionality needed to create .NET Core projects, that is shared between Visual Studio and CLI";
homepage = "https://dotnet.github.io/";
license = licenses.mit;
maintainers = with maintainers; [ corngood ];
mainProgram = "dotnet";
platforms = [
"x86_64-linux"
"aarch64-linux"
"x86_64-darwin"
"aarch64-darwin"
];
# build deadlocks intermittently on rosetta
# https://github.com/dotnet/runtime/issues/111628
broken = stdenv.hostPlatform.system == "x86_64-darwin";
};
}