This commit is contained in:
kleuter
2023-11-01 22:26:17 +01:00
parent 94b1c5907b
commit 860ee1cc77
3387 changed files with 257471 additions and 0 deletions

View File

@ -0,0 +1,158 @@
# Distributed under the OSI-approved BSD 3-Clause License. See accompanying
# file Copyright.txt or https://cmake.org/licensing for details.
#[=[
NOTE: This function is used internally by CMake. Projects should not include
this file directly.
The cmake_try_compiler_or_linker_flag() function can be used to compile and link a
source file to check whether a specific compiler or linker flag is supported.
The function does not use the try_compile() command so as to avoid infinite
recursion. It may not work for all platforms or toolchains, the caller is
responsible for ensuring it is only called in valid situations.
cmake_try_compiler_or_linker_flag(<lang> <flag> <result>
[SRC_EXT <ext>] [COMMAND_PATTERN <pattern>]
[FAIL_REGEX <regex> ...]
[OUTPUT_VARIABLE <output>])
Parameters:
<lang> - Language to check.
<flag> - The flag to add to the compile/link command line.
<result> - Boolean output variable. It will be stored in the cache as an
internal variable and if true, will cause future tests that assign
to that variable to be bypassed.
Optional parameters:
SRC_EXT - Overrides the extension of the source file used for the
check. Defaults are 'c' (C), 'cxx' (CXX), 'F' (Fortran).
COMMAND_PATTERN - Pattern to be used for the command line. The default is
'<FLAG> -o <OUTPUT> <SOURCE>'
FAIL_REGEX - List of additional regular expressions that, if matched by
the output, give a failed result for the check. A common
set of regular expressions will be included in addition to
those given by FAIL_REGEX.
OUTPUT_VARIABLE - Set <output> variable with details about any error.
#]=]
include_guard(GLOBAL)
include(CMakeCheckCompilerFlagCommonPatterns)
function(CMAKE_TRY_COMPILER_OR_LINKER_FLAG lang flag result)
# Cache results between runs similar to check_<lang>_source_compiles()
if(DEFINED ${result})
return()
endif()
set(comment "Is the '${flag}' option(s) supported")
string(REPLACE ";" " " comment "${comment}")
if (NOT lang MATCHES "^(C|CXX|Fortran|ASM)$")
# other possible languages are not supported
# log message to keep trace of this problem...
message(CONFIGURE_LOG
"Function 'CMAKE_CHECK_COMPILER_FLAG' called with unsupported language: ${lang}\n")
set(${result} FALSE CACHE INTERNAL ${comment})
return()
endif()
if (lang STREQUAL "ASM")
# assume ASM compiler is a multi-language compiler, so supports C language as well
set(check_lang C)
else()
set(check_lang ${lang})
endif()
cmake_parse_arguments(CCCF "" "SRC_EXT;COMMAND_PATTERN;OUTPUT_VARIABLE" "FAIL_REGEX" ${ARGN})
if (NOT CCCF_COMMAND_PATTERN)
set (CCCF_COMMAND_PATTERN "<FLAG> -o <OUTPUT> <SOURCE>")
endif()
list (APPEND CCCF_FAIL_REGEX "argument unused during compilation") # clang
if (check_lang STREQUAL "C")
list(APPEND CCCF_FAIL_REGEX
"command line option .* is valid for .* but not for C") # GNU
elseif(check_lang STREQUAL "CXX")
list(APPEND CCCF_FAIL_REGEX
"command line option .* is valid for .* but not for C\\+\\+") # GNU
elseif(check_lang STREQUAL "Fortran")
list(APPEND CCCF_FAIL_REGEX
"command line option .* is valid for .* but not for Fortran") # GNU
endif()
# Add patterns for common errors
check_compiler_flag_common_patterns(COMPILER_FLAG_COMMON_PATTERNS)
foreach(arg IN LISTS COMPILER_FLAG_COMMON_PATTERNS)
if(arg MATCHES "^FAIL_REGEX$")
continue()
endif()
list(APPEND CCCF_FAIL_REGEX "${arg}")
endforeach()
if(NOT CCCF_SRC_EXT)
if (check_lang STREQUAL "C")
set(CCCF_SRC_EXT c)
elseif(check_lang STREQUAL "CXX")
set(CCCF_SRC_EXT cxx)
elseif(check_lang STREQUAL "Fortran")
set(CCCF_SRC_EXT F)
endif()
endif()
if (CCCF_OUTPUT_VARIABLE)
unset(${CCCF_OUTPUT_VARIABLE} PARENT_SCOPE)
endif()
# Compute the directory in which to run the test.
set(COMPILER_FLAG_DIR "${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp")
# Compute source and output files.
set(COMPILER_FLAG_SRC
"${COMPILER_FLAG_DIR}/CompilerFlag${lang}.${CCCF_SRC_EXT}")
if(check_lang STREQUAL "Fortran")
file(WRITE "${COMPILER_FLAG_SRC}"
" program simple\n end program simple\n")
else()
file(WRITE "${COMPILER_FLAG_SRC}" "int main (void)\n{ return 0; }\n")
endif()
get_filename_component(COMPILER_FLAG_EXE "${COMPILER_FLAG_SRC}" NAME_WE)
string(APPEND COMPILER_FLAG_EXE "${CMAKE_EXECUTABLE_SUFFIX}")
# Build command line
separate_arguments(CCCF_COMMAND_PATTERN UNIX_COMMAND
"${CCCF_COMMAND_PATTERN}")
list(TRANSFORM CCCF_COMMAND_PATTERN REPLACE "<SOURCE>" "${COMPILER_FLAG_SRC}")
list(TRANSFORM CCCF_COMMAND_PATTERN REPLACE "<OUTPUT>" "${COMPILER_FLAG_EXE}")
list(TRANSFORM CCCF_COMMAND_PATTERN REPLACE "<FLAG>" "${flag}")
execute_process(
COMMAND "${CMAKE_COMMAND}" -E env LC_ALL=C LC_MESSAGES=C LANG=C
"${CMAKE_${lang}_COMPILER}" ${CCCF_COMMAND_PATTERN}
WORKING_DIRECTORY "${COMPILER_FLAG_DIR}"
OUTPUT_VARIABLE COMPILER_FLAG_OUTPUT
ERROR_VARIABLE COMPILER_FLAG_OUTPUT
RESULT_VARIABLE COMPILER_FLAG_RESULT)
# Record result in the cache so we can avoid re-testing every CMake run
if (COMPILER_FLAG_RESULT)
set(${result} FALSE CACHE INTERNAL ${comment})
else()
foreach(regex IN LISTS CCCF_FAIL_REGEX)
if(COMPILER_FLAG_OUTPUT MATCHES "${regex}")
set(${result} FALSE CACHE INTERNAL ${comment})
endif()
endforeach()
endif()
if (DEFINED ${result})
message(CONFIGURE_LOG
"Determining if the ${flag} option "
"is supported for ${lang} language failed with the following output:\n"
"${COMPILER_FLAG_OUTPUT}\n")
if (CCCF_OUTPUT_VARIABLE)
set(${CCCF_OUTPUT_VARIABLE} "${COMPILER_FLAG_OUTPUT}" PARENT_SCOPE)
endif()
return()
endif()
set(${result} TRUE CACHE INTERNAL ${comment})
endfunction()

View File

@ -0,0 +1,12 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.4">
<dict>
<key>IFPkgDescriptionTitle</key>
<string>@CPACK_PACKAGE_NAME@</string>
<key>IFPkgDescriptionVersion</key>
<string>@CPACK_PACKAGE_VERSION@</string>
<key>IFPkgDescriptionDescription</key>
<string>@CPACK_PACKAGE_DESCRIPTION@</string>
</dict>
</plist>

View File

@ -0,0 +1,37 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>IFMajorVersion</key>
<integer>@CPACK_PACKAGE_VERSION_MAJOR@</integer>
<key>IFMinorVersion</key>
<integer>@CPACK_PACKAGE_VERSION_MINOR@</integer>
<key>IFPkgFlagAllowBackRev</key>
<false/>
<key>IFPkgFlagAuthorizationAction</key>
<string>AdminAuthorization</string>
<key>IFPkgFlagDefaultLocation</key>
<string>@CPACK_PACKAGE_DEFAULT_LOCATION@</string>
<key>IFPkgFlagInstallFat</key>
<false/>
<key>IFPkgFlagIsRequired</key>
<false/>
<key>IFPkgFlagOverwritePermissions</key>
<true/>
<key>IFPkgFlagRelocatable</key>
<@CPACK_PACKAGE_RELOCATABLE@/>
<key>IFPkgFlagRestartAction</key>
<string>NoRestart</string>
<key>IFPkgFlagRootVolumeOnly</key>
<false/>
<key>IFPkgFlagUpdateInstalledLanguages</key>
<false/>
<key>IFPkgFlagUseUserMask</key>
<false/>
<key>IFPkgFormatVersion</key>
<real>0.10000000149011612</real>
<key>CFBundleIdentifier</key>
<string>com.@CPACK_PACKAGE_VENDOR@.@CPACK_PACKAGE_NAME@@CPACK_MODULE_VERSION_SUFFIX@</string>
</dict>
</plist>

View File

@ -0,0 +1,27 @@
<?xml version="1.0" encoding="utf-8"?>
<package xmlns="http://schemas.microsoft.com/packaging/2011/08/nuspec.xsd">
<metadata>
<!-- Required elements-->
<id>@CPACK_NUGET_PACKAGE_NAME@</id>
<version>@CPACK_NUGET_PACKAGE_VERSION@</version>
<description>@CPACK_NUGET_PACKAGE_DESCRIPTION@</description>
<authors>@CPACK_NUGET_PACKAGE_AUTHORS@</authors>
<!-- Optional elements -->
@_CPACK_NUGET_TITLE_TAG@
@_CPACK_NUGET_OWNERS_TAG@
@_CPACK_NUGET_PROJECTURL_TAG@
@_CPACK_NUGET_LICENSEURL_TAG@
@_CPACK_NUGET_LICENSE_TAG@
@_CPACK_NUGET_ICONURL_TAG@
@_CPACK_NUGET_ICON_TAG@
@_CPACK_NUGET_REQUIRELICENSEACCEPTANCE_TAG@
@_CPACK_NUGET_SUMMARY_TAG@
@_CPACK_NUGET_RELEASENOTES_TAG@
@_CPACK_NUGET_COPYRIGHT_TAG@
@_CPACK_NUGET_LANGUAGE_TAG@
@_CPACK_NUGET_TAGS_TAG@
@_CPACK_NUGET_DEPENDENCIES_TAG@
</metadata>
@_CPACK_NUGET_FILES_TAG@
</package>

View File

@ -0,0 +1,47 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleDevelopmentRegion</key>
<string>English</string>
<key>CFBundleDocumentTypes</key>
<array>
<dict>
<key>CFBundleTypeExtensions</key>
<array>
<string>@CPACK_FILE_ASSOCIATION_EXTENSION@</string>
</array>
<key>CFBundleTypeName</key>
<string>@CPACK_FILE_ASSOCIATION_TYPE@</string>
<key>CFBundleTypeRole</key>
<string>Editor</string>
</dict>
</array>
<key>CFBundleExecutable</key>
<string>@CPACK_PACKAGE_FILE_NAME@</string>
<key>CFBundleGetInfoString</key>
<string>@CPACK_APPLE_GUI_INFO_STRING@</string>
<key>CFBundleIconFile</key>
<string>@CPACK_APPLE_GUI_ICON@</string>
<key>CFBundleIdentifier</key>
<string>@CPACK_APPLE_GUI_IDENTIFIER@</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleLongVersionString</key>
<string>@CPACK_APPLE_GUI_LONG_VERSION_STRING@</string>
<key>CFBundleName</key>
<string>@CPACK_APPLE_GUI_BUNDLE_NAME@</string>
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleShortVersionString</key>
<string>@CPACK_APPLE_GUI_SHORT_VERSION_STRING@</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleVersion</key>
<string>@CPACK_APPLE_GUI_BUNDLE_VERSION@</string>
<key>CSResourcesFileMapped</key>
<true/>
<key>NSHumanReadableCopyright</key>
<string>@CPACK_APPLE_GUI_COPYRIGHT@</string>
</dict>
</plist>

View File

@ -0,0 +1,87 @@
#!/bin/sh
#
# Modified from: Aaron Voisine <aaron@voisine.org>
CWD="`dirname \"$0\"`"
TMP=/tmp/$(id -ru)/TemporaryItems
version=`sw_vers -productVersion`
if [ "$?" = "0" ]; then
major=${version%%\.*}
rest=${version#*\.}
minor=${rest%%\.*}
build=${rest#*\.}
else
major=10
minor=4
build=0
fi
echo $version
echo "Major = $major"
echo "Minor = $minor"
echo "Build = $build"
# if 10.5 or greater, then all the open-x11 stuff need not occur
if [ "$major" -lt 10 ] || ([ "$major" -eq 10 ] && [ "$minor" -lt 5 ]); then
version=`sw_vers -productVersion`
if [ "$?" = "0" ]; then
major=${version%%\.*}
rest=${version#*\.}
minor=${rest%%\.*}
build=${rest#*\.}
else
major=10
minor=4
build=0
fi
echo $version
echo "Major = $major"
echo "Minor = $minor"
echo "Build = $build"
# if 10.5 or greater, then all the open-x11 stuff need not occur
if [ "$major" -lt 10 ] || ([ "$major" -eq 10 ] && [ "$minor" -lt 5 ]); then
ps -wx -ocommand | grep -e '[X]11.app' > /dev/null
if [ "$?" != "0" -a ! -f ~/.xinitrc ]; then
echo "rm -f ~/.xinitrc" > ~/.xinitrc
sed 's/xterm/# xterm/' /usr/X11R6/lib/X11/xinit/xinitrc >> ~/.xinitrc
fi
mkdir -p $TMP
cat << __END_OF_GETDISPLAY_SCRIPT__ > "$TMP/getdisplay.sh"
#!/bin/sh
mkdir -p "$TMP"
if [ "\$DISPLAY"x = "x" ]; then
echo :0 > "$TMP/display"
else
echo \$DISPLAY > "$TMP/display"
fi
__END_OF_GETDISPLAY_SCRIPT__
fi
chmod +x "$TMP/getdisplay.sh"
rm -f $TMP/display
open-x11 $TMP/getdisplay.sh || \
open -a XDarwin $TMP/getdisplay.sh || \
echo ":0" > $TMP/display
while [ "$?" = "0" -a ! -f $TMP/display ];
do
#echo "Waiting for display $TMP/display"
sleep 1;
done
export "DISPLAY=`cat $TMP/display`"
ps -wx -ocommand | grep -e '[X]11' > /dev/null || exit 11
cd ~/
echo "$@" > /tmp/arguments.log
if echo $1 | grep -- "^-psn_"; then
shift
fi
fi
exec "$CWD/bin/@CPACK_EXECUTABLE_NAME@" "$@" > /tmp/slicer.output 2>&1

View File

@ -0,0 +1,149 @@
#!/bin/sh
# Display usage
cpack_usage()
{
cat <<EOF
Usage: $0 [options]
Options: [defaults in brackets after descriptions]
--help print this message
--version print cmake installer version
--prefix=dir directory in which to install
--include-subdir include the @CPACK_PACKAGE_FILE_NAME@ subdirectory
--exclude-subdir exclude the @CPACK_PACKAGE_FILE_NAME@ subdirectory
--skip-license accept license
EOF
exit 1
}
cpack_echo_exit()
{
echo $1
exit 1
}
# Display version
cpack_version()
{
echo "@CPACK_PACKAGE_NAME@ Installer Version: @CPACK_PACKAGE_VERSION@, Copyright (c) @CPACK_PACKAGE_VENDOR@"
}
# Helper function to fix windows paths.
cpack_fix_slashes ()
{
echo "$1" | sed 's/\\/\//g'
}
interactive=TRUE
cpack_skip_license=FALSE
cpack_include_subdir=""
for a in "$@CPACK_AT_SIGN@"; do
if echo $a | grep "^--prefix=" > /dev/null 2> /dev/null; then
cpack_prefix_dir=`echo $a | sed "s/^--prefix=//"`
cpack_prefix_dir=`cpack_fix_slashes "${cpack_prefix_dir}"`
fi
if echo $a | grep "^--help" > /dev/null 2> /dev/null; then
cpack_usage
fi
if echo $a | grep "^--version" > /dev/null 2> /dev/null; then
cpack_version
exit 2
fi
if echo $a | grep "^--include-subdir" > /dev/null 2> /dev/null; then
cpack_include_subdir=TRUE
fi
if echo $a | grep "^--exclude-subdir" > /dev/null 2> /dev/null; then
cpack_include_subdir=FALSE
fi
if echo $a | grep "^--skip-license" > /dev/null 2> /dev/null; then
cpack_skip_license=TRUE
fi
done
if [ "x${cpack_include_subdir}x" != "xx" -o "x${cpack_skip_license}x" = "xTRUEx" ]
then
interactive=FALSE
fi
cpack_version
echo "This is a self-extracting archive."
toplevel="`pwd`"
if [ "x${cpack_prefix_dir}x" != "xx" ]
then
toplevel="${cpack_prefix_dir}"
fi
echo "The archive will be extracted to: ${toplevel}"
if [ "x${interactive}x" = "xTRUEx" ]
then
echo ""
echo "If you want to stop extracting, please press <ctrl-C>."
if [ "x${cpack_skip_license}x" != "xTRUEx" ]
then
more << '____cpack__here_doc____'
@CPACK_RESOURCE_FILE_LICENSE_CONTENT@
____cpack__here_doc____
echo
while true
do
echo "Do you accept the license? [yn]: "
read line leftover
case ${line} in
y* | Y*)
cpack_license_accepted=TRUE
break;;
n* | N* | q* | Q* | e* | E*)
echo "License not accepted. Exiting ..."
exit 1;;
esac
done
fi
if [ "x${cpack_include_subdir}x" = "xx" ]
then
echo "By default the @CPACK_PACKAGE_NAME@ will be installed in:"
echo " \"${toplevel}/@CPACK_PACKAGE_FILE_NAME@\""
echo "Do you want to include the subdirectory @CPACK_PACKAGE_FILE_NAME@?"
echo "Saying no will install in: \"${toplevel}\" [Yn]: "
read line leftover
cpack_include_subdir=TRUE
case ${line} in
n* | N*)
cpack_include_subdir=FALSE
esac
fi
fi
if [ "x${cpack_include_subdir}x" = "xTRUEx" ]
then
toplevel="${toplevel}/@CPACK_PACKAGE_FILE_NAME@"
mkdir -p "${toplevel}"
fi
echo
echo "Using target directory: ${toplevel}"
echo "Extracting, please wait..."
echo ""
# take the archive portion of this file and pipe it to tar
# the NUMERIC parameter in this command should be one more
# than the number of lines in this header file
# there are tails which don't understand the "-n" argument, e.g. on SunOS
# OTOH there are tails which complain when not using the "-n" argument (e.g. GNU)
# so at first try to tail some file to see if tail fails if used with "-n"
# if so, don't use "-n"
use_new_tail_syntax="-n"
tail $use_new_tail_syntax +1 "$0" > /dev/null 2> /dev/null || use_new_tail_syntax=""
extractor="pax -r"
command -v pax > /dev/null 2> /dev/null || extractor="tar xf -"
tail $use_new_tail_syntax +###CPACK_HEADER_LENGTH### "$0" | gunzip | (cd "${toplevel}" && ${extractor}) || cpack_echo_exit "Problem unpacking the @CPACK_PACKAGE_FILE_NAME@"
echo "Unpacking finished successfully"
exit 0
#-----------------------------------------------------------
# Start of TAR.GZ file
#-----------------------------------------------------------;

Binary file not shown.

After

Width:  |  Height:  |  Size: 43 KiB

View File

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<installer-gui-script minSpecVersion="1.0">
<title>@CPACK_PACKAGE_NAME@</title>
<welcome file="@CPACK_RESOURCE_FILE_WELCOME_NOPATH@"/>
<readme file="@CPACK_RESOURCE_FILE_README_NOPATH@"/>
<license file="@CPACK_RESOURCE_FILE_LICENSE_NOPATH@"/>
@CPACK_APPLE_PKG_INSTALLER_CONTENT@
</installer-gui-script>

View File

@ -0,0 +1,803 @@
# Distributed under the OSI-approved BSD 3-Clause License. See accompanying
# file Copyright.txt or https://cmake.org/licensing for details.
# CPack script for creating Debian package
# Author: Mathieu Malaterre
#
# http://wiki.debian.org/HowToPackageForDebian
if(CMAKE_BINARY_DIR)
message(FATAL_ERROR "CPackDeb.cmake may only be used by CPack internally.")
endif()
cmake_policy(PUSH)
cmake_policy(SET CMP0057 NEW) # if IN_LIST
function(cpack_deb_variable_fallback OUTPUT_VAR_NAME)
set(FALLBACK_VAR_NAMES ${ARGN})
foreach(variable_name IN LISTS FALLBACK_VAR_NAMES)
if(${variable_name})
set(${OUTPUT_VAR_NAME} "${${variable_name}}" PARENT_SCOPE)
break()
endif()
endforeach()
endfunction()
function(get_component_package_name var component)
string(TOUPPER "${component}" component_upcase)
if(CPACK_DEBIAN_${component_upcase}_PACKAGE_NAME)
string(TOLOWER "${CPACK_DEBIAN_${component_upcase}_PACKAGE_NAME}" package_name)
else()
string(TOLOWER "${CPACK_DEBIAN_PACKAGE_NAME}-${component}" package_name)
endif()
set("${var}" "${package_name}" PARENT_SCOPE)
endfunction()
#extract library name and version for given shared object
function(extract_so_info shared_object libname version)
if(CPACK_READELF_EXECUTABLE)
execute_process(COMMAND "${CPACK_READELF_EXECUTABLE}" -d "${shared_object}"
WORKING_DIRECTORY "${CPACK_TEMPORARY_DIRECTORY}"
RESULT_VARIABLE result
OUTPUT_VARIABLE output
ERROR_QUIET
OUTPUT_STRIP_TRAILING_WHITESPACE)
if(result EQUAL 0)
string(REGEX MATCH "\\(?SONAME\\)?[^\n]*\\[([^\n]+)\\.so\\.([^\n]*)\\]" soname "${output}")
set(${libname} "${CMAKE_MATCH_1}" PARENT_SCOPE)
set(${version} "${CMAKE_MATCH_2}" PARENT_SCOPE)
else()
message(WARNING "Error running readelf for \"${shared_object}\"")
endif()
else()
message(FATAL_ERROR "Readelf utility is not available.")
endif()
endfunction()
function(cpack_deb_check_description SUMMARY LINES RESULT_VARIABLE)
set(_result TRUE)
# Get the summary line
if(NOT SUMMARY MATCHES "^[^\\s].*$")
set(_result FALSE)
set(${RESULT_VARIABLE} ${_result} PARENT_SCOPE)
return()
endif()
foreach(_line IN LISTS LINES)
if(NOT _line MATCHES "^ +[^ ]+.*$")
set(_result FALSE)
break()
endif()
endforeach()
set(${RESULT_VARIABLE} ${_result} PARENT_SCOPE)
endfunction()
function(cpack_deb_format_package_description TEXT OUTPUT_VAR)
# Turn the possible multi-line string into a list
string(UUID uuid NAMESPACE 00000000-0000-0000-0000-000000000000 TYPE SHA1)
string(REPLACE ";" "${uuid}" _text "${TEXT}")
string(REPLACE "\n" ";" _lines "${_text}")
list(POP_FRONT _lines _summary)
# If the description ends with a newline (e.g. typically if it was read
# from a file) the last line will be empty. We drop it here, otherwise
# it would be replaced by a `.` which would lead to the package violating
# the extended-description-contains-empty-paragraph debian policy
list(POP_BACK _lines _last_line)
string(STRIP "${_last_line}" _last_line_strip)
if(_last_line_strip)
list(APPEND _lines "${_last_line_strip}")
endif()
# Check if reformatting required
cpack_deb_check_description("${_summary}" "${_lines}" _result)
if(_result)
# Ok, no formatting required
set(${OUTPUT_VAR} "${TEXT}" PARENT_SCOPE)
return()
endif()
# Format the summary line
string(STRIP "${_summary}" _summary)
# Make sure the rest formatted properly
set(_result)
foreach(_line IN LISTS _lines)
string(STRIP "${_line}" _line_strip)
if(NOT _line_strip)
# Replace empty lines w/ a _single full stop character_
set(_line " .")
else()
# Prepend the normal lines w/ a single space.
# If the line already starts w/ at least one space,
# it'll become _verbatim_ (assuming it supposed to be
# verbatim in the original text).
string(PREPEND _line " ")
endif()
list(APPEND _result "${_line}")
endforeach()
list(PREPEND _result "${_summary}")
list(JOIN _result "\n" _result)
string(REPLACE "${uuid}" ";" _result "${_result}")
set(${OUTPUT_VAR} "${_result}" PARENT_SCOPE)
endfunction()
function(cpack_deb_prepare_package_vars)
# CPACK_DEBIAN_PACKAGE_SHLIBDEPS
# If specify OFF, only user depends are used
if(NOT DEFINED CPACK_DEBIAN_PACKAGE_SHLIBDEPS)
set(CPACK_DEBIAN_PACKAGE_SHLIBDEPS OFF)
endif()
set(WDIR "${CPACK_TOPLEVEL_DIRECTORY}/${CPACK_PACKAGE_FILE_NAME}${CPACK_DEB_PACKAGE_COMPONENT_PART_PATH}")
set(DBGSYMDIR "${CPACK_TOPLEVEL_DIRECTORY}/${CPACK_PACKAGE_FILE_NAME}${CPACK_DEB_PACKAGE_COMPONENT_PART_PATH}-dbgsym")
file(REMOVE_RECURSE "${DBGSYMDIR}")
# per component automatic discover: some of the component might not have
# binaries.
if(CPACK_DEB_PACKAGE_COMPONENT)
string(TOUPPER "${CPACK_DEB_PACKAGE_COMPONENT}" _local_component_name)
set(_component_shlibdeps_var "CPACK_DEBIAN_${_local_component_name}_PACKAGE_SHLIBDEPS")
# if set, overrides the global configuration
if(DEFINED ${_component_shlibdeps_var})
set(CPACK_DEBIAN_PACKAGE_SHLIBDEPS "${${_component_shlibdeps_var}}")
if(CPACK_DEBIAN_PACKAGE_DEBUG)
message("CPackDeb Debug: component '${CPACK_DEB_PACKAGE_COMPONENT}' dpkg-shlibdeps set to ${CPACK_DEBIAN_PACKAGE_SHLIBDEPS}")
endif()
endif()
endif()
cpack_deb_variable_fallback("CPACK_DEBIAN_DEBUGINFO_PACKAGE"
"CPACK_DEBIAN_${_local_component_name}_DEBUGINFO_PACKAGE"
"CPACK_DEBIAN_DEBUGINFO_PACKAGE")
if(CPACK_DEBIAN_PACKAGE_SHLIBDEPS OR CPACK_DEBIAN_PACKAGE_GENERATE_SHLIBS OR CPACK_DEBIAN_DEBUGINFO_PACKAGE)
# Generating binary list - Get type of all install files
file(GLOB_RECURSE FILE_PATHS_ LIST_DIRECTORIES false RELATIVE "${WDIR}" "${WDIR}/*")
find_program(FILE_EXECUTABLE file)
if(NOT FILE_EXECUTABLE)
message(FATAL_ERROR "CPackDeb: file utility is not available. CPACK_DEBIAN_PACKAGE_SHLIBDEPS and CPACK_DEBIAN_PACKAGE_GENERATE_SHLIBS options are not available.")
endif()
# get file info so that we can determine if file is executable or not
unset(CPACK_DEB_INSTALL_FILES)
foreach(FILE_ IN LISTS FILE_PATHS_)
execute_process(COMMAND ${CMAKE_COMMAND} -E env LC_ALL=C ${FILE_EXECUTABLE} "./${FILE_}"
WORKING_DIRECTORY "${WDIR}"
RESULT_VARIABLE FILE_RESULT_
OUTPUT_VARIABLE INSTALL_FILE_)
if(NOT FILE_RESULT_ EQUAL 0)
message(FATAL_ERROR "CPackDeb: execution of command: '${FILE_EXECUTABLE} ./${FILE_}' failed with exit code: ${FILE_RESULT_}")
endif()
list(APPEND CPACK_DEB_INSTALL_FILES "${INSTALL_FILE_}")
endforeach()
# Only dynamically linked ELF files are included
# Extract only file name infront of ":"
foreach(_FILE IN LISTS CPACK_DEB_INSTALL_FILES)
if(_FILE MATCHES "ELF.*dynamically linked")
string(REGEX MATCH "(^.*):" _FILE_NAME "${_FILE}")
list(APPEND CPACK_DEB_BINARY_FILES "${CMAKE_MATCH_1}")
set(CONTAINS_EXECUTABLE_FILES_ TRUE)
endif()
if(_FILE MATCHES "ELF.*shared object")
string(REGEX MATCH "(^.*):" _FILE_NAME "${_FILE}")
list(APPEND CPACK_DEB_SHARED_OBJECT_FILES "${CMAKE_MATCH_1}")
endif()
if(_FILE MATCHES "ELF.*not stripped")
string(REGEX MATCH "(^.*):" _FILE_NAME "${_FILE}")
list(APPEND CPACK_DEB_UNSTRIPPED_FILES "${CMAKE_MATCH_1}")
endif()
endforeach()
endif()
find_program(CPACK_READELF_EXECUTABLE NAMES readelf)
if(CPACK_DEBIAN_DEBUGINFO_PACKAGE AND CPACK_DEB_UNSTRIPPED_FILES)
find_program(CPACK_OBJCOPY_EXECUTABLE NAMES objcopy)
if(NOT CPACK_OBJCOPY_EXECUTABLE)
message(FATAL_ERROR "debuginfo packages require the objcopy tool")
endif()
if(NOT CPACK_READELF_EXECUTABLE)
message(FATAL_ERROR "debuginfo packages require the readelf tool")
endif()
file(RELATIVE_PATH _DBGSYM_ROOT "${CPACK_TEMPORARY_DIRECTORY}" "${DBGSYMDIR}")
foreach(_FILE IN LISTS CPACK_DEB_UNSTRIPPED_FILES)
# Get the file's Build ID
execute_process(COMMAND env LC_ALL=C ${CPACK_READELF_EXECUTABLE} -n "${_FILE}"
WORKING_DIRECTORY "${CPACK_TEMPORARY_DIRECTORY}"
OUTPUT_VARIABLE READELF_OUTPUT
RESULT_VARIABLE READELF_RESULT
ERROR_VARIABLE READELF_ERROR
OUTPUT_STRIP_TRAILING_WHITESPACE )
if(NOT READELF_RESULT EQUAL 0)
message(FATAL_ERROR "CPackDeb: readelf: '${READELF_ERROR}';\n"
"executed command: '${CPACK_READELF_EXECUTABLE} -n ${_FILE}'")
endif()
if(READELF_OUTPUT MATCHES "Build ID: ([0-9a-zA-Z][0-9a-zA-Z])([0-9a-zA-Z]*)")
set(_BUILD_ID_START ${CMAKE_MATCH_1})
set(_BUILD_ID_REMAINING ${CMAKE_MATCH_2})
list(APPEND BUILD_IDS ${_BUILD_ID_START}${_BUILD_ID_REMAINING})
else()
message(FATAL_ERROR "Unable to determine Build ID for ${_FILE}")
endif()
# Split out the debug symbols from the binaries
set(_FILE_DBGSYM ${_DBGSYM_ROOT}/usr/lib/debug/.build-id/${_BUILD_ID_START}/${_BUILD_ID_REMAINING}.debug)
get_filename_component(_OUT_DIR "${_FILE_DBGSYM}" DIRECTORY)
file(MAKE_DIRECTORY "${CPACK_TEMPORARY_DIRECTORY}/${_OUT_DIR}")
execute_process(COMMAND ${CPACK_OBJCOPY_EXECUTABLE} --only-keep-debug "${_FILE}" "${_FILE_DBGSYM}"
WORKING_DIRECTORY "${CPACK_TEMPORARY_DIRECTORY}"
OUTPUT_VARIABLE OBJCOPY_OUTPUT
RESULT_VARIABLE OBJCOPY_RESULT
ERROR_VARIABLE OBJCOPY_ERROR
OUTPUT_STRIP_TRAILING_WHITESPACE )
if(NOT OBJCOPY_RESULT EQUAL 0)
message(FATAL_ERROR "CPackDeb: objcopy: '${OBJCOPY_ERROR}';\n"
"executed command: '${CPACK_OBJCOPY_EXECUTABLE} --only-keep-debug ${_FILE} ${_FILE_DBGSYM}'")
endif()
execute_process(COMMAND ${CPACK_OBJCOPY_EXECUTABLE} --strip-unneeded ${_FILE}
WORKING_DIRECTORY "${CPACK_TEMPORARY_DIRECTORY}"
OUTPUT_VARIABLE OBJCOPY_OUTPUT
RESULT_VARIABLE OBJCOPY_RESULT
ERROR_VARIABLE OBJCOPY_ERROR
OUTPUT_STRIP_TRAILING_WHITESPACE )
if(NOT OBJCOPY_RESULT EQUAL 0)
message(FATAL_ERROR "CPackDeb: objcopy: '${OBJCOPY_ERROR}';\n"
"executed command: '${CPACK_OBJCOPY_EXECUTABLE} --strip-debug ${_FILE}'")
endif()
execute_process(COMMAND ${CPACK_OBJCOPY_EXECUTABLE} --add-gnu-debuglink=${_FILE_DBGSYM} ${_FILE}
WORKING_DIRECTORY "${CPACK_TEMPORARY_DIRECTORY}"
OUTPUT_VARIABLE OBJCOPY_OUTPUT
RESULT_VARIABLE OBJCOPY_RESULT
ERROR_VARIABLE OBJCOPY_ERROR
OUTPUT_STRIP_TRAILING_WHITESPACE )
if(NOT OBJCOPY_RESULT EQUAL 0)
message(FATAL_ERROR "CPackDeb: objcopy: '${OBJCOPY_ERROR}';\n"
"executed command: '${CPACK_OBJCOPY_EXECUTABLE} --add-gnu-debuglink=${_FILE_DBGSYM} ${_FILE}'")
endif()
endforeach()
endif()
if(CPACK_DEBIAN_PACKAGE_SHLIBDEPS)
# dpkg-shlibdeps is a Debian utility for generating dependency list
find_program(SHLIBDEPS_EXECUTABLE dpkg-shlibdeps)
if(SHLIBDEPS_EXECUTABLE)
# Check version of the dpkg-shlibdeps tool using CPackDEB method
execute_process(COMMAND ${CMAKE_COMMAND} -E env LC_ALL=C ${SHLIBDEPS_EXECUTABLE} --version
OUTPUT_VARIABLE _TMP_VERSION
ERROR_QUIET
OUTPUT_STRIP_TRAILING_WHITESPACE)
if(_TMP_VERSION MATCHES "dpkg-shlibdeps version ([0-9]+\\.[0-9]+\\.[0-9]+)")
set(SHLIBDEPS_EXECUTABLE_VERSION "${CMAKE_MATCH_1}")
else()
unset(SHLIBDEPS_EXECUTABLE_VERSION)
endif()
if(CPACK_DEBIAN_PACKAGE_DEBUG)
message("CPackDeb Debug: dpkg-shlibdeps --version output is '${_TMP_VERSION}'")
message("CPackDeb Debug: dpkg-shlibdeps version is <${SHLIBDEPS_EXECUTABLE_VERSION}>")
endif()
if(CONTAINS_EXECUTABLE_FILES_)
message("CPackDeb: - Generating dependency list")
# Create blank control file for running dpkg-shlibdeps
# There might be some other way to invoke dpkg-shlibdeps without creating this file
# but standard debian package should not have anything that can collide with this file or directory
file(MAKE_DIRECTORY ${CPACK_TEMPORARY_DIRECTORY}/debian)
file(WRITE ${CPACK_TEMPORARY_DIRECTORY}/debian/control "")
# Create a DEBIAN directory so that dpkg-shlibdeps can find the package dir when resolving $ORIGIN.
file(MAKE_DIRECTORY "${CPACK_TEMPORARY_DIRECTORY}/DEBIAN")
# Add --ignore-missing-info if the tool supports it
execute_process(COMMAND ${CMAKE_COMMAND} -E env LC_ALL=C ${SHLIBDEPS_EXECUTABLE} --help
OUTPUT_VARIABLE _TMP_HELP
ERROR_QUIET
OUTPUT_STRIP_TRAILING_WHITESPACE)
if(_TMP_HELP MATCHES "--ignore-missing-info")
set(IGNORE_MISSING_INFO_FLAG "--ignore-missing-info")
endif()
if(CPACK_DEBIAN_PACKAGE_SHLIBDEPS_PRIVATE_DIRS)
unset(PRIVATE_SEARCH_DIR_OPTIONS)
# Add -l option if the tool supports it
if(DEFINED SHLIBDEPS_EXECUTABLE_VERSION AND SHLIBDEPS_EXECUTABLE_VERSION VERSION_GREATER_EQUAL 1.17.0)
foreach(dir IN LISTS CPACK_DEBIAN_PACKAGE_SHLIBDEPS_PRIVATE_DIRS)
list(APPEND PRIVATE_SEARCH_DIR_OPTIONS "-l${dir}")
endforeach()
else()
message(WARNING "CPackDeb: dkpg-shlibdeps is too old. \"CPACK_DEBIAN_PACKAGE_SHLIBDEPS_PRIVATE_DIRS\" is therefore ignored.")
endif()
endif()
# Execute dpkg-shlibdeps
# --ignore-missing-info : allow dpkg-shlibdeps to run even if some libs do not belong to a package
# -l<dir>: make dpkg-shlibdeps also search in this directory for (private) shared library dependencies
# -O : print to STDOUT
execute_process(COMMAND ${SHLIBDEPS_EXECUTABLE} ${PRIVATE_SEARCH_DIR_OPTIONS} ${IGNORE_MISSING_INFO_FLAG} -O ${CPACK_DEB_BINARY_FILES}
WORKING_DIRECTORY "${CPACK_TEMPORARY_DIRECTORY}"
OUTPUT_VARIABLE SHLIBDEPS_OUTPUT
RESULT_VARIABLE SHLIBDEPS_RESULT
ERROR_VARIABLE SHLIBDEPS_ERROR
OUTPUT_STRIP_TRAILING_WHITESPACE )
# E2K OSL 6.0.1 and prior has broken dpkg-shlibdeps. CPack will deal with that (mocking SHLIBDEPS_OUTPUT), but inform user of this.
if("${SHLIBDEPS_ERROR}" MATCHES "unknown gcc system type e2k.*, falling back to default")
message(WARNING "CPackDeb: broken dpkg-shlibdeps on E2K detected, will fall back to minimal dependencies.\n"
"You should expect that dependencies list in the package will be incomplete.")
set(SHLIBDEPS_OUTPUT "shlibs:Depends=libc6, lcc-libs")
endif()
if(CPACK_DEBIAN_PACKAGE_DEBUG)
# dpkg-shlibdeps will throw some warnings if some input files are not binary
message( "CPackDeb Debug: dpkg-shlibdeps warnings \n${SHLIBDEPS_ERROR}")
endif()
if(NOT SHLIBDEPS_RESULT EQUAL 0)
message(FATAL_ERROR "CPackDeb: dpkg-shlibdeps: '${SHLIBDEPS_ERROR}';\n"
"executed command: '${SHLIBDEPS_EXECUTABLE} ${PRIVATE_SEARCH_DIR_OPTIONS} ${IGNORE_MISSING_INFO_FLAG} -O ${CPACK_DEB_BINARY_FILES}';\n"
"found files: '${INSTALL_FILE_}';\n"
"files info: '${CPACK_DEB_INSTALL_FILES}';\n"
"binary files: '${CPACK_DEB_BINARY_FILES}'")
endif()
#Get rid of prefix generated by dpkg-shlibdeps
string(REGEX REPLACE "^.*Depends=" "" CPACK_DEBIAN_PACKAGE_AUTO_DEPENDS "${SHLIBDEPS_OUTPUT}")
if(CPACK_DEBIAN_PACKAGE_DEBUG)
message("CPackDeb Debug: Found dependency: ${CPACK_DEBIAN_PACKAGE_AUTO_DEPENDS} from output ${SHLIBDEPS_OUTPUT}")
endif()
# Remove blank control file
# Might not be safe if package actual contain file or directory named debian
file(REMOVE_RECURSE "${CPACK_TEMPORARY_DIRECTORY}/debian")
# remove temporary directory that was created only for dpkg-shlibdeps execution
file(REMOVE_RECURSE "${CPACK_TEMPORARY_DIRECTORY}/DEBIAN")
else()
if(CPACK_DEBIAN_PACKAGE_DEBUG)
message(AUTHOR_WARNING "CPackDeb Debug: Using only user-provided depends because package does not contain executable files that link to shared libraries.")
endif()
endif()
else()
message("CPackDeb: Using only user-provided dependencies because dpkg-shlibdeps is not found.")
endif()
else()
if(CPACK_DEBIAN_PACKAGE_DEBUG)
message("CPackDeb Debug: Using only user-provided dependencies")
endif()
endif()
# Let's define the control file found in debian package:
# Binary package:
# http://www.debian.org/doc/debian-policy/ch-controlfields.html#s-binarycontrolfiles
# DEBIAN/control
# debian policy enforce lower case for package name
# Package: (mandatory)
if(NOT CPACK_DEBIAN_PACKAGE_NAME)
string(TOLOWER "${CPACK_PACKAGE_NAME}" CPACK_DEBIAN_PACKAGE_NAME)
endif()
# Version: (mandatory)
if(NOT CPACK_DEBIAN_PACKAGE_VERSION)
if(NOT CPACK_PACKAGE_VERSION)
message(FATAL_ERROR "CPackDeb: Debian package requires a package version")
endif()
set(CPACK_DEBIAN_PACKAGE_VERSION ${CPACK_PACKAGE_VERSION})
endif()
if(DEFINED CPACK_DEBIAN_PACKAGE_RELEASE OR DEFINED CPACK_DEBIAN_PACKAGE_EPOCH)
# only test the version format if CPACK_DEBIAN_PACKAGE_RELEASE or
# CPACK_DEBIAN_PACKAGE_EPOCH is set
if(NOT CPACK_DEBIAN_PACKAGE_VERSION MATCHES "^[0-9][A-Za-z0-9.+~-]*$")
message(FATAL_ERROR
"CPackDeb: Debian package version must confirm to \"^[0-9][A-Za-z0-9.+~-]*$\" regex!")
endif()
else()
# before CMake 3.10 version format was not tested so only warn to preserve
# backward compatibility
if(NOT CPACK_DEBIAN_PACKAGE_VERSION MATCHES "^([0-9]+:)?[0-9][A-Za-z0-9.+~-]*$")
message(AUTHOR_WARNING
"CPackDeb: Debian package versioning ([<epoch>:]<version>[-<release>])"
" should confirm to \"^([0-9]+:)?[0-9][A-Za-z0-9.+~-]*$\" regex in"
" order to satisfy Debian packaging rules.")
endif()
endif()
if(CPACK_DEBIAN_PACKAGE_RELEASE)
if(NOT CPACK_DEBIAN_PACKAGE_RELEASE MATCHES "^[A-Za-z0-9.+~]+$")
message(FATAL_ERROR
"CPackDeb: Debian package release must confirm to \"^[A-Za-z0-9.+~]+$\" regex!")
endif()
string(APPEND CPACK_DEBIAN_PACKAGE_VERSION
"-${CPACK_DEBIAN_PACKAGE_RELEASE}")
elseif(DEFINED CPACK_DEBIAN_PACKAGE_EPOCH)
# only test the version format if CPACK_DEBIAN_PACKAGE_RELEASE or
# CPACK_DEBIAN_PACKAGE_EPOCH is set - versions CPack/Deb generator before
# CMake 3.10 did not check for version format so we have to preserve
# backward compatibility
if(CPACK_DEBIAN_PACKAGE_VERSION MATCHES ".*-.*")
message(FATAL_ERROR
"CPackDeb: Debian package version must not contain hyphens when CPACK_DEBIAN_PACKAGE_RELEASE is not provided!")
endif()
endif()
if(CPACK_DEBIAN_PACKAGE_EPOCH)
if(NOT CPACK_DEBIAN_PACKAGE_EPOCH MATCHES "^[0-9]+$")
message(FATAL_ERROR
"CPackDeb: Debian package epoch must confirm to \"^[0-9]+$\" regex!")
endif()
set(CPACK_DEBIAN_PACKAGE_VERSION
"${CPACK_DEBIAN_PACKAGE_EPOCH}:${CPACK_DEBIAN_PACKAGE_VERSION}")
endif()
# Architecture: (mandatory)
if(CPACK_DEB_PACKAGE_COMPONENT AND CPACK_DEBIAN_${_local_component_name}_PACKAGE_ARCHITECTURE)
set(CPACK_DEBIAN_PACKAGE_ARCHITECTURE "${CPACK_DEBIAN_${_local_component_name}_PACKAGE_ARCHITECTURE}")
elseif(NOT CPACK_DEBIAN_PACKAGE_ARCHITECTURE)
# There is no such thing as i686 architecture on debian, you should use i386 instead
# $ dpkg --print-architecture
find_program(DPKG_CMD dpkg)
if(NOT DPKG_CMD)
message(STATUS "CPackDeb: Can not find dpkg in your path, default to i386.")
set(CPACK_DEBIAN_PACKAGE_ARCHITECTURE i386)
endif()
execute_process(COMMAND "${DPKG_CMD}" --print-architecture
OUTPUT_VARIABLE CPACK_DEBIAN_PACKAGE_ARCHITECTURE
OUTPUT_STRIP_TRAILING_WHITESPACE
)
endif()
# Source: (optional)
# in case several packages are constructed from a unique source
# (multipackaging), the source may be indicated as well.
# The source might contain a version if the generated package
# version is different from the source version
if(NOT CPACK_DEBIAN_PACKAGE_SOURCE)
set(CPACK_DEBIAN_PACKAGE_SOURCE "")
endif()
# have a look at get_property(result GLOBAL PROPERTY ENABLED_FEATURES),
# this returns the successful find_package() calls, maybe this can help
# Depends:
# You should set: DEBIAN_PACKAGE_DEPENDS
# TODO: automate 'objdump -p | grep NEEDED'
# if per-component variable, overrides the global CPACK_DEBIAN_PACKAGE_${variable_type_}
# automatic dependency discovery will be performed afterwards.
if(CPACK_DEB_PACKAGE_COMPONENT)
foreach(value_type_ IN ITEMS DEPENDS RECOMMENDS SUGGESTS PREDEPENDS ENHANCES BREAKS CONFLICTS PROVIDES REPLACES SOURCE SECTION PRIORITY NAME)
set(_component_var "CPACK_DEBIAN_${_local_component_name}_PACKAGE_${value_type_}")
# if set, overrides the global variable
if(DEFINED ${_component_var})
set(CPACK_DEBIAN_PACKAGE_${value_type_} "${${_component_var}}")
if(CPACK_DEBIAN_PACKAGE_DEBUG)
message("CPackDeb Debug: component '${_local_component_name}' ${value_type_} "
"value set to '${CPACK_DEBIAN_PACKAGE_${value_type_}}'")
endif()
endif()
endforeach()
if(CPACK_DEBIAN_ENABLE_COMPONENT_DEPENDS)
unset(COMPONENT_DEPENDS)
foreach(_PACK IN LISTS CPACK_COMPONENT_${_local_component_name}_DEPENDS)
get_component_package_name(_PACK_NAME "${_PACK}")
list(PREPEND COMPONENT_DEPENDS "${_PACK_NAME} (= ${CPACK_DEBIAN_PACKAGE_VERSION})")
endforeach()
list(JOIN COMPONENT_DEPENDS ", " COMPONENT_DEPENDS)
if(COMPONENT_DEPENDS)
list(PREPEND CPACK_DEBIAN_PACKAGE_DEPENDS ${COMPONENT_DEPENDS})
list(JOIN CPACK_DEBIAN_PACKAGE_DEPENDS ", " CPACK_DEBIAN_PACKAGE_DEPENDS)
endif()
endif()
endif()
# at this point, the CPACK_DEBIAN_PACKAGE_DEPENDS is properly set
# to the minimal dependency of the package
# Append automatically discovered dependencies .
if(CPACK_DEBIAN_PACKAGE_AUTO_DEPENDS)
list(APPEND CPACK_DEBIAN_PACKAGE_DEPENDS ${CPACK_DEBIAN_PACKAGE_AUTO_DEPENDS})
list(JOIN CPACK_DEBIAN_PACKAGE_DEPENDS ", " CPACK_DEBIAN_PACKAGE_DEPENDS)
endif()
if(NOT CPACK_DEBIAN_PACKAGE_DEPENDS)
message(STATUS "CPACK_DEBIAN_PACKAGE_DEPENDS not set, the package will have no dependencies.")
endif()
# Maintainer: (mandatory)
if(NOT CPACK_DEBIAN_PACKAGE_MAINTAINER)
if(NOT CPACK_PACKAGE_CONTACT)
message(FATAL_ERROR "CPackDeb: Debian package requires a maintainer for a package, set CPACK_PACKAGE_CONTACT or CPACK_DEBIAN_PACKAGE_MAINTAINER")
endif()
set(CPACK_DEBIAN_PACKAGE_MAINTAINER ${CPACK_PACKAGE_CONTACT})
endif()
# Description: (mandatory)
# Try package description first
if(CPACK_USED_DEFAULT_PACKAGE_DESCRIPTION_FILE)
set(_desc_fallback)
else()
set(_desc_fallback "CPACK_PACKAGE_DESCRIPTION")
endif()
if(CPACK_DEB_PACKAGE_COMPONENT)
cpack_deb_variable_fallback("CPACK_DEBIAN_PACKAGE_DESCRIPTION"
"CPACK_DEBIAN_${_local_component_name}_DESCRIPTION"
"CPACK_COMPONENT_${_local_component_name}_DESCRIPTION")
else()
cpack_deb_variable_fallback("CPACK_DEBIAN_PACKAGE_DESCRIPTION"
"CPACK_DEBIAN_PACKAGE_DESCRIPTION"
${_desc_fallback})
endif()
# Still no description? ... and description file has set ...
if(NOT CPACK_DEBIAN_PACKAGE_DESCRIPTION
AND CPACK_PACKAGE_DESCRIPTION_FILE
AND NOT CPACK_PACKAGE_DESCRIPTION_FILE STREQUAL CPACK_DEFAULT_PACKAGE_DESCRIPTION_FILE)
# Read `CPACK_PACKAGE_DESCRIPTION_FILE` then...
file(READ ${CPACK_PACKAGE_DESCRIPTION_FILE} CPACK_DEBIAN_PACKAGE_DESCRIPTION)
endif()
# Still no description? #2
if(NOT CPACK_DEBIAN_PACKAGE_DESCRIPTION)
# Try to get `CPACK_PACKAGE_DESCRIPTION_SUMMARY` as the last hope
if(CPACK_PACKAGE_DESCRIPTION_SUMMARY)
set(CPACK_DEBIAN_PACKAGE_DESCRIPTION ${CPACK_PACKAGE_DESCRIPTION_SUMMARY})
else()
# Giving up! Report an error...
set(_description_failure_message
"CPackDeb: Debian package requires a summary for a package, set CPACK_PACKAGE_DESCRIPTION_SUMMARY or CPACK_DEBIAN_PACKAGE_DESCRIPTION")
if(CPACK_DEB_PACKAGE_COMPONENT)
string(APPEND _description_failure_message
" or CPACK_DEBIAN_${_local_component_name}_DESCRIPTION")
endif()
message(FATAL_ERROR "${_description_failure_message}")
endif()
# Ok, description has set. According to the `Debian Policy Manual`_ the first
# line is a package summary. Try to get it as well...
# See also: https://www.debian.org/doc/debian-policy/ch-controlfields.html#description
elseif(CPACK_PACKAGE_DESCRIPTION_SUMMARY AND
NOT CPACK_PACKAGE_DESCRIPTION_SUMMARY STREQUAL CPACK_DEFAULT_PACKAGE_DESCRIPTION_SUMMARY)
# Merge summary w/ the detailed description
string(PREPEND CPACK_DEBIAN_PACKAGE_DESCRIPTION "${CPACK_PACKAGE_DESCRIPTION_SUMMARY}\n")
endif()
# assert(CPACK_DEBIAN_PACKAGE_DESCRIPTION)
# Make sure description is properly formatted
cpack_deb_format_package_description(
"${CPACK_DEBIAN_PACKAGE_DESCRIPTION}"
CPACK_DEBIAN_PACKAGE_DESCRIPTION
)
# Homepage: (optional)
if(NOT CPACK_DEBIAN_PACKAGE_HOMEPAGE AND CPACK_PACKAGE_HOMEPAGE_URL)
set(CPACK_DEBIAN_PACKAGE_HOMEPAGE "${CPACK_PACKAGE_HOMEPAGE_URL}")
endif()
# Section: (recommended)
if(NOT CPACK_DEBIAN_PACKAGE_SECTION)
set(CPACK_DEBIAN_PACKAGE_SECTION "devel")
endif()
# Priority: (recommended)
if(NOT CPACK_DEBIAN_PACKAGE_PRIORITY)
set(CPACK_DEBIAN_PACKAGE_PRIORITY "optional")
endif()
if(CPACK_DEBIAN_ARCHIVE_TYPE)
if(CPACK_DEBIAN_ARCHIVE_TYPE STREQUAL "paxr")
message(DEPRECATION "CPACK_DEBIAN_ARCHIVE_TYPE set to old and invalid "
"type 'paxr', mapping to 'gnutar'")
set(CPACK_DEBIAN_ARCHIVE_TYPE "gnutar")
elseif(NOT CPACK_DEBIAN_ARCHIVE_TYPE STREQUAL "gnutar")
message(FATAL_ERROR "CPACK_DEBIAN_ARCHIVE_TYPE set to unsupported"
"type ${CPACK_DEBIAN_ARCHIVE_TYPE}")
endif()
else()
set(CPACK_DEBIAN_ARCHIVE_TYPE "gnutar")
endif()
# Compression: (recommended)
if(NOT CPACK_DEBIAN_COMPRESSION_TYPE)
set(CPACK_DEBIAN_COMPRESSION_TYPE "gzip")
endif()
# Recommends:
# You should set: CPACK_DEBIAN_PACKAGE_RECOMMENDS
# Suggests:
# You should set: CPACK_DEBIAN_PACKAGE_SUGGESTS
# CPACK_DEBIAN_PACKAGE_CONTROL_EXTRA
# This variable allow advanced user to add custom script to the control.tar.gz (inside the .deb archive)
# Typical examples are:
# - conffiles
# - postinst
# - postrm
# - prerm
# Usage:
# set(CPACK_DEBIAN_PACKAGE_CONTROL_EXTRA
# "${CMAKE_CURRENT_SOURCE_DIR}/prerm;${CMAKE_CURRENT_SOURCE_DIR}/postrm")
# Are we packaging components ?
if(CPACK_DEB_PACKAGE_COMPONENT)
# override values with per component version if set
foreach(VAR_NAME_ IN ITEMS PACKAGE_CONTROL_EXTRA PACKAGE_CONTROL_STRICT_PERMISSION)
if(CPACK_DEBIAN_${_local_component_name}_${VAR_NAME_})
set(CPACK_DEBIAN_${VAR_NAME_} "${CPACK_DEBIAN_${_local_component_name}_${VAR_NAME_}}")
endif()
endforeach()
get_component_package_name(CPACK_DEBIAN_PACKAGE_NAME ${_local_component_name})
endif()
if(NOT CPACK_DEBIAN_PACKAGE_GENERATE_SHLIBS_POLICY)
set(CPACK_DEBIAN_PACKAGE_GENERATE_SHLIBS_POLICY "=")
endif()
unset(CPACK_DEBIAN_PACKAGE_SHLIBS_LIST)
if(CPACK_DEBIAN_PACKAGE_GENERATE_SHLIBS)
if(CPACK_READELF_EXECUTABLE)
foreach(_FILE IN LISTS CPACK_DEB_SHARED_OBJECT_FILES)
extract_so_info("${_FILE}" libname soversion)
if(libname AND DEFINED soversion)
list(APPEND CPACK_DEBIAN_PACKAGE_SHLIBS_LIST
"${libname} ${soversion} ${CPACK_DEBIAN_PACKAGE_NAME} (${CPACK_DEBIAN_PACKAGE_GENERATE_SHLIBS_POLICY} ${CPACK_DEBIAN_PACKAGE_VERSION})")
else()
message(AUTHOR_WARNING "Shared library '${_FILE}' is missing soname or soversion. Library will not be added to DEBIAN/shlibs control file.")
endif()
endforeach()
list(JOIN CPACK_DEBIAN_PACKAGE_SHLIBS_LIST "\n" CPACK_DEBIAN_PACKAGE_SHLIBS_LIST)
else()
message(FATAL_ERROR "Readelf utility is not available. CPACK_DEBIAN_PACKAGE_GENERATE_SHLIBS option is not available.")
endif()
endif()
# add ldconfig call in default postrm and postint
set(CPACK_ADD_LDCONFIG_CALL 0)
# all files in CPACK_DEB_SHARED_OBJECT_FILES have dot at the beginning
set(_LDCONF_DEFAULTS "./lib" "./usr/lib")
foreach(_FILE IN LISTS CPACK_DEB_SHARED_OBJECT_FILES)
get_filename_component(_DIR ${_FILE} DIRECTORY)
get_filename_component(_PARENT_DIR ${_DIR} DIRECTORY)
if(_DIR IN_LIST _LDCONF_DEFAULTS OR _PARENT_DIR IN_LIST _LDCONF_DEFAULTS)
set(CPACK_ADD_LDCONFIG_CALL 1)
endif()
endforeach()
if(CPACK_ADD_LDCONFIG_CALL)
set(CPACK_DEBIAN_GENERATE_POSTINST 1)
set(CPACK_DEBIAN_GENERATE_POSTRM 1)
foreach(f IN LISTS CPACK_DEBIAN_PACKAGE_CONTROL_EXTRA)
get_filename_component(n "${f}" NAME)
if(n STREQUAL "postinst")
set(CPACK_DEBIAN_GENERATE_POSTINST 0)
endif()
if(n STREQUAL "postrm")
set(CPACK_DEBIAN_GENERATE_POSTRM 0)
endif()
endforeach()
else()
set(CPACK_DEBIAN_GENERATE_POSTINST 0)
set(CPACK_DEBIAN_GENERATE_POSTRM 0)
endif()
cpack_deb_variable_fallback("CPACK_DEBIAN_FILE_NAME"
"CPACK_DEBIAN_${_local_component_name}_FILE_NAME"
"CPACK_DEBIAN_FILE_NAME")
if(CPACK_DEBIAN_FILE_NAME)
if(CPACK_DEBIAN_FILE_NAME STREQUAL "DEB-DEFAULT")
# Patch package file name to be in correct debian format:
# <foo>_<VersionNumber>-<DebianRevisionNumber>_<DebianArchitecture>.deb
set(CPACK_OUTPUT_FILE_NAME
"${CPACK_DEBIAN_PACKAGE_NAME}_${CPACK_DEBIAN_PACKAGE_VERSION}_${CPACK_DEBIAN_PACKAGE_ARCHITECTURE}.deb")
set(CPACK_DBGSYM_OUTPUT_FILE_NAME
"${CPACK_DEBIAN_PACKAGE_NAME}-dbgsym_${CPACK_DEBIAN_PACKAGE_VERSION}_${CPACK_DEBIAN_PACKAGE_ARCHITECTURE}.ddeb")
else()
if(NOT CPACK_DEBIAN_FILE_NAME MATCHES ".*\\.(deb|ipk)")
message(FATAL_ERROR "'${CPACK_DEBIAN_FILE_NAME}' is not a valid DEB package file name as it must end with '.deb' or '.ipk'!")
endif()
set(CPACK_OUTPUT_FILE_NAME "${CPACK_DEBIAN_FILE_NAME}")
string(REGEX REPLACE "\.deb$" "-dbgsym.ddeb" CPACK_DBGSYM_OUTPUT_FILE_NAME "${CPACK_DEBIAN_FILE_NAME}")
endif()
set(CPACK_TEMPORARY_PACKAGE_FILE_NAME "${CPACK_TOPLEVEL_DIRECTORY}/${CPACK_OUTPUT_FILE_NAME}")
get_filename_component(BINARY_DIR "${CPACK_OUTPUT_FILE_PATH}" DIRECTORY)
set(CPACK_OUTPUT_FILE_PATH "${BINARY_DIR}/${CPACK_OUTPUT_FILE_NAME}")
else()
# back compatibility - don't change the name
string(REGEX REPLACE "\.deb$" "-dbgsym.ddeb" CPACK_DBGSYM_OUTPUT_FILE_NAME "${CPACK_OUTPUT_FILE_NAME}")
endif()
# Print out some debug information if we were asked for that
if(CPACK_DEBIAN_PACKAGE_DEBUG)
message("CPackDeb:Debug: CPACK_TOPLEVEL_DIRECTORY = '${CPACK_TOPLEVEL_DIRECTORY}'")
message("CPackDeb:Debug: CPACK_TOPLEVEL_TAG = '${CPACK_TOPLEVEL_TAG}'")
message("CPackDeb:Debug: CPACK_TEMPORARY_DIRECTORY = '${CPACK_TEMPORARY_DIRECTORY}'")
message("CPackDeb:Debug: CPACK_OUTPUT_FILE_NAME = '${CPACK_OUTPUT_FILE_NAME}'")
message("CPackDeb:Debug: CPACK_OUTPUT_FILE_PATH = '${CPACK_OUTPUT_FILE_PATH}'")
message("CPackDeb:Debug: CPACK_PACKAGE_FILE_NAME = '${CPACK_PACKAGE_FILE_NAME}'")
message("CPackDeb:Debug: CPACK_PACKAGE_INSTALL_DIRECTORY = '${CPACK_PACKAGE_INSTALL_DIRECTORY}'")
message("CPackDeb:Debug: CPACK_TEMPORARY_PACKAGE_FILE_NAME = '${CPACK_TEMPORARY_PACKAGE_FILE_NAME}'")
message("CPackDeb:Debug: CPACK_DEBIAN_PACKAGE_CONTROL_STRICT_PERMISSION = '${CPACK_DEBIAN_PACKAGE_CONTROL_STRICT_PERMISSION}'")
message("CPackDeb:Debug: CPACK_DEBIAN_PACKAGE_SOURCE = '${CPACK_DEBIAN_PACKAGE_SOURCE}'")
endif()
# For debian source packages:
# debian/control
# http://www.debian.org/doc/debian-policy/ch-controlfields.html#s-sourcecontrolfiles
# .dsc
# http://www.debian.org/doc/debian-policy/ch-controlfields.html#s-debiansourcecontrolfiles
# Builds-Depends:
#if(NOT CPACK_DEBIAN_PACKAGE_BUILDS_DEPENDS)
# set(CPACK_DEBIAN_PACKAGE_BUILDS_DEPENDS
# "debhelper (>> 5.0.0), libncurses5-dev, tcl8.4"
# )
#endif()
# move variables to parent scope so that they may be used to create debian package
set(GEN_CPACK_OUTPUT_FILE_NAME "${CPACK_OUTPUT_FILE_NAME}" PARENT_SCOPE)
set(GEN_CPACK_TEMPORARY_PACKAGE_FILE_NAME "${CPACK_TEMPORARY_PACKAGE_FILE_NAME}" PARENT_SCOPE)
set(GEN_CPACK_DEBIAN_PACKAGE_NAME "${CPACK_DEBIAN_PACKAGE_NAME}" PARENT_SCOPE)
set(GEN_CPACK_DEBIAN_PACKAGE_VERSION "${CPACK_DEBIAN_PACKAGE_VERSION}" PARENT_SCOPE)
set(GEN_CPACK_DEBIAN_PACKAGE_SECTION "${CPACK_DEBIAN_PACKAGE_SECTION}" PARENT_SCOPE)
set(GEN_CPACK_DEBIAN_PACKAGE_PRIORITY "${CPACK_DEBIAN_PACKAGE_PRIORITY}" PARENT_SCOPE)
set(GEN_CPACK_DEBIAN_PACKAGE_ARCHITECTURE "${CPACK_DEBIAN_PACKAGE_ARCHITECTURE}" PARENT_SCOPE)
set(GEN_CPACK_DEBIAN_PACKAGE_MAINTAINER "${CPACK_DEBIAN_PACKAGE_MAINTAINER}" PARENT_SCOPE)
set(GEN_CPACK_DEBIAN_PACKAGE_DESCRIPTION "${CPACK_DEBIAN_PACKAGE_DESCRIPTION}" PARENT_SCOPE)
set(GEN_CPACK_DEBIAN_PACKAGE_DEPENDS "${CPACK_DEBIAN_PACKAGE_DEPENDS}" PARENT_SCOPE)
set(GEN_CPACK_DEBIAN_ARCHIVE_TYPE "${CPACK_DEBIAN_ARCHIVE_TYPE}" PARENT_SCOPE)
set(GEN_CPACK_DEBIAN_COMPRESSION_TYPE "${CPACK_DEBIAN_COMPRESSION_TYPE}" PARENT_SCOPE)
set(GEN_CPACK_DEBIAN_PACKAGE_RECOMMENDS "${CPACK_DEBIAN_PACKAGE_RECOMMENDS}" PARENT_SCOPE)
set(GEN_CPACK_DEBIAN_PACKAGE_SUGGESTS "${CPACK_DEBIAN_PACKAGE_SUGGESTS}" PARENT_SCOPE)
set(GEN_CPACK_DEBIAN_PACKAGE_HOMEPAGE "${CPACK_DEBIAN_PACKAGE_HOMEPAGE}" PARENT_SCOPE)
set(GEN_CPACK_DEBIAN_PACKAGE_PREDEPENDS "${CPACK_DEBIAN_PACKAGE_PREDEPENDS}" PARENT_SCOPE)
set(GEN_CPACK_DEBIAN_PACKAGE_ENHANCES "${CPACK_DEBIAN_PACKAGE_ENHANCES}" PARENT_SCOPE)
set(GEN_CPACK_DEBIAN_PACKAGE_BREAKS "${CPACK_DEBIAN_PACKAGE_BREAKS}" PARENT_SCOPE)
set(GEN_CPACK_DEBIAN_PACKAGE_CONFLICTS "${CPACK_DEBIAN_PACKAGE_CONFLICTS}" PARENT_SCOPE)
set(GEN_CPACK_DEBIAN_PACKAGE_PROVIDES "${CPACK_DEBIAN_PACKAGE_PROVIDES}" PARENT_SCOPE)
set(GEN_CPACK_DEBIAN_PACKAGE_REPLACES "${CPACK_DEBIAN_PACKAGE_REPLACES}" PARENT_SCOPE)
set(GEN_CPACK_DEBIAN_PACKAGE_SHLIBS "${CPACK_DEBIAN_PACKAGE_SHLIBS_LIST}" PARENT_SCOPE)
set(GEN_CPACK_DEBIAN_PACKAGE_CONTROL_EXTRA "${CPACK_DEBIAN_PACKAGE_CONTROL_EXTRA}" PARENT_SCOPE)
set(GEN_CPACK_DEBIAN_PACKAGE_CONTROL_STRICT_PERMISSION
"${CPACK_DEBIAN_PACKAGE_CONTROL_STRICT_PERMISSION}" PARENT_SCOPE)
set(GEN_CPACK_DEBIAN_PACKAGE_SOURCE
"${CPACK_DEBIAN_PACKAGE_SOURCE}" PARENT_SCOPE)
set(GEN_CPACK_DEBIAN_GENERATE_POSTINST "${CPACK_DEBIAN_GENERATE_POSTINST}" PARENT_SCOPE)
set(GEN_CPACK_DEBIAN_GENERATE_POSTRM "${CPACK_DEBIAN_GENERATE_POSTRM}" PARENT_SCOPE)
set(GEN_WDIR "${WDIR}" PARENT_SCOPE)
set(GEN_CPACK_DEBIAN_DEBUGINFO_PACKAGE "${CPACK_DEBIAN_DEBUGINFO_PACKAGE}" PARENT_SCOPE)
if(BUILD_IDS)
set(GEN_DBGSYMDIR "${DBGSYMDIR}" PARENT_SCOPE)
set(GEN_CPACK_DBGSYM_OUTPUT_FILE_NAME "${CPACK_DBGSYM_OUTPUT_FILE_NAME}" PARENT_SCOPE)
list(JOIN BUILD_IDS " " BUILD_IDS)
set(GEN_BUILD_IDS "${BUILD_IDS}" PARENT_SCOPE)
else()
unset(GEN_DBGSYMDIR PARENT_SCOPE)
unset(GEN_CPACK_DBGSYM_OUTPUT_FILE_NAME PARENT_SCOPE)
unset(GEN_BUILD_IDS PARENT_SCOPE)
endif()
endfunction()
cpack_deb_prepare_package_vars()
cmake_policy(POP)

View File

@ -0,0 +1,53 @@
# Distributed under the OSI-approved BSD 3-Clause License. See accompanying
# file Copyright.txt or https://cmake.org/licensing for details.
if(NOT "${CPACK_EXTERNAL_REQUESTED_VERSIONS}" STREQUAL "")
unset(_found_major)
foreach(_req_version IN LISTS CPACK_EXTERNAL_REQUESTED_VERSIONS)
if(_req_version MATCHES "^([0-9]+)\\.([0-9]+)$")
set(_req_major "${CMAKE_MATCH_1}")
set(_req_minor "${CMAKE_MATCH_2}")
foreach(_known_version IN LISTS CPACK_EXTERNAL_KNOWN_VERSIONS)
string(REGEX MATCH
"^([0-9]+)\\.([0-9]+)$"
_known_version_dummy
"${_known_version}"
)
set(_known_major "${CMAKE_MATCH_1}")
set(_known_minor "${CMAKE_MATCH_2}")
if(_req_major EQUAL _known_major AND NOT _known_minor LESS _req_minor)
set(_found_major "${_known_major}")
set(_found_minor "${_known_minor}")
break()
endif()
endforeach()
if(DEFINED _found_major)
break()
endif()
endif()
endforeach()
if(DEFINED _found_major)
set(CPACK_EXTERNAL_SELECTED_MAJOR "${_found_major}")
set(CPACK_EXTERNAL_SELECTED_MINOR "${_found_minor}")
set(CPACK_EXTERNAL_SELECTED_VERSION "${_found_major}.${_found_minor}")
else()
message(FATAL_ERROR
"Could not find a suitable version in CPACK_EXTERNAL_REQUESTED_VERSIONS"
)
endif()
else()
list(GET CPACK_EXTERNAL_KNOWN_VERSIONS 0 CPACK_EXTERNAL_SELECTED_VERSION)
string(REGEX MATCH
"^([0-9]+)\\.([0-9]+)$"
_dummy
"${CPACK_EXTERNAL_SELECTED_VERSION}"
)
set(CPACK_EXTERNAL_SELECTED_MAJOR "${CMAKE_MATCH_1}")
set(CPACK_EXTERNAL_SELECTED_MINOR "${CMAKE_MATCH_2}")
endif()

View File

@ -0,0 +1,107 @@
# Distributed under the OSI-approved BSD 3-Clause License. See accompanying
# file Copyright.txt or https://cmake.org/licensing for details.
if(CMAKE_BINARY_DIR)
message(FATAL_ERROR "CPackFreeBSD.cmake may only be used by CPack internally.")
endif()
if(NOT UNIX)
message(FATAL_ERROR "CPackFreeBSD.cmake may only be used under UNIX.")
endif()
###
#
# These bits are copied from the Debian packaging file; slightly modified.
# They are used for filling in FreeBSD-packaging variables that can take
# on values from elsewhere -- e.g. the package description may as well be
# copied from Debian.
#
function(_cpack_freebsd_fallback_var OUTPUT_VAR_NAME)
set(FALLBACK_VAR_NAMES ${ARGN})
set(VALUE "${${OUTPUT_VAR_NAME}}")
if(VALUE)
return()
endif()
foreach(variable_name IN LISTS FALLBACK_VAR_NAMES)
if(${variable_name})
set(${OUTPUT_VAR_NAME} "${${variable_name}}" PARENT_SCOPE)
set(VALUE "${${variable_name}}")
break()
endif()
endforeach()
if(NOT VALUE)
message(WARNING "Variable ${OUTPUT_VAR_NAME} could not be given a fallback value from (any of) ${FALLBACK_VAR_NAMES}.")
endif()
endfunction()
function(check_required_var VAR_NAME)
if(NOT ${VAR_NAME})
message(FATAL_ERROR "Variable ${VAR_NAME} is not set.")
endif()
endfunction()
set(_cpack_freebsd_fallback_origin "misc/bogus")
_cpack_freebsd_fallback_var("CPACK_FREEBSD_PACKAGE_NAME"
"CPACK_PACKAGE_NAME"
"CMAKE_PROJECT_NAME"
)
set(_cpack_freebsd_fallback_www "http://example.com/?pkg=${CPACK_FREEBSD_PACKAGE_NAME}")
_cpack_freebsd_fallback_var("CPACK_FREEBSD_PACKAGE_COMMENT"
"CPACK_PACKAGE_DESCRIPTION_SUMMARY"
)
# TODO: maybe read the PACKAGE_DESCRIPTION file for the longer
# FreeBSD pkg-descr?
_cpack_freebsd_fallback_var("CPACK_FREEBSD_PACKAGE_DESCRIPTION"
"CPACK_DEBIAN_PACKAGE_DESCRIPTION"
"CPACK_PACKAGE_DESCRIPTION_SUMMARY"
"PACKAGE_DESCRIPTION"
)
# There's really only one homepage for a project, so
# re-use the Debian setting if it's there.
_cpack_freebsd_fallback_var("CPACK_FREEBSD_PACKAGE_WWW"
"CPACK_PACKAGE_HOMEPAGE_URL"
"CPACK_DEBIAN_PACKAGE_HOMEPAGE"
"_cpack_freebsd_fallback_www"
)
_cpack_freebsd_fallback_var("CPACK_FREEBSD_PACKAGE_VERSION"
"CMAKE_PROJECT_VERSION"
"${CMAKE_PROJECT_NAME}_VERSION"
"PROJECT_VERSION"
"CPACK_PACKAGE_VERSION"
"CPACK_PACKAGE_VERSION"
)
_cpack_freebsd_fallback_var("CPACK_FREEBSD_PACKAGE_MAINTAINER"
"CPACK_PACKAGE_CONTACT"
)
_cpack_freebsd_fallback_var("CPACK_FREEBSD_PACKAGE_LICENSE"
"CPACK_RPM_PACKAGE_LICENSE"
)
_cpack_freebsd_fallback_var("CPACK_FREEBSD_PACKAGE_ORIGIN"
"_cpack_freebsd_fallback_origin"
)
if(NOT CPACK_FREEBSD_PACKAGE_CATEGORIES)
string(REGEX REPLACE "/.*" "" CPACK_FREEBSD_PACKAGE_CATEGORIES ${CPACK_FREEBSD_PACKAGE_ORIGIN})
endif()
check_required_var("CPACK_FREEBSD_PACKAGE_NAME")
check_required_var("CPACK_FREEBSD_PACKAGE_ORIGIN")
check_required_var("CPACK_FREEBSD_PACKAGE_VERSION")
check_required_var("CPACK_FREEBSD_PACKAGE_MAINTAINER")
check_required_var("CPACK_FREEBSD_PACKAGE_COMMENT")
check_required_var("CPACK_FREEBSD_PACKAGE_DESCRIPTION")
check_required_var("CPACK_FREEBSD_PACKAGE_WWW")
check_required_var("CPACK_FREEBSD_PACKAGE_LICENSE")

View File

@ -0,0 +1,442 @@
# 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 ATTRIBUTES)
cmake_parse_arguments(PARSE_ARGV 2 _args "${_options}" "${_one_value_args}" "${_multi_value_args}")
if(_args_ATTRIBUTES)
list(JOIN _args_ATTRIBUTES " " _attributes)
string(PREPEND _attributes " ")
endif()
_cpack_nuget_variable_fallback(_value ${NUGET_VAR_NAME} ${ARGN} USE_CDATA)
string(TOUPPER "${ELEMENT}" _ELEMENT_UP)
if(_value)
set(
_CPACK_NUGET_${_ELEMENT_UP}_TAG
"<${ELEMENT}${_attributes}>${_value}</${ELEMENT}>"
PARENT_SCOPE
)
elseif(_attributes)
set(
_CPACK_NUGET_${_ELEMENT_UP}_TAG
"<${ELEMENT}${_attributes} />"
PARENT_SCOPE
)
endif()
endfunction()
# Warn of obsolete nuspec fields, referencing CMake variables and suggested
# replacement, if any
function(_cpack_nuget_deprecation_warning NUGET_ELEMENT VARNAME REPLACEMENT)
if(${VARNAME})
if(REPLACEMENT)
message(DEPRECATION "nuspec element `${NUGET_ELEMENT}` is deprecated in NuGet; consider replacing `${VARNAME}` with `${REPLACEMENT}`")
else()
message(DEPRECATION "nuspec element `${NUGET_ELEMENT}` is deprecated in NuGet; consider removing `${VARNAME}`")
endif()
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()
# Warn about deprecated nuspec elements; warnings only display if
# variable is set
# Note that while nuspec's "summary" element is deprecated, there
# is no suggested replacement so (for now) no deprecation warning
# is shown for `CPACK_NUGET_*_DESCRIPTION_SUMMARY`
_cpack_nuget_deprecation_warning("licenseUrl" CPACK_NUGET_PACKAGE_LICENSEURL
"CPACK_NUGET_PACKAGE_LICENSE_FILE_NAME or CPACK_NUGET_PACKAGE_LICENSE_EXPRESSION")
_cpack_nuget_deprecation_warning("licenseUrl" CPACK_NUGET_${CPACK_NUGET_PACKAGE_COMPONENT}_LICENSEURL
"CPACK_NUGET_${CPACK_NUGET_PACKAGE_COMPONENT}_LICENSE_FILE_NAME or CPACK_NUGET_${CPACK_NUGET_PACKAGE_COMPONENT}_LICENSE_EXPRESSION")
_cpack_nuget_deprecation_warning("iconUrl" CPACK_NUGET_PACKAGE_ICONURL
"CPACK_NUGET_PACKAGE_ICON")
_cpack_nuget_deprecation_warning("iconUrl" CPACK_NUGET_${CPACK_NUGET_PACKAGE_COMPONENT}_ICONURL
"CPACK_NUGET_${CPACK_NUGET_PACKAGE_COMPONENT}_ICON")
# Set nuspec fields
_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
)
# "licenseUrl" is deprecated in favor of "license"
_cpack_nuget_variable_fallback_and_wrap_into_element(licenseUrl LICENSEURL)
# "iconUrl" is deprecated in favor of "icon"
_cpack_nuget_variable_fallback_and_wrap_into_element(iconUrl ICONURL)
# "license" takes a "type" attribute of either "file" or "expression"
# "file" refers to a file path of a .txt or .md file relative to the installation root
# "expression" refers to simple or compound expression of license identifiers
# listed at https://spdx.org/licenses/
# Note that only one of CPACK_NUGET_PACKAGE_LICENSE_FILE_NAME and
# CPACK_NUGET_PACKAGE_LICENSE_EXPRESSION may be specified. If both are specified,
# CPACK_NUGET_PACKAGE_LICENSE_FILE_NAME takes precedence and CPACK_NUGET_PACKAGE_LICENSE_EXPRESSION is ignored.
if(CPACK_NUGET_PACKAGE_LICENSE_FILE_NAME)
_cpack_nuget_variable_fallback_and_wrap_into_element(
license LICENSE_FILE_NAME
ATTRIBUTES [[type="file"]]
)
elseif(CPACK_NUGET_PACKAGE_LICENSE_EXPRESSION)
_cpack_nuget_variable_fallback_and_wrap_into_element(
license LICENSE_EXPRESSION
ATTRIBUTES [[type="expression"]]
)
endif()
# "icon" refers to a file path relative to the installation root
_cpack_nuget_variable_fallback_and_wrap_into_element(icon ICON)
# "summary" is deprecated in favor of "description"
_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)
# "language" is a locale identifier such as "en_CA"
_cpack_nuget_variable_fallback_and_wrap_into_element(language LANGUAGE)
_cpack_nuget_variable_fallback_and_wrap_into_element(tags TAGS LIST_GLUE " ")
# "repository" holds repository metadata consisting of four optional
# attributes: "type", "url", "branch", and "commit". While all fields are
# considered optional, they are not independent. Currently unsupported.
# Handle dependencies
_cpack_nuget_variable_fallback(_deps DEPENDENCIES)
set(_collected_deps)
foreach(_dep IN LISTS _deps)
_cpack_nuget_debug(" checking dependency `${_dep}`")
_cpack_nuget_variable_fallback(_ver DEPENDENCIES_${_dep}_VERSION)
if(NOT _ver)
string(TOUPPER "${_dep}" _dep_upper)
_cpack_nuget_variable_fallback(_ver DEPENDENCIES_${_dep_upper}_VERSION)
endif()
if(_ver)
_cpack_nuget_debug(" got `${_dep}` dependency version ${_ver}")
string(CONCAT _collected_deps "${_collected_deps}" " <dependency id=\"${_dep}\" version=\"${_ver}\" />\n")
endif()
endforeach()
# Render deps into the variable
if(_collected_deps)
string(CONCAT _CPACK_NUGET_DEPENDENCIES_TAG "<dependencies>\n" "${_collected_deps}" " </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)
cmake_path(APPEND _comp "**")
cmake_path(NATIVE_PATH _comp _comp)
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}"
RESULT_VARIABLE _nuget_result
)
if(NOT _nuget_result EQUAL 0)
message(FATAL_ERROR "Nuget pack failed")
endif()
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}"
RESULT_VARIABLE _nuget_result
)
if(NOT _nuget_result EQUAL 0)
message(FATAL_ERROR "Nuget pack failed")
endif()
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}"
RESULT_VARIABLE _nuget_result
)
if(NOT _nuget_result EQUAL 0)
message(FATAL_ERROR "Nuget pack failed")
endif()
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}"
RESULT_VARIABLE _nuget_result
)
if(NOT _nuget_result EQUAL 0)
message(FATAL_ERROR "Nuget pack failed")
endif()
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}")

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,20 @@
# Distributed under the OSI-approved BSD 3-Clause License. See accompanying
# file Copyright.txt or https://cmake.org/licensing for details.
if(NOT CPACK_WIX_ROOT)
string(REPLACE "\\" "/" CPACK_WIX_ROOT "$ENV{WIX}")
endif()
find_program(CPACK_WIX_CANDLE_EXECUTABLE candle
PATHS "${CPACK_WIX_ROOT}" PATH_SUFFIXES "bin")
if(NOT CPACK_WIX_CANDLE_EXECUTABLE)
message(FATAL_ERROR "Could not find the WiX candle executable.")
endif()
find_program(CPACK_WIX_LIGHT_EXECUTABLE light
PATHS "${CPACK_WIX_ROOT}" PATH_SUFFIXES "bin")
if(NOT CPACK_WIX_LIGHT_EXECUTABLE)
message(FATAL_ERROR "Could not find the WiX light executable.")
endif()

View File

@ -0,0 +1,30 @@
# Distributed under the OSI-approved BSD 3-Clause License. See accompanying
# file Copyright.txt or https://cmake.org/licensing for details.
if(CMAKE_BINARY_DIR)
message(FATAL_ERROR "CPackZIP.cmake may only be used by CPack internally.")
endif()
find_program(ZIP_EXECUTABLE wzzip PATHS "$ENV{ProgramFiles}/WinZip")
if(ZIP_EXECUTABLE)
set(CPACK_ZIP_COMMAND "\"${ZIP_EXECUTABLE}\" -P \"<ARCHIVE>\" @<FILELIST>")
set(CPACK_ZIP_NEED_QUOTES TRUE)
endif()
if(NOT ZIP_EXECUTABLE)
find_program(ZIP_EXECUTABLE 7z PATHS "$ENV{ProgramFiles}/7-Zip")
if(ZIP_EXECUTABLE)
set(CPACK_ZIP_COMMAND "\"${ZIP_EXECUTABLE}\" a -tzip \"<ARCHIVE>\" @<FILELIST>")
set(CPACK_ZIP_NEED_QUOTES TRUE)
endif()
endif()
if(NOT ZIP_EXECUTABLE)
find_package(Cygwin)
find_program(ZIP_EXECUTABLE zip PATHS "${CYGWIN_INSTALL_PATH}/bin")
if(ZIP_EXECUTABLE)
set(CPACK_ZIP_COMMAND "\"${ZIP_EXECUTABLE}\" -r \"<ARCHIVE>\" . -i@<FILELIST>")
set(CPACK_ZIP_NEED_QUOTES FALSE)
endif()
endif()

View File

@ -0,0 +1,88 @@
{ Distributed under the OSI-approved BSD 3-Clause License. See accompanying
file Copyright.txt or https://cmake.org/licensing for details. }
function CPackGetCustomInstallationMessage(Param: String): String;
begin
Result := SetupMessage(msgCustomInstallation);
end;
{ Downloaded components }
#ifdef CPackDownloadCount
const
NO_PROGRESS_BOX = 4;
RESPOND_YES_TO_ALL = 16;
var
CPackDownloadPage: TDownloadWizardPage;
CPackShell: Variant;
<event('InitializeWizard')>
procedure CPackInitializeWizard();
begin
CPackDownloadPage := CreateDownloadPage(SetupMessage(msgWizardPreparing), SetupMessage(msgPreparingDesc), nil);
CPackShell := CreateOleObject('Shell.Application');
end;
<event('NextButtonClick')>
function CPackNextButtonClick(CurPageID: Integer): Boolean;
begin
if CurPageID = wpReady then
begin
CPackDownloadPage.Clear;
CPackDownloadPage.Show;
#sub AddDownload
if WizardIsComponentSelected('{#CPackDownloadComponents[i]}') then
#emit "CPackDownloadPage.Add('" + CPackDownloadUrls[i] + "', '" + CPackDownloadArchives[i] + ".zip', '" + CPackDownloadHashes[i] + "');"
#endsub
#define i
#for {i = 0; i < CPackDownloadCount; i++} AddDownload
#undef i
try
try
CPackDownloadPage.Download;
Result := True;
except
if not CPackDownloadPage.AbortedByUser then
SuppressibleMsgBox(AddPeriod(GetExceptionMessage), mbCriticalError, MB_OK, IDOK);
Result := False;
end;
finally
CPackDownloadPage.Hide;
end;
end else
Result := True;
end;
procedure CPackExtractFile(ArchiveName, FileName: String);
var
ZipFileName: String;
ZipFile: Variant;
Item: Variant;
TargetFolderName: String;
TargetFolder: Variant;
begin
TargetFolderName := RemoveBackslashUnlessRoot(ExpandConstant('{tmp}\' + ArchiveName + '\' + ExtractFileDir(FileName)));
ZipFileName := ExpandConstant('{tmp}\' + ArchiveName + '.zip');
if not DirExists(TargetFolderName) then
if not ForceDirectories(TargetFolderName) then
RaiseException(Format('Target path "%s" cannot be created', [TargetFolderName]));
ZipFile := CPackShell.NameSpace(ZipFileName);
if VarIsClear(ZipFile) then
RaiseException(Format('Cannot open ZIP file "%s" or does not exist', [ZipFileName]));
Item := ZipFile.ParseName(FileName);
if VarIsClear(Item) then
RaiseException(Format('Cannot find "%s" in "%s" ZIP file', [FileName, ZipFileName]));
TargetFolder := CPackShell.NameSpace(TargetFolderName);
if VarIsClear(TargetFolder) then
RaiseException(Format('Target path "%s" does not exist', [TargetFolderName]));
TargetFolder.CopyHere(Item, NO_PROGRESS_BOX or RESPOND_YES_TO_ALL);
end;
#endif

View File

@ -0,0 +1,34 @@
; Script generated by the CPack Inno Setup generator.
; All changes made in this file will be lost when CPack is run again.
@CPACK_INNOSETUP_INCLUDES_INTERNAL@
[Setup]
@CPACK_INNOSETUP_SETUP_INTERNAL@
[Languages]
@CPACK_INNOSETUP_LANGUAGES_INTERNAL@
[Dirs]
@CPACK_INNOSETUP_DIRS_INTERNAL@
[Files]
@CPACK_INNOSETUP_FILES_INTERNAL@
[Types]
@CPACK_INNOSETUP_TYPES_INTERNAL@
[Components]
@CPACK_INNOSETUP_COMPONENTS_INTERNAL@
[Tasks]
@CPACK_INNOSETUP_TASKS_INTERNAL@
[Icons]
@CPACK_INNOSETUP_ICONS_INTERNAL@
[Run]
@CPACK_INNOSETUP_RUN_INTERNAL@
[Code]
@CPACK_INNOSETUP_CODE_INTERNAL@

View File

@ -0,0 +1,46 @@
[Settings]
NumFields=5
[Field 1]
Type=label
Text=By default @CPACK_PACKAGE_INSTALL_DIRECTORY@ does not add its directory to the system PATH.
Left=0
Right=-1
Top=0
Bottom=20
[Field 2]
Type=radiobutton
Text=Do not add @CPACK_PACKAGE_NAME@ to the system PATH
Left=0
Right=-1
Top=30
Bottom=40
State=1
[Field 3]
Type=radiobutton
Text=Add @CPACK_PACKAGE_NAME@ to the system PATH for all users
Left=0
Right=-1
Top=40
Bottom=50
State=0
[Field 4]
Type=radiobutton
Text=Add @CPACK_PACKAGE_NAME@ to the system PATH for current user
Left=0
Right=-1
Top=50
Bottom=60
State=0
[Field 5]
Type=CheckBox
Text=Create @CPACK_PACKAGE_NAME@ Desktop Icon
Left=0
Right=-1
Top=80
Bottom=90
State=0

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,47 @@
<?xml version="1.0" encoding="UTF-8"?>
<?include "cpack_variables.wxi"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi" @CPACK_WIX_CUSTOM_XMLNS_EXPANDED@
RequiredVersion="3.6.3303.0">
<Product Id="$(var.CPACK_WIX_PRODUCT_GUID)"
Name="$(var.CPACK_PACKAGE_NAME)"
Language="1033"
Version="$(var.CPACK_PACKAGE_VERSION)"
Manufacturer="$(var.CPACK_PACKAGE_VENDOR)"
UpgradeCode="$(var.CPACK_WIX_UPGRADE_GUID)">
<Package InstallerVersion="301" Compressed="yes"/>
<Media Id="1" Cabinet="media1.cab" EmbedCab="yes"/>
<MajorUpgrade
Schedule="afterInstallInitialize"
AllowSameVersionUpgrades="yes"
DowngradeErrorMessage="A later version of [ProductName] is already installed. Setup will now exit."/>
<WixVariable Id="WixUILicenseRtf" Value="$(var.CPACK_WIX_LICENSE_RTF)"/>
<Property Id="WIXUI_INSTALLDIR" Value="INSTALL_ROOT"/>
<?ifdef CPACK_WIX_PRODUCT_ICON?>
<Property Id="ARPPRODUCTICON">ProductIcon.ico</Property>
<Icon Id="ProductIcon.ico" SourceFile="$(var.CPACK_WIX_PRODUCT_ICON)"/>
<?endif?>
<?ifdef CPACK_WIX_UI_BANNER?>
<WixVariable Id="WixUIBannerBmp" Value="$(var.CPACK_WIX_UI_BANNER)"/>
<?endif?>
<?ifdef CPACK_WIX_UI_DIALOG?>
<WixVariable Id="WixUIDialogBmp" Value="$(var.CPACK_WIX_UI_DIALOG)"/>
<?endif?>
<FeatureRef Id="ProductFeature"/>
<UIRef Id="$(var.CPACK_WIX_UI_REF)" />
<?include "properties.wxi"?>
<?include "product_fragment.wxi"?>
</Product>
</Wix>

View File

@ -0,0 +1,31 @@
# Distributed under the OSI-approved BSD 3-Clause License. See accompanying
# file Copyright.txt or https://cmake.org/licensing for details.
include_guard(GLOBAL)
include(Internal/CheckFlagCommonConfig)
include(Internal/CheckSourceCompiles)
include(CMakeCheckCompilerFlagCommonPatterns)
function(CMAKE_CHECK_COMPILER_FLAG _lang _flag _var)
# Parse extra arguments
cmake_parse_arguments(PARSE_ARGV 3 CHECK_COMPILER_FLAG "" "OUTPUT_VARIABLE" "")
cmake_check_flag_common_init("check_compiler_flag" ${_lang} _lang_src _lang_fail_regex)
set(CMAKE_REQUIRED_DEFINITIONS ${_flag})
check_compiler_flag_common_patterns(_common_patterns)
cmake_check_source_compiles(${_lang}
"${_lang_src}"
${_var}
${_lang_fail_regex}
${_common_patterns}
OUTPUT_VARIABLE _output
)
if (CHECK_COMPILER_FLAG_OUTPUT_VARIABLE)
set(${CHECK_COMPILER_FLAG_OUTPUT_VARIABLE} "${_output}" PARENT_SCOPE)
endif()
cmake_check_flag_common_finish()
endfunction()

View File

@ -0,0 +1,78 @@
# Distributed under the OSI-approved BSD 3-Clause License. See accompanying
# file Copyright.txt or https://cmake.org/licensing for details.
# Do NOT include this module directly into any of your code. It is meant as
# a library for Check*CompilerFlag.cmake and Check*LinkerFlag.cma modules.
# It's content may change in any way between releases.
include_guard(GLOBAL)
block(SCOPE_FOR POLICIES)
cmake_policy(SET CMP0054 NEW) # if() quoted variables not dereferenced
cmake_policy(SET CMP0057 NEW) # if() supports IN_LIST
macro(CMAKE_CHECK_FLAG_COMMON_INIT _FUNC _LANG _SRC _PATTERNS)
if("${_LANG}" STREQUAL "C")
set(${_SRC} "int main(void) { return 0; }")
set(${_PATTERNS} FAIL_REGEX "command[ -]line option .* is valid for .* but not for C"
FAIL_REGEX "-Werror=.* argument .* is not valid for C")
elseif("${_LANG}" STREQUAL "CXX")
set(${_SRC} "int main() { return 0; }")
set(${_PATTERNS} FAIL_REGEX "command[ -]line option .* is valid for .* but not for C\\+\\+"
FAIL_REGEX "-Werror=.* argument .* is not valid for C\\+\\+")
elseif("${_LANG}" STREQUAL "CUDA")
set(${_SRC} "__host__ int main() { return 0; }")
set(${_PATTERNS} FAIL_REGEX "command[ -]line option .* is valid for .* but not for C\\+\\+" # Host GNU
FAIL_REGEX "argument unused during compilation: .*") # Clang
elseif("${_LANG}" STREQUAL "Fortran")
set(${_SRC} " program test\n stop\n end program")
set(${_PATTERNS} FAIL_REGEX "command[ -]line option .* is valid for .* but not for Fortran")
elseif("${_LANG}" STREQUAL "HIP")
set(${_SRC} "__host__ int main() { return 0; }")
set(${_PATTERNS} FAIL_REGEX "argument unused during compilation: .*") # Clang
elseif("${_LANG}" STREQUAL "OBJC")
set(${_SRC} [=[
#ifndef __OBJC__
# error "Not an Objective-C compiler"
#endif
int main(void) { return 0; }]=])
set(${_PATTERNS} FAIL_REGEX "command[ -]line option .* is valid for .* but not for Objective-C" # GNU
FAIL_REGEX "argument unused during compilation: .*") # Clang
elseif("${_LANG}" STREQUAL "OBJCXX")
set(${_SRC} [=[
#ifndef __OBJC__
# error "Not an Objective-C++ compiler"
#endif
int main(void) { return 0; }]=])
set(${_PATTERNS} FAIL_REGEX "command[ -]line option .* is valid for .* but not for Objective-C\\+\\+" # GNU
FAIL_REGEX "argument unused during compilation: .*") # Clang
elseif("${_LANG}" STREQUAL "ISPC")
set(${_SRC} "float func(uniform int32, float a) { return a / 2.25; }")
elseif("${_LANG}" STREQUAL "Swift")
set(${_SRC} "func blarpy() { }")
else()
message (SEND_ERROR "${_FUNC}: ${_LANG}: unknown language.")
return()
endif()
get_property (_supported_languages GLOBAL PROPERTY ENABLED_LANGUAGES)
if (NOT "${_LANG}" IN_LIST _supported_languages)
message (SEND_ERROR "${_FUNC}: ${_LANG}: needs to be enabled before use.")
return()
endif()
# Normalize locale during test compilation.
set(_CFCC_locale_vars LC_ALL LC_MESSAGES LANG)
foreach(v IN LISTS _CFCC_locale_vars)
set(_CMAKE_CHECK_FLAG_COMMON_CONFIG_locale_vars_saved_${v} "$ENV{${v}}")
set(ENV{${v}} C)
endforeach()
endmacro()
macro(CMAKE_CHECK_FLAG_COMMON_FINISH)
foreach(v IN LISTS _CFCC_locale_vars)
set(ENV{${v}} ${_CMAKE_CHECK_FLAG_COMMON_CONFIG_locale_vars_saved_${v}})
endforeach()
endmacro()
endblock()

View File

@ -0,0 +1,52 @@
# Distributed under the OSI-approved BSD 3-Clause License. See accompanying
# file Copyright.txt or https://cmake.org/licensing for details.
include_guard(GLOBAL)
include(Internal/CheckFlagCommonConfig)
include(Internal/CheckSourceCompiles)
include(CMakeCheckCompilerFlagCommonPatterns)
block(SCOPE_FOR POLICIES)
cmake_policy(SET CMP0054 NEW) # if() quoted variables not dereferenced
function(CMAKE_CHECK_LINKER_FLAG _lang _flag _var)
# link step supports less languages than the compiler
# so do a first check about the requested language
if (_lang STREQUAL "ISPC")
message (SEND_ERROR "check_linker_flag: ${_lang}: unsupported language.")
return()
endif()
# Parse extra arguments
cmake_parse_arguments(PARSE_ARGV 3 CHECK_LINKER_FLAG "" "OUTPUT_VARIABLE" "")
cmake_check_flag_common_init("check_linker_flag" ${_lang} _lang_src _lang_fail_regex)
set(CMAKE_REQUIRED_LINK_OPTIONS "${_flag}")
check_compiler_flag_common_patterns(_common_patterns)
# Match linker warnings if the exact flag is ignored.
foreach(flag IN LISTS _flag)
string(REGEX REPLACE "([][+.*?()^$])" [[\\\1]] _flag_regex "${flag}")
list(APPEND _common_patterns
FAIL_REGEX "warning: .*${_flag_regex}.* ignored"
)
endforeach()
cmake_check_source_compiles(${_lang}
"${_lang_src}"
${_var}
${_lang_fail_regex}
${_common_patterns}
OUTPUT_VARIABLE _output
)
if (CHECK_LINKER_FLAG_OUTPUT_VARIABLE)
set(${CHECK_LINKER_FLAG_OUTPUT_VARIABLE} "${_output}" PARENT_SCOPE)
endif()
cmake_check_flag_common_finish()
endfunction()
endblock()

View File

@ -0,0 +1,134 @@
# Distributed under the OSI-approved BSD 3-Clause License. See accompanying
# file Copyright.txt or https://cmake.org/licensing for details.
include_guard(GLOBAL)
block(SCOPE_FOR POLICIES)
cmake_policy(SET CMP0054 NEW) # if() quoted variables not dereferenced
cmake_policy(SET CMP0057 NEW) # if() supports IN_LIST
function(CMAKE_CHECK_SOURCE_COMPILES _lang _source _var)
if(NOT DEFINED "${_var}")
set(_lang_filename "src")
if(_lang STREQUAL "C")
set(_lang_textual "C")
set(_lang_ext "c")
elseif(_lang STREQUAL "CXX")
set(_lang_textual "C++")
set(_lang_ext "cxx")
elseif(_lang STREQUAL "CUDA")
set(_lang_textual "CUDA")
set(_lang_ext "cu")
elseif(_lang STREQUAL "Fortran")
set(_lang_textual "Fortran")
set(_lang_ext "F90")
elseif(_lang STREQUAL "HIP")
set(_lang_textual "HIP")
set(_lang_ext "hip")
elseif(_lang STREQUAL "ISPC")
set(_lang_textual "ISPC")
set(_lang_ext "ispc")
elseif(_lang STREQUAL "OBJC")
set(_lang_textual "Objective-C")
set(_lang_ext "m")
elseif(_lang STREQUAL "OBJCXX")
set(_lang_textual "Objective-C++")
set(_lang_ext "mm")
elseif(_lang STREQUAL "Swift")
set(_lang_textual "Swift")
set(_lang_ext "swift")
if (NOT DEFINED CMAKE_TRY_COMPILE_TARGET_TYPE
OR CMAKE_TRY_COMPILE_TARGET_TYPE STREQUAL "EXECUTABLE")
set(_lang_filename "main")
endif()
else()
message (SEND_ERROR "check_source_compiles: ${_lang}: unknown language.")
return()
endif()
get_property (_supported_languages GLOBAL PROPERTY ENABLED_LANGUAGES)
if (NOT _lang IN_LIST _supported_languages)
message (SEND_ERROR "check_source_compiles: ${_lang}: needs to be enabled before use.")
return()
endif()
set(_FAIL_REGEX)
set(_SRC_EXT)
set(_key)
foreach(arg ${ARGN})
if("${arg}" MATCHES "^(FAIL_REGEX|SRC_EXT|OUTPUT_VARIABLE)$")
set(_key "${arg}")
elseif(_key STREQUAL "FAIL_REGEX")
list(APPEND _FAIL_REGEX "${arg}")
elseif(_key STREQUAL "SRC_EXT")
set(_SRC_EXT "${arg}")
set(_key "")
elseif(_key STREQUAL "OUTPUT_VARIABLE")
set(_OUTPUT_VARIABLE "${arg}")
set(_key "")
else()
message(FATAL_ERROR "Unknown argument:\n ${arg}\n")
endif()
endforeach()
if(NOT _SRC_EXT)
set(_SRC_EXT ${_lang_ext})
endif()
if(CMAKE_REQUIRED_LINK_OPTIONS)
set(CHECK_${LANG}_SOURCE_COMPILES_ADD_LINK_OPTIONS
LINK_OPTIONS ${CMAKE_REQUIRED_LINK_OPTIONS})
else()
set(CHECK_${LANG}_SOURCE_COMPILES_ADD_LINK_OPTIONS)
endif()
if(CMAKE_REQUIRED_LIBRARIES)
set(CHECK_${LANG}_SOURCE_COMPILES_ADD_LIBRARIES
LINK_LIBRARIES ${CMAKE_REQUIRED_LIBRARIES})
else()
set(CHECK_${LANG}_SOURCE_COMPILES_ADD_LIBRARIES)
endif()
if(CMAKE_REQUIRED_INCLUDES)
set(CHECK_${LANG}_SOURCE_COMPILES_ADD_INCLUDES
"-DINCLUDE_DIRECTORIES:STRING=${CMAKE_REQUIRED_INCLUDES}")
else()
set(CHECK_${LANG}_SOURCE_COMPILES_ADD_INCLUDES)
endif()
if(NOT CMAKE_REQUIRED_QUIET)
message(CHECK_START "Performing Test ${_var}")
endif()
string(APPEND _source "\n")
try_compile(${_var}
SOURCE_FROM_VAR "${_lang_filename}.${_SRC_EXT}" _source
COMPILE_DEFINITIONS -D${_var} ${CMAKE_REQUIRED_DEFINITIONS}
${CHECK_${LANG}_SOURCE_COMPILES_ADD_LINK_OPTIONS}
${CHECK_${LANG}_SOURCE_COMPILES_ADD_LIBRARIES}
CMAKE_FLAGS -DCOMPILE_DEFINITIONS:STRING=${CMAKE_REQUIRED_FLAGS}
"${CHECK_${LANG}_SOURCE_COMPILES_ADD_INCLUDES}"
OUTPUT_VARIABLE OUTPUT)
foreach(_regex ${_FAIL_REGEX})
if("${OUTPUT}" MATCHES "${_regex}")
set(${_var} 0)
endif()
endforeach()
if (_OUTPUT_VARIABLE)
set(${_OUTPUT_VARIABLE} "${OUTPUT}" PARENT_SCOPE)
endif()
if(${_var})
set(${_var} 1 CACHE INTERNAL "Test ${_var}")
if(NOT CMAKE_REQUIRED_QUIET)
message(CHECK_PASS "Success")
endif()
else()
if(NOT CMAKE_REQUIRED_QUIET)
message(CHECK_FAIL "Failed")
endif()
set(${_var} "" CACHE INTERNAL "Test ${_var}")
endif()
endif()
endfunction()
endblock()

View File

@ -0,0 +1,127 @@
# Distributed under the OSI-approved BSD 3-Clause License. See accompanying
# file Copyright.txt or https://cmake.org/licensing for details.
include_guard(GLOBAL)
block(SCOPE_FOR POLICIES)
cmake_policy(SET CMP0054 NEW) # if() quoted variables not dereferenced
cmake_policy(SET CMP0057 NEW) # if() supports IN_LIST
function(CMAKE_CHECK_SOURCE_RUNS _lang _source _var)
if(NOT DEFINED "${_var}")
if(_lang STREQUAL "C")
set(_lang_textual "C")
set(_lang_ext "c")
elseif(_lang STREQUAL "CXX")
set(_lang_textual "C++")
set(_lang_ext "cxx")
elseif(_lang STREQUAL "CUDA")
set(_lang_textual "CUDA")
set(_lang_ext "cu")
elseif(_lang STREQUAL "Fortran")
set(_lang_textual "Fortran")
set(_lang_ext "F90")
elseif(_lang STREQUAL "HIP")
set(_lang_textual "HIP")
set(_lang_ext "hip")
elseif(_lang STREQUAL "OBJC")
set(_lang_textual "Objective-C")
set(_lang_ext "m")
elseif(_lang STREQUAL "OBJCXX")
set(_lang_textual "Objective-C++")
set(_lang_ext "mm")
else()
message (SEND_ERROR "check_source_runs: ${_lang}: unknown language.")
return()
endif()
get_property (_supported_languages GLOBAL PROPERTY ENABLED_LANGUAGES)
if (NOT _lang IN_LIST _supported_languages)
message (SEND_ERROR "check_source_runs: ${_lang}: needs to be enabled before use.")
return()
endif()
set(_FAIL_REGEX)
set(_SRC_EXT)
set(_key)
foreach(arg ${ARGN})
if("${arg}" MATCHES "^(FAIL_REGEX|SRC_EXT)$")
set(_key "${arg}")
elseif(_key STREQUAL "FAIL_REGEX")
list(APPEND _FAIL_REGEX "${arg}")
elseif(_key STREQUAL "SRC_EXT")
set(_SRC_EXT "${arg}")
set(_key "")
else()
set(message_type FATAL_ERROR)
if (_CheckSourceRuns_old_signature)
set(message_type AUTHOR_WARNING)
endif ()
message("${message_type}" "Unknown argument:\n ${arg}\n")
unset(message_type)
endif()
endforeach()
if(NOT _SRC_EXT)
set(_SRC_EXT ${_lang_ext})
endif()
if(CMAKE_REQUIRED_LINK_OPTIONS)
set(CHECK_${_lang}_SOURCE_COMPILES_ADD_LINK_OPTIONS
LINK_OPTIONS ${CMAKE_REQUIRED_LINK_OPTIONS})
else()
set(CHECK_${_lang}_SOURCE_COMPILES_ADD_LINK_OPTIONS)
endif()
if(CMAKE_REQUIRED_LIBRARIES)
set(CHECK_${_lang}_SOURCE_COMPILES_ADD_LIBRARIES
LINK_LIBRARIES ${CMAKE_REQUIRED_LIBRARIES})
else()
set(CHECK_${_lang}_SOURCE_COMPILES_ADD_LIBRARIES)
endif()
if(CMAKE_REQUIRED_INCLUDES)
set(CHECK_${_lang}_SOURCE_COMPILES_ADD_INCLUDES
"-DINCLUDE_DIRECTORIES:STRING=${CMAKE_REQUIRED_INCLUDES}")
else()
set(CHECK_${_lang}_SOURCE_COMPILES_ADD_INCLUDES)
endif()
if(NOT CMAKE_REQUIRED_QUIET)
message(CHECK_START "Performing Test ${_var}")
endif()
string(APPEND _source "\n")
try_run(${_var}_EXITCODE ${_var}_COMPILED
SOURCE_FROM_VAR "src.${_SRC_EXT}" _source
COMPILE_DEFINITIONS -D${_var} ${CMAKE_REQUIRED_DEFINITIONS}
${CHECK_${_lang}_SOURCE_COMPILES_ADD_LINK_OPTIONS}
${CHECK_${_lang}_SOURCE_COMPILES_ADD_LIBRARIES}
CMAKE_FLAGS -DCOMPILE_DEFINITIONS:STRING=${CMAKE_REQUIRED_FLAGS}
-DCMAKE_SKIP_RPATH:BOOL=${CMAKE_SKIP_RPATH}
"${CHECK_${_lang}_SOURCE_COMPILES_ADD_INCLUDES}"
)
# if it did not compile make the return value fail code of 1
if(NOT ${_var}_COMPILED)
set(${_var}_EXITCODE 1)
set(${_var}_EXITCODE 1 PARENT_SCOPE)
endif()
# if the return value was 0 then it worked
if("${${_var}_EXITCODE}" EQUAL 0)
set(${_var} 1 CACHE INTERNAL "Test ${_var}")
if(NOT CMAKE_REQUIRED_QUIET)
message(CHECK_PASS "Success")
endif()
else()
if(CMAKE_CROSSCOMPILING AND "${${_var}_EXITCODE}" MATCHES "FAILED_TO_RUN")
set(${_var} "${${_var}_EXITCODE}" PARENT_SCOPE)
else()
set(${_var} "" CACHE INTERNAL "Test ${_var}")
endif()
if(NOT CMAKE_REQUIRED_QUIET)
message(CHECK_FAIL "Failed")
endif()
endif()
endif()
endfunction()
endblock()

View File

@ -0,0 +1,129 @@
macro(_record_compiler_features lang compile_flags feature_list)
include("${CMAKE_ROOT}/Modules/Compiler/${CMAKE_${lang}_COMPILER_ID}-${lang}-FeatureTests.cmake" OPTIONAL)
string(TOLOWER ${lang} lang_lc)
file(REMOVE "${CMAKE_BINARY_DIR}/CMakeFiles/feature_tests.bin")
set(_content "
const char features[] = {\"\\n\"\n")
get_property(known_features GLOBAL PROPERTY CMAKE_${lang}_KNOWN_FEATURES)
foreach(feature ${known_features})
if (_cmake_feature_test_${feature})
if (${_cmake_feature_test_${feature}} STREQUAL 1)
set(_feature_condition "\"1\" ")
else()
set(_feature_condition "#if ${_cmake_feature_test_${feature}}\n\"1\"\n#else\n\"0\"\n#endif\n")
endif()
string(APPEND _content
"\"${lang}_FEATURE:\"\n${_feature_condition}\"${feature}\\n\"\n")
endif()
endforeach()
string(APPEND _content
"\n};\n\nint main(int argc, char** argv) { (void)argv; return features[argc]; }\n")
if(CMAKE_${lang}_LINK_WITH_STANDARD_COMPILE_OPTION)
# This toolchain requires use of the language standard flag
# when linking in order to use the matching standard library.
set(compile_flags_for_link "${compile_flags}")
else()
set(compile_flags_for_link "")
endif()
try_compile(CMAKE_${lang}_FEATURE_TEST
SOURCE_FROM_VAR "feature_tests.${lang_lc}" _content
COMPILE_DEFINITIONS "${compile_flags}"
LINK_LIBRARIES "${compile_flags_for_link}"
COPY_FILE "${CMAKE_BINARY_DIR}/CMakeFiles/feature_tests.bin"
COPY_FILE_ERROR _copy_error
)
if(NOT CMAKE_${lang}_FEATURE_TEST)
set(_result 255)
elseif(_copy_error)
set(_result 255)
message(WARNING "${_copy_error}")
else()
set(_result 0)
endif()
unset(CMAKE_${lang}_FEATURE_TEST CACHE)
unset(compile_flags_for_link)
if (_result EQUAL 0)
if(EXISTS "${CMAKE_BINARY_DIR}/CMakeFiles/feature_tests.bin")
file(STRINGS "${CMAKE_BINARY_DIR}/CMakeFiles/feature_tests.bin"
features REGEX "${lang}_FEATURE:.*")
foreach(info ${features})
string(REPLACE "${lang}_FEATURE:" "" info ${info})
string(SUBSTRING ${info} 0 1 has_feature)
if(has_feature)
string(REGEX REPLACE "^1" "" feature ${info})
list(APPEND ${feature_list} ${feature})
endif()
endforeach()
endif()
endif()
endmacro()
macro(_record_compiler_features_c std)
list(APPEND CMAKE_C${std}_COMPILE_FEATURES c_std_${std})
get_property(lang_level_has_features GLOBAL PROPERTY CMAKE_C${std}_KNOWN_FEATURES)
if(lang_level_has_features)
_record_compiler_features(C "${CMAKE_C${std}_STANDARD_COMPILE_OPTION}" CMAKE_C${std}_COMPILE_FEATURES)
endif()
unset(lang_level_has_features)
endmacro()
macro(_record_compiler_features_cxx std)
list(APPEND CMAKE_CXX${std}_COMPILE_FEATURES cxx_std_${std})
get_property(lang_level_has_features GLOBAL PROPERTY CMAKE_CXX${std}_KNOWN_FEATURES)
if(lang_level_has_features)
_record_compiler_features(CXX "${CMAKE_CXX${std}_STANDARD_COMPILE_OPTION}" CMAKE_CXX${std}_COMPILE_FEATURES)
endif()
unset(lang_level_has_features)
endmacro()
macro(_record_compiler_features_cuda std)
list(APPEND CMAKE_CUDA${std}_COMPILE_FEATURES cuda_std_${std})
get_property(lang_level_has_features GLOBAL PROPERTY CMAKE_CUDA${std}_KNOWN_FEATURES)
if(lang_level_has_features)
_record_compiler_features(CUDA "${CMAKE_CUDA${std}_STANDARD_COMPILE_OPTION}" CMAKE_CUDA${std}_COMPILE_FEATURES)
endif()
unset(lang_level_has_features)
endmacro()
macro(_record_compiler_features_hip std)
list(APPEND CMAKE_HIP${std}_COMPILE_FEATURES hip_std_${std})
get_property(lang_level_has_features GLOBAL PROPERTY CMAKE_HIP${std}_KNOWN_FEATURES)
if(lang_level_has_features)
_record_compiler_features(HIP "${CMAKE_HIP${std}_STANDARD_COMPILE_OPTION}" CMAKE_HIP${std}_COMPILE_FEATURES)
endif()
unset(lang_level_has_features)
endmacro()
macro(_has_compiler_features lang level compile_flags feature_list)
# presume all known features are supported
get_property(known_features GLOBAL PROPERTY CMAKE_${lang}${level}_KNOWN_FEATURES)
list(APPEND ${feature_list} ${known_features})
endmacro()
macro(_has_compiler_features_c std)
list(APPEND CMAKE_C${std}_COMPILE_FEATURES c_std_${std})
_has_compiler_features(C ${std} "${CMAKE_C${std}_STANDARD_COMPILE_OPTION}" CMAKE_C${std}_COMPILE_FEATURES)
endmacro()
macro(_has_compiler_features_cxx std)
list(APPEND CMAKE_CXX${std}_COMPILE_FEATURES cxx_std_${std})
_has_compiler_features(CXX ${std} "${CMAKE_CXX${std}_STANDARD_COMPILE_OPTION}" CMAKE_CXX${std}_COMPILE_FEATURES)
endmacro()
macro(_has_compiler_features_cuda std)
list(APPEND CMAKE_CUDA${std}_COMPILE_FEATURES cuda_std_${std})
_has_compiler_features(CUDA ${std} "${CMAKE_CUDA${std}_STANDARD_COMPILE_OPTION}" CMAKE_CUDA${std}_COMPILE_FEATURES)
endmacro()
macro(_has_compiler_features_hip std)
list(APPEND CMAKE_HIP${std}_COMPILE_FEATURES hip_std_${std})
_has_compiler_features(HIP ${std} "${CMAKE_HIP${std}_STANDARD_COMPILE_OPTION}" CMAKE_HIP${std}_COMPILE_FEATURES)
endmacro()

View File

@ -0,0 +1,69 @@
# Distributed under the OSI-approved BSD 3-Clause License. See accompanying
# file Copyright.txt or https://cmake.org/licensing for details.
# Do NOT include this module directly into any of your code. It is used by
# the try_compile() implementation to work around a specific issue with
# conflicting flags when building for Apple platforms.
if(NOT APPLE)
return()
endif()
block(SCOPE_FOR POLICIES)
cmake_policy(SET CMP0054 NEW) # if() quoted variables not dereferenced
function(__cmake_internal_workaround_headerpad_flag_conflict _LANG)
# Until we can avoid hard-coding -Wl,-headerpad_max_install_names in the
# linker flags, we need to remove it here for cases where we know it will
# conflict with other flags, generate a warning and be ignored.
set(regex "(^| )(-fembed-bitcode(-marker|=(all|bitcode|marker))?|-bundle_bitcode)($| )")
set(remove_headerpad NO)
# Check arbitrary flags that the user or project has set. These compiler
# flags get added to the linker command line.
if("${CMAKE_${_LANG}_FLAGS}" MATCHES "${regex}")
set(remove_headerpad YES)
endif()
if(NOT remove_headerpad)
get_property(is_multi_config GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG)
if(is_multi_config)
# Only one of these config-specific variables will be set by try_compile()
# and the rest will be unset, but we can't easily tell which one is set.
# No harm to just add them all here, empty ones won't add flags to check.
foreach(config IN LISTS CMAKE_CONFIGURATION_TYPES)
if("${CMAKE_${_LANG}_FLAGS_${config}}" MATCHES "${regex}")
set(remove_headerpad YES)
break()
endif()
endforeach()
else()
if("${CMAKE_${_LANG}_FLAGS_${CMAKE_BUILD_TYPE}}" MATCHES "${regex}")
set(remove_headerpad YES)
endif()
endif()
endif()
# The try_compile() command passes compiler flags to check in a way that
# results in them being added to add_definitions(). Those don't end up on
# the linker command line, so we don't need to check them here.
if(remove_headerpad)
foreach(flag IN ITEMS
CMAKE_${_LANG}_LINK_FLAGS
CMAKE_SHARED_LIBRARY_CREATE_${_LANG}_FLAGS
CMAKE_SHARED_MODULE_CREATE_${_LANG}_FLAGS)
string(REPLACE "-Wl,-headerpad_max_install_names" "" ${flag} "${${flag}}")
set(${flag} "${${flag}}" PARENT_SCOPE)
endforeach()
endif()
endfunction()
get_property(__enabled_languages GLOBAL PROPERTY ENABLED_LANGUAGES)
foreach(__lang IN LISTS __enabled_languages)
__cmake_internal_workaround_headerpad_flag_conflict(${__lang})
endforeach()
unset(__lang)
unset(__enabled_languages)
endblock()

View File

@ -0,0 +1,41 @@
# 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(NOT EXISTS "${CMAKE_SYSROOT}/etc/centos-release")
return()
endif()
# Get the first string only
file(
STRINGS "${CMAKE_SYSROOT}/etc/centos-release" CMAKE_GET_OS_RELEASE_FALLBACK_CONTENT
LIMIT_COUNT 1
)
#
# Example:
# CentOS release 6.10 (Final)
#
if(CMAKE_GET_OS_RELEASE_FALLBACK_CONTENT MATCHES "CentOS release ([0-9\.]+) .*")
set(CMAKE_GET_OS_RELEASE_FALLBACK_RESULT_NAME CentOS)
set(CMAKE_GET_OS_RELEASE_FALLBACK_RESULT_PRETTY_NAME "${CMAKE_GET_OS_RELEASE_FALLBACK_CONTENT}")
set(CMAKE_GET_OS_RELEASE_FALLBACK_RESULT_ID centos)
set(CMAKE_GET_OS_RELEASE_FALLBACK_RESULT_ID_LIKE rhel)
set(CMAKE_GET_OS_RELEASE_FALLBACK_RESULT_VERSION ${CMAKE_MATCH_1})
set(CMAKE_GET_OS_RELEASE_FALLBACK_RESULT_VERSION_ID ${CMAKE_MATCH_1})
list(
APPEND CMAKE_GET_OS_RELEASE_FALLBACK_RESULT
CMAKE_GET_OS_RELEASE_FALLBACK_RESULT_NAME
CMAKE_GET_OS_RELEASE_FALLBACK_RESULT_PRETTY_NAME
CMAKE_GET_OS_RELEASE_FALLBACK_RESULT_ID
CMAKE_GET_OS_RELEASE_FALLBACK_RESULT_ID_LIKE
CMAKE_GET_OS_RELEASE_FALLBACK_RESULT_VERSION
CMAKE_GET_OS_RELEASE_FALLBACK_RESULT_VERSION_ID
)
endif()
unset(CMAKE_GET_OS_RELEASE_FALLBACK_CONTENT)

View File

@ -0,0 +1,38 @@
# 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(NOT EXISTS "${CMAKE_SYSROOT}/etc/debian_version")
return()
endif()
# Get the first string only
file(
STRINGS "${CMAKE_SYSROOT}/etc/debian_version" CMAKE_GET_OS_RELEASE_FALLBACK_CONTENT
LIMIT_COUNT 1
)
#
# Example:
# 6.0.10 # Old debian
# wheezy/sid # Ubuntu
#
if(CMAKE_GET_OS_RELEASE_FALLBACK_CONTENT MATCHES "[0-9]+(\.[0-9]+)*")
set(CMAKE_GET_OS_RELEASE_FALLBACK_RESULT_NAME Debian)
set(CMAKE_GET_OS_RELEASE_FALLBACK_RESULT_ID debian)
set(CMAKE_GET_OS_RELEASE_FALLBACK_RESULT_VERSION ${CMAKE_GET_OS_RELEASE_FALLBACK_CONTENT})
set(CMAKE_GET_OS_RELEASE_FALLBACK_RESULT_VERSION_ID ${CMAKE_GET_OS_RELEASE_FALLBACK_CONTENT})
list(
APPEND CMAKE_GET_OS_RELEASE_FALLBACK_RESULT
CMAKE_GET_OS_RELEASE_FALLBACK_RESULT_NAME
CMAKE_GET_OS_RELEASE_FALLBACK_RESULT_ID
CMAKE_GET_OS_RELEASE_FALLBACK_RESULT_VERSION
CMAKE_GET_OS_RELEASE_FALLBACK_RESULT_VERSION_ID
)
endif()
unset(CMAKE_GET_OS_RELEASE_FALLBACK_CONTENT)