Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add support for absolute paths for [Intermediate]OutputPath for remote builds #18997

Open
rolfbjarne opened this issue Sep 11, 2023 · 4 comments
Labels
feature A feature to be implemented windows-only The issue only occur on Windows
Milestone

Comments

@rolfbjarne
Copy link
Member

We've never supported absolute paths for [Intermediate]OutputPath, but this has not been a frequent problem, because the default was to use relative paths.

However, in .NET 8, a new output path mode was implemented (UseArtifactsPath=true), and now absolute paths for [Intermediate]OutputPath will be much more common.

As such, we should look into making absolute paths work.

This wasn't done for .NET 8 because it's a rather complicated problem to fix, and the complexity was discovered too late in the release cycle. In the meantime, we've added logic to detect the scenario, and show an actionable error instead (#18900).

The basic problem is that the project's remote directory, the one with the hash:

/Users/rolf/Library/Caches/Xamarin/mtbs/builds/DotNet8Test/f915cefc3161dc001199a62de03b2def4b16a89c7efc331dce9f95ca9b91ccc1/

is both the root of the project directory (so any relative paths are resolved relative to that directory) as well as the root of the drive system (so it contains C:/... paths).

This means that a given path has two valid locations if it's inside the project directory:

  1. As a relative path:

/Users/rolf/Library/Caches/Xamarin/mtbs/builds/DotNet8Test/f915cefc3161dc001199a62de03b2def4b16a89c7efc331dce9f95ca9b91ccc1/outputdir/whatever

  1. As an absolute path

/Users/rolf/Library/Caches/Xamarin/mtbs/builds/DotNet8Test/f915cefc3161dc001199a62de03b2def4b16a89c7efc331dce9f95ca9b91ccc1/C:/source/projects/DotNet8Test/outputdir/whatever

and the build breaks when one file is in one location, but our build logic expects it in the other.

One potential fix would be to only work with absolute paths on the Mac (relative to the hash directory), so that the build would create this path:

/Users/rolf/Library/Caches/Xamarin/mtbs/builds/DotNet8Test/f915cefc3161dc001199a62de03b2def4b16a89c7efc331dce9f95ca9b91ccc1/C:/source/projects/DotNet8Test/

make that the current directory, and make all relative paths relative to that directory. Then there would be no confusion, because each path wouldn't have two different locations.

References:

@rolfbjarne rolfbjarne added feature A feature to be implemented windows-only The issue only occur on Windows labels Sep 11, 2023
@rolfbjarne rolfbjarne added this to the .NET 9 milestone Sep 11, 2023
@gabsamples6
Copy link

@rolfbjarne we cannot add nugets to xamarin.firebase.ios.Cloudmessaging in both net 7 and 8

  1. Create an empty Maui project .net 7 or 8 (windows machine)
  2. Nugets - add reference to Xamarin.Firebase.iOS.Cloudmessagging and you will see

Severity Code Description Project File Line Suppression State
Error Could not find a part of the path 'C:\Users\joebloggs.nuget\packages\xamarin.firebase.ios.installations\8.10.0.3\lib\xamarinios10\Firebase.Installations.resources\FirebaseInstallations.xcframework\ios-arm64_x86_64-simulator\FirebaseInstallations.framework\Headers\FIRInstallationsAuthTokenResult.h'.

Any workarounds?

@rolfbjarne
Copy link
Member Author

@gabsamples6 looks like a MAX_PATH problem, because that path is 263 characters long :/

One workaround would be to put the packages directory in the root folder (and with a shorter name), that should leave a bit more leeway for nuget packages.

@gabsamples6
Copy link

@rolfbjarne thanks for your time on this one - this is what I tried.
Changed maxPath in windows 11 - did not work
moved to c:/nuget and even this was not enough

what worked
go to the xaman.shared.Sdk.target and remove the _CopyLocalBindingResources target as you suggested in another thread.

so whenever there is a new version of visual studio I have to remember to go back and delete this target. Not sure if there are any side effects to it but it allowed me to proceed.

However that cleared the first hurdle ony to find out that Xamarin.firebase.cloudmessaging does not work on windows and we develop on windows.

Messaging.SharedInstance is always null so many people are stuck on this one and i have below. Any suggestions? workaround?


	<ItemGroup>
		<BundleResource Include="Platforms\iOS\GoogleService-Info.plist" Link="GoogleService-Info.plist" />
	</ItemGroup>

thank you for your time

@rolfbjarne
Copy link
Member Author

However that cleared the first hurdle ony to find out that Xamarin.firebase.cloudmessaging does not work on windows

I'm not aware of any issues with Xamarin.Firebase.Cloudmessaging, could you create a new issue with a test project?

rolfbjarne added a commit to rolfbjarne/xamarin-macios that referenced this issue Nov 8, 2023
…dotnet-linker. Fixes xamarin#19378.

We currently detect/resolve binding resource packages (the sidecar) in two places:

* The ResolveNativeReferences MSBuild task.
* Inside mtouch/mmp/dotnet-linker.

Which means we end up passing every native library or framework twice to the native linker.

This is usually not a problem, the native linker will ignore duplicated
arguments, except when building remotely from Windows, in which case the build
process may end up with native libraries in different locations, because files
may end up in multiple places on the remote Mac if using absolute paths (see
xamarin#18997 for a thorough explanation).

So completely remove the logic to detect/resolve binding resource packages in
mtouch/mmp/dotnet-linker, which will avoid the issue completely.

Fixes xamarin#19378.
rolfbjarne added a commit that referenced this issue Nov 13, 2023
…dotnet-linker. Fixes #19378. (#19407)

We currently detect/resolve binding resource packages (the sidecar) in two places:

* The ResolveNativeReferences MSBuild task.
* Inside mtouch/mmp/dotnet-linker.

Which means we end up passing every native library or framework twice to the native linker.

This is usually not a problem, the native linker will ignore duplicated
arguments, except when building remotely from Windows, in which case the build
process may end up with native libraries in different locations, because files
may end up in multiple places on the remote Mac if using absolute paths (see
#18997 for a thorough explanation).

So completely remove the logic to detect/resolve binding resource packages in
mtouch/mmp/dotnet-linker, which will avoid the issue completely.

A few mtouch tests also needed updating, since they're calling mtouch directly instead
of going through the msbuild targets.

Fixes #19378.
vs-mobiletools-engineering-service2 pushed a commit to vs-mobiletools-engineering-service2/xamarin-macios that referenced this issue Nov 16, 2023
…dotnet-linker. Fixes xamarin#19378.

We currently detect/resolve binding resource packages (the sidecar) in two places:

* The ResolveNativeReferences MSBuild task.
* Inside mtouch/mmp/dotnet-linker.

Which means we end up passing every native library or framework twice to the native linker.

This is usually not a problem, the native linker will ignore duplicated
arguments, except when building remotely from Windows, in which case the build
process may end up with native libraries in different locations, because files
may end up in multiple places on the remote Mac if using absolute paths (see
xamarin#18997 for a thorough explanation).

So completely remove the logic to detect/resolve binding resource packages in
mtouch/mmp/dotnet-linker, which will avoid the issue completely.

Fixes xamarin#19378.
vs-mobiletools-engineering-service2 added a commit to vs-mobiletools-engineering-service2/xamarin-macios that referenced this issue Nov 27, 2023
…ges in mtouch/mmp/dotnet-linker. Fixes xamarin#19378. (xamarin#19463)

We currently detect/resolve binding resource packages (the sidecar) in
two places:

* The ResolveNativeReferences MSBuild task.
* Inside mtouch/mmp/dotnet-linker.

Which means we end up passing every native library or framework twice to
the native linker.

This is usually not a problem, the native linker will ignore duplicated
arguments, except when building remotely from Windows, in which case the
build
process may end up with native libraries in different locations, because
files
may end up in multiple places on the remote Mac if using absolute paths
(see
xamarin#18997 for a thorough
explanation).

So completely remove the logic to detect/resolve binding resource
packages in
mtouch/mmp/dotnet-linker, which will avoid the issue completely.

A few mtouch tests also needed updating, since they're calling mtouch
directly instead
of going through the msbuild targets.

Fixes xamarin#19378.


Backport of xamarin#19407

---------

Co-authored-by: Rolf Bjarne Kvinge <rolf@xamarin.com>
@rolfbjarne rolfbjarne modified the milestones: .NET 9, .NET 10 Sep 27, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
feature A feature to be implemented windows-only The issue only occur on Windows
Projects
None yet
Development

No branches or pull requests

2 participants