-
Notifications
You must be signed in to change notification settings - Fork 312
Update Nuget package and VS projects to build and package ARM64 #135
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
base: main
Are you sure you want to change the base?
Conversation
…ckage to include a targets file and different versions of the API lib.
…yml. Update the nuget major version as the package layout is different.
…working on my forked branch
zhuman
left a comment
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Looks good, I haven't tried a copy of the Nuget myself but this looks like the canonical directory structure we need.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Pull request overview
This PR adds ARM64 platform support to the PICT project and restructures the NuGet package to include multiple architectures and both Debug and Release builds of the API library.
Changes:
- Added ARM64 platform configurations to all Visual Studio projects alongside existing x86 and x64 platforms
- Updated NuGet package structure to organize binaries by architecture (win-x86, win-x64, win-arm64) and configuration (Debug/Release)
- Introduced MSBuild targets file for automatic library and header path configuration in consuming projects
Reviewed changes
Copilot reviewed 9 out of 10 changed files in this pull request and generated 16 comments.
Show a summary per file
| File | Description |
|---|---|
| pict.sln | Added ARM64 platform configurations and updated build mappings for all projects |
| cli/pictcli.vcxproj | Added ARM64, x64 configurations; updated output paths and runtime library settings |
| api/pictapi.vcxproj | Added ARM64, x64 configurations; updated output paths and runtime library settings |
| clidll/pictclidll.vcxproj | Added ARM64, x64 configurations; updated output paths and runtime library settings |
| api-usage/pictapi-usage.vcxproj | Added ARM64, x64 configurations; updated output paths and runtime library settings |
| clidll-usage/pictclidll-usage.vcxproj | Added ARM64, x64 configurations; updated output paths and runtime library settings |
| Microsoft.Test.Pict.nuspec | Updated version to 4.0.0; restructured package to include all architectures and configurations |
| Microsoft.Test.Pict.targets | New MSBuild targets file for automatic configuration in consuming projects |
| .github/workflows/nuget-publish.yml | Updated CI/CD to build matrix of configurations and platforms; split into build and package jobs |
| .gitignore | Added platform-specific build output directories |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
| <WarningLevel>Level3</WarningLevel> | ||
| <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions> | ||
| <AdditionalIncludeDirectories>$(SolutionDir)\api</AdditionalIncludeDirectories> | ||
| <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary> |
Copilot
AI
Jan 13, 2026
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The RuntimeLibrary has been changed to 'MultiThreadedDebug' for Debug configurations and 'MultiThreaded' for Release configurations. These settings indicate static linking of the C runtime library. This is a significant change from what was likely the previous default (dynamic runtime). This change will affect all consumers of the library and requires that consuming projects also use the same runtime library setting. This should be clearly documented in release notes or migration guides, as it's a breaking change that can cause linker errors (LNK2005, LNK2038, etc.) for existing users.
| <AdditionalLibraryDirectories Condition="'$(Platform)' == 'Win32' And '$(Configuration)' == 'Debug'">$(MSBuildThisFileDirectory)..\contents\win-x86\api\Debug;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories> | ||
| <!-- Win32 Release --> | ||
| <AdditionalLibraryDirectories Condition="'$(Platform)' == 'Win32' And '$(Configuration)' == 'Release'">$(MSBuildThisFileDirectory)..\contents\win-x86\api\Release;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories> | ||
| <!-- x64 Debug --> | ||
| <AdditionalLibraryDirectories Condition="'$(Platform)' == 'x64' And '$(Configuration)' == 'Debug'">$(MSBuildThisFileDirectory)..\contents\win-x64\api\Debug;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories> | ||
| <!-- x64 Release --> | ||
| <AdditionalLibraryDirectories Condition="'$(Platform)' == 'x64' And '$(Configuration)' == 'Release'">$(MSBuildThisFileDirectory)..\contents\win-x64\api\Release;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories> | ||
| <!-- ARM64 Debug --> | ||
| <AdditionalLibraryDirectories Condition="'$(Platform)' == 'ARM64' And '$(Configuration)' == 'Debug'">$(MSBuildThisFileDirectory)..\contents\win-arm64\api\Debug;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories> | ||
| <!-- ARM64 Release --> | ||
| <AdditionalLibraryDirectories Condition="'$(Platform)' == 'ARM64' And '$(Configuration)' == 'Release'">$(MSBuildThisFileDirectory)..\contents\win-arm64\api\Release;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories> |
Copilot
AI
Jan 13, 2026
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The MSBuild condition uses 'And' (case-sensitive) which should be 'and' (lowercase) in MSBuild conditions. MSBuild is case-insensitive for most keywords, but the correct convention is to use lowercase 'and'/'or' operators for better consistency with MSBuild documentation and standards.
| <AdditionalLibraryDirectories Condition="'$(Platform)' == 'Win32' And '$(Configuration)' == 'Debug'">$(MSBuildThisFileDirectory)..\contents\win-x86\api\Debug;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories> | |
| <!-- Win32 Release --> | |
| <AdditionalLibraryDirectories Condition="'$(Platform)' == 'Win32' And '$(Configuration)' == 'Release'">$(MSBuildThisFileDirectory)..\contents\win-x86\api\Release;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories> | |
| <!-- x64 Debug --> | |
| <AdditionalLibraryDirectories Condition="'$(Platform)' == 'x64' And '$(Configuration)' == 'Debug'">$(MSBuildThisFileDirectory)..\contents\win-x64\api\Debug;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories> | |
| <!-- x64 Release --> | |
| <AdditionalLibraryDirectories Condition="'$(Platform)' == 'x64' And '$(Configuration)' == 'Release'">$(MSBuildThisFileDirectory)..\contents\win-x64\api\Release;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories> | |
| <!-- ARM64 Debug --> | |
| <AdditionalLibraryDirectories Condition="'$(Platform)' == 'ARM64' And '$(Configuration)' == 'Debug'">$(MSBuildThisFileDirectory)..\contents\win-arm64\api\Debug;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories> | |
| <!-- ARM64 Release --> | |
| <AdditionalLibraryDirectories Condition="'$(Platform)' == 'ARM64' And '$(Configuration)' == 'Release'">$(MSBuildThisFileDirectory)..\contents\win-arm64\api\Release;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories> | |
| <AdditionalLibraryDirectories Condition="'$(Platform)' == 'Win32' and '$(Configuration)' == 'Debug'">$(MSBuildThisFileDirectory)..\contents\win-x86\api\Debug;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories> | |
| <!-- Win32 Release --> | |
| <AdditionalLibraryDirectories Condition="'$(Platform)' == 'Win32' and '$(Configuration)' == 'Release'">$(MSBuildThisFileDirectory)..\contents\win-x86\api\Release;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories> | |
| <!-- x64 Debug --> | |
| <AdditionalLibraryDirectories Condition="'$(Platform)' == 'x64' and '$(Configuration)' == 'Debug'">$(MSBuildThisFileDirectory)..\contents\win-x64\api\Debug;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories> | |
| <!-- x64 Release --> | |
| <AdditionalLibraryDirectories Condition="'$(Platform)' == 'x64' and '$(Configuration)' == 'Release'">$(MSBuildThisFileDirectory)..\contents\win-x64\api\Release;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories> | |
| <!-- ARM64 Debug --> | |
| <AdditionalLibraryDirectories Condition="'$(Platform)' == 'ARM64' and '$(Configuration)' == 'Debug'">$(MSBuildThisFileDirectory)..\contents\win-arm64\api\Debug;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories> | |
| <!-- ARM64 Release --> | |
| <AdditionalLibraryDirectories Condition="'$(Platform)' == 'ARM64' and '$(Configuration)' == 'Release'">$(MSBuildThisFileDirectory)..\contents\win-arm64\api\Release;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories> |
| <Content Include="$(MSBuildThisFileDirectory)contents\win-x86\dll\*.dll"> | ||
| <Link>%(Filename)%(Extension)</Link> | ||
| <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> | ||
| </Content> | ||
| </ItemGroup> | ||
| <ItemGroup Condition="'$(Platform)' == 'x64'"> | ||
| <Content Include="$(MSBuildThisFileDirectory)contents\win-x64\dll\*.dll"> | ||
| <Link>%(Filename)%(Extension)</Link> | ||
| <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> | ||
| </Content> | ||
| </ItemGroup> | ||
| <ItemGroup Condition="'$(Platform)' == 'ARM64'"> | ||
| <Content Include="$(MSBuildThisFileDirectory)contents\win-arm64\dll\*.dll"> |
Copilot
AI
Jan 13, 2026
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
There's an inconsistency in path separators. Line 6 uses a backslash path separator '..\contents\api', while lines 29, 35, and 41 use forward slash 'contents\win-x86\dll'. This should be consistent. Additionally, line 29 is missing the '..' prefix that appears in line 6, which could cause the path to be incorrect relative to MSBuildThisFileDirectory.
| <Content Include="$(MSBuildThisFileDirectory)contents\win-x86\dll\*.dll"> | |
| <Link>%(Filename)%(Extension)</Link> | |
| <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> | |
| </Content> | |
| </ItemGroup> | |
| <ItemGroup Condition="'$(Platform)' == 'x64'"> | |
| <Content Include="$(MSBuildThisFileDirectory)contents\win-x64\dll\*.dll"> | |
| <Link>%(Filename)%(Extension)</Link> | |
| <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> | |
| </Content> | |
| </ItemGroup> | |
| <ItemGroup Condition="'$(Platform)' == 'ARM64'"> | |
| <Content Include="$(MSBuildThisFileDirectory)contents\win-arm64\dll\*.dll"> | |
| <Content Include="$(MSBuildThisFileDirectory)..\contents\win-x86\dll\*.dll"> | |
| <Link>%(Filename)%(Extension)</Link> | |
| <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> | |
| </Content> | |
| </ItemGroup> | |
| <ItemGroup Condition="'$(Platform)' == 'x64'"> | |
| <Content Include="$(MSBuildThisFileDirectory)..\contents\win-x64\dll\*.dll"> | |
| <Link>%(Filename)%(Extension)</Link> | |
| <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> | |
| </Content> | |
| </ItemGroup> | |
| <ItemGroup Condition="'$(Platform)' == 'ARM64'"> | |
| <Content Include="$(MSBuildThisFileDirectory)..\contents\win-arm64\dll\*.dll"> |
|
|
||
| <!-- Documentation and license - common for all architectures --> | ||
| <file src="doc/pict.md" target="contents" /> | ||
| <file src="LICENSE.TXT" target="contents" /> |
Copilot
AI
Jan 13, 2026
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The license file reference is 'LICENSE.TXT' (uppercase), but line 45 references it as 'LICENSE.TXT' which matches. However, it's important to verify that the actual file in the repository uses this exact casing, as file systems on some platforms are case-sensitive. The file should exist with the exact casing specified here.
| <PreprocessorDefinitions>WIN32;_DEBUG;PICTCLIDLL_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions)</PreprocessorDefinitions> | ||
| <ConformanceMode>false</ConformanceMode> | ||
| <AdditionalIncludeDirectories>$(SolutionDir)\api; $(SolutionDir)\cli</AdditionalIncludeDirectories> | ||
| <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary> |
Copilot
AI
Jan 13, 2026
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The RuntimeLibrary has been changed to 'MultiThreadedDebug' for Debug configurations. This is a breaking change from the previous configuration which likely used 'MultiThreadedDebugDLL' (dynamic runtime). This change means the runtime library is now statically linked instead of dynamically linked. While this may be intentional, it should be documented as it affects how consumers link against this library and may cause linking errors if their projects use different runtime library settings.
|
|
||
| Microsoft Visual Studio Solution File, Format Version 12.00 | ||
| # Visual Studio Version 17 | ||
| VisualStudioVersion = 17.14.36203.30 d17.14 |
Copilot
AI
Jan 13, 2026
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
There's inconsistent spacing in the Visual Studio version comment. The version shows '17.14.36203.30 d17.14' which appears to have extra content ('d17.14') that looks like it may be accidentally included. This should be cleaned up to show just the version number.
| VisualStudioVersion = 17.14.36203.30 d17.14 | |
| VisualStudioVersion = 17.14.36203.30 |
| # Add additional options to the MSBuild command line here (like platform or verbosity level). | ||
| # See https://docs.microsoft.com/visualstudio/msbuild/msbuild-command-line-reference | ||
| run: msbuild /m /p:Configuration=${{env.BUILD_CONFIGURATION}} ${{env.SOLUTION_FILE_PATH}} | ||
| run: msbuild /m /p:Configuration=${{ matrix.configuration }} /p:Platform=${{ matrix.platform }} ${{env.SOLUTION_FILE_PATH}} |
Copilot
AI
Jan 13, 2026
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The SOLUTION_FILE_PATH is set to '.' (current directory) but should specify the actual solution file name 'pict.sln'. This will cause MSBuild to fail as it expects a solution or project file, not a directory. Change this to 'pict.sln' or './pict.sln'.
| <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> | ||
| <LinkIncremental>true</LinkIncremental> | ||
| <IntDir>$(Platform)\$(Configuration)\</IntDir> | ||
| </PropertyGroup> | ||
| <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> | ||
| <LinkIncremental>true</LinkIncremental> | ||
| </PropertyGroup> | ||
| <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM64'"> | ||
| <LinkIncremental>true</LinkIncremental> | ||
| </PropertyGroup> | ||
| <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> | ||
| <LinkIncremental>false</LinkIncremental> | ||
| <IntDir>$(Platform)\$(Configuration)\</IntDir> | ||
| </PropertyGroup> | ||
| <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> | ||
| <LinkIncremental>false</LinkIncremental> | ||
| </PropertyGroup> | ||
| <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|ARM64'"> | ||
| <LinkIncremental>false</LinkIncremental> | ||
| </PropertyGroup> |
Copilot
AI
Jan 13, 2026
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The IntDir property is only set for Win32 platform configurations (lines 71 and 81) but not for x64 and ARM64 configurations. This inconsistency means intermediate build files for x64 and ARM64 will use default locations, which may cause conflicts or inconsistent build directory structures. The IntDir should be set for all platform configurations for consistency.
| <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> | ||
| <LinkIncremental>true</LinkIncremental> | ||
| <OutDir>$(SolutionDir)$(Platform)\$(Configuration)\clidll-usage\</OutDir> | ||
| <IntDir>$(Platform)\$(Configuration)\</IntDir> | ||
| </PropertyGroup> | ||
| <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> | ||
| <LinkIncremental>true</LinkIncremental> | ||
| <OutDir>$(SolutionDir)$(Platform)\$(Configuration)\clidll-usage\</OutDir> | ||
| </PropertyGroup> | ||
| <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM64'"> | ||
| <LinkIncremental>true</LinkIncremental> | ||
| <OutDir>$(SolutionDir)$(Platform)\$(Configuration)\clidll-usage\</OutDir> | ||
| </PropertyGroup> | ||
| <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> | ||
| <LinkIncremental>false</LinkIncremental> | ||
| <OutDir>$(SolutionDir)$(Platform)\$(Configuration)\clidll-usage\</OutDir> | ||
| <IntDir>$(Platform)\$(Configuration)\</IntDir> | ||
| </PropertyGroup> | ||
| <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> | ||
| <LinkIncremental>false</LinkIncremental> | ||
| <OutDir>$(SolutionDir)$(Platform)\$(Configuration)\clidll-usage\</OutDir> | ||
| </PropertyGroup> | ||
| <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|ARM64'"> | ||
| <LinkIncremental>false</LinkIncremental> | ||
| <OutDir>$(SolutionDir)$(Platform)\$(Configuration)\clidll-usage\</OutDir> | ||
| </PropertyGroup> |
Copilot
AI
Jan 13, 2026
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The IntDir property is only set for Win32 platform configurations (lines 68 and 81) but not for x64 and ARM64 configurations. This inconsistency means intermediate build files for x64 and ARM64 will use default locations, which may cause conflicts or inconsistent build directory structures. The IntDir should be set for all platform configurations for consistency.
| </PropertyGroup> | ||
| <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> | ||
| <IntDir>$(Platform)\$(Configuration)\</IntDir> | ||
| </PropertyGroup> |
Copilot
AI
Jan 13, 2026
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The IntDir property is only set for Win32 platform configurations (lines 70 and 73) but not for x64 and ARM64 configurations. This inconsistency means intermediate build files for x64 and ARM64 will use default locations, which may cause conflicts or inconsistent build directory structures. The IntDir should be set for all platform configurations for consistency.
| </PropertyGroup> | |
| </PropertyGroup> | |
| <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> | |
| <IntDir>$(Platform)\$(Configuration)\</IntDir> | |
| </PropertyGroup> | |
| <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> | |
| <IntDir>$(Platform)\$(Configuration)\</IntDir> | |
| </PropertyGroup> | |
| <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM64'"> | |
| <IntDir>$(Platform)\$(Configuration)\</IntDir> | |
| </PropertyGroup> | |
| <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|ARM64'"> | |
| <IntDir>$(Platform)\$(Configuration)\</IntDir> | |
| </PropertyGroup> |
Note:
No actual code changes here, just build and packaging scaffolding.