1
0
mirror of https://github.com/Kitware/CMake.git synced 2025-10-14 02:08:27 +08:00

CPack/NuGet: Enable the generation of NuGet symbol package(s)

Enable the generation of NuGet symbol package(s) with the new variable
`CPACK_NUGET_SYMBOL_PACKAGE`. CPack generates then normal nuget package
(*.nupkg) and a symbol nuget package (*.snupkg). The new generate
package contains PDB files.

Fixes: #26976
This commit is contained in:
Jens Carl
2025-06-02 14:20:35 -07:00
committed by Brad King
parent e3b7a00af1
commit e71396c8db
10 changed files with 99 additions and 2 deletions

View File

@@ -41,6 +41,14 @@ List of CPack NuGet generator specific variables:
:Mandatory: No
:Default: ``OFF``
.. variable:: CPACK_NUGET_SYMBOL_PACKAGE
.. versionadded:: 4.1
Generate a Nuget symbol package (.snupkg).
:Mandatory: No
:Default: ``OFF``
Required metadata variables
~~~~~~~~~~~~~~~~~~~~~~~~~~~

View File

@@ -0,0 +1,6 @@
cpack-nuget-symbol-package
--------------------------
* The :cpack_gen:`CPack NuGet Generator` gained option
:variable:`CPACK_NUGET_SYMBOL_PACKAGE` to generate NuGet
symbol packages containing PDB files.

View File

@@ -468,6 +468,12 @@ if(CPACK_NUGET_PACKAGE_DEBUG)
list(APPEND CPACK_NUGET_PACK_ADDITIONAL_OPTIONS "-Verbosity" "detailed")
endif()
# Generate symbol package
if(CPACK_NUGET_SYMBOL_PACKAGE)
list(APPEND CPACK_NUGET_PACK_ADDITIONAL_OPTIONS "-Symbols")
list(APPEND CPACK_NUGET_PACK_ADDITIONAL_OPTIONS "-SymbolPackageFormat" "snupkg")
endif()
# Case one: ordinal all-in-one package
if(CPACK_NUGET_ORDINAL_MONOLITIC)
# This variable `CPACK_NUGET_ALL_IN_ONE` set by C++ code:
@@ -552,9 +558,19 @@ else()
endif()
endif()
file(GLOB_RECURSE GEN_CPACK_OUTPUT_FILES "${CPACK_TEMPORARY_DIRECTORY}/*.nupkg")
if(NOT GEN_CPACK_OUTPUT_FILES)
file(GLOB_RECURSE GEN_CPACK_NUGET_PACKAGE_FILES "${CPACK_TEMPORARY_DIRECTORY}/*.nupkg")
if(NOT GEN_CPACK_NUGET_PACKAGE_FILES)
message(FATAL_ERROR "NuGet package was not generated at `${CPACK_TEMPORARY_DIRECTORY}`!")
endif()
list(APPEND GEN_CPACK_OUTPUT_FILES "${GEN_CPACK_NUGET_PACKAGE_FILES}")
if(CPACK_NUGET_SYMBOL_PACKAGE)
file(GLOB_RECURSE GEN_CPACK_NUGET_SYMBOL_PACKAGE_FILES "${CPACK_TEMPORARY_DIRECTORY}/*.snupkg")
if(NOT GEN_CPACK_NUGET_SYMBOL_PACKAGE_FILES)
message(FATAL_ERROR "NuGet symbol package was not generated at `${CPACK_TEMPORARY_DIRECTORY}`!")
endif()
list(APPEND GEN_CPACK_OUTPUT_FILES "${GEN_CPACK_NUGET_SYMBOL_PACKAGE_FILES}")
endif()
_cpack_nuget_debug("Generated files: ${GEN_CPACK_OUTPUT_FILES}")

View File

@@ -0,0 +1,31 @@
file(GLOB generated_nuspec "${RunCMake_TEST_BINARY_DIR}/_CPack_Packages/*/NuGet/GeneratorTest-1.2.3-*/CPack.NuGet.nuspec")
if(NOT generated_nuspec)
set(RunCMake_TEST_FAILED "No nuspec file generated under ${RunCMake_TEST_BINARY_DIR}")
else()
# Read in the generated nuspec file content
file(STRINGS "${generated_nuspec}" actual_nuspec REGEX "^.*[^ ]+$")
# Read in the expected file content
file(STRINGS "${CMAKE_CURRENT_LIST_DIR}/expected.nuspec" expected_nuspec REGEX "^.*[^ ]+$")
# Compare the file contents
string(COMPARE EQUAL "${actual_nuspec}" "${expected_nuspec}" nuspec_matches)
if(NOT nuspec_matches)
set(RunCMake_TEST_FAILED "generated nuspec file incorrect")
set(failure_msg "")
# This would be nicer with a `diff` output, but it needs to be portable
string(APPEND failure_msg "\nExpected file:\n")
string(APPEND failure_msg "${expected_nuspec}")
string(APPEND failure_msg "Actual file:\n")
string(APPEND failure_msg "${actual_nuspec}")
set(RunCMake_TEST_FAILURE_MESSAGE "${failure_msg}")
endif()
endif()
if(NOT EXISTS "${RunCMake_TEST_BINARY_DIR}/GeneratorTest.1.2.3.nupkg")
set(RunCMake_TEST_FAILED "NuGet standard package not generated")
endif()
if(NOT EXISTS "${RunCMake_TEST_BINARY_DIR}/GeneratorTest.1.2.3.snupkg")
set(RunCMake_TEST_FAILED "NuGet symbol package not generated")
endif()

View File

@@ -5,3 +5,4 @@ set(env_PATH "$ENV{PATH}")
set(RunCPack_GENERATORS NuGet)
run_cpack(NuGetLib)
run_cpack(NuGetSymbol)

View File

@@ -0,0 +1,35 @@
cmake_minimum_required(VERSION 4.0) # FIXME: Actually requires 4.1
project(CPackNugetGenerator)
install(FILES notactuallyalib.dll DESTINATION lib/net4)
install(FILES notactuallyalib.pdb DESTINATION lib/net4)
install(FILES alsonotalib.dll DESTINATION lib/net6.0)
install(FILES alsonotalib.pdb DESTINATION lib/net6.0)
# Create NuGet package
set(CPACK_GENERATOR NuGet)
set(CPACK_PACKAGE_NAME GeneratorTest)
set(CPACK_PACKAGE_VERSION "1.2.3")
set(CPACK_PACKAGE_VENDOR "ACME Inc")
set(CPACK_NUGET_SYMBOL_PACKAGE ON)
set(CPACK_NUGET_PACKAGE_OWNERS "ACME Inc")
set(CPACK_PACKAGE_DESCRIPTION "A NuGet package for testing CMake's CPack NuGet generator")
set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "A test NuGet package")
set(CPACK_PACKAGE_HOMEPAGE_URL "https://www.example.com")
set(CPACK_NUGET_PACKAGE_REPOSITORY_URL "https://github.com/example/nugetlib.git")
set(CPACK_NUGET_PACKAGE_REPOSITORY_TYPE git)
set(CPACK_NUGET_PACKAGE_LICENSE_EXPRESSION "MIT")
# Set up dependencies
set(CPACK_NUGET_PACKAGE_TFMS "net4;net6.0")
set(CPACK_NUGET_PACKAGE_DEPENDENCIES_net4 "Foo;Bar")
# NB: If a version number is omitted, the dependency will not be created
set(CPACK_NUGET_PACKAGE_DEPENDENCIES_net4_Foo_VERSION "1.23")
set(CPACK_NUGET_PACKAGE_DEPENDENCIES_net4_Bar_VERSION "4.3.2")
# NB: General dependencies (not framework-specific) go in this variable
set(CPACK_NUGET_PACKAGE_DEPENDENCIES "Baz")
set(CPACK_NUGET_PACKAGE_DEPENDENCIES_Baz_VERSION "9.8.6")
# NB: Since "net6.0" was listed but no dependencies have been specified, an empty group
# will be added to the nuspec file for this framework. This can be used to address `NU5128`_.
include(CPack)