123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363 |
- # Distributed under the OSI-approved BSD 3-Clause License. See accompanying
- # file Copyright.txt or https://cmake.org/licensing for details.
- # Author: Alex Turbov
- if(CMAKE_BINARY_DIR)
- message(FATAL_ERROR "CPackNuGet.cmake may only be used by CPack internally.")
- endif()
- function(_cpack_nuget_debug)
- if(CPACK_NUGET_PACKAGE_DEBUG)
- message("CPackNuGet:Debug: " ${ARGN})
- endif()
- endfunction()
- function(_cpack_nuget_debug_var NAME)
- if(CPACK_NUGET_PACKAGE_DEBUG)
- message("CPackNuGet:Debug: ${NAME}=`${${NAME}}`")
- endif()
- endfunction()
- function(_cpack_nuget_variable_fallback OUTPUT_VAR_NAME NUGET_VAR_NAME)
- if(ARGN)
- list(JOIN ARGN "`, `" _va_args)
- set(_va_args ", ARGN: `${_va_args}`")
- endif()
- _cpack_nuget_debug(
- "_cpack_nuget_variable_fallback: "
- "OUTPUT_VAR_NAME=`${OUTPUT_VAR_NAME}`, "
- "NUGET_VAR_NAME=`${NUGET_VAR_NAME}`"
- "${_va_args}"
- )
- set(_options USE_CDATA)
- set(_one_value_args LIST_GLUE)
- set(_multi_value_args FALLBACK_VARS)
- cmake_parse_arguments(PARSE_ARGV 0 _args "${_options}" "${_one_value_args}" "${_multi_value_args}")
- if(CPACK_NUGET_PACKAGE_COMPONENT)
- string(
- TOUPPER "${CPACK_NUGET_PACKAGE_COMPONENT}"
- CPACK_NUGET_PACKAGE_COMPONENT_UPPER
- )
- endif()
- if(CPACK_NUGET_PACKAGE_COMPONENT
- AND CPACK_NUGET_${CPACK_NUGET_PACKAGE_COMPONENT}_PACKAGE_${NUGET_VAR_NAME}
- )
- set(
- _result
- "${CPACK_NUGET_${CPACK_NUGET_PACKAGE_COMPONENT}_PACKAGE_${NUGET_VAR_NAME}}"
- )
- _cpack_nuget_debug(
- " CPACK_NUGET_${CPACK_NUGET_PACKAGE_COMPONENT}_PACKAGE_${NUGET_VAR_NAME}: "
- "OUTPUT_VAR_NAME->${OUTPUT_VAR_NAME}=`${_result}`"
- )
- elseif(CPACK_NUGET_PACKAGE_COMPONENT_UPPER
- AND CPACK_NUGET_${CPACK_NUGET_PACKAGE_COMPONENT_UPPER}_PACKAGE_${NUGET_VAR_NAME}
- )
- set(
- _result
- "${CPACK_NUGET_${CPACK_NUGET_PACKAGE_COMPONENT_UPPER}_PACKAGE_${NUGET_VAR_NAME}}"
- )
- _cpack_nuget_debug(
- " CPACK_NUGET_${CPACK_NUGET_PACKAGE_COMPONENT_UPPER}_PACKAGE_${NUGET_VAR_NAME}: "
- "OUTPUT_VAR_NAME->${OUTPUT_VAR_NAME}=`${_result}`"
- )
- elseif(CPACK_NUGET_PACKAGE_${NUGET_VAR_NAME})
- set(_result "${CPACK_NUGET_PACKAGE_${NUGET_VAR_NAME}}")
- _cpack_nuget_debug(
- " CPACK_NUGET_PACKAGE_${NUGET_VAR_NAME}: "
- "OUTPUT_VAR_NAME->${OUTPUT_VAR_NAME}=`${_result}`"
- )
- else()
- foreach(_var IN LISTS _args_FALLBACK_VARS)
- _cpack_nuget_debug(" Fallback: ${_var} ...")
- if(${_var})
- _cpack_nuget_debug(" ${_var}=`${${_var}}`")
- set(_result "${${_var}}")
- _cpack_nuget_debug(
- " ${_var}: OUTPUT_VAR_NAME->${OUTPUT_VAR_NAME}=`${_result}`"
- )
- break()
- endif()
- endforeach()
- endif()
- if(_result)
- if(_args_USE_CDATA)
- set(_value_before "<![CDATA[")
- set(_value_after "]]>")
- endif()
- list(LENGTH _result _result_len)
- if(_result_len GREATER 1 AND _args_LIST_GLUE)
- list(JOIN _result "${_args_LIST_GLUE}" _result)
- endif()
- set(${OUTPUT_VAR_NAME} "${_value_before}${_result}${_value_after}" PARENT_SCOPE)
- endif()
- endfunction()
- function(_cpack_nuget_variable_fallback_and_wrap_into_element ELEMENT NUGET_VAR_NAME)
- set(_options)
- set(_one_value_args)
- set(_multi_value_args FALLBACK_VARS)
- cmake_parse_arguments(PARSE_ARGV 0 _args "${_options}" "${_one_value_args}" "${_multi_value_args}")
- _cpack_nuget_variable_fallback(_value ${NUGET_VAR_NAME} ${ARGN} USE_CDATA)
- if(_value)
- string(TOUPPER "${ELEMENT}" _ELEMENT_UP)
- set(
- _CPACK_NUGET_${_ELEMENT_UP}_TAG
- "<${ELEMENT}>${_value}</${ELEMENT}>"
- PARENT_SCOPE
- )
- endif()
- endfunction()
- # Print some debug info
- _cpack_nuget_debug("---[CPack NuGet Input Variables]---")
- _cpack_nuget_debug_var(CPACK_PACKAGE_NAME)
- _cpack_nuget_debug_var(CPACK_PACKAGE_VERSION)
- _cpack_nuget_debug_var(CPACK_TOPLEVEL_TAG)
- _cpack_nuget_debug_var(CPACK_TOPLEVEL_DIRECTORY)
- _cpack_nuget_debug_var(CPACK_TEMPORARY_DIRECTORY)
- _cpack_nuget_debug_var(CPACK_NUGET_GROUPS)
- if(CPACK_NUGET_GROUPS)
- foreach(_group IN LISTS CPACK_NUGET_GROUPS)
- string(MAKE_C_IDENTIFIER "${_group}" _group_up)
- string(TOUPPER "${_group_up}" _group_up)
- _cpack_nuget_debug_var(CPACK_NUGET_${_group_up}_GROUP_COMPONENTS)
- endforeach()
- endif()
- _cpack_nuget_debug_var(CPACK_NUGET_COMPONENTS)
- _cpack_nuget_debug_var(CPACK_NUGET_ALL_IN_ONE)
- _cpack_nuget_debug_var(CPACK_NUGET_ORDINAL_MONOLITIC)
- _cpack_nuget_debug("-----------------------------------")
- function(_cpack_nuget_render_spec)
- # Make a variable w/ upper-cased component name
- if(CPACK_NUGET_PACKAGE_COMPONENT)
- string(TOUPPER "${CPACK_NUGET_PACKAGE_COMPONENT}" CPACK_NUGET_PACKAGE_COMPONENT_UPPER)
- endif()
- # Set mandatory variables (not wrapped into XML elements)
- # https://docs.microsoft.com/en-us/nuget/reference/nuspec#required-metadata-elements
- if(CPACK_NUGET_PACKAGE_COMPONENT)
- if(CPACK_NUGET_${CPACK_NUGET_PACKAGE_COMPONENT_UPPER}_PACKAGE_NAME)
- set(
- CPACK_NUGET_PACKAGE_NAME
- "${CPACK_NUGET_${CPACK_NUGET_PACKAGE_COMPONENT_UPPER}_PACKAGE_NAME}"
- )
- elseif(NOT CPACK_NUGET_PACKAGE_COMPONENT STREQUAL "Unspecified")
- set(
- CPACK_NUGET_PACKAGE_NAME
- "${CPACK_PACKAGE_NAME}.${CPACK_NUGET_PACKAGE_COMPONENT}"
- )
- else()
- set(CPACK_NUGET_PACKAGE_NAME "${CPACK_PACKAGE_NAME}")
- endif()
- elseif(NOT CPACK_NUGET_PACKAGE_NAME)
- set(CPACK_NUGET_PACKAGE_NAME "${CPACK_PACKAGE_NAME}")
- endif()
- _cpack_nuget_variable_fallback(
- CPACK_NUGET_PACKAGE_VERSION VERSION
- FALLBACK_VARS
- CPACK_PACKAGE_VERSION
- )
- _cpack_nuget_variable_fallback(
- CPACK_NUGET_PACKAGE_DESCRIPTION DESCRIPTION
- FALLBACK_VARS
- CPACK_COMPONENT_${CPACK_NUGET_PACKAGE_COMPONENT}_DESCRIPTION
- CPACK_COMPONENT_${CPACK_NUGET_PACKAGE_COMPONENT_UPPER}_DESCRIPTION
- CPACK_COMPONENT_GROUP_${CPACK_NUGET_PACKAGE_COMPONENT_UPPER}_DESCRIPTION
- CPACK_PACKAGE_DESCRIPTION
- USE_CDATA
- )
- _cpack_nuget_variable_fallback(
- CPACK_NUGET_PACKAGE_AUTHORS AUTHORS
- FALLBACK_VARS
- CPACK_PACKAGE_VENDOR
- USE_CDATA
- LIST_GLUE ","
- )
- # Set optional variables (wrapped into XML elements)
- # https://docs.microsoft.com/en-us/nuget/reference/nuspec#optional-metadata-elements
- _cpack_nuget_variable_fallback_and_wrap_into_element(
- title
- TITLE
- FALLBACK_VARS
- CPACK_COMPONENT_${CPACK_NUGET_PACKAGE_COMPONENT}_DISPLAY_NAME
- CPACK_COMPONENT_${CPACK_NUGET_PACKAGE_COMPONENT_UPPER}_DISPLAY_NAME
- CPACK_COMPONENT_GROUP_${CPACK_NUGET_PACKAGE_COMPONENT_UPPER}_DISPLAY_NAME
- )
- _cpack_nuget_variable_fallback_and_wrap_into_element(owners OWNERS LIST_GLUE ",")
- _cpack_nuget_variable_fallback_and_wrap_into_element(
- projectUrl
- HOMEPAGE_URL
- FALLBACK_VARS
- CPACK_PACKAGE_HOMEPAGE_URL
- )
- _cpack_nuget_variable_fallback_and_wrap_into_element(licenseUrl LICENSEURL)
- _cpack_nuget_variable_fallback_and_wrap_into_element(iconUrl ICONURL)
- _cpack_nuget_variable_fallback_and_wrap_into_element(
- summary DESCRIPTION_SUMMARY
- FALLBACK_VARS
- CPACK_PACKAGE_DESCRIPTION_SUMMARY
- )
- if(CPACK_NUGET_PACKAGE_REQUIRE_LICENSE_ACCEPTANCE)
- set(
- _CPACK_NUGET_REQUIRELICENSEACCEPTANCE_TAG
- "<requireLicenseAcceptance>true</requireLicenseAcceptance>"
- )
- endif()
- _cpack_nuget_variable_fallback_and_wrap_into_element(releaseNotes RELEASE_NOTES)
- _cpack_nuget_variable_fallback_and_wrap_into_element(copyright COPYRIGHT)
- _cpack_nuget_variable_fallback_and_wrap_into_element(tags TAGS LIST_GLUE " ")
- # Handle dependencies
- _cpack_nuget_variable_fallback(_deps DEPENDENCIES)
- set(_collected_deps)
- foreach(_dep IN LISTS _deps)
- _cpack_nuget_debug(" checking dependency `${_dep}`")
- string(MAKE_C_IDENTIFIER "${_dep}" _dep_id)
- _cpack_nuget_variable_fallback(_ver DEPENDENCIES_${_dep_id}_VERSION)
- if(NOT _ver)
- string(TOUPPER "${_dep_id}" _dep_id)
- _cpack_nuget_variable_fallback(_ver DEPENDENCIES_${_dep_id}_VERSION)
- endif()
- if(_ver)
- _cpack_nuget_debug(" got `${_dep}` dependency version ${_ver}")
- list(APPEND _collected_deps "<dependency id=\"${_dep}\" version=\"${_ver}\" />")
- endif()
- endforeach()
- # Render deps into the variable
- if(_collected_deps)
- set(_CPACK_NUGET_DEPENDENCIES_TAG "<dependencies>\n")
- foreach(_line IN LISTS _collected_deps)
- string(
- APPEND _CPACK_NUGET_DEPENDENCIES_TAG
- " ${_line}\n"
- )
- endforeach()
- string(APPEND _CPACK_NUGET_DEPENDENCIES_TAG " </dependencies>")
- endif()
- # Render the spec file
- # NOTE The spec filename doesn't matter. Being included into a package,
- # NuGet will name it properly.
- _cpack_nuget_debug("Rendering `${CPACK_TEMPORARY_DIRECTORY}/CPack.NuGet.nuspec` file...")
- configure_file(
- "${CMAKE_ROOT}/Modules/Internal/CPack/CPack.NuGet.nuspec.in"
- "${CPACK_TEMPORARY_DIRECTORY}/CPack.NuGet.nuspec"
- @ONLY
- )
- endfunction()
- function(_cpack_nuget_make_files_tag)
- set(_files)
- foreach(_comp IN LISTS ARGN)
- string(APPEND _files " <file src=\"${_comp}\\**\" target=\".\" />\n")
- endforeach()
- set(_CPACK_NUGET_FILES_TAG "<files>\n${_files} </files>" PARENT_SCOPE)
- endfunction()
- find_program(NUGET_EXECUTABLE nuget)
- _cpack_nuget_debug_var(NUGET_EXECUTABLE)
- if(NOT NUGET_EXECUTABLE)
- message(FATAL_ERROR "NuGet executable not found")
- endif()
- # Add details for debug run
- if(CPACK_NUGET_PACKAGE_DEBUG)
- list(APPEND CPACK_NUGET_PACK_ADDITIONAL_OPTIONS "-Verbosity" "detailed")
- endif()
- # Case one: ordinal all-in-one package
- if(CPACK_NUGET_ORDINAL_MONOLITIC)
- # This variable `CPACK_NUGET_ALL_IN_ONE` set by C++ code:
- # Meaning to pack all installed files into a single package
- _cpack_nuget_debug("---[Making an ordinal monolitic package]---")
- _cpack_nuget_render_spec()
- execute_process(
- COMMAND "${NUGET_EXECUTABLE}" pack ${CPACK_NUGET_PACK_ADDITIONAL_OPTIONS}
- WORKING_DIRECTORY "${CPACK_TEMPORARY_DIRECTORY}"
- )
- elseif(CPACK_NUGET_ALL_IN_ONE)
- # This variable `CPACK_NUGET_ALL_IN_ONE` set by C++ code:
- # Meaning to pack all installed components into a single package
- _cpack_nuget_debug("---[Making a monolitic package from installed components]---")
- # Prepare the `files` element which include files from several components
- _cpack_nuget_make_files_tag(${CPACK_NUGET_COMPONENTS})
- _cpack_nuget_render_spec()
- execute_process(
- COMMAND "${NUGET_EXECUTABLE}" pack ${CPACK_NUGET_PACK_ADDITIONAL_OPTIONS}
- WORKING_DIRECTORY "${CPACK_TEMPORARY_DIRECTORY}"
- )
- else()
- # Is there any grouped component?
- if(CPACK_NUGET_GROUPS)
- _cpack_nuget_debug("---[Making grouped component(s) package(s)]---")
- foreach(_group IN LISTS CPACK_NUGET_GROUPS)
- _cpack_nuget_debug("Starting to make the package for group `${_group}`")
- string(MAKE_C_IDENTIFIER "${_group}" _group_up)
- string(TOUPPER "${_group_up}" _group_up)
- # Render a spec file which includes all components in the current group
- unset(_CPACK_NUGET_FILES_TAG)
- _cpack_nuget_make_files_tag(${CPACK_NUGET_${_group_up}_GROUP_COMPONENTS})
- # Temporary set `CPACK_NUGET_PACKAGE_COMPONENT` to the group name
- # to properly collect various per group settings
- set(CPACK_NUGET_PACKAGE_COMPONENT ${_group})
- _cpack_nuget_render_spec()
- unset(CPACK_NUGET_PACKAGE_COMPONENT)
- execute_process(
- COMMAND "${NUGET_EXECUTABLE}" pack ${CPACK_NUGET_PACK_ADDITIONAL_OPTIONS}
- WORKING_DIRECTORY "${CPACK_TEMPORARY_DIRECTORY}"
- )
- endforeach()
- endif()
- # Is there any single component package needed?
- if(CPACK_NUGET_COMPONENTS)
- _cpack_nuget_debug("---[Making single-component(s) package(s)]---")
- foreach(_comp IN LISTS CPACK_NUGET_COMPONENTS)
- _cpack_nuget_debug("Starting to make the package for component `${_comp}`")
- # Render a spec file which includes only given component
- unset(_CPACK_NUGET_FILES_TAG)
- _cpack_nuget_make_files_tag(${_comp})
- # Temporary set `CPACK_NUGET_PACKAGE_COMPONENT` to the current
- # component name to properly collect various per group settings
- set(CPACK_NUGET_PACKAGE_COMPONENT ${_comp})
- _cpack_nuget_render_spec()
- unset(CPACK_NUGET_PACKAGE_COMPONENT)
- execute_process(
- COMMAND "${NUGET_EXECUTABLE}" pack ${CPACK_NUGET_PACK_ADDITIONAL_OPTIONS}
- WORKING_DIRECTORY "${CPACK_TEMPORARY_DIRECTORY}"
- )
- endforeach()
- endif()
- endif()
- file(GLOB_RECURSE GEN_CPACK_OUTPUT_FILES "${CPACK_TEMPORARY_DIRECTORY}/*.nupkg")
- if(NOT GEN_CPACK_OUTPUT_FILES)
- message(FATAL_ERROR "NuGet package was not generated at `${CPACK_TEMPORARY_DIRECTORY}`!")
- endif()
- _cpack_nuget_debug("Generated files: ${GEN_CPACK_OUTPUT_FILES}")
|