Skip to content

Conversation

@Spruill-1
Copy link

  • Add ARM64 targets to the solution
  • Update nuget package to include different architectures of the binaries
  • Update nuget package to include debug and release builds of the API lib
  • Update nuget package version
  • Include nuget package target file - automatically include header path and lib for VS projects.

Note:
No actual code changes here, just build and packaging scaffolding.

…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.
Copy link

@zhuman zhuman left a 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.

Copy link

Copilot AI left a 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>
Copy link

Copilot AI Jan 13, 2026

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.

Copilot uses AI. Check for mistakes.
Comment on lines +10 to +20
<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>
Copy link

Copilot AI Jan 13, 2026

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.

Suggested change
<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>

Copilot uses AI. Check for mistakes.
Comment on lines +29 to +41
<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">
Copy link

Copilot AI Jan 13, 2026

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.

Suggested change
<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">

Copilot uses AI. Check for mistakes.

<!-- Documentation and license - common for all architectures -->
<file src="doc/pict.md" target="contents" />
<file src="LICENSE.TXT" target="contents" />
Copy link

Copilot AI Jan 13, 2026

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.

Copilot uses AI. Check for mistakes.
<PreprocessorDefinitions>WIN32;_DEBUG;PICTCLIDLL_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ConformanceMode>false</ConformanceMode>
<AdditionalIncludeDirectories>$(SolutionDir)\api; $(SolutionDir)\cli</AdditionalIncludeDirectories>
<RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
Copy link

Copilot AI Jan 13, 2026

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.

Copilot uses AI. Check for mistakes.

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 17
VisualStudioVersion = 17.14.36203.30 d17.14
Copy link

Copilot AI Jan 13, 2026

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.

Suggested change
VisualStudioVersion = 17.14.36203.30 d17.14
VisualStudioVersion = 17.14.36203.30

Copilot uses AI. Check for mistakes.
# 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}}
Copy link

Copilot AI Jan 13, 2026

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'.

Copilot uses AI. Check for mistakes.
Comment on lines +69 to +88
<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>
Copy link

Copilot AI Jan 13, 2026

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.

Copilot uses AI. Check for mistakes.
Comment on lines +65 to +90
<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>
Copy link

Copilot AI Jan 13, 2026

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.

Copilot uses AI. Check for mistakes.
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<IntDir>$(Platform)\$(Configuration)\</IntDir>
</PropertyGroup>
Copy link

Copilot AI Jan 13, 2026

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.

Suggested change
</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>

Copilot uses AI. Check for mistakes.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants