mirror of
https://github.com/crystalidea/qt-build-tools.git
synced 2025-07-04 16:35:24 +08:00
well, looks like cmake 3.17 is required though
This commit is contained in:
@ -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_check_compiler_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_check_compiler_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_CHECK_COMPILER_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...
|
||||
file(APPEND ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeError.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})
|
||||
file(APPEND ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeError.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()
|
Binary file not shown.
@ -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>
|
@ -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>
|
@ -0,0 +1,24 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<package xmlns="http://schemas.microsoft.com/packaging/2010/07/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_ICONURL_TAG@
|
||||
@_CPACK_NUGET_REQUIRELICENSEACCEPTANCE_TAG@
|
||||
@_CPACK_NUGET_SUMMARY_TAG@
|
||||
@_CPACK_NUGET_RELEASENOTES_TAG@
|
||||
@_CPACK_NUGET_COPYRIGHT_TAG@
|
||||
@_CPACK_NUGET_TAGS_TAG@
|
||||
@_CPACK_NUGET_DEPENDENCIES_TAG@
|
||||
</metadata>
|
||||
@_CPACK_NUGET_FILES_TAG@
|
||||
</package>
|
Binary file not shown.
Binary file not shown.
After Width: | Height: | Size: 362 B |
@ -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>
|
Binary file not shown.
@ -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
|
@ -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.
Binary file not shown.
After Width: | Height: | Size: 43 KiB |
@ -0,0 +1,9 @@
|
||||
<?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@"/>
|
||||
<options allow-external-scripts="no" customize="allow" rootVolumeOnly="false"></options>
|
||||
@CPACK_PACKAGEMAKER_CHOICES@
|
||||
</installer-gui-script>
|
@ -0,0 +1,776 @@
|
||||
# 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(READELF_EXECUTABLE)
|
||||
execute_process(COMMAND "${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(READELF_EXECUTABLE NAMES readelf)
|
||||
|
||||
if(CPACK_DEBIAN_DEBUGINFO_PACKAGE AND CPACK_DEB_UNSTRIPPED_FILES)
|
||||
find_program(OBJCOPY_EXECUTABLE NAMES objcopy)
|
||||
|
||||
if(NOT OBJCOPY_EXECUTABLE)
|
||||
message(FATAL_ERROR "debuginfo packages require the objcopy tool")
|
||||
endif()
|
||||
if(NOT 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 ${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: '${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 ${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: '${OBJCOPY_EXECUTABLE} --only-keep-debug ${_FILE} ${_FILE_DBGSYM}'")
|
||||
endif()
|
||||
execute_process(COMMAND ${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: '${OBJCOPY_EXECUTABLE} --strip-debug ${_FILE}'")
|
||||
endif()
|
||||
execute_process(COMMAND ${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: '${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()
|
||||
|
||||
# Execute dpkg-shlibdeps
|
||||
# --ignore-missing-info : allow dpkg-shlibdeps to run even if some libs do not belong to a package
|
||||
# -O : print to STDOUT
|
||||
execute_process(COMMAND ${SHLIBDEPS_EXECUTABLE} ${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 )
|
||||
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} ${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 frist
|
||||
# line is a pacakge 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(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)
|
||||
foreach(_FILE IN LISTS CPACK_DEB_SHARED_OBJECT_FILES)
|
||||
get_filename_component(_DIR ${_FILE} DIRECTORY)
|
||||
# all files in CPACK_DEB_SHARED_OBJECT_FILES have dot at the beginning
|
||||
if(_DIR STREQUAL "./lib" OR _DIR STREQUAL "./usr/lib")
|
||||
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 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)
|
||||
endif()
|
||||
endfunction()
|
||||
|
||||
cpack_deb_prepare_package_vars()
|
||||
|
||||
cmake_policy(POP)
|
@ -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()
|
@ -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 variable ${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")
|
@ -0,0 +1,354 @@
|
||||
# Distributed under the OSI-approved BSD 3-Clause License. See accompanying
|
||||
# file Copyright.txt or https://cmake.org/licensing for details.
|
||||
|
||||
# Author: Alex Turbov
|
||||
|
||||
if(CMAKE_BINARY_DIR)
|
||||
message(FATAL_ERROR "CPackNuGet.cmake may only be used by CPack internally.")
|
||||
endif()
|
||||
|
||||
function(_cpack_nuget_debug)
|
||||
if(CPACK_NUGET_PACKAGE_DEBUG)
|
||||
message("CPackNuGet:Debug: " ${ARGN})
|
||||
endif()
|
||||
endfunction()
|
||||
|
||||
function(_cpack_nuget_debug_var NAME)
|
||||
if(CPACK_NUGET_PACKAGE_DEBUG)
|
||||
message("CPackNuGet:Debug: ${NAME}=`${${NAME}}`")
|
||||
endif()
|
||||
endfunction()
|
||||
|
||||
function(_cpack_nuget_variable_fallback OUTPUT_VAR_NAME NUGET_VAR_NAME)
|
||||
if(ARGN)
|
||||
list(JOIN ARGN "`, `" _va_args)
|
||||
set(_va_args ", ARGN: `${_va_args}`")
|
||||
endif()
|
||||
_cpack_nuget_debug(
|
||||
"_cpack_nuget_variable_fallback: "
|
||||
"OUTPUT_VAR_NAME=`${OUTPUT_VAR_NAME}`, "
|
||||
"NUGET_VAR_NAME=`${NUGET_VAR_NAME}`"
|
||||
"${_va_args}"
|
||||
)
|
||||
|
||||
set(_options USE_CDATA)
|
||||
set(_one_value_args LIST_GLUE)
|
||||
set(_multi_value_args FALLBACK_VARS)
|
||||
cmake_parse_arguments(PARSE_ARGV 0 _args "${_options}" "${_one_value_args}" "${_multi_value_args}")
|
||||
|
||||
if(CPACK_NUGET_PACKAGE_COMPONENT)
|
||||
string(
|
||||
TOUPPER "${CPACK_NUGET_PACKAGE_COMPONENT}"
|
||||
CPACK_NUGET_PACKAGE_COMPONENT_UPPER
|
||||
)
|
||||
endif()
|
||||
|
||||
if(CPACK_NUGET_PACKAGE_COMPONENT
|
||||
AND CPACK_NUGET_${CPACK_NUGET_PACKAGE_COMPONENT}_PACKAGE_${NUGET_VAR_NAME}
|
||||
)
|
||||
set(
|
||||
_result
|
||||
"${CPACK_NUGET_${CPACK_NUGET_PACKAGE_COMPONENT}_PACKAGE_${NUGET_VAR_NAME}}"
|
||||
)
|
||||
_cpack_nuget_debug(
|
||||
" CPACK_NUGET_${CPACK_NUGET_PACKAGE_COMPONENT}_PACKAGE_${NUGET_VAR_NAME}: "
|
||||
"OUTPUT_VAR_NAME->${OUTPUT_VAR_NAME}=`${_result}`"
|
||||
)
|
||||
|
||||
elseif(CPACK_NUGET_PACKAGE_COMPONENT_UPPER
|
||||
AND CPACK_NUGET_${CPACK_NUGET_PACKAGE_COMPONENT_UPPER}_PACKAGE_${NUGET_VAR_NAME}
|
||||
)
|
||||
set(
|
||||
_result
|
||||
"${CPACK_NUGET_${CPACK_NUGET_PACKAGE_COMPONENT_UPPER}_PACKAGE_${NUGET_VAR_NAME}}"
|
||||
)
|
||||
_cpack_nuget_debug(
|
||||
" CPACK_NUGET_${CPACK_NUGET_PACKAGE_COMPONENT_UPPER}_PACKAGE_${NUGET_VAR_NAME}: "
|
||||
"OUTPUT_VAR_NAME->${OUTPUT_VAR_NAME}=`${_result}`"
|
||||
)
|
||||
|
||||
elseif(CPACK_NUGET_PACKAGE_${NUGET_VAR_NAME})
|
||||
set(_result "${CPACK_NUGET_PACKAGE_${NUGET_VAR_NAME}}")
|
||||
_cpack_nuget_debug(
|
||||
" CPACK_NUGET_PACKAGE_${NUGET_VAR_NAME}: "
|
||||
"OUTPUT_VAR_NAME->${OUTPUT_VAR_NAME}=`${_result}`"
|
||||
)
|
||||
|
||||
else()
|
||||
foreach(_var IN LISTS _args_FALLBACK_VARS)
|
||||
_cpack_nuget_debug(" Fallback: ${_var} ...")
|
||||
if(${_var})
|
||||
_cpack_nuget_debug(" ${_var}=`${${_var}}`")
|
||||
set(_result "${${_var}}")
|
||||
_cpack_nuget_debug(
|
||||
" ${_var}: OUTPUT_VAR_NAME->${OUTPUT_VAR_NAME}=`${_result}`"
|
||||
)
|
||||
break()
|
||||
endif()
|
||||
endforeach()
|
||||
endif()
|
||||
|
||||
if(_result)
|
||||
if(_args_USE_CDATA)
|
||||
set(_value_before "<![CDATA[")
|
||||
set(_value_after "]]>")
|
||||
endif()
|
||||
|
||||
list(LENGTH _result _result_len)
|
||||
if(_result_len GREATER 1 AND _args_LIST_GLUE)
|
||||
list(JOIN _result "${_args_LIST_GLUE}" _result)
|
||||
endif()
|
||||
|
||||
set(${OUTPUT_VAR_NAME} "${_value_before}${_result}${_value_after}" PARENT_SCOPE)
|
||||
endif()
|
||||
|
||||
endfunction()
|
||||
|
||||
function(_cpack_nuget_variable_fallback_and_wrap_into_element ELEMENT NUGET_VAR_NAME)
|
||||
set(_options)
|
||||
set(_one_value_args)
|
||||
set(_multi_value_args FALLBACK_VARS)
|
||||
cmake_parse_arguments(PARSE_ARGV 0 _args "${_options}" "${_one_value_args}" "${_multi_value_args}")
|
||||
|
||||
_cpack_nuget_variable_fallback(_value ${NUGET_VAR_NAME} ${ARGN} USE_CDATA)
|
||||
|
||||
if(_value)
|
||||
string(TOUPPER "${ELEMENT}" _ELEMENT_UP)
|
||||
set(
|
||||
_CPACK_NUGET_${_ELEMENT_UP}_TAG
|
||||
"<${ELEMENT}>${_value}</${ELEMENT}>"
|
||||
PARENT_SCOPE
|
||||
)
|
||||
endif()
|
||||
endfunction()
|
||||
|
||||
# Print some debug info
|
||||
_cpack_nuget_debug("---[CPack NuGet Input Variables]---")
|
||||
_cpack_nuget_debug_var(CPACK_PACKAGE_NAME)
|
||||
_cpack_nuget_debug_var(CPACK_PACKAGE_VERSION)
|
||||
_cpack_nuget_debug_var(CPACK_TOPLEVEL_TAG)
|
||||
_cpack_nuget_debug_var(CPACK_TOPLEVEL_DIRECTORY)
|
||||
_cpack_nuget_debug_var(CPACK_TEMPORARY_DIRECTORY)
|
||||
_cpack_nuget_debug_var(CPACK_NUGET_GROUPS)
|
||||
if(CPACK_NUGET_GROUPS)
|
||||
foreach(_group IN LISTS CPACK_NUGET_GROUPS)
|
||||
string(MAKE_C_IDENTIFIER "${_group}" _group_up)
|
||||
string(TOUPPER "${_group_up}" _group_up)
|
||||
_cpack_nuget_debug_var(CPACK_NUGET_${_group_up}_GROUP_COMPONENTS)
|
||||
endforeach()
|
||||
endif()
|
||||
_cpack_nuget_debug_var(CPACK_NUGET_COMPONENTS)
|
||||
_cpack_nuget_debug_var(CPACK_NUGET_ALL_IN_ONE)
|
||||
_cpack_nuget_debug_var(CPACK_NUGET_ORDINAL_MONOLITIC)
|
||||
_cpack_nuget_debug("-----------------------------------")
|
||||
|
||||
function(_cpack_nuget_render_spec)
|
||||
# Make a variable w/ upper-cased component name
|
||||
if(CPACK_NUGET_PACKAGE_COMPONENT)
|
||||
string(TOUPPER "${CPACK_NUGET_PACKAGE_COMPONENT}" CPACK_NUGET_PACKAGE_COMPONENT_UPPER)
|
||||
endif()
|
||||
|
||||
# Set mandatory variables (not wrapped into XML elements)
|
||||
# https://docs.microsoft.com/en-us/nuget/reference/nuspec#required-metadata-elements
|
||||
if(CPACK_NUGET_PACKAGE_COMPONENT)
|
||||
if(CPACK_NUGET_${CPACK_NUGET_PACKAGE_COMPONENT_UPPER}_PACKAGE_NAME)
|
||||
set(
|
||||
CPACK_NUGET_PACKAGE_NAME
|
||||
"${CPACK_NUGET_${CPACK_NUGET_PACKAGE_COMPONENT_UPPER}_PACKAGE_NAME}"
|
||||
)
|
||||
elseif(NOT CPACK_NUGET_PACKAGE_COMPONENT STREQUAL "Unspecified")
|
||||
set(
|
||||
CPACK_NUGET_PACKAGE_NAME
|
||||
"${CPACK_PACKAGE_NAME}.${CPACK_NUGET_PACKAGE_COMPONENT}"
|
||||
)
|
||||
else()
|
||||
set(CPACK_NUGET_PACKAGE_NAME "${CPACK_PACKAGE_NAME}")
|
||||
endif()
|
||||
elseif(NOT CPACK_NUGET_PACKAGE_NAME)
|
||||
set(CPACK_NUGET_PACKAGE_NAME "${CPACK_PACKAGE_NAME}")
|
||||
endif()
|
||||
|
||||
_cpack_nuget_variable_fallback(
|
||||
CPACK_NUGET_PACKAGE_VERSION VERSION
|
||||
FALLBACK_VARS
|
||||
CPACK_PACKAGE_VERSION
|
||||
)
|
||||
_cpack_nuget_variable_fallback(
|
||||
CPACK_NUGET_PACKAGE_DESCRIPTION DESCRIPTION
|
||||
FALLBACK_VARS
|
||||
CPACK_COMPONENT_${CPACK_NUGET_PACKAGE_COMPONENT}_DESCRIPTION
|
||||
CPACK_COMPONENT_${CPACK_NUGET_PACKAGE_COMPONENT_UPPER}_DESCRIPTION
|
||||
CPACK_COMPONENT_GROUP_${CPACK_NUGET_PACKAGE_COMPONENT_UPPER}_DESCRIPTION
|
||||
CPACK_PACKAGE_DESCRIPTION
|
||||
USE_CDATA
|
||||
)
|
||||
_cpack_nuget_variable_fallback(
|
||||
CPACK_NUGET_PACKAGE_AUTHORS AUTHORS
|
||||
FALLBACK_VARS
|
||||
CPACK_PACKAGE_VENDOR
|
||||
USE_CDATA
|
||||
LIST_GLUE ","
|
||||
)
|
||||
|
||||
# Set optional variables (wrapped into XML elements)
|
||||
# https://docs.microsoft.com/en-us/nuget/reference/nuspec#optional-metadata-elements
|
||||
_cpack_nuget_variable_fallback_and_wrap_into_element(
|
||||
title
|
||||
TITLE
|
||||
FALLBACK_VARS
|
||||
CPACK_COMPONENT_${CPACK_NUGET_PACKAGE_COMPONENT}_DISPLAY_NAME
|
||||
CPACK_COMPONENT_${CPACK_NUGET_PACKAGE_COMPONENT_UPPER}_DISPLAY_NAME
|
||||
CPACK_COMPONENT_GROUP_${CPACK_NUGET_PACKAGE_COMPONENT_UPPER}_DISPLAY_NAME
|
||||
)
|
||||
_cpack_nuget_variable_fallback_and_wrap_into_element(owners OWNERS LIST_GLUE ",")
|
||||
_cpack_nuget_variable_fallback_and_wrap_into_element(
|
||||
projectUrl
|
||||
HOMEPAGE_URL
|
||||
FALLBACK_VARS
|
||||
CPACK_PACKAGE_HOMEPAGE_URL
|
||||
)
|
||||
_cpack_nuget_variable_fallback_and_wrap_into_element(licenseUrl LICENSEURL)
|
||||
_cpack_nuget_variable_fallback_and_wrap_into_element(iconUrl ICONURL)
|
||||
_cpack_nuget_variable_fallback_and_wrap_into_element(
|
||||
summary DESCRIPTION_SUMMARY
|
||||
FALLBACK_VARS
|
||||
CPACK_PACKAGE_DESCRIPTION_SUMMARY
|
||||
)
|
||||
if(CPACK_NUGET_PACKAGE_REQUIRE_LICENSE_ACCEPTANCE)
|
||||
set(
|
||||
_CPACK_NUGET_REQUIRELICENSEACCEPTANCE_TAG
|
||||
"<requireLicenseAcceptance>true</requireLicenseAcceptance>"
|
||||
)
|
||||
endif()
|
||||
_cpack_nuget_variable_fallback_and_wrap_into_element(releaseNotes RELEASE_NOTES)
|
||||
_cpack_nuget_variable_fallback_and_wrap_into_element(copyright COPYRIGHT)
|
||||
_cpack_nuget_variable_fallback_and_wrap_into_element(tags TAGS LIST_GLUE " ")
|
||||
|
||||
# Handle dependencies
|
||||
_cpack_nuget_variable_fallback(_deps DEPENDENCIES)
|
||||
set(_collected_deps)
|
||||
foreach(_dep IN LISTS _deps)
|
||||
_cpack_nuget_debug(" checking dependency `${_dep}`")
|
||||
|
||||
_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)
|
||||
string(APPEND _files " <file src=\"${_comp}\\**\" target=\".\" />\n")
|
||||
endforeach()
|
||||
set(_CPACK_NUGET_FILES_TAG "<files>\n${_files} </files>" PARENT_SCOPE)
|
||||
endfunction()
|
||||
|
||||
find_program(NUGET_EXECUTABLE nuget)
|
||||
_cpack_nuget_debug_var(NUGET_EXECUTABLE)
|
||||
if(NOT NUGET_EXECUTABLE)
|
||||
message(FATAL_ERROR "NuGet executable not found")
|
||||
endif()
|
||||
|
||||
# Add details for debug run
|
||||
if(CPACK_NUGET_PACKAGE_DEBUG)
|
||||
list(APPEND CPACK_NUGET_PACK_ADDITIONAL_OPTIONS "-Verbosity" "detailed")
|
||||
endif()
|
||||
|
||||
# Case one: ordinal all-in-one package
|
||||
if(CPACK_NUGET_ORDINAL_MONOLITIC)
|
||||
# This variable `CPACK_NUGET_ALL_IN_ONE` set by C++ code:
|
||||
# Meaning to pack all installed files into a single package
|
||||
_cpack_nuget_debug("---[Making an ordinal monolitic package]---")
|
||||
_cpack_nuget_render_spec()
|
||||
execute_process(
|
||||
COMMAND "${NUGET_EXECUTABLE}" pack ${CPACK_NUGET_PACK_ADDITIONAL_OPTIONS}
|
||||
WORKING_DIRECTORY "${CPACK_TEMPORARY_DIRECTORY}"
|
||||
)
|
||||
|
||||
elseif(CPACK_NUGET_ALL_IN_ONE)
|
||||
# This variable `CPACK_NUGET_ALL_IN_ONE` set by C++ code:
|
||||
# Meaning to pack all installed components into a single package
|
||||
_cpack_nuget_debug("---[Making a monolitic package from installed components]---")
|
||||
|
||||
# Prepare the `files` element which include files from several components
|
||||
_cpack_nuget_make_files_tag(${CPACK_NUGET_COMPONENTS})
|
||||
_cpack_nuget_render_spec()
|
||||
execute_process(
|
||||
COMMAND "${NUGET_EXECUTABLE}" pack ${CPACK_NUGET_PACK_ADDITIONAL_OPTIONS}
|
||||
WORKING_DIRECTORY "${CPACK_TEMPORARY_DIRECTORY}"
|
||||
)
|
||||
|
||||
else()
|
||||
# Is there any grouped component?
|
||||
if(CPACK_NUGET_GROUPS)
|
||||
_cpack_nuget_debug("---[Making grouped component(s) package(s)]---")
|
||||
foreach(_group IN LISTS CPACK_NUGET_GROUPS)
|
||||
_cpack_nuget_debug("Starting to make the package for group `${_group}`")
|
||||
string(MAKE_C_IDENTIFIER "${_group}" _group_up)
|
||||
string(TOUPPER "${_group_up}" _group_up)
|
||||
|
||||
# Render a spec file which includes all components in the current group
|
||||
unset(_CPACK_NUGET_FILES_TAG)
|
||||
_cpack_nuget_make_files_tag(${CPACK_NUGET_${_group_up}_GROUP_COMPONENTS})
|
||||
# Temporary set `CPACK_NUGET_PACKAGE_COMPONENT` to the group name
|
||||
# to properly collect various per group settings
|
||||
set(CPACK_NUGET_PACKAGE_COMPONENT ${_group})
|
||||
_cpack_nuget_render_spec()
|
||||
unset(CPACK_NUGET_PACKAGE_COMPONENT)
|
||||
execute_process(
|
||||
COMMAND "${NUGET_EXECUTABLE}" pack ${CPACK_NUGET_PACK_ADDITIONAL_OPTIONS}
|
||||
WORKING_DIRECTORY "${CPACK_TEMPORARY_DIRECTORY}"
|
||||
)
|
||||
endforeach()
|
||||
endif()
|
||||
# Is there any single component package needed?
|
||||
if(CPACK_NUGET_COMPONENTS)
|
||||
_cpack_nuget_debug("---[Making single-component(s) package(s)]---")
|
||||
foreach(_comp IN LISTS CPACK_NUGET_COMPONENTS)
|
||||
_cpack_nuget_debug("Starting to make the package for component `${_comp}`")
|
||||
# Render a spec file which includes only given component
|
||||
unset(_CPACK_NUGET_FILES_TAG)
|
||||
_cpack_nuget_make_files_tag(${_comp})
|
||||
# Temporary set `CPACK_NUGET_PACKAGE_COMPONENT` to the current
|
||||
# component name to properly collect various per group settings
|
||||
set(CPACK_NUGET_PACKAGE_COMPONENT ${_comp})
|
||||
_cpack_nuget_render_spec()
|
||||
unset(CPACK_NUGET_PACKAGE_COMPONENT)
|
||||
execute_process(
|
||||
COMMAND "${NUGET_EXECUTABLE}" pack ${CPACK_NUGET_PACK_ADDITIONAL_OPTIONS}
|
||||
WORKING_DIRECTORY "${CPACK_TEMPORARY_DIRECTORY}"
|
||||
)
|
||||
endforeach()
|
||||
endif()
|
||||
endif()
|
||||
|
||||
file(GLOB_RECURSE GEN_CPACK_OUTPUT_FILES "${CPACK_TEMPORARY_DIRECTORY}/*.nupkg")
|
||||
if(NOT GEN_CPACK_OUTPUT_FILES)
|
||||
message(FATAL_ERROR "NuGet package was not generated at `${CPACK_TEMPORARY_DIRECTORY}`!")
|
||||
endif()
|
||||
|
||||
_cpack_nuget_debug("Generated files: ${GEN_CPACK_OUTPUT_FILES}")
|
File diff suppressed because it is too large
Load Diff
@ -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()
|
@ -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()
|
@ -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
|
@ -0,0 +1,978 @@
|
||||
; CPack install script designed for a nmake build
|
||||
|
||||
;--------------------------------
|
||||
; You must define these values
|
||||
|
||||
!define VERSION "@CPACK_PACKAGE_VERSION@"
|
||||
!define PATCH "@CPACK_PACKAGE_VERSION_PATCH@"
|
||||
!define INST_DIR "@CPACK_TEMPORARY_DIRECTORY@"
|
||||
|
||||
;--------------------------------
|
||||
;Variables
|
||||
|
||||
Var MUI_TEMP
|
||||
Var STARTMENU_FOLDER
|
||||
Var SV_ALLUSERS
|
||||
Var START_MENU
|
||||
Var DO_NOT_ADD_TO_PATH
|
||||
Var ADD_TO_PATH_ALL_USERS
|
||||
Var ADD_TO_PATH_CURRENT_USER
|
||||
Var INSTALL_DESKTOP
|
||||
Var IS_DEFAULT_INSTALLDIR
|
||||
;--------------------------------
|
||||
;Include Modern UI
|
||||
|
||||
!include "MUI.nsh"
|
||||
|
||||
;Default installation folder
|
||||
InstallDir "@CPACK_NSIS_INSTALL_ROOT@\@CPACK_PACKAGE_INSTALL_DIRECTORY@"
|
||||
|
||||
;--------------------------------
|
||||
;General
|
||||
|
||||
;Name and file
|
||||
Name "@CPACK_NSIS_PACKAGE_NAME@"
|
||||
OutFile "@CPACK_TOPLEVEL_DIRECTORY@/@CPACK_OUTPUT_FILE_NAME@"
|
||||
|
||||
;Set compression
|
||||
SetCompressor @CPACK_NSIS_COMPRESSOR@
|
||||
|
||||
;Require administrator access
|
||||
RequestExecutionLevel admin
|
||||
|
||||
@CPACK_NSIS_DEFINES@
|
||||
|
||||
!include Sections.nsh
|
||||
|
||||
;--- Component support macros: ---
|
||||
; The code for the add/remove functionality is from:
|
||||
; http://nsis.sourceforge.net/Add/Remove_Functionality
|
||||
; It has been modified slightly and extended to provide
|
||||
; inter-component dependencies.
|
||||
Var AR_SecFlags
|
||||
Var AR_RegFlags
|
||||
@CPACK_NSIS_SECTION_SELECTED_VARS@
|
||||
|
||||
; Loads the "selected" flag for the section named SecName into the
|
||||
; variable VarName.
|
||||
!macro LoadSectionSelectedIntoVar SecName VarName
|
||||
SectionGetFlags ${${SecName}} $${VarName}
|
||||
IntOp $${VarName} $${VarName} & ${SF_SELECTED} ;Turn off all other bits
|
||||
!macroend
|
||||
|
||||
; Loads the value of a variable... can we get around this?
|
||||
!macro LoadVar VarName
|
||||
IntOp $R0 0 + $${VarName}
|
||||
!macroend
|
||||
|
||||
; Sets the value of a variable
|
||||
!macro StoreVar VarName IntValue
|
||||
IntOp $${VarName} 0 + ${IntValue}
|
||||
!macroend
|
||||
|
||||
!macro InitSection SecName
|
||||
; This macro reads component installed flag from the registry and
|
||||
;changes checked state of the section on the components page.
|
||||
;Input: section index constant name specified in Section command.
|
||||
|
||||
ClearErrors
|
||||
;Reading component status from registry
|
||||
ReadRegDWORD $AR_RegFlags HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\@CPACK_PACKAGE_INSTALL_REGISTRY_KEY@\Components\${SecName}" "Installed"
|
||||
IfErrors "default_${SecName}"
|
||||
;Status will stay default if registry value not found
|
||||
;(component was never installed)
|
||||
IntOp $AR_RegFlags $AR_RegFlags & ${SF_SELECTED} ;Turn off all other bits
|
||||
SectionGetFlags ${${SecName}} $AR_SecFlags ;Reading default section flags
|
||||
IntOp $AR_SecFlags $AR_SecFlags & 0xFFFE ;Turn lowest (enabled) bit off
|
||||
IntOp $AR_SecFlags $AR_RegFlags | $AR_SecFlags ;Change lowest bit
|
||||
|
||||
; Note whether this component was installed before
|
||||
!insertmacro StoreVar ${SecName}_was_installed $AR_RegFlags
|
||||
IntOp $R0 $AR_RegFlags & $AR_RegFlags
|
||||
|
||||
;Writing modified flags
|
||||
SectionSetFlags ${${SecName}} $AR_SecFlags
|
||||
|
||||
"default_${SecName}:"
|
||||
!insertmacro LoadSectionSelectedIntoVar ${SecName} ${SecName}_selected
|
||||
!macroend
|
||||
|
||||
!macro FinishSection SecName
|
||||
; This macro reads section flag set by user and removes the section
|
||||
;if it is not selected.
|
||||
;Then it writes component installed flag to registry
|
||||
;Input: section index constant name specified in Section command.
|
||||
|
||||
SectionGetFlags ${${SecName}} $AR_SecFlags ;Reading section flags
|
||||
;Checking lowest bit:
|
||||
IntOp $AR_SecFlags $AR_SecFlags & ${SF_SELECTED}
|
||||
IntCmp $AR_SecFlags 1 "leave_${SecName}"
|
||||
;Section is not selected:
|
||||
;Calling Section uninstall macro and writing zero installed flag
|
||||
!insertmacro "Remove_${${SecName}}"
|
||||
WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\@CPACK_PACKAGE_INSTALL_REGISTRY_KEY@\Components\${SecName}" \
|
||||
"Installed" 0
|
||||
Goto "exit_${SecName}"
|
||||
|
||||
"leave_${SecName}:"
|
||||
;Section is selected:
|
||||
WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\@CPACK_PACKAGE_INSTALL_REGISTRY_KEY@\Components\${SecName}" \
|
||||
"Installed" 1
|
||||
|
||||
"exit_${SecName}:"
|
||||
!macroend
|
||||
|
||||
!macro RemoveSection_CPack SecName
|
||||
; This macro is used to call section's Remove_... macro
|
||||
;from the uninstaller.
|
||||
;Input: section index constant name specified in Section command.
|
||||
|
||||
!insertmacro "Remove_${${SecName}}"
|
||||
!macroend
|
||||
|
||||
; Determine whether the selection of SecName changed
|
||||
!macro MaybeSelectionChanged SecName
|
||||
!insertmacro LoadVar ${SecName}_selected
|
||||
SectionGetFlags ${${SecName}} $R1
|
||||
IntOp $R1 $R1 & ${SF_SELECTED} ;Turn off all other bits
|
||||
|
||||
; See if the status has changed:
|
||||
IntCmp $R0 $R1 "${SecName}_unchanged"
|
||||
!insertmacro LoadSectionSelectedIntoVar ${SecName} ${SecName}_selected
|
||||
|
||||
IntCmp $R1 ${SF_SELECTED} "${SecName}_was_selected"
|
||||
!insertmacro "Deselect_required_by_${SecName}"
|
||||
goto "${SecName}_unchanged"
|
||||
|
||||
"${SecName}_was_selected:"
|
||||
!insertmacro "Select_${SecName}_depends"
|
||||
|
||||
"${SecName}_unchanged:"
|
||||
!macroend
|
||||
;--- End of Add/Remove macros ---
|
||||
|
||||
;--------------------------------
|
||||
;Interface Settings
|
||||
|
||||
!define MUI_HEADERIMAGE
|
||||
!define MUI_ABORTWARNING
|
||||
|
||||
;----------------------------------------
|
||||
; based upon a script of "Written by KiCHiK 2003-01-18 05:57:02"
|
||||
;----------------------------------------
|
||||
!verbose 3
|
||||
!include "WinMessages.NSH"
|
||||
!verbose 4
|
||||
;====================================================
|
||||
; get_NT_environment
|
||||
; Returns: the selected environment
|
||||
; Output : head of the stack
|
||||
;====================================================
|
||||
!macro select_NT_profile UN
|
||||
Function ${UN}select_NT_profile
|
||||
StrCmp $ADD_TO_PATH_ALL_USERS "1" 0 environment_single
|
||||
DetailPrint "Selected environment for all users"
|
||||
Push "all"
|
||||
Return
|
||||
environment_single:
|
||||
DetailPrint "Selected environment for current user only."
|
||||
Push "current"
|
||||
Return
|
||||
FunctionEnd
|
||||
!macroend
|
||||
!insertmacro select_NT_profile ""
|
||||
!insertmacro select_NT_profile "un."
|
||||
;----------------------------------------------------
|
||||
!define NT_current_env 'HKCU "Environment"'
|
||||
!define NT_all_env 'HKLM "SYSTEM\CurrentControlSet\Control\Session Manager\Environment"'
|
||||
|
||||
!ifndef WriteEnvStr_RegKey
|
||||
!ifdef ALL_USERS
|
||||
!define WriteEnvStr_RegKey \
|
||||
'HKLM "SYSTEM\CurrentControlSet\Control\Session Manager\Environment"'
|
||||
!else
|
||||
!define WriteEnvStr_RegKey 'HKCU "Environment"'
|
||||
!endif
|
||||
!endif
|
||||
|
||||
; AddToPath - Adds the given dir to the search path.
|
||||
; Input - head of the stack
|
||||
; Note - Win9x systems requires reboot
|
||||
|
||||
Function AddToPath
|
||||
Exch $0
|
||||
Push $1
|
||||
Push $2
|
||||
Push $3
|
||||
|
||||
# don't add if the path doesn't exist
|
||||
IfFileExists "$0\*.*" "" AddToPath_done
|
||||
|
||||
ReadEnvStr $1 PATH
|
||||
; if the path is too long for a NSIS variable NSIS will return a 0
|
||||
; length string. If we find that, then warn and skip any path
|
||||
; modification as it will trash the existing path.
|
||||
StrLen $2 $1
|
||||
IntCmp $2 0 CheckPathLength_ShowPathWarning CheckPathLength_Done CheckPathLength_Done
|
||||
CheckPathLength_ShowPathWarning:
|
||||
Messagebox MB_OK|MB_ICONEXCLAMATION "Warning! PATH too long installer unable to modify PATH!"
|
||||
Goto AddToPath_done
|
||||
CheckPathLength_Done:
|
||||
Push "$1;"
|
||||
Push "$0;"
|
||||
Call StrStr
|
||||
Pop $2
|
||||
StrCmp $2 "" "" AddToPath_done
|
||||
Push "$1;"
|
||||
Push "$0\;"
|
||||
Call StrStr
|
||||
Pop $2
|
||||
StrCmp $2 "" "" AddToPath_done
|
||||
GetFullPathName /SHORT $3 $0
|
||||
Push "$1;"
|
||||
Push "$3;"
|
||||
Call StrStr
|
||||
Pop $2
|
||||
StrCmp $2 "" "" AddToPath_done
|
||||
Push "$1;"
|
||||
Push "$3\;"
|
||||
Call StrStr
|
||||
Pop $2
|
||||
StrCmp $2 "" "" AddToPath_done
|
||||
|
||||
Call IsNT
|
||||
Pop $1
|
||||
StrCmp $1 1 AddToPath_NT
|
||||
; Not on NT
|
||||
StrCpy $1 $WINDIR 2
|
||||
FileOpen $1 "$1\autoexec.bat" a
|
||||
FileSeek $1 -1 END
|
||||
FileReadByte $1 $2
|
||||
IntCmp $2 26 0 +2 +2 # DOS EOF
|
||||
FileSeek $1 -1 END # write over EOF
|
||||
FileWrite $1 "$\r$\nSET PATH=%PATH%;$3$\r$\n"
|
||||
FileClose $1
|
||||
SetRebootFlag true
|
||||
Goto AddToPath_done
|
||||
|
||||
AddToPath_NT:
|
||||
StrCmp $ADD_TO_PATH_ALL_USERS "1" ReadAllKey
|
||||
ReadRegStr $1 ${NT_current_env} "PATH"
|
||||
Goto DoTrim
|
||||
ReadAllKey:
|
||||
ReadRegStr $1 ${NT_all_env} "PATH"
|
||||
DoTrim:
|
||||
StrCmp $1 "" AddToPath_NTdoIt
|
||||
Push $1
|
||||
Call Trim
|
||||
Pop $1
|
||||
StrCpy $0 "$1;$0"
|
||||
AddToPath_NTdoIt:
|
||||
StrCmp $ADD_TO_PATH_ALL_USERS "1" WriteAllKey
|
||||
WriteRegExpandStr ${NT_current_env} "PATH" $0
|
||||
Goto DoSend
|
||||
WriteAllKey:
|
||||
WriteRegExpandStr ${NT_all_env} "PATH" $0
|
||||
DoSend:
|
||||
SendMessage ${HWND_BROADCAST} ${WM_WININICHANGE} 0 "STR:Environment" /TIMEOUT=5000
|
||||
|
||||
AddToPath_done:
|
||||
Pop $3
|
||||
Pop $2
|
||||
Pop $1
|
||||
Pop $0
|
||||
FunctionEnd
|
||||
|
||||
|
||||
; RemoveFromPath - Remove a given dir from the path
|
||||
; Input: head of the stack
|
||||
|
||||
Function un.RemoveFromPath
|
||||
Exch $0
|
||||
Push $1
|
||||
Push $2
|
||||
Push $3
|
||||
Push $4
|
||||
Push $5
|
||||
Push $6
|
||||
|
||||
IntFmt $6 "%c" 26 # DOS EOF
|
||||
|
||||
Call un.IsNT
|
||||
Pop $1
|
||||
StrCmp $1 1 unRemoveFromPath_NT
|
||||
; Not on NT
|
||||
StrCpy $1 $WINDIR 2
|
||||
FileOpen $1 "$1\autoexec.bat" r
|
||||
GetTempFileName $4
|
||||
FileOpen $2 $4 w
|
||||
GetFullPathName /SHORT $0 $0
|
||||
StrCpy $0 "SET PATH=%PATH%;$0"
|
||||
Goto unRemoveFromPath_dosLoop
|
||||
|
||||
unRemoveFromPath_dosLoop:
|
||||
FileRead $1 $3
|
||||
StrCpy $5 $3 1 -1 # read last char
|
||||
StrCmp $5 $6 0 +2 # if DOS EOF
|
||||
StrCpy $3 $3 -1 # remove DOS EOF so we can compare
|
||||
StrCmp $3 "$0$\r$\n" unRemoveFromPath_dosLoopRemoveLine
|
||||
StrCmp $3 "$0$\n" unRemoveFromPath_dosLoopRemoveLine
|
||||
StrCmp $3 "$0" unRemoveFromPath_dosLoopRemoveLine
|
||||
StrCmp $3 "" unRemoveFromPath_dosLoopEnd
|
||||
FileWrite $2 $3
|
||||
Goto unRemoveFromPath_dosLoop
|
||||
unRemoveFromPath_dosLoopRemoveLine:
|
||||
SetRebootFlag true
|
||||
Goto unRemoveFromPath_dosLoop
|
||||
|
||||
unRemoveFromPath_dosLoopEnd:
|
||||
FileClose $2
|
||||
FileClose $1
|
||||
StrCpy $1 $WINDIR 2
|
||||
Delete "$1\autoexec.bat"
|
||||
CopyFiles /SILENT $4 "$1\autoexec.bat"
|
||||
Delete $4
|
||||
Goto unRemoveFromPath_done
|
||||
|
||||
unRemoveFromPath_NT:
|
||||
StrCmp $ADD_TO_PATH_ALL_USERS "1" unReadAllKey
|
||||
ReadRegStr $1 ${NT_current_env} "PATH"
|
||||
Goto unDoTrim
|
||||
unReadAllKey:
|
||||
ReadRegStr $1 ${NT_all_env} "PATH"
|
||||
unDoTrim:
|
||||
StrCpy $5 $1 1 -1 # copy last char
|
||||
StrCmp $5 ";" +2 # if last char != ;
|
||||
StrCpy $1 "$1;" # append ;
|
||||
Push $1
|
||||
Push "$0;"
|
||||
Call un.StrStr ; Find `$0;` in $1
|
||||
Pop $2 ; pos of our dir
|
||||
StrCmp $2 "" unRemoveFromPath_done
|
||||
; else, it is in path
|
||||
# $0 - path to add
|
||||
# $1 - path var
|
||||
StrLen $3 "$0;"
|
||||
StrLen $4 $2
|
||||
StrCpy $5 $1 -$4 # $5 is now the part before the path to remove
|
||||
StrCpy $6 $2 "" $3 # $6 is now the part after the path to remove
|
||||
StrCpy $3 $5$6
|
||||
|
||||
StrCpy $5 $3 1 -1 # copy last char
|
||||
StrCmp $5 ";" 0 +2 # if last char == ;
|
||||
StrCpy $3 $3 -1 # remove last char
|
||||
|
||||
StrCmp $ADD_TO_PATH_ALL_USERS "1" unWriteAllKey
|
||||
WriteRegExpandStr ${NT_current_env} "PATH" $3
|
||||
Goto unDoSend
|
||||
unWriteAllKey:
|
||||
WriteRegExpandStr ${NT_all_env} "PATH" $3
|
||||
unDoSend:
|
||||
SendMessage ${HWND_BROADCAST} ${WM_WININICHANGE} 0 "STR:Environment" /TIMEOUT=5000
|
||||
|
||||
unRemoveFromPath_done:
|
||||
Pop $6
|
||||
Pop $5
|
||||
Pop $4
|
||||
Pop $3
|
||||
Pop $2
|
||||
Pop $1
|
||||
Pop $0
|
||||
FunctionEnd
|
||||
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
; Uninstall sutff
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
|
||||
###########################################
|
||||
# Utility Functions #
|
||||
###########################################
|
||||
|
||||
;====================================================
|
||||
; IsNT - Returns 1 if the current system is NT, 0
|
||||
; otherwise.
|
||||
; Output: head of the stack
|
||||
;====================================================
|
||||
; IsNT
|
||||
; no input
|
||||
; output, top of the stack = 1 if NT or 0 if not
|
||||
;
|
||||
; Usage:
|
||||
; Call IsNT
|
||||
; Pop $R0
|
||||
; ($R0 at this point is 1 or 0)
|
||||
|
||||
!macro IsNT un
|
||||
Function ${un}IsNT
|
||||
Push $0
|
||||
ReadRegStr $0 HKLM "SOFTWARE\Microsoft\Windows NT\CurrentVersion" CurrentVersion
|
||||
StrCmp $0 "" 0 IsNT_yes
|
||||
; we are not NT.
|
||||
Pop $0
|
||||
Push 0
|
||||
Return
|
||||
|
||||
IsNT_yes:
|
||||
; NT!!!
|
||||
Pop $0
|
||||
Push 1
|
||||
FunctionEnd
|
||||
!macroend
|
||||
!insertmacro IsNT ""
|
||||
!insertmacro IsNT "un."
|
||||
|
||||
; StrStr
|
||||
; input, top of stack = string to search for
|
||||
; top of stack-1 = string to search in
|
||||
; output, top of stack (replaces with the portion of the string remaining)
|
||||
; modifies no other variables.
|
||||
;
|
||||
; Usage:
|
||||
; Push "this is a long ass string"
|
||||
; Push "ass"
|
||||
; Call StrStr
|
||||
; Pop $R0
|
||||
; ($R0 at this point is "ass string")
|
||||
|
||||
!macro StrStr un
|
||||
Function ${un}StrStr
|
||||
Exch $R1 ; st=haystack,old$R1, $R1=needle
|
||||
Exch ; st=old$R1,haystack
|
||||
Exch $R2 ; st=old$R1,old$R2, $R2=haystack
|
||||
Push $R3
|
||||
Push $R4
|
||||
Push $R5
|
||||
StrLen $R3 $R1
|
||||
StrCpy $R4 0
|
||||
; $R1=needle
|
||||
; $R2=haystack
|
||||
; $R3=len(needle)
|
||||
; $R4=cnt
|
||||
; $R5=tmp
|
||||
loop:
|
||||
StrCpy $R5 $R2 $R3 $R4
|
||||
StrCmp $R5 $R1 done
|
||||
StrCmp $R5 "" done
|
||||
IntOp $R4 $R4 + 1
|
||||
Goto loop
|
||||
done:
|
||||
StrCpy $R1 $R2 "" $R4
|
||||
Pop $R5
|
||||
Pop $R4
|
||||
Pop $R3
|
||||
Pop $R2
|
||||
Exch $R1
|
||||
FunctionEnd
|
||||
!macroend
|
||||
!insertmacro StrStr ""
|
||||
!insertmacro StrStr "un."
|
||||
|
||||
Function Trim ; Added by Pelaca
|
||||
Exch $R1
|
||||
Push $R2
|
||||
Loop:
|
||||
StrCpy $R2 "$R1" 1 -1
|
||||
StrCmp "$R2" " " RTrim
|
||||
StrCmp "$R2" "$\n" RTrim
|
||||
StrCmp "$R2" "$\r" RTrim
|
||||
StrCmp "$R2" ";" RTrim
|
||||
GoTo Done
|
||||
RTrim:
|
||||
StrCpy $R1 "$R1" -1
|
||||
Goto Loop
|
||||
Done:
|
||||
Pop $R2
|
||||
Exch $R1
|
||||
FunctionEnd
|
||||
|
||||
Function ConditionalAddToRegisty
|
||||
Pop $0
|
||||
Pop $1
|
||||
StrCmp "$0" "" ConditionalAddToRegisty_EmptyString
|
||||
WriteRegStr SHCTX "Software\Microsoft\Windows\CurrentVersion\Uninstall\@CPACK_PACKAGE_INSTALL_REGISTRY_KEY@" \
|
||||
"$1" "$0"
|
||||
;MessageBox MB_OK "Set Registry: '$1' to '$0'"
|
||||
DetailPrint "Set install registry entry: '$1' to '$0'"
|
||||
ConditionalAddToRegisty_EmptyString:
|
||||
FunctionEnd
|
||||
|
||||
;--------------------------------
|
||||
|
||||
!ifdef CPACK_USES_DOWNLOAD
|
||||
Function DownloadFile
|
||||
IfFileExists $INSTDIR\* +2
|
||||
CreateDirectory $INSTDIR
|
||||
Pop $0
|
||||
|
||||
; Skip if already downloaded
|
||||
IfFileExists $INSTDIR\$0 0 +2
|
||||
Return
|
||||
|
||||
StrCpy $1 "@CPACK_DOWNLOAD_SITE@"
|
||||
|
||||
try_again:
|
||||
NSISdl::download "$1/$0" "$INSTDIR\$0"
|
||||
|
||||
Pop $1
|
||||
StrCmp $1 "success" success
|
||||
StrCmp $1 "Cancelled" cancel
|
||||
MessageBox MB_OK "Download failed: $1"
|
||||
cancel:
|
||||
Return
|
||||
success:
|
||||
FunctionEnd
|
||||
!endif
|
||||
|
||||
;--------------------------------
|
||||
; Define some macro setting for the gui
|
||||
@CPACK_NSIS_INSTALLER_MUI_ICON_CODE@
|
||||
@CPACK_NSIS_INSTALLER_ICON_CODE@
|
||||
@CPACK_NSIS_INSTALLER_MUI_WELCOMEFINISH_CODE@
|
||||
@CPACK_NSIS_INSTALLER_MUI_UNWELCOMEFINISH_CODE@
|
||||
@CPACK_NSIS_INSTALLER_MUI_COMPONENTS_DESC@
|
||||
@CPACK_NSIS_INSTALLER_MUI_FINISHPAGE_RUN_CODE@
|
||||
|
||||
;--------------------------------
|
||||
;Pages
|
||||
@CPACK_NSIS_INSTALLER_WELCOME_TITLE_CODE@
|
||||
@CPACK_NSIS_INSTALLER_WELCOME_TITLE_3LINES_CODE@
|
||||
!insertmacro MUI_PAGE_WELCOME
|
||||
|
||||
!insertmacro MUI_PAGE_LICENSE "@CPACK_RESOURCE_FILE_LICENSE@"
|
||||
Page custom InstallOptionsPage
|
||||
!insertmacro MUI_PAGE_DIRECTORY
|
||||
|
||||
;Start Menu Folder Page Configuration
|
||||
!define MUI_STARTMENUPAGE_REGISTRY_ROOT "SHCTX"
|
||||
!define MUI_STARTMENUPAGE_REGISTRY_KEY "Software\@CPACK_PACKAGE_VENDOR@\@CPACK_PACKAGE_INSTALL_REGISTRY_KEY@"
|
||||
!define MUI_STARTMENUPAGE_REGISTRY_VALUENAME "Start Menu Folder"
|
||||
!insertmacro MUI_PAGE_STARTMENU Application $STARTMENU_FOLDER
|
||||
|
||||
@CPACK_NSIS_PAGE_COMPONENTS@
|
||||
|
||||
!insertmacro MUI_PAGE_INSTFILES
|
||||
@CPACK_NSIS_INSTALLER_FINISH_TITLE_CODE@
|
||||
@CPACK_NSIS_INSTALLER_FINISH_TITLE_3LINES_CODE@
|
||||
!insertmacro MUI_PAGE_FINISH
|
||||
|
||||
!insertmacro MUI_UNPAGE_CONFIRM
|
||||
!insertmacro MUI_UNPAGE_INSTFILES
|
||||
|
||||
;--------------------------------
|
||||
;Languages
|
||||
|
||||
!insertmacro MUI_LANGUAGE "English" ;first language is the default language
|
||||
!insertmacro MUI_LANGUAGE "Albanian"
|
||||
!insertmacro MUI_LANGUAGE "Arabic"
|
||||
!insertmacro MUI_LANGUAGE "Basque"
|
||||
!insertmacro MUI_LANGUAGE "Belarusian"
|
||||
!insertmacro MUI_LANGUAGE "Bosnian"
|
||||
!insertmacro MUI_LANGUAGE "Breton"
|
||||
!insertmacro MUI_LANGUAGE "Bulgarian"
|
||||
!insertmacro MUI_LANGUAGE "Croatian"
|
||||
!insertmacro MUI_LANGUAGE "Czech"
|
||||
!insertmacro MUI_LANGUAGE "Danish"
|
||||
!insertmacro MUI_LANGUAGE "Dutch"
|
||||
!insertmacro MUI_LANGUAGE "Estonian"
|
||||
!insertmacro MUI_LANGUAGE "Farsi"
|
||||
!insertmacro MUI_LANGUAGE "Finnish"
|
||||
!insertmacro MUI_LANGUAGE "French"
|
||||
!insertmacro MUI_LANGUAGE "German"
|
||||
!insertmacro MUI_LANGUAGE "Greek"
|
||||
!insertmacro MUI_LANGUAGE "Hebrew"
|
||||
!insertmacro MUI_LANGUAGE "Hungarian"
|
||||
!insertmacro MUI_LANGUAGE "Icelandic"
|
||||
!insertmacro MUI_LANGUAGE "Indonesian"
|
||||
!insertmacro MUI_LANGUAGE "Irish"
|
||||
!insertmacro MUI_LANGUAGE "Italian"
|
||||
!insertmacro MUI_LANGUAGE "Japanese"
|
||||
!insertmacro MUI_LANGUAGE "Korean"
|
||||
!insertmacro MUI_LANGUAGE "Kurdish"
|
||||
!insertmacro MUI_LANGUAGE "Latvian"
|
||||
!insertmacro MUI_LANGUAGE "Lithuanian"
|
||||
!insertmacro MUI_LANGUAGE "Luxembourgish"
|
||||
!insertmacro MUI_LANGUAGE "Macedonian"
|
||||
!insertmacro MUI_LANGUAGE "Malay"
|
||||
!insertmacro MUI_LANGUAGE "Mongolian"
|
||||
!insertmacro MUI_LANGUAGE "Norwegian"
|
||||
!insertmacro MUI_LANGUAGE "Polish"
|
||||
!insertmacro MUI_LANGUAGE "Portuguese"
|
||||
!insertmacro MUI_LANGUAGE "PortugueseBR"
|
||||
!insertmacro MUI_LANGUAGE "Romanian"
|
||||
!insertmacro MUI_LANGUAGE "Russian"
|
||||
!insertmacro MUI_LANGUAGE "Serbian"
|
||||
!insertmacro MUI_LANGUAGE "SerbianLatin"
|
||||
!insertmacro MUI_LANGUAGE "SimpChinese"
|
||||
!insertmacro MUI_LANGUAGE "Slovak"
|
||||
!insertmacro MUI_LANGUAGE "Slovenian"
|
||||
!insertmacro MUI_LANGUAGE "Spanish"
|
||||
!insertmacro MUI_LANGUAGE "Swedish"
|
||||
!insertmacro MUI_LANGUAGE "Thai"
|
||||
!insertmacro MUI_LANGUAGE "TradChinese"
|
||||
!insertmacro MUI_LANGUAGE "Turkish"
|
||||
!insertmacro MUI_LANGUAGE "Ukrainian"
|
||||
!insertmacro MUI_LANGUAGE "Welsh"
|
||||
|
||||
;--------------------------------
|
||||
;Reserve Files
|
||||
|
||||
;These files should be inserted before other files in the data block
|
||||
;Keep these lines before any File command
|
||||
;Only for solid compression (by default, solid compression is enabled for BZIP2 and LZMA)
|
||||
|
||||
ReserveFile "NSIS.InstallOptions.ini"
|
||||
!insertmacro MUI_RESERVEFILE_INSTALLOPTIONS
|
||||
|
||||
; for UserInfo::GetName and UserInfo::GetAccountType
|
||||
ReserveFile /plugin 'UserInfo.dll'
|
||||
|
||||
;--------------------------------
|
||||
; Installation types
|
||||
@CPACK_NSIS_INSTALLATION_TYPES@
|
||||
|
||||
;--------------------------------
|
||||
; Component sections
|
||||
@CPACK_NSIS_COMPONENT_SECTIONS@
|
||||
|
||||
;--------------------------------
|
||||
;Installer Sections
|
||||
|
||||
Section "-Core installation"
|
||||
;Use the entire tree produced by the INSTALL target. Keep the
|
||||
;list of directories here in sync with the RMDir commands below.
|
||||
SetOutPath "$INSTDIR"
|
||||
@CPACK_NSIS_EXTRA_PREINSTALL_COMMANDS@
|
||||
@CPACK_NSIS_FULL_INSTALL@
|
||||
|
||||
;Store installation folder
|
||||
WriteRegStr SHCTX "Software\@CPACK_PACKAGE_VENDOR@\@CPACK_PACKAGE_INSTALL_REGISTRY_KEY@" "" $INSTDIR
|
||||
|
||||
;Create uninstaller
|
||||
WriteUninstaller "$INSTDIR\@CPACK_NSIS_UNINSTALL_NAME@.exe"
|
||||
Push "DisplayName"
|
||||
Push "@CPACK_NSIS_DISPLAY_NAME@"
|
||||
Call ConditionalAddToRegisty
|
||||
Push "DisplayVersion"
|
||||
Push "@CPACK_PACKAGE_VERSION@"
|
||||
Call ConditionalAddToRegisty
|
||||
Push "Publisher"
|
||||
Push "@CPACK_PACKAGE_VENDOR@"
|
||||
Call ConditionalAddToRegisty
|
||||
Push "UninstallString"
|
||||
Push "$INSTDIR\@CPACK_NSIS_UNINSTALL_NAME@.exe"
|
||||
Call ConditionalAddToRegisty
|
||||
Push "NoRepair"
|
||||
Push "1"
|
||||
Call ConditionalAddToRegisty
|
||||
|
||||
!ifdef CPACK_NSIS_ADD_REMOVE
|
||||
;Create add/remove functionality
|
||||
Push "ModifyPath"
|
||||
Push "$INSTDIR\AddRemove.exe"
|
||||
Call ConditionalAddToRegisty
|
||||
!else
|
||||
Push "NoModify"
|
||||
Push "1"
|
||||
Call ConditionalAddToRegisty
|
||||
!endif
|
||||
|
||||
; Optional registration
|
||||
Push "DisplayIcon"
|
||||
Push "$INSTDIR\@CPACK_NSIS_INSTALLED_ICON_NAME@"
|
||||
Call ConditionalAddToRegisty
|
||||
Push "HelpLink"
|
||||
Push "@CPACK_NSIS_HELP_LINK@"
|
||||
Call ConditionalAddToRegisty
|
||||
Push "URLInfoAbout"
|
||||
Push "@CPACK_NSIS_URL_INFO_ABOUT@"
|
||||
Call ConditionalAddToRegisty
|
||||
Push "Contact"
|
||||
Push "@CPACK_NSIS_CONTACT@"
|
||||
Call ConditionalAddToRegisty
|
||||
!insertmacro MUI_INSTALLOPTIONS_READ $INSTALL_DESKTOP "NSIS.InstallOptions.ini" "Field 5" "State"
|
||||
!insertmacro MUI_STARTMENU_WRITE_BEGIN Application
|
||||
|
||||
;Create shortcuts
|
||||
CreateDirectory "$SMPROGRAMS\$STARTMENU_FOLDER"
|
||||
@CPACK_NSIS_CREATE_ICONS@
|
||||
@CPACK_NSIS_CREATE_ICONS_EXTRA@
|
||||
CreateShortCut "$SMPROGRAMS\$STARTMENU_FOLDER\Uninstall.lnk" "$INSTDIR\@CPACK_NSIS_UNINSTALL_NAME@.exe"
|
||||
|
||||
;Read a value from an InstallOptions INI file
|
||||
!insertmacro MUI_INSTALLOPTIONS_READ $DO_NOT_ADD_TO_PATH "NSIS.InstallOptions.ini" "Field 2" "State"
|
||||
!insertmacro MUI_INSTALLOPTIONS_READ $ADD_TO_PATH_ALL_USERS "NSIS.InstallOptions.ini" "Field 3" "State"
|
||||
!insertmacro MUI_INSTALLOPTIONS_READ $ADD_TO_PATH_CURRENT_USER "NSIS.InstallOptions.ini" "Field 4" "State"
|
||||
|
||||
; Write special uninstall registry entries
|
||||
Push "StartMenu"
|
||||
Push "$STARTMENU_FOLDER"
|
||||
Call ConditionalAddToRegisty
|
||||
Push "DoNotAddToPath"
|
||||
Push "$DO_NOT_ADD_TO_PATH"
|
||||
Call ConditionalAddToRegisty
|
||||
Push "AddToPathAllUsers"
|
||||
Push "$ADD_TO_PATH_ALL_USERS"
|
||||
Call ConditionalAddToRegisty
|
||||
Push "AddToPathCurrentUser"
|
||||
Push "$ADD_TO_PATH_CURRENT_USER"
|
||||
Call ConditionalAddToRegisty
|
||||
Push "InstallToDesktop"
|
||||
Push "$INSTALL_DESKTOP"
|
||||
Call ConditionalAddToRegisty
|
||||
|
||||
!insertmacro MUI_STARTMENU_WRITE_END
|
||||
|
||||
@CPACK_NSIS_EXTRA_INSTALL_COMMANDS@
|
||||
|
||||
SectionEnd
|
||||
|
||||
Section "-Add to path"
|
||||
Push $INSTDIR\bin
|
||||
StrCmp "@CPACK_NSIS_MODIFY_PATH@" "ON" 0 doNotAddToPath
|
||||
StrCmp $DO_NOT_ADD_TO_PATH "1" doNotAddToPath 0
|
||||
Call AddToPath
|
||||
doNotAddToPath:
|
||||
SectionEnd
|
||||
|
||||
;--------------------------------
|
||||
; Create custom pages
|
||||
Function InstallOptionsPage
|
||||
!insertmacro MUI_HEADER_TEXT "Install Options" "Choose options for installing @CPACK_NSIS_PACKAGE_NAME@"
|
||||
!insertmacro MUI_INSTALLOPTIONS_DISPLAY "NSIS.InstallOptions.ini"
|
||||
|
||||
FunctionEnd
|
||||
|
||||
;--------------------------------
|
||||
; determine admin versus local install
|
||||
Function un.onInit
|
||||
|
||||
ClearErrors
|
||||
UserInfo::GetName
|
||||
IfErrors noLM
|
||||
Pop $0
|
||||
UserInfo::GetAccountType
|
||||
Pop $1
|
||||
StrCmp $1 "Admin" 0 +3
|
||||
SetShellVarContext all
|
||||
;MessageBox MB_OK 'User "$0" is in the Admin group'
|
||||
Goto done
|
||||
StrCmp $1 "Power" 0 +3
|
||||
SetShellVarContext all
|
||||
;MessageBox MB_OK 'User "$0" is in the Power Users group'
|
||||
Goto done
|
||||
|
||||
noLM:
|
||||
;Get installation folder from registry if available
|
||||
|
||||
done:
|
||||
|
||||
FunctionEnd
|
||||
|
||||
;--- Add/Remove callback functions: ---
|
||||
!macro SectionList MacroName
|
||||
;This macro used to perform operation on multiple sections.
|
||||
;List all of your components in following manner here.
|
||||
@CPACK_NSIS_COMPONENT_SECTION_LIST@
|
||||
!macroend
|
||||
|
||||
Section -FinishComponents
|
||||
;Removes unselected components and writes component status to registry
|
||||
!insertmacro SectionList "FinishSection"
|
||||
|
||||
!ifdef CPACK_NSIS_ADD_REMOVE
|
||||
; Get the name of the installer executable
|
||||
System::Call 'kernel32::GetModuleFileNameA(i 0, t .R0, i 1024) i r1'
|
||||
StrCpy $R3 $R0
|
||||
|
||||
; Strip off the last 13 characters, to see if we have AddRemove.exe
|
||||
StrLen $R1 $R0
|
||||
IntOp $R1 $R0 - 13
|
||||
StrCpy $R2 $R0 13 $R1
|
||||
StrCmp $R2 "AddRemove.exe" addremove_installed
|
||||
|
||||
; We're not running AddRemove.exe, so install it
|
||||
CopyFiles $R3 $INSTDIR\AddRemove.exe
|
||||
|
||||
addremove_installed:
|
||||
!endif
|
||||
SectionEnd
|
||||
;--- End of Add/Remove callback functions ---
|
||||
|
||||
;--------------------------------
|
||||
; Component dependencies
|
||||
Function .onSelChange
|
||||
!insertmacro SectionList MaybeSelectionChanged
|
||||
FunctionEnd
|
||||
|
||||
;--------------------------------
|
||||
;Uninstaller Section
|
||||
|
||||
Section "Uninstall"
|
||||
ReadRegStr $START_MENU SHCTX \
|
||||
"Software\Microsoft\Windows\CurrentVersion\Uninstall\@CPACK_PACKAGE_INSTALL_REGISTRY_KEY@" "StartMenu"
|
||||
;MessageBox MB_OK "Start menu is in: $START_MENU"
|
||||
ReadRegStr $DO_NOT_ADD_TO_PATH SHCTX \
|
||||
"Software\Microsoft\Windows\CurrentVersion\Uninstall\@CPACK_PACKAGE_INSTALL_REGISTRY_KEY@" "DoNotAddToPath"
|
||||
ReadRegStr $ADD_TO_PATH_ALL_USERS SHCTX \
|
||||
"Software\Microsoft\Windows\CurrentVersion\Uninstall\@CPACK_PACKAGE_INSTALL_REGISTRY_KEY@" "AddToPathAllUsers"
|
||||
ReadRegStr $ADD_TO_PATH_CURRENT_USER SHCTX \
|
||||
"Software\Microsoft\Windows\CurrentVersion\Uninstall\@CPACK_PACKAGE_INSTALL_REGISTRY_KEY@" "AddToPathCurrentUser"
|
||||
;MessageBox MB_OK "Add to path: $DO_NOT_ADD_TO_PATH all users: $ADD_TO_PATH_ALL_USERS"
|
||||
ReadRegStr $INSTALL_DESKTOP SHCTX \
|
||||
"Software\Microsoft\Windows\CurrentVersion\Uninstall\@CPACK_PACKAGE_INSTALL_REGISTRY_KEY@" "InstallToDesktop"
|
||||
;MessageBox MB_OK "Install to desktop: $INSTALL_DESKTOP "
|
||||
|
||||
@CPACK_NSIS_EXTRA_UNINSTALL_COMMANDS@
|
||||
|
||||
;Remove files we installed.
|
||||
;Keep the list of directories here in sync with the File commands above.
|
||||
@CPACK_NSIS_DELETE_FILES@
|
||||
@CPACK_NSIS_DELETE_DIRECTORIES@
|
||||
|
||||
!ifdef CPACK_NSIS_ADD_REMOVE
|
||||
;Remove the add/remove program
|
||||
Delete "$INSTDIR\AddRemove.exe"
|
||||
!endif
|
||||
|
||||
;Remove the uninstaller itself.
|
||||
Delete "$INSTDIR\@CPACK_NSIS_UNINSTALL_NAME@.exe"
|
||||
DeleteRegKey SHCTX "Software\Microsoft\Windows\CurrentVersion\Uninstall\@CPACK_PACKAGE_INSTALL_REGISTRY_KEY@"
|
||||
|
||||
;Remove the installation directory if it is empty.
|
||||
RMDir "$INSTDIR"
|
||||
|
||||
; Remove the registry entries.
|
||||
DeleteRegKey SHCTX "Software\@CPACK_PACKAGE_VENDOR@\@CPACK_PACKAGE_INSTALL_REGISTRY_KEY@"
|
||||
|
||||
; Removes all optional components
|
||||
!insertmacro SectionList "RemoveSection_CPack"
|
||||
|
||||
!insertmacro MUI_STARTMENU_GETFOLDER Application $MUI_TEMP
|
||||
|
||||
Delete "$SMPROGRAMS\$MUI_TEMP\Uninstall.lnk"
|
||||
@CPACK_NSIS_DELETE_ICONS@
|
||||
@CPACK_NSIS_DELETE_ICONS_EXTRA@
|
||||
|
||||
;Delete empty start menu parent directories
|
||||
StrCpy $MUI_TEMP "$SMPROGRAMS\$MUI_TEMP"
|
||||
|
||||
startMenuDeleteLoop:
|
||||
ClearErrors
|
||||
RMDir $MUI_TEMP
|
||||
GetFullPathName $MUI_TEMP "$MUI_TEMP\.."
|
||||
|
||||
IfErrors startMenuDeleteLoopDone
|
||||
|
||||
StrCmp "$MUI_TEMP" "$SMPROGRAMS" startMenuDeleteLoopDone startMenuDeleteLoop
|
||||
startMenuDeleteLoopDone:
|
||||
|
||||
; If the user changed the shortcut, then untinstall may not work. This should
|
||||
; try to fix it.
|
||||
StrCpy $MUI_TEMP "$START_MENU"
|
||||
Delete "$SMPROGRAMS\$MUI_TEMP\Uninstall.lnk"
|
||||
@CPACK_NSIS_DELETE_ICONS_EXTRA@
|
||||
|
||||
;Delete empty start menu parent directories
|
||||
StrCpy $MUI_TEMP "$SMPROGRAMS\$MUI_TEMP"
|
||||
|
||||
secondStartMenuDeleteLoop:
|
||||
ClearErrors
|
||||
RMDir $MUI_TEMP
|
||||
GetFullPathName $MUI_TEMP "$MUI_TEMP\.."
|
||||
|
||||
IfErrors secondStartMenuDeleteLoopDone
|
||||
|
||||
StrCmp "$MUI_TEMP" "$SMPROGRAMS" secondStartMenuDeleteLoopDone secondStartMenuDeleteLoop
|
||||
secondStartMenuDeleteLoopDone:
|
||||
|
||||
DeleteRegKey /ifempty SHCTX "Software\@CPACK_PACKAGE_VENDOR@\@CPACK_PACKAGE_INSTALL_REGISTRY_KEY@"
|
||||
|
||||
Push $INSTDIR\bin
|
||||
StrCmp $DO_NOT_ADD_TO_PATH_ "1" doNotRemoveFromPath 0
|
||||
Call un.RemoveFromPath
|
||||
doNotRemoveFromPath:
|
||||
SectionEnd
|
||||
|
||||
;--------------------------------
|
||||
; determine admin versus local install
|
||||
; Is install for "AllUsers" or "JustMe"?
|
||||
; Default to "JustMe" - set to "AllUsers" if admin or on Win9x
|
||||
; This function is used for the very first "custom page" of the installer.
|
||||
; This custom page does not show up visibly, but it executes prior to the
|
||||
; first visible page and sets up $INSTDIR properly...
|
||||
; Choose different default installation folder based on SV_ALLUSERS...
|
||||
; "Program Files" for AllUsers, "My Documents" for JustMe...
|
||||
|
||||
Function .onInit
|
||||
StrCmp "@CPACK_NSIS_ENABLE_UNINSTALL_BEFORE_INSTALL@" "ON" 0 inst
|
||||
|
||||
ReadRegStr $0 HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\@CPACK_PACKAGE_INSTALL_REGISTRY_KEY@" "UninstallString"
|
||||
StrCmp $0 "" inst
|
||||
|
||||
MessageBox MB_YESNOCANCEL|MB_ICONEXCLAMATION \
|
||||
"@CPACK_NSIS_PACKAGE_NAME@ is already installed. $\n$\nDo you want to uninstall the old version before installing the new one?" \
|
||||
/SD IDYES IDYES uninst IDNO inst
|
||||
Abort
|
||||
|
||||
;Run the uninstaller
|
||||
uninst:
|
||||
ClearErrors
|
||||
StrLen $2 "\Uninstall.exe"
|
||||
StrCpy $3 $0 -$2 # remove "\Uninstall.exe" from UninstallString to get path
|
||||
ExecWait '"$0" /S _?=$3' ;Do not copy the uninstaller to a temp file
|
||||
|
||||
IfErrors uninst_failed inst
|
||||
uninst_failed:
|
||||
MessageBox MB_OK|MB_ICONSTOP "Uninstall failed."
|
||||
Abort
|
||||
|
||||
|
||||
inst:
|
||||
; Reads components status for registry
|
||||
!insertmacro SectionList "InitSection"
|
||||
|
||||
; check to see if /D has been used to change
|
||||
; the install directory by comparing it to the
|
||||
; install directory that is expected to be the
|
||||
; default
|
||||
StrCpy $IS_DEFAULT_INSTALLDIR 0
|
||||
StrCmp "$INSTDIR" "@CPACK_NSIS_INSTALL_ROOT@\@CPACK_PACKAGE_INSTALL_DIRECTORY@" 0 +2
|
||||
StrCpy $IS_DEFAULT_INSTALLDIR 1
|
||||
|
||||
StrCpy $SV_ALLUSERS "JustMe"
|
||||
; if default install dir then change the default
|
||||
; if it is installed for JustMe
|
||||
StrCmp "$IS_DEFAULT_INSTALLDIR" "1" 0 +2
|
||||
StrCpy $INSTDIR "$DOCUMENTS\@CPACK_PACKAGE_INSTALL_DIRECTORY@"
|
||||
|
||||
ClearErrors
|
||||
UserInfo::GetName
|
||||
IfErrors noLM
|
||||
Pop $0
|
||||
UserInfo::GetAccountType
|
||||
Pop $1
|
||||
StrCmp $1 "Admin" 0 +4
|
||||
SetShellVarContext all
|
||||
;MessageBox MB_OK 'User "$0" is in the Admin group'
|
||||
StrCpy $SV_ALLUSERS "AllUsers"
|
||||
Goto done
|
||||
StrCmp $1 "Power" 0 +4
|
||||
SetShellVarContext all
|
||||
;MessageBox MB_OK 'User "$0" is in the Power Users group'
|
||||
StrCpy $SV_ALLUSERS "AllUsers"
|
||||
Goto done
|
||||
|
||||
noLM:
|
||||
StrCpy $SV_ALLUSERS "AllUsers"
|
||||
;Get installation folder from registry if available
|
||||
|
||||
done:
|
||||
StrCmp $SV_ALLUSERS "AllUsers" 0 +3
|
||||
StrCmp "$IS_DEFAULT_INSTALLDIR" "1" 0 +2
|
||||
StrCpy $INSTDIR "@CPACK_NSIS_INSTALL_ROOT@\@CPACK_PACKAGE_INSTALL_DIRECTORY@"
|
||||
|
||||
StrCmp "@CPACK_NSIS_MODIFY_PATH@" "ON" 0 noOptionsPage
|
||||
!insertmacro MUI_INSTALLOPTIONS_EXTRACT "NSIS.InstallOptions.ini"
|
||||
|
||||
noOptionsPage:
|
||||
FunctionEnd
|
@ -0,0 +1,47 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
|
||||
<?include "cpack_variables.wxi"?>
|
||||
|
||||
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi"
|
||||
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>
|
@ -0,0 +1,119 @@
|
||||
|
||||
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")
|
||||
file(WRITE "${CMAKE_BINARY_DIR}/CMakeFiles/feature_tests.${lang_lc}" "
|
||||
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()
|
||||
file(APPEND "${CMAKE_BINARY_DIR}/CMakeFiles/feature_tests.${lang_lc}" "\"${lang}_FEATURE:\"\n${_feature_condition}\"${feature}\\n\"\n")
|
||||
endif()
|
||||
endforeach()
|
||||
file(APPEND "${CMAKE_BINARY_DIR}/CMakeFiles/feature_tests.${lang_lc}"
|
||||
"\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
|
||||
${CMAKE_BINARY_DIR} "${CMAKE_BINARY_DIR}/CMakeFiles/feature_tests.${lang_lc}"
|
||||
COMPILE_DEFINITIONS "${compile_flags}"
|
||||
LINK_LIBRARIES "${compile_flags_for_link}"
|
||||
OUTPUT_VARIABLE _output
|
||||
COPY_FILE "${CMAKE_BINARY_DIR}/CMakeFiles/feature_tests.bin"
|
||||
COPY_FILE_ERROR _copy_error
|
||||
)
|
||||
if(CMAKE_${lang}_FEATURE_TEST AND NOT _copy_error)
|
||||
set(_result 0)
|
||||
else()
|
||||
set(_result 255)
|
||||
endif()
|
||||
unset(CMAKE_${lang}_FEATURE_TEST CACHE)
|
||||
unset(compile_flags_for_link)
|
||||
|
||||
if (_result EQUAL 0)
|
||||
file(APPEND ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeOutput.log
|
||||
"\n\nDetecting ${lang} [${compile_flags}] compiler features compiled with the following output:\n${_output}\n\n")
|
||||
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})
|
||||
file(APPEND ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeOutput.log
|
||||
" Feature record: ${info}\n")
|
||||
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()
|
||||
else()
|
||||
file(APPEND ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeError.log
|
||||
"Detecting ${lang} [${compile_flags}] compiler features failed to compile with the following output:\n${_output}\n${_copy_error}\n\n")
|
||||
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(_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()
|
Reference in New Issue
Block a user