diff --git a/Make.config b/Make.config
index 188f42bacf..714074b2ea 100644
--- a/Make.config
+++ b/Make.config
@@ -673,5 +673,8 @@ DOTNET_tvOS_SDK_PLATFORMS=tvsimulator tvos
DOTNET_macOS_SDK_PLATFORMS=mac
DOTNET_MacCatalyst_SDK_PLATFORMS=maccatalyst
+# A local feed to place test nugets.
+NUGET_TEST_FEED=$(abspath $(TOP)/tests/.nuget/packages)
+
.SUFFIXES:
MAKEFLAGS += --no-builtin-rules
diff --git a/tests/dotnet/Makefile b/tests/dotnet/Makefile
index 07f46bb4e1..74ec0d9788 100644
--- a/tests/dotnet/Makefile
+++ b/tests/dotnet/Makefile
@@ -5,10 +5,12 @@ include $(TOP)/Make.config
# This tells NuGet to use the nupkgs we're building locally,
# and to put any extracted packages in the 'packages' directory (to not clutter up ~/.nuget/packages)
NuGet.config: $(TOP)/NuGet.config Makefile
+ $(Q) mkdir -p "$(abspath $(NUGET_TEST_FEED))"
$(Q) $(CP) $< $@.tmp
ifdef CUSTOM_DOTNET
$(Q) nuget sources add -Name dev-runtime-feed -Source $(abspath $(DOTNET_RUNTIME_PATH)/artifacts/packages/Release/Shipping) -ConfigFile $@.tmp
endif
+ $(Q) nuget sources add -Name local-tests-feed -Source $(abspath $(NUGET_TEST_FEED)) -ConfigFile $@.tmp
$(Q) nuget config -Set globalPackagesFolder=$(abspath $(CURDIR)/packages) -Config $@.tmp
$(Q) nuget config -Set repositorypath=$(abspath $(CURDIR)/packages) -Config $@.tmp
$(Q) mv $@.tmp $@
diff --git a/tests/test-libraries/Makefile b/tests/test-libraries/Makefile
index 34adc5835c..9a74356d7c 100644
--- a/tests/test-libraries/Makefile
+++ b/tests/test-libraries/Makefile
@@ -1,7 +1,7 @@
TOP=../..
include $(TOP)/Make.config
-SUBDIRS += custom-type-assembly frameworks
+SUBDIRS += custom-type-assembly frameworks nugets
# without this many compiler warnings about unused functions and variables
# in system headers show up.
diff --git a/tests/test-libraries/nugets/FrameworksInRuntimesNativeDirectory/FrameworksInRuntimesNativeDirectory.csproj b/tests/test-libraries/nugets/FrameworksInRuntimesNativeDirectory/FrameworksInRuntimesNativeDirectory.csproj
new file mode 100644
index 0000000000..23761d8615
--- /dev/null
+++ b/tests/test-libraries/nugets/FrameworksInRuntimesNativeDirectory/FrameworksInRuntimesNativeDirectory.csproj
@@ -0,0 +1,108 @@
+
+
+ netstandard2.0
+ Xamarin.Tests.FrameworksInRuntimesNativeDirectory
+ 1.0.0
+ https://github.com/xamarin/xamarin-macios
+ main
+ Microsoft
+ © Microsoft Corporation. All rights reserved.
+ https://github.com/xamarin/xamarin-macios
+ ../../..
+ $(RootTestDirectory)/test-libraries/frameworks
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Dependency
+ true
+
+
+
+
+
+ <_FrameworkListFile>$(IntermediateOutputPath)data/RuntimeList.xml
+ <_PackNativePath>runtimes/$(_RuntimeIdentifier)/native
+
+
+
+
+ <_PackageFiles Include="$(TestFrameworksDirectory)/.libs/ios-arm64/FrameworksInRuntimesNativeDirectory1.framework/*" IsNative="true" PackagePath="runtimes/ios-arm64/native/FrameworksInRuntimesNativeDirectory1.framework/" />
+ <_PackageFiles Include="$(TestFrameworksDirectory)/.libs/ios-arm/FrameworksInRuntimesNativeDirectory1.framework/*" IsNative="true" PackagePath="runtimes/ios-arm/native/FrameworksInRuntimesNativeDirectory1.framework/" />
+ <_PackageFiles Include="$(TestFrameworksDirectory)/.libs/iossimulator-x64/FrameworksInRuntimesNativeDirectory1.framework/*" IsNative="true" PackagePath="runtimes/iossimulator-x64/native/FrameworksInRuntimesNativeDirectory1.framework/" />
+ <_PackageFiles Include="$(TestFrameworksDirectory)/.libs/iossimulator-x86/FrameworksInRuntimesNativeDirectory1.framework/*" IsNative="true" PackagePath="runtimes/iossimulator-x86/native/FrameworksInRuntimesNativeDirectory1.framework/" />
+
+
+ <_PackageFiles Include="$(TestFrameworksDirectory)/.libs/tvos-arm64/FrameworksInRuntimesNativeDirectory1.framework/*" IsNative="true" PackagePath="runtimes/tvos-arm64/native/FrameworksInRuntimesNativeDirectory1.framework/" />
+ <_PackageFiles Include="$(TestFrameworksDirectory)/.libs/tvossimulator-x64/FrameworksInRuntimesNativeDirectory1.framework/*" IsNative="true" PackagePath="runtimes/tvossimulator-x64/native/FrameworksInRuntimesNativeDirectory1.framework/" />
+
+
+ <_PackageFiles Include="$(TestFrameworksDirectory)/.libs/osx-x64/FrameworksInRuntimesNativeDirectory1.framework.zip" IsNative="true" PackagePath="runtimes/osx-x64/native/" />
+ <_PackageFiles Include="$(TestFrameworksDirectory)/.libs/osx-arm64/FrameworksInRuntimesNativeDirectory1.framework.zip" IsNative="true" PackagePath="runtimes/osx-arm64/native/" />
+
+
+ <_PackageFiles Include="$(TestFrameworksDirectory)/.libs/maccatalyst-x64/FrameworksInRuntimesNativeDirectory1.framework.zip" IsNative="true" PackagePath="runtimes/maccatalyst-x64/native/" />
+ <_PackageFiles Include="$(TestFrameworksDirectory)/.libs/maccatalyst-arm64/FrameworksInRuntimesNativeDirectory1.framework.zip" IsNative="true" PackagePath="runtimes/maccatalyst-arm64/native/" />
+
+
+
+ <_PackageFiles Include="$(TestFrameworksDirectory)/.libs/ios-arm64/FrameworksInRuntimesNativeDirectory2.framework/*" IsNative="true" PackagePath="runtimes/ios-arm64/native/FrameworksInRuntimesNativeDirectory2.framework/" />
+ <_PackageFiles Include="$(TestFrameworksDirectory)/.libs/ios-arm/FrameworksInRuntimesNativeDirectory2.framework/*" IsNative="true" PackagePath="runtimes/ios-arm/native/FrameworksInRuntimesNativeDirectory2.framework/" />
+ <_PackageFiles Include="$(TestFrameworksDirectory)/.libs/iossimulator-x64/FrameworksInRuntimesNativeDirectory2.framework/*" IsNative="true" PackagePath="runtimes/iossimulator-x64/native/FrameworksInRuntimesNativeDirectory2.framework/" />
+ <_PackageFiles Include="$(TestFrameworksDirectory)/.libs/iossimulator-x86/FrameworksInRuntimesNativeDirectory2.framework/*" IsNative="true" PackagePath="runtimes/iossimulator-x86/native/FrameworksInRuntimesNativeDirectory2.framework/" />
+
+
+ <_PackageFiles Include="$(TestFrameworksDirectory)/.libs/tvos-arm64/FrameworksInRuntimesNativeDirectory2.framework/*" IsNative="true" PackagePath="runtimes/tvos-arm64/native/FrameworksInRuntimesNativeDirectory2.framework/" />
+ <_PackageFiles Include="$(TestFrameworksDirectory)/.libs/tvossimulator-x64/FrameworksInRuntimesNativeDirectory2.framework/*" IsNative="true" PackagePath="runtimes/tvossimulator-x64/native/FrameworksInRuntimesNativeDirectory2.framework/" />
+
+
+ <_PackageFiles Include="$(TestFrameworksDirectory)/.libs/osx-x64/FrameworksInRuntimesNativeDirectory2.framework.zip" IsNative="true" PackagePath="runtimes/osx-x64/native/" />
+ <_PackageFiles Include="$(TestFrameworksDirectory)/.libs/osx-arm64/FrameworksInRuntimesNativeDirectory2.framework.zip" IsNative="true" PackagePath="runtimes/osx-arm64/native/" />
+
+
+ <_PackageFiles Include="$(TestFrameworksDirectory)/.libs/maccatalyst-x64/FrameworksInRuntimesNativeDirectory2.framework.zip" IsNative="true" PackagePath="runtimes/maccatalyst-x64/native/" />
+ <_PackageFiles Include="$(TestFrameworksDirectory)/.libs/maccatalyst-arm64/FrameworksInRuntimesNativeDirectory2.framework.zip" IsNative="true" PackagePath="runtimes/maccatalyst-arm64/native/" />
+
+
+ <_PackageFiles TargetPath="%(PackagePath)" />
+
+
+
+
+ <_FrameworkListRootAttributes Include="Name" Value="Microsoft $(_PlatformName) - NET 6.0" />
+ <_FrameworkListRootAttributes Include="TargetFrameworkIdentifier" Value=".NETCoreApp" />
+ <_FrameworkListRootAttributes Include="TargetFrameworkVersion" Value="6.0" />
+ <_PackageFiles Include="$(_FrameworkListFile)" PackagePath="data" />
+
+
+
+
+
+
+
+
+
+
+ _GenerateFrameworkListFile;
+ $(BeforePack);
+
+
+
+
diff --git a/tests/test-libraries/nugets/FrameworksInRuntimesNativeDirectory/Library.cs b/tests/test-libraries/nugets/FrameworksInRuntimesNativeDirectory/Library.cs
new file mode 100644
index 0000000000..b35af8435f
--- /dev/null
+++ b/tests/test-libraries/nugets/FrameworksInRuntimesNativeDirectory/Library.cs
@@ -0,0 +1,22 @@
+using System;
+using System.Runtime.InteropServices;
+
+namespace FrameworksInRuntimesNativeDirectory {
+ public static class PInvokes {
+ [DllImport ("@rpath/FrameworksInRuntimesNativeDirectory1.framework/FrameworksInRuntimesNativeDirectory1")]
+ static extern IntPtr getFrameworksInRuntimesNativeDirectory1 ();
+
+ public static string GetFrameworksInRuntimesNativeDirectory1 ()
+ {
+ return Marshal.PtrToStringAuto (getFrameworksInRuntimesNativeDirectory1 ());
+ }
+
+ [DllImport ("@rpath/FrameworksInRuntimesNativeDirectory2.framework/FrameworksInRuntimesNativeDirectory2")]
+ static extern IntPtr getFrameworksInRuntimesNativeDirectory2 ();
+
+ public static string GetFrameworksInRuntimesNativeDirectory2 ()
+ {
+ return Marshal.PtrToStringAuto (getFrameworksInRuntimesNativeDirectory2 ());
+ }
+ }
+}
diff --git a/tests/test-libraries/nugets/FrameworksInRuntimesNativeDirectory/Makefile b/tests/test-libraries/nugets/FrameworksInRuntimesNativeDirectory/Makefile
new file mode 100644
index 0000000000..4b3198f8b7
--- /dev/null
+++ b/tests/test-libraries/nugets/FrameworksInRuntimesNativeDirectory/Makefile
@@ -0,0 +1,30 @@
+TOP=../../../..
+include $(TOP)/Make.config
+
+unexport MSBUILD_EXE_PATH
+
+NuGet.config global.json:
+ $(Q) $(MAKE) -C $(TOP)/tests/dotnet $@
+ $(Q) $(CP) $(TOP)/tests/dotnet/$@ .
+
+.libs:
+ $(Q) mkdir -p $@
+
+PACKAGE_ID=$(shell grep PackageId FrameworksInRuntimesNativeDirectory.csproj | sed 's_.*\(.*\).*_\1_')
+PACKAGE_VERSION=$(shell grep '' FrameworksInRuntimesNativeDirectory.csproj | sed 's_.*\(.*\).*_\1_')
+
+# Test case for https://github.com/xamarin/xamarin-macios/issues/12440
+.libs/FrameworksInRuntimesNativeDirectory.nupkg: FrameworksInRuntimesNativeDirectory.csproj NuGet.config global.json $(wildcard *.cs) | .libs
+ $(Q) mkdir -p $(abspath $(NUGET_TEST_FEED))
+ $(Q_GEN) $(DOTNET6) pack /bl $(DOTNET_PACK_VERBOSITY) $<
+ $(Q) $(CP) bin/Debug/Xamarin.Tests.FrameworksInRuntimesNativeDirectory.$(PACKAGE_VERSION).nupkg $@
+
+INSTALLED_PACKAGE=$(NUGET_TEST_FEED)/xamarin.tests.frameworksinruntimesnativedirectory/$(PACKAGE_VERSION)/xamarin.tests.frameworksinruntimesnativedirectory.$(PACKAGE_VERSION).nupkg
+
+$(INSTALLED_PACKAGE): .libs/FrameworksInRuntimesNativeDirectory.nupkg
+ if test -d $(NUGET_TEST_FEED)/$(PACKAGE_ID)/$(PACKAGE_VERSION); then nuget delete $(PACKAGE_ID) $(PACKAGE_VERSION) -source $(abspath $(NUGET_TEST_FEED)) -NonInteractive || true; fi
+ rm -Rf $(TOP)/tests/dotnet/packages/xamarin.tests.frameworksinruntimesnativedirectory
+ mkdir -p $(abspath $(NUGET_TEST_FEED))
+ nuget add "$<" -source $(abspath $(NUGET_TEST_FEED)) -NonInteractive
+
+all-local:: $(INSTALLED_PACKAGE)
diff --git a/tests/test-libraries/nugets/Makefile b/tests/test-libraries/nugets/Makefile
new file mode 100644
index 0000000000..6d296c2019
--- /dev/null
+++ b/tests/test-libraries/nugets/Makefile
@@ -0,0 +1,4 @@
+TOP=../../..
+SUBDIRS=FrameworksInRuntimesNativeDirectory
+
+include $(TOP)/Make.config