From a14a39de32bc5521c74adb8320955448f2a023bc Mon Sep 17 00:00:00 2001 From: Jonathan Pryor Date: Thu, 25 Feb 2021 18:22:17 -0500 Subject: [PATCH 01/12] [Java.Interop-PerformanceTests] Support .NET Core 3.1 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Build `Java.Interop-PerformanceTests.csproj` for `netcoreapp3.1`, and run it using `dotnet test`. This in turn requires building the `tests/NativeTiming` native library for .NET Core, which in turn requires moving away from the Visual Studio for Mac (née Xamarin Studio) -based `.cproj` file. Replace `NativeTiming.cproj` with a `Microsoft.Build.NoTargets`- based `NativeTiming.csproj` file, so that it can be referenced and built by `msbuild` and `dotnet build`. Add a `cmake`+"Makefile"-based build system for `tests/NativeTiming`. Update `core-tests.yaml` so that `dotnet test` is used to run both the net472 and netcoreapp3.1 versions of `Java.Interop-PerformanceTests.dll.` Note (for posterity): if a `.*proj` file depends upon `$(Configuration)`, it *must also* be added to `Java.Interop.sln`. Failure to do so will mean that when building the project in *Release* configuration, the *new* project will instead be built in *Debug* configuration, resulting in all manner of head-scratching. --- Directory.Build.props | 1 + Java.Interop.sln | 7 ++ build-tools/automation/azure-pipelines.yaml | 10 +++ .../automation/templates/core-build.yaml | 4 +- .../automation/templates/core-tests.yaml | 16 ++++ .../Directory.Build.targets | 12 +++ .../Java.Interop-PerformanceTests.csproj | 9 +-- tests/NativeTiming/CMakeLists.txt | 11 +++ tests/NativeTiming/Directory.Build.targets | 81 +++++++++++++++++++ tests/NativeTiming/NativeTiming.cproj | 36 --------- tests/NativeTiming/NativeTiming.csproj | 11 +++ tests/NativeTiming/timing.c | 11 ++- 12 files changed, 163 insertions(+), 46 deletions(-) create mode 100644 tests/Java.Interop-PerformanceTests/Directory.Build.targets create mode 100644 tests/NativeTiming/CMakeLists.txt create mode 100644 tests/NativeTiming/Directory.Build.targets delete mode 100644 tests/NativeTiming/NativeTiming.cproj create mode 100644 tests/NativeTiming/NativeTiming.csproj diff --git a/Directory.Build.props b/Directory.Build.props index 47af2496b..bb59986b2 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -50,6 +50,7 @@ $(MSBuildThisFileDirectory)external\xamarin-android-tools + cmake $(MSBuildThisFileDirectory)build-tools\gradle $(GradleHome)\gradlew --stacktrace --no-daemon diff --git a/Java.Interop.sln b/Java.Interop.sln index a986444cd..b36e26169 100644 --- a/Java.Interop.sln +++ b/Java.Interop.sln @@ -99,6 +99,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Java.Interop.Localization", EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "invocation-overhead", "tests\invocation-overhead\invocation-overhead.csproj", "{3CF58D34-693C-408A-BFE7-BC5E4BE44A26}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NativeTiming", "tests\NativeTiming\NativeTiming.csproj", "{BF5A4019-F2FF-45AC-949D-EF7E8C94196B}" +EndProject Global GlobalSection(SharedMSBuildProjectFiles) = preSolution src\Java.Interop.NamingCustomAttributes\Java.Interop.NamingCustomAttributes.projitems*{58b564a1-570d-4da2-b02d-25bddb1a9f4f}*SharedItemsImports = 5 @@ -278,6 +280,10 @@ Global {3CF58D34-693C-408A-BFE7-BC5E4BE44A26}.Debug|Any CPU.Build.0 = Debug|Any CPU {3CF58D34-693C-408A-BFE7-BC5E4BE44A26}.Release|Any CPU.ActiveCfg = Release|Any CPU {3CF58D34-693C-408A-BFE7-BC5E4BE44A26}.Release|Any CPU.Build.0 = Release|Any CPU + {BF5A4019-F2FF-45AC-949D-EF7E8C94196B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {BF5A4019-F2FF-45AC-949D-EF7E8C94196B}.Debug|Any CPU.Build.0 = Debug|Any CPU + {BF5A4019-F2FF-45AC-949D-EF7E8C94196B}.Release|Any CPU.ActiveCfg = Release|Any CPU + {BF5A4019-F2FF-45AC-949D-EF7E8C94196B}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -325,6 +331,7 @@ Global {6CF94627-BA74-4336-88CD-7EDA20C8F292} = {271C9F30-F679-4793-942B-0D9527CB3E2F} {998D178B-F4C7-48B5-BDEE-44E2F869BB22} = {0998E45F-8BCE-4791-A944-962CD54E2D80} {3CF58D34-693C-408A-BFE7-BC5E4BE44A26} = {271C9F30-F679-4793-942B-0D9527CB3E2F} + {BF5A4019-F2FF-45AC-949D-EF7E8C94196B} = {271C9F30-F679-4793-942B-0D9527CB3E2F} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {29204E0C-382A-49A0-A814-AD7FBF9774A5} diff --git a/build-tools/automation/azure-pipelines.yaml b/build-tools/automation/azure-pipelines.yaml index c907106f6..289475056 100644 --- a/build-tools/automation/azure-pipelines.yaml +++ b/build-tools/automation/azure-pipelines.yaml @@ -22,6 +22,8 @@ variables: HostedMacImage: macOS-10.15 HostedWinVS2019: Hosted Windows 2019 with VS2019 NetCoreTargetFrameworkPathSuffix: -netcoreapp3.1 + VSInstallDir: C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise + Cl64Path: $(VSInstallDir)\VC\Tools\MSVC\14.28.29334\bin\Hostx64\x64 jobs: - job: windows_build @@ -36,6 +38,10 @@ jobs: - template: templates\install-dependencies.yaml + - script: > + echo "##vso[task.setvariable variable=PATH]%PATH%;$(Cl64Path)" + displayName: 'Add cl to PATH' + - task: NuGetToolInstaller@0 inputs: versionSpec: 5.x @@ -86,6 +92,10 @@ jobs: - template: templates\install-dependencies.yaml + - script: > + echo "##vso[task.setvariable variable=PATH]%PATH%;$(Cl64Path)" + displayName: 'Add cl to PATH' + - template: templates\core-build.yaml - template: templates\core-tests.yaml diff --git a/build-tools/automation/templates/core-build.yaml b/build-tools/automation/templates/core-build.yaml index b631aed7c..371ba7340 100644 --- a/build-tools/automation/templates/core-build.yaml +++ b/build-tools/automation/templates/core-build.yaml @@ -6,10 +6,10 @@ steps: displayName: Prepare Solution inputs: projects: Java.Interop.sln - arguments: '-c $(Build.Configuration) -target:Prepare' + arguments: '-c $(Build.Configuration) -target:Prepare /v:diag' - task: DotNetCoreCLI@2 displayName: Build Solution inputs: projects: Java.Interop.sln - arguments: '-c $(Build.Configuration) -m:1' + arguments: '-c $(Build.Configuration) -m:1 /v:diag' diff --git a/build-tools/automation/templates/core-tests.yaml b/build-tools/automation/templates/core-tests.yaml index 9c4696400..b62a7615f 100644 --- a/build-tools/automation/templates/core-tests.yaml +++ b/build-tools/automation/templates/core-tests.yaml @@ -90,3 +90,19 @@ steps: command: test arguments: bin/Test$(Build.Configuration)/Java.Interop.Export-Tests.dll continueOnError: true + +- task: DotNetCoreCLI@2 + displayName: 'Tests: Java.Interop' + condition: eq('${{ parameters.runNativeTests }}', 'true') + inputs: + command: test + arguments: bin/Test$(Build.Configuration)/Java.Interop-PerformanceTests.dll + continueOnError: true + +- task: DotNetCoreCLI@2 + displayName: 'Tests: Java.Interop' + condition: eq('${{ parameters.runNativeTests }}', 'true') + inputs: + command: test + arguments: bin/Test$(Build.Configuration)$(NetCoreTargetFrameworkPathSuffix)/Java.Interop-PerformanceTests.dll + continueOnError: true diff --git a/tests/Java.Interop-PerformanceTests/Directory.Build.targets b/tests/Java.Interop-PerformanceTests/Directory.Build.targets new file mode 100644 index 000000000..f3866e5d6 --- /dev/null +++ b/tests/Java.Interop-PerformanceTests/Directory.Build.targets @@ -0,0 +1,12 @@ + + + + + + + + + diff --git a/tests/Java.Interop-PerformanceTests/Java.Interop-PerformanceTests.csproj b/tests/Java.Interop-PerformanceTests/Java.Interop-PerformanceTests.csproj index 62c69132d..33cee5a8e 100644 --- a/tests/Java.Interop-PerformanceTests/Java.Interop-PerformanceTests.csproj +++ b/tests/Java.Interop-PerformanceTests/Java.Interop-PerformanceTests.csproj @@ -1,7 +1,7 @@  - net472 + net472;netcoreapp3.1 false true @@ -25,17 +25,12 @@ + - - - - - - diff --git a/tests/NativeTiming/CMakeLists.txt b/tests/NativeTiming/CMakeLists.txt new file mode 100644 index 000000000..a98557ebe --- /dev/null +++ b/tests/NativeTiming/CMakeLists.txt @@ -0,0 +1,11 @@ +set(CMAKE_OSX_ARCHITECTURES x86_64 arm64) + +project(NativeTiming C) + +cmake_minimum_required(VERSION 3.10.2) + +foreach(dir in ${JDK_INCLUDE_LIST}) + include_directories(${dir}) +endforeach() + +add_library(NativeTiming SHARED timing.c) diff --git a/tests/NativeTiming/Directory.Build.targets b/tests/NativeTiming/Directory.Build.targets new file mode 100644 index 000000000..93259bbc4 --- /dev/null +++ b/tests/NativeTiming/Directory.Build.targets @@ -0,0 +1,81 @@ + + + + <_NativeTimingLibName Condition=" '$(OS)' != 'Windows_NT' And Exists ('/Library/Frameworks/') ">libNativeTiming.dylib + <_NativeTimingLibName Condition=" '$(OS)' != 'Windows_NT' And !Exists ('/Library/Frameworks/') ">libNativeTiming.so + <_NativeTimingLibName Condition=" '$(OS)' == 'Windows_NT' ">NativeTiming.dll + <_NativeTimingOutputPath>$(OutputPath)$(_NativeTimingLibName) + + + + + PreserveNewest + + + + + + + + + + <_JdkDirs>"-DJDK_INCLUDE_LIST=@(JdkIncludePath, ';')" + <_Cc Condition=" '$(CL64PATH)' != '' " >"-DCMAKE_C_COMPILER=$(CL64PATH)/cl" + <_CmakeGenerator Condition=" '$(OS)' != 'Windows_NT' ">-G "Unix Makefiles" + <_CmakeGenerator Condition=" '$(OS)' == 'Windows_NT' ">-G "NMake Makefiles" + + + + + <_CmakeStatus>$(MSBuildLastTaskResult) + + + + + + + + + + + + <_Make Condition=" '$(OS)' != 'Windows_NT' ">make + <_Make Condition=" '$(OS)' == 'Windows_NT' ">nmake + + + + <_Libs Include="$(IntermediateOutputPath)$(_NativeTimingLibName)*" /> + + + + + + + + + + diff --git a/tests/NativeTiming/NativeTiming.cproj b/tests/NativeTiming/NativeTiming.cproj deleted file mode 100644 index 1a0e80afe..000000000 --- a/tests/NativeTiming/NativeTiming.cproj +++ /dev/null @@ -1,36 +0,0 @@ - - - - Debug - AnyCPU - 10.0.0 - 2.0 - {BF996B2A-23E0-4FE2-943F-2FBA6FC38272} - - - - C - Bin - - - true - ..\..\bin\Debug - NativeTiming - SharedLibrary - DEBUG MONODEVELOP - . - -m64 -I /System/Library/Frameworks/JavaVM.framework/Headers - -shared -m64 - - - bin\Release - NativeTiming - SharedLibrary - 3 - MONODEVELOP - . - - - - - \ No newline at end of file diff --git a/tests/NativeTiming/NativeTiming.csproj b/tests/NativeTiming/NativeTiming.csproj new file mode 100644 index 000000000..d744f014b --- /dev/null +++ b/tests/NativeTiming/NativeTiming.csproj @@ -0,0 +1,11 @@ + + + netstandard2.0 + false + + + + $(TestOutputFullPath) + + + diff --git a/tests/NativeTiming/timing.c b/tests/NativeTiming/timing.c index ae25d67bd..b72b0bdbe 100644 --- a/tests/NativeTiming/timing.c +++ b/tests/NativeTiming/timing.c @@ -1,7 +1,12 @@ #include -#include #include +#if WIN32 +#include +#else /* !def WIN32 */ +#include +#endif /* def WIN32 */ + #ifdef PLATFORM_ANDROID #include #endif /* def PLATFORM_ANDROID */ @@ -211,11 +216,15 @@ foo_init (JNIEnv *env) static long long current_time_millis (void) { +#if defined (WIN32) + return (long long) GetTickCount64 (); +#else /* !def WIN32 */ struct timeval tv; gettimeofday(&tv, (struct timezone *) NULL); long long when = tv.tv_sec * 1000LL + tv.tv_usec / 1000; return when; +#endif /* def WIN32 */ } void From 2ea695c80fb7bfd57384cb47cd5c1b651e8abc6f Mon Sep 17 00:00:00 2001 From: Jonathan Pryor Date: Thu, 25 Feb 2021 22:07:19 -0500 Subject: [PATCH 02/12] Instead of trying to set %PATH% find all `**\cl.exe` files under the VS install dir? --- build-tools/automation/azure-pipelines.yaml | 10 +--------- tests/NativeTiming/Directory.Build.targets | 8 +++++++- 2 files changed, 8 insertions(+), 10 deletions(-) diff --git a/build-tools/automation/azure-pipelines.yaml b/build-tools/automation/azure-pipelines.yaml index 289475056..7e0e1ff9c 100644 --- a/build-tools/automation/azure-pipelines.yaml +++ b/build-tools/automation/azure-pipelines.yaml @@ -23,7 +23,7 @@ variables: HostedWinVS2019: Hosted Windows 2019 with VS2019 NetCoreTargetFrameworkPathSuffix: -netcoreapp3.1 VSInstallDir: C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise - Cl64Path: $(VSInstallDir)\VC\Tools\MSVC\14.28.29334\bin\Hostx64\x64 + MsvcDir: $(VSInstallDir)\VC\Tools\MSVC jobs: - job: windows_build @@ -38,10 +38,6 @@ jobs: - template: templates\install-dependencies.yaml - - script: > - echo "##vso[task.setvariable variable=PATH]%PATH%;$(Cl64Path)" - displayName: 'Add cl to PATH' - - task: NuGetToolInstaller@0 inputs: versionSpec: 5.x @@ -92,10 +88,6 @@ jobs: - template: templates\install-dependencies.yaml - - script: > - echo "##vso[task.setvariable variable=PATH]%PATH%;$(Cl64Path)" - displayName: 'Add cl to PATH' - - template: templates\core-build.yaml - template: templates\core-tests.yaml diff --git a/tests/NativeTiming/Directory.Build.targets b/tests/NativeTiming/Directory.Build.targets index 93259bbc4..40ef204ef 100644 --- a/tests/NativeTiming/Directory.Build.targets +++ b/tests/NativeTiming/Directory.Build.targets @@ -22,9 +22,15 @@ Inputs="CMakeLists.txt;$(MSBuildThisFileFullPath);NativeTiming.csproj" Outputs="$(IntermediateOutputPath)CMakeCache.txt"> + + <_Cl Include="$(MSVCDIR)\*\bin\Hostx64\x64\cl.exe" /> + + + <_ClPath>%(_Cl.Identity) + <_JdkDirs>"-DJDK_INCLUDE_LIST=@(JdkIncludePath, ';')" - <_Cc Condition=" '$(CL64PATH)' != '' " >"-DCMAKE_C_COMPILER=$(CL64PATH)/cl" + <_Cc Condition=" '$(_ClPath)' != '' " >"-DCMAKE_C_COMPILER=$(_ClPath)" <_CmakeGenerator Condition=" '$(OS)' != 'Windows_NT' ">-G "Unix Makefiles" <_CmakeGenerator Condition=" '$(OS)' == 'Windows_NT' ">-G "NMake Makefiles" From 6dfc8e35f62cd3aa16d3407e3e2bda7453492d1a Mon Sep 17 00:00:00 2001 From: Jonathan Pryor Date: Thu, 25 Feb 2021 22:18:53 -0500 Subject: [PATCH 03/12] use Unix dir chars [Last attempt][0] found a compiler! cmake -G "NMake Makefiles" -S . -B obj\\Release\ "-DJDK_INCLUDE_LIST=C:\Program Files\Java\jdk8u282-b08\include;C:\Program Files\Java\jdk8u282-b08\include\win32" "-DCMAKE_C_COMPILER=C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\VC\Tools\MSVC\14.28.29333\bin\Hostx64\x64\cl.exe" It still failed: Syntax error in cmake code at D:/a/1/s/tests/NativeTiming/obj/Release/CMakeFiles/3.19.4/CMakeCCompiler.cmake:1 when parsing string C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\VC\Tools\MSVC\14.28.29333\bin\Hostx64\x64\cl.exe Invalid escape sequence \P `cmake` doesn't like DOS directory separators (`\`). Replace with Unix dir separators (`/`). [0]: https://devdiv.visualstudio.com/DevDiv/_build/results?buildId=4505481&view=logs&j=f31c9f97-4411-58e7-49ac-fc73f645e6b6&t=cbeb8522-7b64-5cc0-7bee-eff0e164a409 --- tests/NativeTiming/Directory.Build.targets | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/NativeTiming/Directory.Build.targets b/tests/NativeTiming/Directory.Build.targets index 40ef204ef..bb1685fec 100644 --- a/tests/NativeTiming/Directory.Build.targets +++ b/tests/NativeTiming/Directory.Build.targets @@ -27,6 +27,7 @@ <_ClPath>%(_Cl.Identity) + <_ClPath>$(_ClPath.Replace('%5c', '/')) <_JdkDirs>"-DJDK_INCLUDE_LIST=@(JdkIncludePath, ';')" @@ -34,7 +35,6 @@ <_CmakeGenerator Condition=" '$(OS)' != 'Windows_NT' ">-G "Unix Makefiles" <_CmakeGenerator Condition=" '$(OS)' == 'Windows_NT' ">-G "NMake Makefiles" - Date: Thu, 25 Feb 2021 22:29:02 -0500 Subject: [PATCH 04/12] Capture & report CMakeError.log --- tests/NativeTiming/Directory.Build.targets | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/tests/NativeTiming/Directory.Build.targets b/tests/NativeTiming/Directory.Build.targets index bb1685fec..d5efbfecc 100644 --- a/tests/NativeTiming/Directory.Build.targets +++ b/tests/NativeTiming/Directory.Build.targets @@ -49,7 +49,26 @@ + + + + + + Date: Thu, 4 Mar 2021 21:24:25 -0500 Subject: [PATCH 05/12] Cleanup & beating my head against the wall? MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit After following: https://docs.microsoft.com/en-us/azure/devops/pipelines/apps/windows/cpp?view=azure-devops The pipeline YAML is: # .NET Desktop # Build and run tests for .NET Desktop or Windows classic desktop solutions. # Add steps that publish symbols, save build artifacts, and more: # https://docs.microsoft.com/azure/devops/pipelines/apps/windows/dot-net trigger: - master pool: vmImage: 'windows-latest' variables: solution: '**/*.sln' buildPlatform: 'Any CPU' buildConfiguration: 'Release' steps: - task: NuGetToolInstaller@1 - task: NuGetCommand@2 inputs: restoreSolution: '$(solution)' - task: VSBuild@1 inputs: solution: '$(solution)' platform: '$(buildPlatform)' configuration: '$(buildConfiguration)' - task: VSTest@2 inputs: platform: '$(buildPlatform)' configuration: '$(buildConfiguration)' Meaning it looks like the *important* bit is to use `VSBuild@1`, not `MSBuild@1`, presumably because `VSBuild` ensures that the C++ toolchain actually works… Time to test that guess. Plus other cleanup, e.g. declare "private" properties, etc. --- build-tools/automation/azure-pipelines.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build-tools/automation/azure-pipelines.yaml b/build-tools/automation/azure-pipelines.yaml index 7e0e1ff9c..581ee1bbe 100644 --- a/build-tools/automation/azure-pipelines.yaml +++ b/build-tools/automation/azure-pipelines.yaml @@ -54,7 +54,7 @@ jobs: configuration: $(Build.Configuration) msbuildArguments: /restore /t:Prepare - - task: MSBuild@1 + - task: VSBuild@1 displayName: MSBuild Java.Interop.sln inputs: solution: Java.Interop.sln From 6da1e49e85844bf64115bf63729433e1dd18d323 Mon Sep 17 00:00:00 2001 From: Jonathan Pryor Date: Thu, 4 Mar 2021 21:39:16 -0500 Subject: [PATCH 06/12] is `cl` even *in* %PATH% when buildilng w/ VSTest@1? See also: https://docs.microsoft.com/en-us/azure/devops/pipelines/tasks/build/visual-studio-build?view=azure-devops --- build-tools/automation/azure-pipelines.yaml | 4 ++-- tests/NativeTiming/Directory.Build.targets | 8 ++++++++ 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/build-tools/automation/azure-pipelines.yaml b/build-tools/automation/azure-pipelines.yaml index 581ee1bbe..37659348a 100644 --- a/build-tools/automation/azure-pipelines.yaml +++ b/build-tools/automation/azure-pipelines.yaml @@ -55,11 +55,11 @@ jobs: msbuildArguments: /restore /t:Prepare - task: VSBuild@1 - displayName: MSBuild Java.Interop.sln + displayName: VSBuild Java.Interop.sln inputs: solution: Java.Interop.sln configuration: $(Build.Configuration) - msbuildArguments: /restore + msbuildArgs: /restore - task: MSBuild@1 displayName: MSBuild RunNUnitTests.targets diff --git a/tests/NativeTiming/Directory.Build.targets b/tests/NativeTiming/Directory.Build.targets index d5efbfecc..288158317 100644 --- a/tests/NativeTiming/Directory.Build.targets +++ b/tests/NativeTiming/Directory.Build.targets @@ -31,10 +31,18 @@ <_JdkDirs>"-DJDK_INCLUDE_LIST=@(JdkIncludePath, ';')" + <_CmakeGenerator Condition=" '$(OS)' != 'Windows_NT' ">-G "Unix Makefiles" <_CmakeGenerator Condition=" '$(OS)' == 'Windows_NT' ">-G "NMake Makefiles" + + Date: Thu, 4 Mar 2021 21:57:05 -0500 Subject: [PATCH 07/12] Use .vcxproj generator? Is `cl` in path (6da1e49e)? ***NO***. Furthermore, based on the sample docs: * https://docs.microsoft.com/en-us/azure/devops/pipelines/apps/windows/cpp?view=azure-devops * https://github.com/adventworks/cpp-sample/tree/master/cpp-sample The sample doesn't invoke `cl` directly. It uses a `.vcxproj`. Let's Try That? Update `cmake` to emit a `.vcxproj` file. Let's see where *that* leads. --- tests/NativeTiming/Directory.Build.targets | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/tests/NativeTiming/Directory.Build.targets b/tests/NativeTiming/Directory.Build.targets index 288158317..38abd9538 100644 --- a/tests/NativeTiming/Directory.Build.targets +++ b/tests/NativeTiming/Directory.Build.targets @@ -35,14 +35,10 @@ <_Cc Condition=" '$(_ClPath)' != '' " >"-DCMAKE_C_COMPILER=$(_ClPath)" --> <_CmakeGenerator Condition=" '$(OS)' != 'Windows_NT' ">-G "Unix Makefiles" + - - Date: Fri, 5 Mar 2021 19:06:17 -0500 Subject: [PATCH 08/12] Try calling vcvarsall.bat MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Context: https://github.com/xamarin/java.interop/pull/808#issuecomment-786370513 Context: https://github.com/dotnet/runtime/blob/e1e46a8d2ca9c2c932c8ceb61f884c7c82351442/eng/native/init-compiler-and-cmake.cmd Context: https://github.com/dotnet/runtime/blob/e1e46a8d2ca9c2c932c8ceb61f884c7c82351442/src/mono/mono.proj#L362 We tried calling `vcvars64.bat` during an earlier invocation, which failed, but we were attempting to call it from YAML. Instead, take a page out of the dotnet/runtime build system: Instead of calling `vcvars64.bat` from YAML, instead call it *from within MSBuild*, via `call path\to\vcvars64.bat && …`. Thus, on Windows, we do: call "%VSINSTALLROOT%\VC\Auxiliary\Build\vcvarsall.bat x86_amd64 && ^ cmake -G "NMake Makefiles" -S . -B obj\Debug -DJDK_INCLUDE_LIST=…" … call "%VSINSTALLROOT%\VC\Auxiliary\Build\vcvarsall.bat x86_amd64 && ^ cd obj\Debug && ^ nmake VERSION=1 This *appears* to work from a "clean" shell. What about CI? --- build-tools/automation/azure-pipelines.yaml | 3 +- tests/NativeTiming/Directory.Build.targets | 36 ++++++++++----------- 2 files changed, 19 insertions(+), 20 deletions(-) diff --git a/build-tools/automation/azure-pipelines.yaml b/build-tools/automation/azure-pipelines.yaml index 37659348a..c6669057f 100644 --- a/build-tools/automation/azure-pipelines.yaml +++ b/build-tools/automation/azure-pipelines.yaml @@ -22,8 +22,7 @@ variables: HostedMacImage: macOS-10.15 HostedWinVS2019: Hosted Windows 2019 with VS2019 NetCoreTargetFrameworkPathSuffix: -netcoreapp3.1 - VSInstallDir: C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise - MsvcDir: $(VSInstallDir)\VC\Tools\MSVC + VSInstallRoot: C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise jobs: - job: windows_build diff --git a/tests/NativeTiming/Directory.Build.targets b/tests/NativeTiming/Directory.Build.targets index 38abd9538..d78880268 100644 --- a/tests/NativeTiming/Directory.Build.targets +++ b/tests/NativeTiming/Directory.Build.targets @@ -18,30 +18,33 @@ DependsOnTargets="_PrepareCmake;_BuildNativeTiming"> + + + <_Vcvarsall Include="$(VSINSTALLROOT)\VC\Auxiliary\Build\vcvarsall.bat" /> + + + <_Vcvarsall>%(_Vcvarsall.Identity) + <_PrepareToolchain>call "$(_Vcvarsall)" x86_amd64 && + + + <_Make Condition=" '$(OS)' != 'Windows_NT' ">make + <_Make Condition=" '$(OS)' == 'Windows_NT' ">nmake + + + - - <_Cl Include="$(MSVCDIR)\*\bin\Hostx64\x64\cl.exe" /> - - - <_ClPath>%(_Cl.Identity) - <_ClPath>$(_ClPath.Replace('%5c', '/')) - <_JdkDirs>"-DJDK_INCLUDE_LIST=@(JdkIncludePath, ';')" - <_CmakeGenerator Condition=" '$(OS)' != 'Windows_NT' ">-G "Unix Makefiles" - <_CmakeStatus>$(MSBuildLastTaskResult) @@ -82,14 +85,11 @@ - - <_Make Condition=" '$(OS)' != 'Windows_NT' ">make - <_Make Condition=" '$(OS)' == 'Windows_NT' ">nmake - From 9b2d23b3eefe5fa28e434abcbf87e36e97903389 Mon Sep 17 00:00:00 2001 From: Jonathan Pryor Date: Fri, 5 Mar 2021 19:27:04 -0500 Subject: [PATCH 09/12] Use MSBuild@1; don't set VSInstallRoot Commit 93872cf1 worked, in that Windows built! macOS, not so much, because `$VSINSTALLROOT` was set via YAML, so macOS was *also* trying to `call path\to\vcvarsall.bat`, which couldn't possibly work. Remove the `VSSInstallRoot` setting in YAML; it *appears* that `msbuild` will set this -- at least it does on *my* Windows box -- and return to using `MSBuild@1` and not `VSBuild@1`. --- build-tools/automation/azure-pipelines.yaml | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/build-tools/automation/azure-pipelines.yaml b/build-tools/automation/azure-pipelines.yaml index c6669057f..276793ce6 100644 --- a/build-tools/automation/azure-pipelines.yaml +++ b/build-tools/automation/azure-pipelines.yaml @@ -22,7 +22,6 @@ variables: HostedMacImage: macOS-10.15 HostedWinVS2019: Hosted Windows 2019 with VS2019 NetCoreTargetFrameworkPathSuffix: -netcoreapp3.1 - VSInstallRoot: C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise jobs: - job: windows_build @@ -53,12 +52,12 @@ jobs: configuration: $(Build.Configuration) msbuildArguments: /restore /t:Prepare - - task: VSBuild@1 + - task: MSBuild@1 displayName: VSBuild Java.Interop.sln inputs: solution: Java.Interop.sln configuration: $(Build.Configuration) - msbuildArgs: /restore + msbuildArguments: /restore - task: MSBuild@1 displayName: MSBuild RunNUnitTests.targets From b66fc2ff2107956bc06fa6158f12288a0d3176b7 Mon Sep 17 00:00:00 2001 From: Jonathan Pryor Date: Fri, 5 Mar 2021 20:11:08 -0500 Subject: [PATCH 10/12] Selectively define VSInstallRoot Commit 9b2d23b3 worked when using .NET Framework on Windows and on macOS, but failed when using Windows + .NET Core, because `dotnet build` *doesn't* define `%VSINSTALLROOT%` in that environment. Update the `windows_dotnet_build` job so that `VSInstallRoot` is defined. Update the `NativeTiming` build so that it verifies that `$(VSINSTALLROOT)` exists before trying to do anything with it. --- build-tools/automation/azure-pipelines.yaml | 5 ++++- tests/NativeTiming/Directory.Build.targets | 9 ++++++--- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/build-tools/automation/azure-pipelines.yaml b/build-tools/automation/azure-pipelines.yaml index 276793ce6..6c847b8c2 100644 --- a/build-tools/automation/azure-pipelines.yaml +++ b/build-tools/automation/azure-pipelines.yaml @@ -53,7 +53,7 @@ jobs: msbuildArguments: /restore /t:Prepare - task: MSBuild@1 - displayName: VSBuild Java.Interop.sln + displayName: MSBuild Java.Interop.sln inputs: solution: Java.Interop.sln configuration: $(Build.Configuration) @@ -78,6 +78,9 @@ jobs: displayName: Windows - .NET Core pool: $(HostedWinVS2019) timeoutInMinutes: 20 + variables: + - name: VSInstallRoot + value: C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise workspace: clean: all steps: diff --git a/tests/NativeTiming/Directory.Build.targets b/tests/NativeTiming/Directory.Build.targets index d78880268..f1ff4fcf2 100644 --- a/tests/NativeTiming/Directory.Build.targets +++ b/tests/NativeTiming/Directory.Build.targets @@ -19,10 +19,13 @@ - - <_Vcvarsall Include="$(VSINSTALLROOT)\VC\Auxiliary\Build\vcvarsall.bat" /> + + <_Vcvarsall + Condition=" '$(VSINSTALLROOT)' != '' And Exists('$(VSINSTALLROOT)') " + Include="$(VSINSTALLROOT)\VC\Auxiliary\Build\vcvarsall.bat" + /> - + <_Vcvarsall>%(_Vcvarsall.Identity) <_PrepareToolchain>call "$(_Vcvarsall)" x86_amd64 && From f33cf85004ac1d9d6d06214525b1e5231f9a31a2 Mon Sep 17 00:00:00 2001 From: Jonathan Pryor Date: Fri, 5 Mar 2021 20:24:11 -0500 Subject: [PATCH 11/12] Globally define VSInstallRoot Commit b66fc2ff's attempt to only define `VSInstallRoot` for `windows_dotnet_build` didn't work, in that `%VSINSTALLROOT%` wasn't set, causing the build to fail. Return to declaring `VSInstallRoot` as a global variable. The `Exists('$(VSINSTALLROOT)')` guard from b66fc2ff should prevent macOS builds from failing. --- build-tools/automation/azure-pipelines.yaml | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/build-tools/automation/azure-pipelines.yaml b/build-tools/automation/azure-pipelines.yaml index 6c847b8c2..c3886c7a0 100644 --- a/build-tools/automation/azure-pipelines.yaml +++ b/build-tools/automation/azure-pipelines.yaml @@ -22,6 +22,7 @@ variables: HostedMacImage: macOS-10.15 HostedWinVS2019: Hosted Windows 2019 with VS2019 NetCoreTargetFrameworkPathSuffix: -netcoreapp3.1 + VSInstallRoot: C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise jobs: - job: windows_build @@ -78,9 +79,6 @@ jobs: displayName: Windows - .NET Core pool: $(HostedWinVS2019) timeoutInMinutes: 20 - variables: - - name: VSInstallRoot - value: C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise workspace: clean: all steps: From 024281b1259d8afc47229237d000f7ddddbf2c95 Mon Sep 17 00:00:00 2001 From: Jonathan Pryor Date: Mon, 8 Mar 2021 11:10:34 -0500 Subject: [PATCH 12/12] Remove /v:diag --- build-tools/automation/templates/core-build.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/build-tools/automation/templates/core-build.yaml b/build-tools/automation/templates/core-build.yaml index 371ba7340..b631aed7c 100644 --- a/build-tools/automation/templates/core-build.yaml +++ b/build-tools/automation/templates/core-build.yaml @@ -6,10 +6,10 @@ steps: displayName: Prepare Solution inputs: projects: Java.Interop.sln - arguments: '-c $(Build.Configuration) -target:Prepare /v:diag' + arguments: '-c $(Build.Configuration) -target:Prepare' - task: DotNetCoreCLI@2 displayName: Build Solution inputs: projects: Java.Interop.sln - arguments: '-c $(Build.Configuration) -m:1 /v:diag' + arguments: '-c $(Build.Configuration) -m:1'