Update upstream source from tag 'upstream/3.25.0'
Update to upstream version '3.25.0' with Debian dir 068404b33fb7dc12acbeace99a929ff77eabff70
This commit is contained in:
commit
d0ed1a49c0
@ -41,8 +41,8 @@ set the path with these commands:
|
||||
:group 'cmake)
|
||||
|
||||
;; Keywords
|
||||
(defconst cmake-keywords-block-open '("IF" "MACRO" "FOREACH" "ELSE" "ELSEIF" "WHILE" "FUNCTION"))
|
||||
(defconst cmake-keywords-block-close '("ENDIF" "ENDFOREACH" "ENDMACRO" "ELSE" "ELSEIF" "ENDWHILE" "ENDFUNCTION"))
|
||||
(defconst cmake-keywords-block-open '("BLOCK" "IF" "MACRO" "FOREACH" "ELSE" "ELSEIF" "WHILE" "FUNCTION"))
|
||||
(defconst cmake-keywords-block-close '("ENDBLOCK" "ENDIF" "ENDFOREACH" "ENDMACRO" "ELSE" "ELSEIF" "ENDWHILE" "ENDFUNCTION"))
|
||||
(defconst cmake-keywords
|
||||
(let ((kwds (append cmake-keywords-block-open cmake-keywords-block-close nil)))
|
||||
(delete-dups kwds)))
|
||||
@ -288,6 +288,39 @@ This puts the mark at the end, and point at the beginning."
|
||||
|
||||
;------------------------------------------------------------------------------
|
||||
|
||||
(defun cmake--syntax-propertize-until-bracket-close (syntax)
|
||||
;; This function assumes that a previous search has matched the
|
||||
;; beginning of a bracket_comment or bracket_argument and that the
|
||||
;; second capture group has matched the equal signs between the two
|
||||
;; opening brackets
|
||||
(let* ((mb (match-beginning 2))
|
||||
(me (match-end 2))
|
||||
(cb (format "]%s]" (buffer-substring mb me))))
|
||||
(save-match-data
|
||||
(if (search-forward cb end 'move)
|
||||
(progn
|
||||
(setq me (match-end 0))
|
||||
(put-text-property
|
||||
(1- me)
|
||||
me
|
||||
'syntax-table
|
||||
(string-to-syntax syntax)))
|
||||
(setq me end)))
|
||||
(put-text-property
|
||||
(match-beginning 1)
|
||||
me
|
||||
'syntax-multiline
|
||||
t)))
|
||||
|
||||
(defconst cmake--syntax-propertize-function
|
||||
(syntax-propertize-rules
|
||||
("\\(#\\)\\[\\(=*\\)\\["
|
||||
(1
|
||||
(prog1 "!" (cmake--syntax-propertize-until-bracket-close "!"))))
|
||||
("\\(\\[\\)\\(=*\\)\\["
|
||||
(1
|
||||
(prog1 "|" (cmake--syntax-propertize-until-bracket-close "|"))))))
|
||||
|
||||
;; Syntax table for this mode.
|
||||
(defvar cmake-mode-syntax-table nil
|
||||
"Syntax table for CMake mode.")
|
||||
@ -318,7 +351,10 @@ This puts the mark at the end, and point at the beginning."
|
||||
; Setup indentation function.
|
||||
(set (make-local-variable 'indent-line-function) 'cmake-indent)
|
||||
; Setup comment syntax.
|
||||
(set (make-local-variable 'comment-start) "#"))
|
||||
(set (make-local-variable 'comment-start) "#")
|
||||
;; Setup syntax propertization
|
||||
(set (make-local-variable 'syntax-propertize-function) cmake--syntax-propertize-function)
|
||||
(add-hook 'syntax-propertize-extend-region-functions #'syntax-propertize-multiline nil t))
|
||||
|
||||
;; Default cmake-mode key bindings
|
||||
(define-key cmake-mode-map "\e\C-a" #'cmake-beginning-of-defun)
|
||||
|
@ -59,8 +59,8 @@ fun! CMakeGetIndent(lnum)
|
||||
|
||||
let cmake_closing_parens_line = '^\s*\()\+\)\s*$'
|
||||
|
||||
let cmake_indent_begin_regex = '^\s*\(IF\|MACRO\|FOREACH\|ELSE\|ELSEIF\|WHILE\|FUNCTION\)\s*('
|
||||
let cmake_indent_end_regex = '^\s*\(ENDIF\|ENDFOREACH\|ENDMACRO\|ELSE\|ELSEIF\|ENDWHILE\|ENDFUNCTION\)\s*('
|
||||
let cmake_indent_begin_regex = '^\s*\(BLOCK\|IF\|MACRO\|FOREACH\|ELSE\|ELSEIF\|WHILE\|FUNCTION\)\s*('
|
||||
let cmake_indent_end_regex = '^\s*\(ENDBLOCK\|ENDIF\|ENDFOREACH\|ENDMACRO\|ELSE\|ELSEIF\|ENDWHILE\|ENDFUNCTION\)\s*('
|
||||
|
||||
if this_line =~? cmake_closing_parens_line
|
||||
if previous_line !~? cmake_indent_open_regex
|
||||
|
@ -436,6 +436,7 @@ syn keyword cmakeProperty contained
|
||||
\ XCODE_SCHEME_ENVIRONMENT
|
||||
\ XCODE_SCHEME_EXECUTABLE
|
||||
\ XCODE_SCHEME_GUARD_MALLOC
|
||||
\ XCODE_SCHEME_LAUNCH_MODE
|
||||
\ XCODE_SCHEME_MAIN_THREAD_CHECKER_STOP
|
||||
\ XCODE_SCHEME_MALLOC_GUARD_EDGES
|
||||
\ XCODE_SCHEME_MALLOC_SCRIBBLE
|
||||
@ -444,6 +445,9 @@ syn keyword cmakeProperty contained
|
||||
\ XCODE_SCHEME_THREAD_SANITIZER_STOP
|
||||
\ XCODE_SCHEME_UNDEFINED_BEHAVIOUR_SANITIZER
|
||||
\ XCODE_SCHEME_UNDEFINED_BEHAVIOUR_SANITIZER_STOP
|
||||
\ XCODE_SCHEME_ENABLE_GPU_API_VALIDATION
|
||||
\ XCODE_SCHEME_ENABLE_GPU_SHADER_VALIDATION
|
||||
\ XCODE_SCHEME_LAUNCH_CONFIGURATION
|
||||
\ XCODE_SCHEME_WORKING_DIRECTORY
|
||||
\ XCODE_SCHEME_ZOMBIE_OBJECTS
|
||||
\ XCTEST
|
||||
@ -1537,6 +1541,7 @@ syn keyword cmakeVariable contained
|
||||
\ CMAKE_XCODE_SCHEME_DYNAMIC_LINKER_API_USAGE
|
||||
\ CMAKE_XCODE_SCHEME_ENVIRONMENT
|
||||
\ CMAKE_XCODE_SCHEME_GUARD_MALLOC
|
||||
\ CMAKE_XCODE_SCHEME_LAUNCH_MODE
|
||||
\ CMAKE_XCODE_SCHEME_MAIN_THREAD_CHECKER_STOP
|
||||
\ CMAKE_XCODE_SCHEME_MALLOC_GUARD_EDGES
|
||||
\ CMAKE_XCODE_SCHEME_MALLOC_SCRIBBLE
|
||||
@ -1545,6 +1550,9 @@ syn keyword cmakeVariable contained
|
||||
\ CMAKE_XCODE_SCHEME_THREAD_SANITIZER_STOP
|
||||
\ CMAKE_XCODE_SCHEME_UNDEFINED_BEHAVIOUR_SANITIZER
|
||||
\ CMAKE_XCODE_SCHEME_UNDEFINED_BEHAVIOUR_SANITIZER_STOP
|
||||
\ CMAKE_XCODE_SCHEME_ENABLE_GPU_API_VALIDATION
|
||||
\ CMAKE_XCODE_SCHEME_ENABLE_GPU_SHADER_VALIDATION
|
||||
\ CMAKE_XCODE_SCHEME_LAUNCH_CONFIGURATION
|
||||
\ CMAKE_XCODE_SCHEME_WORKING_DIRECTORY
|
||||
\ CMAKE_XCODE_SCHEME_ZOMBIE_OBJECTS
|
||||
\ CPACK_ABSOLUTE_DESTINATION_FILES
|
||||
@ -3830,6 +3838,7 @@ syn keyword cmakeCommand
|
||||
\ add_subdirectory
|
||||
\ add_test
|
||||
\ aux_source_directory
|
||||
\ block
|
||||
\ break
|
||||
\ build_command
|
||||
\ cmake_host_system_information
|
||||
@ -3857,6 +3866,7 @@ syn keyword cmakeCommand
|
||||
\ define_property
|
||||
\ enable_language
|
||||
\ enable_testing
|
||||
\ endblock
|
||||
\ endfunction
|
||||
\ endmacro
|
||||
\ execute_process
|
||||
|
468
CMakeLists.txt
468
CMakeLists.txt
@ -1,7 +1,7 @@
|
||||
# Distributed under the OSI-approved BSD 3-Clause License. See accompanying
|
||||
# file Copyright.txt or https://cmake.org/licensing for details.
|
||||
|
||||
cmake_minimum_required(VERSION 3.13...3.22 FATAL_ERROR)
|
||||
cmake_minimum_required(VERSION 3.13...3.23 FATAL_ERROR)
|
||||
set(CMAKE_USER_MAKE_RULES_OVERRIDE_C ${CMAKE_CURRENT_SOURCE_DIR}/Source/Modules/OverrideC.cmake)
|
||||
set(CMAKE_USER_MAKE_RULES_OVERRIDE_CXX ${CMAKE_CURRENT_SOURCE_DIR}/Source/Modules/OverrideCXX.cmake)
|
||||
|
||||
@ -17,8 +17,8 @@ unset(CMAKE_USER_MAKE_RULES_OVERRIDE_C)
|
||||
if(MSVC AND NOT CMAKE_VERSION VERSION_LESS 3.15)
|
||||
# Filter out MSVC runtime library flags that may have come from
|
||||
# the cache of an existing build tree or from scripts.
|
||||
foreach(l C CXX)
|
||||
foreach(c DEBUG MINSIZEREL RELEASE RELWITHDEBINFO)
|
||||
foreach(l IN ITEMS C CXX)
|
||||
foreach(c IN ITEMS DEBUG MINSIZEREL RELEASE RELWITHDEBINFO)
|
||||
string(REGEX REPLACE "[-/]M[DT]d?( |$)" "" "CMAKE_${l}_FLAGS_${c}" "${CMAKE_${l}_FLAGS_${c}}")
|
||||
endforeach()
|
||||
endforeach()
|
||||
@ -60,17 +60,6 @@ else()
|
||||
set(USE_LGPL "")
|
||||
endif()
|
||||
|
||||
if("${CMake_SOURCE_DIR}" STREQUAL "${CMAKE_SOURCE_DIR}")
|
||||
# Disallow architecture-specific try_run. It may not run on the host.
|
||||
macro(TRY_RUN)
|
||||
if(CMAKE_TRY_COMPILE_OSX_ARCHITECTURES)
|
||||
message(FATAL_ERROR "TRY_RUN not allowed with CMAKE_TRY_COMPILE_OSX_ARCHITECTURES=[${CMAKE_TRY_COMPILE_OSX_ARCHITECTURES}]")
|
||||
else()
|
||||
_TRY_RUN(${ARGV})
|
||||
endif()
|
||||
endmacro()
|
||||
endif()
|
||||
|
||||
# Use most-recent available language dialects with GNU and Clang
|
||||
if(NOT DEFINED CMAKE_C_STANDARD AND NOT CMake_NO_C_STANDARD)
|
||||
include(${CMake_SOURCE_DIR}/Source/Checks/cm_c11_thread_local.cmake)
|
||||
@ -81,7 +70,7 @@ if(NOT DEFINED CMAKE_C_STANDARD AND NOT CMake_NO_C_STANDARD)
|
||||
endif()
|
||||
endif()
|
||||
if(NOT DEFINED CMAKE_CXX_STANDARD AND NOT CMake_NO_CXX_STANDARD)
|
||||
if (CMAKE_CXX_COMPILER_ID STREQUAL SunPro AND CMAKE_CXX_COMPILER_VERSION VERSION_LESS 5.14)
|
||||
if(CMAKE_CXX_COMPILER_ID STREQUAL SunPro AND CMAKE_CXX_COMPILER_VERSION VERSION_LESS 5.14)
|
||||
set(CMAKE_CXX_STANDARD 98)
|
||||
else()
|
||||
if(NOT CMAKE_VERSION VERSION_LESS 3.8)
|
||||
@ -114,9 +103,7 @@ if(NOT CMake_TEST_EXTERNAL_CMAKE)
|
||||
endif()
|
||||
|
||||
# Inform STL library header wrappers whether to use system versions.
|
||||
configure_file(${CMake_SOURCE_DIR}/Utilities/std/cmSTL.hxx.in
|
||||
${CMake_BINARY_DIR}/Utilities/cmSTL.hxx
|
||||
@ONLY)
|
||||
configure_file(Utilities/std/cmSTL.hxx.in Utilities/cmSTL.hxx @ONLY)
|
||||
|
||||
# set the internal encoding of CMake to UTF-8
|
||||
set(KWSYS_ENCODING_DEFAULT_CODEPAGE CP_UTF8)
|
||||
@ -143,7 +130,7 @@ option(CMake_BUILD_DEVELOPER_REFERENCE
|
||||
mark_as_advanced(CMake_BUILD_DEVELOPER_REFERENCE)
|
||||
|
||||
# option to build using interprocedural optimizations (IPO/LTO)
|
||||
if (NOT CMAKE_VERSION VERSION_LESS 3.12.2)
|
||||
if(NOT CMAKE_VERSION VERSION_LESS 3.12.2)
|
||||
option(CMake_BUILD_LTO "Compile CMake with link-time optimization if supported" OFF)
|
||||
if(CMake_BUILD_LTO)
|
||||
include(CheckIPOSupported)
|
||||
@ -165,7 +152,7 @@ macro(CMAKE_HANDLE_SYSTEM_LIBRARIES)
|
||||
# Allow the user to enable/disable all system utility library options by
|
||||
# defining CMAKE_USE_SYSTEM_LIBRARIES or CMAKE_USE_SYSTEM_LIBRARY_${util}.
|
||||
set(UTILITIES BZIP2 CURL EXPAT FORM JSONCPP LIBARCHIVE LIBLZMA LIBRHASH LIBUV NGHTTP2 ZLIB ZSTD)
|
||||
foreach(util ${UTILITIES})
|
||||
foreach(util IN LISTS UTILITIES)
|
||||
if(NOT DEFINED CMAKE_USE_SYSTEM_LIBRARY_${util}
|
||||
AND DEFINED CMAKE_USE_SYSTEM_LIBRARIES)
|
||||
set(CMAKE_USE_SYSTEM_LIBRARY_${util} "${CMAKE_USE_SYSTEM_LIBRARIES}")
|
||||
@ -215,16 +202,14 @@ macro(CMAKE_HANDLE_SYSTEM_LIBRARIES)
|
||||
mark_as_advanced(CMAKE_USE_SYSTEM_KWIML)
|
||||
|
||||
# Mention to the user what system libraries are being used.
|
||||
foreach(util ${UTILITIES} KWIML)
|
||||
foreach(util IN LISTS UTILITIES ITEMS KWIML)
|
||||
if(CMAKE_USE_SYSTEM_${util})
|
||||
message(STATUS "Using system-installed ${util}")
|
||||
endif()
|
||||
endforeach()
|
||||
|
||||
# Inform utility library header wrappers whether to use system versions.
|
||||
configure_file(${CMake_SOURCE_DIR}/Utilities/cmThirdParty.h.in
|
||||
${CMake_BINARY_DIR}/Utilities/cmThirdParty.h
|
||||
@ONLY)
|
||||
configure_file(Utilities/cmThirdParty.h.in Utilities/cmThirdParty.h @ONLY)
|
||||
|
||||
endmacro()
|
||||
|
||||
@ -235,7 +220,7 @@ endmacro()
|
||||
macro(CMAKE_SETUP_TESTING)
|
||||
if(BUILD_TESTING)
|
||||
set(CMAKE_TEST_SYSTEM_LIBRARIES 0)
|
||||
foreach(util CURL EXPAT ZLIB)
|
||||
foreach(util IN ITEMS CURL EXPAT ZLIB)
|
||||
if(CMAKE_USE_SYSTEM_${util})
|
||||
set(CMAKE_TEST_SYSTEM_LIBRARIES 1)
|
||||
endif()
|
||||
@ -250,7 +235,7 @@ macro(CMAKE_SETUP_TESTING)
|
||||
set(CMAKE_CTEST_COMMAND "${CMake_TEST_EXTERNAL_CMAKE}/ctest")
|
||||
set(CMAKE_CMAKE_COMMAND "${CMake_TEST_EXTERNAL_CMAKE}/cmake")
|
||||
set(CMAKE_CPACK_COMMAND "${CMake_TEST_EXTERNAL_CMAKE}/cpack")
|
||||
foreach(exe cmake ctest cpack)
|
||||
foreach(exe IN ITEMS cmake ctest cpack)
|
||||
add_executable(${exe} IMPORTED)
|
||||
set_property(TARGET ${exe} PROPERTY IMPORTED_LOCATION ${CMake_TEST_EXTERNAL_CMAKE}/${exe})
|
||||
endforeach()
|
||||
@ -262,18 +247,12 @@ macro(CMAKE_SETUP_TESTING)
|
||||
endif()
|
||||
|
||||
# configure some files for testing
|
||||
configure_file("${CMAKE_CURRENT_SOURCE_DIR}/Templates/CTestScript.cmake.in"
|
||||
"${CMAKE_CURRENT_BINARY_DIR}/CTestScript.cmake"
|
||||
@ONLY)
|
||||
configure_file(${CMake_SOURCE_DIR}/Tests/.NoDartCoverage
|
||||
${CMake_BINARY_DIR}/Tests/.NoDartCoverage)
|
||||
configure_file(${CMake_SOURCE_DIR}/Tests/.NoDartCoverage
|
||||
${CMake_BINARY_DIR}/Modules/.NoDartCoverage)
|
||||
configure_file(${CMake_SOURCE_DIR}/CTestCustom.cmake.in
|
||||
${CMake_BINARY_DIR}/CTestCustom.cmake @ONLY)
|
||||
configure_file(Templates/CTestScript.cmake.in CTestScript.cmake @ONLY)
|
||||
configure_file(Tests/.NoDartCoverage Tests/.NoDartCoverage)
|
||||
configure_file(Tests/.NoDartCoverage Modules/.NoDartCoverage)
|
||||
configure_file(CTestCustom.cmake.in CTestCustom.cmake @ONLY)
|
||||
if(BUILD_TESTING AND DART_ROOT)
|
||||
configure_file(${CMake_SOURCE_DIR}/CMakeLogo.gif
|
||||
${CMake_BINARY_DIR}/Testing/HTML/TestingResults/Icons/Logo.gif COPYONLY)
|
||||
configure_file(CMakeLogo.gif Testing/HTML/TestingResults/Icons/Logo.gif COPYONLY)
|
||||
endif()
|
||||
mark_as_advanced(DART_ROOT)
|
||||
endmacro()
|
||||
@ -339,390 +318,6 @@ macro(CMAKE_SET_TARGET_FOLDER tgt folder)
|
||||
endif()
|
||||
endmacro()
|
||||
|
||||
|
||||
#-----------------------------------------------------------------------
|
||||
# a macro to build the utilities used by CMake
|
||||
# Simply to improve readability of the main script.
|
||||
#-----------------------------------------------------------------------
|
||||
macro (CMAKE_BUILD_UTILITIES)
|
||||
find_package(Threads)
|
||||
|
||||
# Suppress unnecessary checks in third-party code.
|
||||
include(Utilities/cmThirdPartyChecks.cmake)
|
||||
|
||||
#---------------------------------------------------------------------
|
||||
# Create the kwsys library for CMake.
|
||||
set(KWSYS_NAMESPACE cmsys)
|
||||
set(KWSYS_USE_SystemTools 1)
|
||||
set(KWSYS_USE_Directory 1)
|
||||
set(KWSYS_USE_RegularExpression 1)
|
||||
set(KWSYS_USE_Base64 1)
|
||||
set(KWSYS_USE_MD5 1)
|
||||
set(KWSYS_USE_Process 1)
|
||||
set(KWSYS_USE_CommandLineArguments 1)
|
||||
set(KWSYS_USE_ConsoleBuf 1)
|
||||
set(KWSYS_HEADER_ROOT ${CMake_BINARY_DIR}/Source)
|
||||
set(KWSYS_INSTALL_DOC_DIR "${CMAKE_DOC_DIR}")
|
||||
if(CMake_NO_CXX_STANDARD)
|
||||
set(KWSYS_CXX_STANDARD "")
|
||||
endif()
|
||||
if(CMake_NO_SELF_BACKTRACE)
|
||||
set(KWSYS_NO_EXECINFO 1)
|
||||
endif()
|
||||
if(WIN32)
|
||||
# FIXME: Teach KWSys to hard-code these checks on Windows.
|
||||
set(KWSYS_C_HAS_CLOCK_GETTIME_MONOTONIC_COMPILED 0)
|
||||
set(KWSYS_C_HAS_PTRDIFF_T_COMPILED 1)
|
||||
set(KWSYS_CXX_HAS_ENVIRON_IN_STDLIB_H_COMPILED 1)
|
||||
set(KWSYS_CXX_HAS_RLIMIT64_COMPILED 0)
|
||||
set(KWSYS_CXX_HAS_SETENV_COMPILED 0)
|
||||
set(KWSYS_CXX_HAS_UNSETENV_COMPILED 0)
|
||||
set(KWSYS_CXX_HAS_UTIMENSAT_COMPILED 0)
|
||||
set(KWSYS_CXX_HAS_UTIMES_COMPILED 0)
|
||||
set(KWSYS_CXX_STAT_HAS_ST_MTIM_COMPILED 0)
|
||||
set(KWSYS_CXX_STAT_HAS_ST_MTIMESPEC_COMPILED 0)
|
||||
set(KWSYS_STL_HAS_WSTRING_COMPILED 1)
|
||||
set(KWSYS_SYS_HAS_IFADDRS_H 0)
|
||||
endif()
|
||||
add_subdirectory(Source/kwsys)
|
||||
set(kwsys_folder "Utilities/KWSys")
|
||||
CMAKE_SET_TARGET_FOLDER(${KWSYS_NAMESPACE} "${kwsys_folder}")
|
||||
CMAKE_SET_TARGET_FOLDER(${KWSYS_NAMESPACE}_c "${kwsys_folder}")
|
||||
if(BUILD_TESTING)
|
||||
CMAKE_SET_TARGET_FOLDER(${KWSYS_NAMESPACE}TestDynload "${kwsys_folder}")
|
||||
CMAKE_SET_TARGET_FOLDER(${KWSYS_NAMESPACE}TestProcess "${kwsys_folder}")
|
||||
CMAKE_SET_TARGET_FOLDER(${KWSYS_NAMESPACE}TestsC "${kwsys_folder}")
|
||||
CMAKE_SET_TARGET_FOLDER(${KWSYS_NAMESPACE}TestsCxx "${kwsys_folder}")
|
||||
CMAKE_SET_TARGET_FOLDER(${KWSYS_NAMESPACE}TestSharedForward "${kwsys_folder}")
|
||||
endif()
|
||||
|
||||
#---------------------------------------------------------------------
|
||||
# Setup third-party libraries.
|
||||
# Everything in the tree should be able to include files from the
|
||||
# Utilities directory.
|
||||
if ((CMAKE_SYSTEM_NAME STREQUAL "AIX" OR CMAKE_SYSTEM_NAME STREQUAL "OS400") AND CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
|
||||
# using -isystem option generate error "template with C linkage"
|
||||
include_directories("${CMake_SOURCE_DIR}/Utilities/std")
|
||||
else()
|
||||
include_directories(SYSTEM "${CMake_SOURCE_DIR}/Utilities/std")
|
||||
endif()
|
||||
|
||||
include_directories("${CMake_BINARY_DIR}/Utilities")
|
||||
if ((CMAKE_SYSTEM_NAME STREQUAL "AIX" OR CMAKE_SYSTEM_NAME STREQUAL "OS400") AND CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
|
||||
# using -isystem option generate error "template with C linkage"
|
||||
include_directories("${CMake_SOURCE_DIR}/Utilities")
|
||||
else()
|
||||
include_directories(SYSTEM "${CMake_SOURCE_DIR}/Utilities")
|
||||
endif()
|
||||
|
||||
#---------------------------------------------------------------------
|
||||
# Build CMake std library for CMake and CTest.
|
||||
set(CMAKE_STD_LIBRARY cmstd)
|
||||
add_subdirectory(Utilities/std)
|
||||
CMAKE_SET_TARGET_FOLDER(cmstd "Utilities/std")
|
||||
|
||||
# check for the use of system libraries versus builtin ones
|
||||
# (a macro defined in this file)
|
||||
CMAKE_HANDLE_SYSTEM_LIBRARIES()
|
||||
|
||||
if(CMAKE_USE_SYSTEM_KWIML)
|
||||
find_package(KWIML 1.0)
|
||||
if(NOT KWIML_FOUND)
|
||||
message(FATAL_ERROR "CMAKE_USE_SYSTEM_KWIML is ON but KWIML is not found!")
|
||||
endif()
|
||||
set(CMake_KWIML_LIBRARIES kwiml::kwiml)
|
||||
else()
|
||||
set(CMake_KWIML_LIBRARIES "")
|
||||
if(BUILD_TESTING)
|
||||
set(KWIML_TEST_ENABLE 1)
|
||||
endif()
|
||||
add_subdirectory(Utilities/KWIML)
|
||||
endif()
|
||||
|
||||
if(CMAKE_USE_SYSTEM_LIBRHASH)
|
||||
find_package(LibRHash)
|
||||
if(NOT LibRHash_FOUND)
|
||||
message(FATAL_ERROR
|
||||
"CMAKE_USE_SYSTEM_LIBRHASH is ON but LibRHash is not found!")
|
||||
endif()
|
||||
set(CMAKE_LIBRHASH_LIBRARIES LibRHash::LibRHash)
|
||||
else()
|
||||
set(CMAKE_LIBRHASH_LIBRARIES cmlibrhash)
|
||||
add_subdirectory(Utilities/cmlibrhash)
|
||||
CMAKE_SET_TARGET_FOLDER(cmlibrhash "Utilities/3rdParty")
|
||||
endif()
|
||||
|
||||
#---------------------------------------------------------------------
|
||||
# Build zlib library for Curl, CMake, and CTest.
|
||||
set(CMAKE_ZLIB_HEADER "cm_zlib.h")
|
||||
if(CMAKE_USE_SYSTEM_ZLIB)
|
||||
find_package(ZLIB)
|
||||
if(NOT ZLIB_FOUND)
|
||||
message(FATAL_ERROR
|
||||
"CMAKE_USE_SYSTEM_ZLIB is ON but a zlib is not found!")
|
||||
endif()
|
||||
set(CMAKE_ZLIB_INCLUDES ${ZLIB_INCLUDE_DIR})
|
||||
set(CMAKE_ZLIB_LIBRARIES ${ZLIB_LIBRARIES})
|
||||
else()
|
||||
set(CMAKE_ZLIB_INCLUDES ${CMake_SOURCE_DIR}/Utilities)
|
||||
set(CMAKE_ZLIB_LIBRARIES cmzlib)
|
||||
set(WITHOUT_ZLIB_DLL "")
|
||||
set(WITHOUT_ZLIB_DLL_WITH_LIB cmzlib)
|
||||
set(ZLIB_DLL "")
|
||||
set(ZLIB_DLL_WITH_LIB cmzlib)
|
||||
set(ZLIB_WINAPI "")
|
||||
set(ZLIB_WINAPI_COMPILED 0)
|
||||
set(ZLIB_WINAPI_WITH_LIB cmzlib)
|
||||
add_subdirectory(Utilities/cmzlib)
|
||||
CMAKE_SET_TARGET_FOLDER(cmzlib "Utilities/3rdParty")
|
||||
endif()
|
||||
|
||||
#---------------------------------------------------------------------
|
||||
# Build Curl library for CTest.
|
||||
if(CMAKE_USE_SYSTEM_CURL)
|
||||
find_package(CURL)
|
||||
if(NOT CURL_FOUND)
|
||||
message(FATAL_ERROR
|
||||
"CMAKE_USE_SYSTEM_CURL is ON but a curl is not found!")
|
||||
endif()
|
||||
set(CMAKE_CURL_INCLUDES ${CURL_INCLUDE_DIRS})
|
||||
set(CMAKE_CURL_LIBRARIES ${CURL_LIBRARIES})
|
||||
else()
|
||||
set(CURL_SPECIAL_ZLIB_H ${CMAKE_ZLIB_HEADER})
|
||||
set(CURL_SPECIAL_LIBZ_INCLUDES ${CMAKE_ZLIB_INCLUDES})
|
||||
set(CURL_SPECIAL_LIBZ ${CMAKE_ZLIB_LIBRARIES})
|
||||
set(CMAKE_CURL_INCLUDES)
|
||||
set(CMAKE_CURL_LIBRARIES cmcurl)
|
||||
if(CMAKE_TESTS_CDASH_SERVER)
|
||||
set(CMAKE_CURL_TEST_URL "${CMAKE_TESTS_CDASH_SERVER}/user.php")
|
||||
endif()
|
||||
set(_CMAKE_USE_OPENSSL_DEFAULT OFF)
|
||||
if(NOT DEFINED CMAKE_USE_OPENSSL AND NOT WIN32 AND NOT APPLE
|
||||
AND CMAKE_SYSTEM_NAME MATCHES "(Linux|FreeBSD)")
|
||||
set(_CMAKE_USE_OPENSSL_DEFAULT ON)
|
||||
endif()
|
||||
option(CMAKE_USE_OPENSSL "Use OpenSSL." ${_CMAKE_USE_OPENSSL_DEFAULT})
|
||||
mark_as_advanced(CMAKE_USE_OPENSSL)
|
||||
if(CMAKE_USE_OPENSSL)
|
||||
set(CURL_CA_BUNDLE "" CACHE FILEPATH "Path to SSL CA Certificate Bundle")
|
||||
set(CURL_CA_PATH "" CACHE PATH "Path to SSL CA Certificate Directory")
|
||||
mark_as_advanced(CURL_CA_BUNDLE CURL_CA_PATH)
|
||||
endif()
|
||||
if(NOT CMAKE_USE_SYSTEM_NGHTTP2)
|
||||
# Tell curl's FindNGHTTP2 module to use our library.
|
||||
set(NGHTTP2_LIBRARY cmnghttp2)
|
||||
set(NGHTTP2_INCLUDE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/Utilities/cmnghttp2/lib/includes)
|
||||
endif()
|
||||
add_subdirectory(Utilities/cmcurl)
|
||||
CMAKE_SET_TARGET_FOLDER(cmcurl "Utilities/3rdParty")
|
||||
CMAKE_SET_TARGET_FOLDER(LIBCURL "Utilities/3rdParty")
|
||||
if(NOT CMAKE_USE_SYSTEM_NGHTTP2)
|
||||
# Configure after curl to re-use some check results.
|
||||
add_subdirectory(Utilities/cmnghttp2)
|
||||
CMAKE_SET_TARGET_FOLDER(cmnghttp2 "Utilities/3rdParty")
|
||||
endif()
|
||||
endif()
|
||||
|
||||
#---------------------------------------------------------------------
|
||||
# Build expat library for CMake, CTest, and libarchive.
|
||||
if(CMAKE_USE_SYSTEM_EXPAT)
|
||||
find_package(EXPAT)
|
||||
if(NOT EXPAT_FOUND)
|
||||
message(FATAL_ERROR
|
||||
"CMAKE_USE_SYSTEM_EXPAT is ON but a expat is not found!")
|
||||
endif()
|
||||
set(CMAKE_EXPAT_INCLUDES ${EXPAT_INCLUDE_DIRS})
|
||||
set(CMAKE_EXPAT_LIBRARIES ${EXPAT_LIBRARIES})
|
||||
else()
|
||||
set(CMAKE_EXPAT_INCLUDES)
|
||||
set(CMAKE_EXPAT_LIBRARIES cmexpat)
|
||||
add_subdirectory(Utilities/cmexpat)
|
||||
CMAKE_SET_TARGET_FOLDER(cmexpat "Utilities/3rdParty")
|
||||
endif()
|
||||
|
||||
#---------------------------------------------------------------------
|
||||
# Build or use system libbz2 for libarchive.
|
||||
if(NOT CMAKE_USE_SYSTEM_LIBARCHIVE)
|
||||
if(CMAKE_USE_SYSTEM_BZIP2)
|
||||
find_package(BZip2)
|
||||
else()
|
||||
set(BZIP2_INCLUDE_DIR
|
||||
"${CMAKE_CURRENT_SOURCE_DIR}/Utilities/cmbzip2")
|
||||
set(BZIP2_LIBRARIES cmbzip2)
|
||||
set(BZIP2_NEED_PREFIX "")
|
||||
set(USE_BZIP2_DLL "")
|
||||
set(USE_BZIP2_DLL_WITH_LIB cmbzip2)
|
||||
set(USE_BZIP2_STATIC "")
|
||||
set(USE_BZIP2_STATIC_WITH_LIB cmbzip2)
|
||||
add_subdirectory(Utilities/cmbzip2)
|
||||
CMAKE_SET_TARGET_FOLDER(cmbzip2 "Utilities/3rdParty")
|
||||
endif()
|
||||
endif()
|
||||
|
||||
#---------------------------------------------------------------------
|
||||
# Build or use system zstd for libarchive.
|
||||
if(NOT CMAKE_USE_SYSTEM_LIBARCHIVE)
|
||||
if(NOT CMAKE_USE_SYSTEM_ZSTD)
|
||||
set(ZSTD_INCLUDE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/Utilities/cmzstd")
|
||||
set(ZSTD_LIBRARY cmzstd)
|
||||
add_subdirectory(Utilities/cmzstd)
|
||||
CMAKE_SET_TARGET_FOLDER(cmzstd "Utilities/3rdParty")
|
||||
endif()
|
||||
endif()
|
||||
|
||||
#---------------------------------------------------------------------
|
||||
# Build or use system liblzma for libarchive.
|
||||
if(NOT CMAKE_USE_SYSTEM_LIBARCHIVE)
|
||||
if(CMAKE_USE_SYSTEM_LIBLZMA)
|
||||
find_package(LibLZMA)
|
||||
if(NOT LIBLZMA_FOUND)
|
||||
message(FATAL_ERROR "CMAKE_USE_SYSTEM_LIBLZMA is ON but LibLZMA is not found!")
|
||||
endif()
|
||||
else()
|
||||
add_subdirectory(Utilities/cmliblzma)
|
||||
CMAKE_SET_TARGET_FOLDER(cmliblzma "Utilities/3rdParty")
|
||||
set(LIBLZMA_HAS_AUTO_DECODER 1)
|
||||
set(LIBLZMA_HAS_EASY_ENCODER 1)
|
||||
set(LIBLZMA_HAS_LZMA_PRESET 1)
|
||||
set(LIBLZMA_INCLUDE_DIR
|
||||
"${CMAKE_CURRENT_SOURCE_DIR}/Utilities/cmliblzma/liblzma/api")
|
||||
set(LIBLZMA_LIBRARY cmliblzma)
|
||||
set(HAVE_LZMA_STREAM_ENCODER_MT 1)
|
||||
endif()
|
||||
endif()
|
||||
|
||||
#---------------------------------------------------------------------
|
||||
# Build or use system libarchive for CMake and CTest.
|
||||
if(CMAKE_USE_SYSTEM_LIBARCHIVE)
|
||||
find_package(LibArchive 3.3.3)
|
||||
if(NOT LibArchive_FOUND)
|
||||
message(FATAL_ERROR "CMAKE_USE_SYSTEM_LIBARCHIVE is ON but LibArchive is not found!")
|
||||
endif()
|
||||
set(CMAKE_TAR_INCLUDES ${LibArchive_INCLUDE_DIRS})
|
||||
set(CMAKE_TAR_LIBRARIES ${LibArchive_LIBRARIES})
|
||||
else()
|
||||
set(EXPAT_INCLUDE_DIR ${CMAKE_EXPAT_INCLUDES})
|
||||
set(EXPAT_LIBRARY ${CMAKE_EXPAT_LIBRARIES})
|
||||
set(ZLIB_INCLUDE_DIR ${CMAKE_ZLIB_INCLUDES})
|
||||
set(ZLIB_LIBRARY ${CMAKE_ZLIB_LIBRARIES})
|
||||
add_definitions(-DLIBARCHIVE_STATIC)
|
||||
set(ENABLE_MBEDTLS OFF)
|
||||
set(ENABLE_NETTLE OFF)
|
||||
if(DEFINED CMAKE_USE_OPENSSL)
|
||||
set(ENABLE_OPENSSL "${CMAKE_USE_OPENSSL}")
|
||||
else()
|
||||
set(ENABLE_OPENSSL OFF)
|
||||
endif()
|
||||
set(ENABLE_LIBB2 OFF)
|
||||
set(ENABLE_LZ4 OFF)
|
||||
set(ENABLE_LZO OFF)
|
||||
set(ENABLE_LZMA ON)
|
||||
set(ENABLE_ZSTD ON)
|
||||
set(ENABLE_ZLIB ON)
|
||||
set(ENABLE_BZip2 ON)
|
||||
set(ENABLE_LIBXML2 OFF)
|
||||
set(ENABLE_EXPAT OFF)
|
||||
set(ENABLE_PCREPOSIX OFF)
|
||||
set(ENABLE_LibGCC OFF)
|
||||
set(ENABLE_CNG OFF)
|
||||
set(ENABLE_TAR OFF)
|
||||
set(ENABLE_TAR_SHARED OFF)
|
||||
set(ENABLE_CPIO OFF)
|
||||
set(ENABLE_CPIO_SHARED OFF)
|
||||
set(ENABLE_CAT OFF)
|
||||
set(ENABLE_CAT_SHARED OFF)
|
||||
set(ENABLE_XATTR OFF)
|
||||
set(ENABLE_ACL OFF)
|
||||
set(ENABLE_ICONV OFF)
|
||||
set(ENABLE_TEST OFF)
|
||||
set(ENABLE_COVERAGE OFF)
|
||||
set(ENABLE_INSTALL OFF)
|
||||
set(POSIX_REGEX_LIB "" CACHE INTERNAL "libarchive: No POSIX regular expression support")
|
||||
set(ENABLE_SAFESEH "" CACHE INTERNAL "libarchive: No /SAFESEH linker flag")
|
||||
set(WINDOWS_VERSION "WIN7" CACHE INTERNAL "libarchive: Set Windows version to use (Windows only)")
|
||||
add_subdirectory(Utilities/cmlibarchive)
|
||||
CMAKE_SET_TARGET_FOLDER(cmlibarchive "Utilities/3rdParty")
|
||||
set(CMAKE_TAR_LIBRARIES cmlibarchive ${BZIP2_LIBRARIES})
|
||||
endif()
|
||||
|
||||
#---------------------------------------------------------------------
|
||||
# Build jsoncpp library.
|
||||
if(CMAKE_USE_SYSTEM_JSONCPP)
|
||||
find_package(JsonCpp 1.4.1)
|
||||
if(NOT JsonCpp_FOUND)
|
||||
message(FATAL_ERROR
|
||||
"CMAKE_USE_SYSTEM_JSONCPP is ON but a JsonCpp is not found!")
|
||||
endif()
|
||||
if(CMAKE_CXX_COMPILER_ID MATCHES "GNU|LCC|Clang")
|
||||
set_property(TARGET JsonCpp::JsonCpp APPEND PROPERTY
|
||||
INTERFACE_COMPILE_OPTIONS -Wno-deprecated-declarations)
|
||||
endif()
|
||||
set(CMAKE_JSONCPP_LIBRARIES JsonCpp::JsonCpp)
|
||||
else()
|
||||
set(CMAKE_JSONCPP_LIBRARIES cmjsoncpp)
|
||||
add_subdirectory(Utilities/cmjsoncpp)
|
||||
CMAKE_SET_TARGET_FOLDER(cmjsoncpp "Utilities/3rdParty")
|
||||
endif()
|
||||
|
||||
#---------------------------------------------------------------------
|
||||
# Build libuv library.
|
||||
if(CMAKE_USE_SYSTEM_LIBUV)
|
||||
if(WIN32)
|
||||
find_package(LibUV 1.38.0)
|
||||
else()
|
||||
find_package(LibUV 1.28.0)
|
||||
endif()
|
||||
if(NOT LIBUV_FOUND)
|
||||
message(FATAL_ERROR
|
||||
"CMAKE_USE_SYSTEM_LIBUV is ON but a libuv is not found!")
|
||||
endif()
|
||||
set(CMAKE_LIBUV_LIBRARIES LibUV::LibUV)
|
||||
else()
|
||||
set(CMAKE_LIBUV_LIBRARIES cmlibuv)
|
||||
add_subdirectory(Utilities/cmlibuv)
|
||||
CMAKE_SET_TARGET_FOLDER(cmlibuv "Utilities/3rdParty")
|
||||
endif()
|
||||
|
||||
#---------------------------------------------------------------------
|
||||
# Use curses?
|
||||
if(NOT DEFINED BUILD_CursesDialog)
|
||||
if (UNIX)
|
||||
include(${CMake_SOURCE_DIR}/Source/Checks/Curses.cmake)
|
||||
set(BUILD_CursesDialog_DEFAULT "${CMakeCheckCurses_COMPILED}")
|
||||
elseif(WIN32)
|
||||
set(BUILD_CursesDialog_DEFAULT "OFF")
|
||||
endif()
|
||||
option(BUILD_CursesDialog "Build the CMake Curses Dialog ccmake" "${BUILD_CursesDialog_DEFAULT}")
|
||||
endif ()
|
||||
if(BUILD_CursesDialog)
|
||||
if(UNIX)
|
||||
set(CURSES_NEED_NCURSES TRUE)
|
||||
find_package(Curses)
|
||||
if(NOT CURSES_FOUND)
|
||||
message(WARNING
|
||||
"'ccmake' will not be built because Curses was not found.\n"
|
||||
"Turn off BUILD_CursesDialog to suppress this message."
|
||||
)
|
||||
set(BUILD_CursesDialog 0)
|
||||
endif()
|
||||
elseif(WIN32)
|
||||
# FIXME: Add support for system-provided pdcurses.
|
||||
add_subdirectory(Utilities/cmpdcurses)
|
||||
set(CURSES_LIBRARY cmpdcurses)
|
||||
set(CURSES_INCLUDE_PATH "") # cmpdcurses has usage requirements
|
||||
set(CMAKE_USE_SYSTEM_FORM 0)
|
||||
set(HAVE_CURSES_USE_DEFAULT_COLORS 1)
|
||||
endif()
|
||||
endif()
|
||||
if(BUILD_CursesDialog)
|
||||
if(NOT CMAKE_USE_SYSTEM_FORM)
|
||||
add_subdirectory(Source/CursesDialog/form)
|
||||
elseif(NOT CURSES_FORM_LIBRARY)
|
||||
message( FATAL_ERROR "CMAKE_USE_SYSTEM_FORM in ON but CURSES_FORM_LIBRARY is not set!" )
|
||||
endif()
|
||||
endif()
|
||||
endmacro ()
|
||||
|
||||
#-----------------------------------------------------------------------
|
||||
if(NOT CMake_TEST_EXTERNAL_CMAKE)
|
||||
if(CMAKE_CXX_PLATFORM_ID MATCHES "OpenBSD")
|
||||
@ -749,7 +344,7 @@ include(Source/CMakeVersion.cmake)
|
||||
|
||||
# Include the standard Dart testing module
|
||||
enable_testing()
|
||||
include (${CMAKE_ROOT}/Modules/Dart.cmake)
|
||||
include(${CMAKE_ROOT}/Modules/Dart.cmake)
|
||||
|
||||
# Set up test-time configuration.
|
||||
set_directory_properties(PROPERTIES
|
||||
@ -803,8 +398,9 @@ if(CMake_TEST_EXTERNAL_CMAKE)
|
||||
endif()
|
||||
|
||||
if(NOT CMake_TEST_EXTERNAL_CMAKE)
|
||||
# build the utilities (a macro defined in this file)
|
||||
CMAKE_BUILD_UTILITIES()
|
||||
find_package(Threads)
|
||||
# build the utilities
|
||||
include(CMakeBuildUtilities)
|
||||
|
||||
if(BUILD_QtDialog)
|
||||
if(APPLE)
|
||||
@ -813,10 +409,9 @@ if(NOT CMake_TEST_EXTERNAL_CMAKE)
|
||||
set(CMAKE_BUNDLE_LOCATION "${CMAKE_INSTALL_PREFIX}")
|
||||
# make sure CMAKE_INSTALL_PREFIX ends in /
|
||||
if(NOT CMAKE_INSTALL_PREFIX MATCHES "/$")
|
||||
set(CMAKE_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}/")
|
||||
string(APPEND CMAKE_INSTALL_PREFIX "/")
|
||||
endif()
|
||||
set(CMAKE_INSTALL_PREFIX
|
||||
"${CMAKE_INSTALL_PREFIX}CMake.app/Contents")
|
||||
string(APPEND CMAKE_INSTALL_PREFIX "CMake.app/Contents")
|
||||
endif()
|
||||
endif()
|
||||
|
||||
@ -829,14 +424,11 @@ if(NOT CMake_TEST_EXTERNAL_CMAKE)
|
||||
endif()
|
||||
|
||||
# add the uninstall support
|
||||
configure_file(
|
||||
"${CMAKE_CURRENT_SOURCE_DIR}/cmake_uninstall.cmake.in"
|
||||
"${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake"
|
||||
@ONLY)
|
||||
configure_file(cmake_uninstall.cmake.in cmake_uninstall.cmake @ONLY)
|
||||
add_custom_target(uninstall
|
||||
"${CMAKE_COMMAND}" -P "${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake")
|
||||
|
||||
include (CMakeCPack.cmake)
|
||||
include(CMakeCPack.cmake)
|
||||
|
||||
endif()
|
||||
|
||||
@ -860,10 +452,10 @@ if(NOT CMake_TEST_EXTERNAL_CMAKE)
|
||||
-Wshadow -Wpointer-arith -Wformat-security -Wundef
|
||||
)
|
||||
|
||||
foreach(FLAG_LANG C CXX)
|
||||
foreach(FLAG ${${FLAG_LANG}_FLAGS_LIST})
|
||||
foreach(FLAG_LANG IN ITEMS C CXX)
|
||||
foreach(FLAG IN LISTS ${FLAG_LANG}_FLAGS_LIST)
|
||||
if(NOT " ${CMAKE_${FLAG_LANG}_FLAGS} " MATCHES " ${FLAG} ")
|
||||
set(CMAKE_${FLAG_LANG}_FLAGS "${CMAKE_${FLAG_LANG}_FLAGS} ${FLAG}")
|
||||
string(APPEND CMAKE_${FLAG_LANG}_FLAGS " ${FLAG}")
|
||||
endif()
|
||||
endforeach()
|
||||
endforeach()
|
||||
@ -883,9 +475,6 @@ add_subdirectory(Tests)
|
||||
if(NOT CMake_TEST_EXTERNAL_CMAKE)
|
||||
if(BUILD_TESTING)
|
||||
CMAKE_SET_TARGET_FOLDER(CMakeLibTests "Tests")
|
||||
IF(TARGET CMakeServerLibTests)
|
||||
CMAKE_SET_TARGET_FOLDER(CMakeServerLibTests "Tests")
|
||||
ENDIF()
|
||||
endif()
|
||||
if(TARGET documentation)
|
||||
CMAKE_SET_TARGET_FOLDER(documentation "Documentation")
|
||||
@ -894,7 +483,8 @@ endif()
|
||||
|
||||
if(BUILD_TESTING)
|
||||
add_test(SystemInformationNew "${CMAKE_CMAKE_COMMAND}"
|
||||
--system-information -G "${CMAKE_GENERATOR}" )
|
||||
--system-information -G "${CMAKE_GENERATOR}"
|
||||
)
|
||||
endif()
|
||||
|
||||
if(NOT CMake_TEST_EXTERNAL_CMAKE)
|
||||
|
@ -74,6 +74,7 @@ list(APPEND CTEST_CUSTOM_WARNING_EXCEPTION
|
||||
"cm(StringCommand|CTestTestHandler)\\.cxx.*warning.*rand.*may return deterministic values"
|
||||
"cm(StringCommand|CTestTestHandler)\\.cxx.*warning.*rand.*isn.*t random" # we do not do crypto
|
||||
"cm(StringCommand|CTestTestHandler)\\.cxx.*warning.*srand.*seed choices are.*poor" # we do not do crypto
|
||||
"cmFindPackageCommand.cxx.*: warning #177-D: parameter .* was declared but never referenced"
|
||||
"IPA warning: function.*multiply defined in"
|
||||
"LICENSE WARNING" # PGI license expiry. Not useful in nightly testing.
|
||||
|
||||
@ -83,6 +84,11 @@ list(APPEND CTEST_CUSTOM_WARNING_EXCEPTION
|
||||
"compilation completed with warnings" # PGI
|
||||
"[0-9]+ Warning\\(s\\) detected" # SunPro
|
||||
|
||||
# Ignore false positive on `cm::optional` usage from GCC
|
||||
"cmGlobalNinjaGenerator.cxx:[0-9]*:[0-9]*: warning: '.*cm::optional<CxxModuleMapFormat>::_mem\\)\\)' may be used uninitialized \\[-Wmaybe-uninitialized\\]"
|
||||
"cmGlobalNinjaGenerator.cxx:[0-9]*:[0-9]*: note: '.*cm::optional<CxxModuleMapFormat>::_mem\\)\\)' was declared here"
|
||||
"cmGlobalNinjaGenerator.cxx:[0-9]*:[0-9]*: warning: '\\*\\(\\(void\\*\\)& modmap_fmt \\+4\\)' may be used uninitialized in this function \\[-Wmaybe-uninitialized\\]"
|
||||
|
||||
# clang-analyzer exceptions
|
||||
"cmListFileLexer.c:[0-9]+:[0-9]+: warning: Array subscript is undefined"
|
||||
"jsoncpp/src/.*:[0-9]+:[0-9]+: warning: Value stored to .* is never read"
|
||||
|
@ -18,12 +18,12 @@ endif()
|
||||
# not hurt other versions, and this will work into the
|
||||
# future
|
||||
if(MSVC OR _INTEL_WINDOWS OR _CLANG_MSVC_WINDOWS)
|
||||
add_definitions(-D_CRT_SECURE_NO_DEPRECATE -D_CRT_NONSTDC_NO_DEPRECATE)
|
||||
add_compile_definitions(_CRT_SECURE_NO_DEPRECATE _CRT_NONSTDC_NO_DEPRECATE)
|
||||
else()
|
||||
endif()
|
||||
|
||||
if(MSVC)
|
||||
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -stack:10000000")
|
||||
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${CMAKE_CXX_LINKER_WRAPPER_FLAG}-stack:10000000")
|
||||
endif()
|
||||
|
||||
# MSVC 14.28 enables C5105, but the Windows SDK 10.0.18362.0 triggers it.
|
||||
@ -62,7 +62,7 @@ endif()
|
||||
# Use 64-bit off_t on 32-bit Linux
|
||||
if (CMAKE_SYSTEM_NAME STREQUAL "Linux" AND CMAKE_SIZEOF_VOID_P EQUAL 4)
|
||||
# ensure 64bit offsets are used for filesystem accesses for 32bit compilation
|
||||
add_definitions(-D_FILE_OFFSET_BITS=64)
|
||||
add_compile_definitions(_FILE_OFFSET_BITS=64)
|
||||
endif()
|
||||
|
||||
# Workaround for TOC Overflow on ppc64
|
||||
@ -98,7 +98,7 @@ if (CMAKE_CXX_COMPILER_ID STREQUAL SunPro AND
|
||||
endif()
|
||||
endif()
|
||||
|
||||
foreach(lang C CXX)
|
||||
foreach(lang IN ITEMS C CXX)
|
||||
# Suppress warnings from PGI compiler.
|
||||
if (CMAKE_${lang}_COMPILER_ID STREQUAL "PGI")
|
||||
set(CMAKE_${lang}_FLAGS "${CMAKE_${lang}_FLAGS} -w")
|
||||
@ -136,3 +136,12 @@ OFF to disable /MP completely." )
|
||||
endif()
|
||||
endif()
|
||||
endif()
|
||||
|
||||
# Get rid of excess -Wunused-but-set-variable on release builds with LCC >= 1.26
|
||||
foreach(l IN ITEMS C CXX)
|
||||
if(CMAKE_${l}_COMPILER_ID STREQUAL "LCC" AND NOT CMAKE_${l}_COMPILER_VERSION VERSION_LESS 1.26)
|
||||
foreach(c IN ITEMS MINSIZEREL RELEASE RELWITHDEBINFO)
|
||||
string(APPEND "CMAKE_${l}_FLAGS_${c}" " -Wno-unused-but-set-variable")
|
||||
endforeach()
|
||||
endif()
|
||||
endforeach()
|
||||
|
@ -53,6 +53,7 @@ The following individuals and institutions are among the Contributors:
|
||||
* Clement Creusot <creusot@cs.york.ac.uk>
|
||||
* Daniel Blezek <blezek@gmail.com>
|
||||
* Daniel Pfeifer <daniel@pfeifer-mail.de>
|
||||
* Dawid Wróbel <me@dawidwrobel.com>
|
||||
* Enrico Scholz <enrico.scholz@informatik.tu-chemnitz.de>
|
||||
* Eran Ifrah <eran.ifrah@gmail.com>
|
||||
* Esben Mose Hansen, Ange Optimization ApS
|
||||
|
@ -15,6 +15,7 @@ The general signature is:
|
||||
[PATHS [path | ENV var]... ]
|
||||
[REGISTRY_VIEW (64|32|64_32|32_64|HOST|TARGET|BOTH)]
|
||||
[PATH_SUFFIXES suffix1 [suffix2 ...]]
|
||||
[VALIDATOR function]
|
||||
[DOC "cache documentation string"]
|
||||
[NO_CACHE]
|
||||
[REQUIRED]
|
||||
@ -66,6 +67,31 @@ Options include:
|
||||
Specify additional subdirectories to check below each directory
|
||||
location otherwise considered.
|
||||
|
||||
``VALIDATOR``
|
||||
.. versionadded:: 3.25
|
||||
|
||||
Specify a :command:`function` to be called for each candidate item found
|
||||
(a :command:`macro` cannot be provided, that will result in an error).
|
||||
Two arguments will be passed to the validator function: the name of a
|
||||
result variable, and the absolute path to the candidate item. The item
|
||||
will be accepted and the search will end unless the function sets the
|
||||
value in the result variable to false in the calling scope. The result
|
||||
variable will hold a true value when the validator function is entered.
|
||||
|
||||
.. parsed-literal::
|
||||
|
||||
function(my_check validator_result_var item)
|
||||
if(NOT item MATCHES ...)
|
||||
set(${validator_result_var} FALSE PARENT_SCOPE)
|
||||
endif()
|
||||
endfunction()
|
||||
|
||||
|FIND_XXX| (result NAMES ... VALIDATOR my_check)
|
||||
|
||||
Note that if a cached result is used, the search is skipped and any
|
||||
``VALIDATOR`` is ignored. The cached result is not required to pass the
|
||||
validation function.
|
||||
|
||||
``DOC``
|
||||
Specify the documentation string for the ``<VAR>`` cache entry.
|
||||
|
||||
|
@ -67,6 +67,8 @@ The options are:
|
||||
Each byproduct file will be marked with the :prop_sf:`GENERATED`
|
||||
source file property automatically.
|
||||
|
||||
*See policy* :policy:`CMP0058` *for the motivation behind this feature.*
|
||||
|
||||
Explicit specification of byproducts is supported by the
|
||||
:generator:`Ninja` generator to tell the ``ninja`` build tool
|
||||
how to regenerate byproducts when they are missing. It is
|
||||
@ -434,7 +436,7 @@ one of the keywords to make clear the behavior they expect.
|
||||
Because generator expressions can be used in custom commands,
|
||||
it is possible to define ``COMMAND`` lines or whole custom commands
|
||||
which evaluate to empty strings for certain configurations.
|
||||
For **Visual Studio 2010 (and newer)** generators these command
|
||||
For **Visual Studio 11 2012 (and newer)** generators these command
|
||||
lines or custom commands will be omitted for the specific
|
||||
configuration and no "empty-string-command" will be added.
|
||||
|
||||
|
@ -42,6 +42,8 @@ The options are:
|
||||
Each byproduct file will be marked with the :prop_sf:`GENERATED`
|
||||
source file property automatically.
|
||||
|
||||
*See policy* :policy:`CMP0058` *for the motivation behind this feature.*
|
||||
|
||||
Explicit specification of byproducts is supported by the
|
||||
:generator:`Ninja` generator to tell the ``ninja`` build tool
|
||||
how to regenerate byproducts when they are missing. It is
|
||||
|
@ -5,7 +5,7 @@ Add a subdirectory to the build.
|
||||
|
||||
.. code-block:: cmake
|
||||
|
||||
add_subdirectory(source_dir [binary_dir] [EXCLUDE_FROM_ALL])
|
||||
add_subdirectory(source_dir [binary_dir] [EXCLUDE_FROM_ALL] [SYSTEM])
|
||||
|
||||
Adds a subdirectory to the build. The source_dir specifies the
|
||||
directory in which the source CMakeLists.txt and code files are
|
||||
@ -33,3 +33,10 @@ dependencies supersede this exclusion. If a target built by the
|
||||
parent project depends on a target in the subdirectory, the dependee
|
||||
target will be included in the parent project build system to satisfy
|
||||
the dependency.
|
||||
|
||||
If the ``SYSTEM`` argument is provided, the :prop_dir:`SYSTEM` directory
|
||||
property of the subdirectory will be set to true. This property is
|
||||
used to initialize the :prop_tgt:`SYSTEM` property of each target
|
||||
created in that subdirectory. The include directories of targets with
|
||||
:prop_tgt:`SYSTEM` set to true will be treated as ``SYSTEM`` when
|
||||
compiling consumers.
|
||||
|
76
Help/command/block.rst
Normal file
76
Help/command/block.rst
Normal file
@ -0,0 +1,76 @@
|
||||
block
|
||||
-----
|
||||
|
||||
.. versionadded:: 3.25
|
||||
|
||||
Evaluate a group of commands with a dedicated variable and/or policy scope.
|
||||
|
||||
.. code-block:: cmake
|
||||
|
||||
block([SCOPE_FOR [POLICIES] [VARIABLES] ] [PROPAGATE <var-name>...])
|
||||
<commands>
|
||||
endblock()
|
||||
|
||||
All commands between ``block()`` and the matching :command:`endblock` are
|
||||
recorded without being invoked. Once the :command:`endblock` is evaluated, the
|
||||
recorded list of commands is invoked inside the requested scopes, then the
|
||||
scopes created by the ``block()`` command are removed.
|
||||
|
||||
``SCOPE_FOR``
|
||||
Specify which scopes must be created.
|
||||
|
||||
``POLICIES``
|
||||
Create a new policy scope. This is equivalent to
|
||||
:command:`cmake_policy(PUSH)`.
|
||||
|
||||
``VARIABLES``
|
||||
Create a new variable scope.
|
||||
|
||||
If ``SCOPE_FOR`` is not specified, this is equivalent to:
|
||||
|
||||
.. code-block:: cmake
|
||||
|
||||
block(SCOPE_FOR VARIABLES POLICIES)
|
||||
|
||||
``PROPAGATE``
|
||||
When a variable scope is created by the :command:`block` command, this
|
||||
option sets or unsets the specified variables in the parent scope. This is
|
||||
equivalent to :command:`set(PARENT_SCOPE)` or :command:`unset(PARENT_SCOPE)`
|
||||
commands.
|
||||
|
||||
.. code-block:: cmake
|
||||
|
||||
set(var1 "INIT1")
|
||||
set(var2 "INIT2")
|
||||
|
||||
block(PROPAGATE var1 var2)
|
||||
set(var1 "VALUE1")
|
||||
unset(var2)
|
||||
endblock()
|
||||
|
||||
# Now var1 holds VALUE1, and var2 is unset
|
||||
|
||||
This option is only allowed when a variable scope is created. An error will
|
||||
be raised in the other cases.
|
||||
|
||||
When the ``block()`` is inside a :command:`foreach` or :command:`while`
|
||||
command, the :command:`break` and :command:`continue` commands can be used
|
||||
inside the block.
|
||||
|
||||
.. code-block:: cmake
|
||||
|
||||
while(TRUE)
|
||||
block()
|
||||
...
|
||||
# the break() command will terminate the while() command
|
||||
break()
|
||||
endblock()
|
||||
endwhile()
|
||||
|
||||
|
||||
See Also
|
||||
^^^^^^^^
|
||||
|
||||
* :command:`endblock`
|
||||
* :command:`return`
|
||||
* :command:`cmake_policy`
|
@ -24,12 +24,12 @@ options, if any. The trailing ``-- -i`` option is added for
|
||||
:ref:`Makefile Generators` if policy :policy:`CMP0061` is not set to
|
||||
``NEW``.
|
||||
|
||||
When invoked, this ``cmake --build`` command line will launch the
|
||||
When invoked, this :option:`cmake --build` command line will launch the
|
||||
underlying build system tool.
|
||||
|
||||
.. versionadded:: 3.21
|
||||
The ``PARALLEL_LEVEL`` argument can be used to set the ``--parallel``
|
||||
flag.
|
||||
The ``PARALLEL_LEVEL`` argument can be used to set the
|
||||
:option:`--parallel <cmake--build --parallel>` flag.
|
||||
|
||||
.. code-block:: cmake
|
||||
|
||||
@ -39,7 +39,7 @@ This second signature is deprecated, but still available for backwards
|
||||
compatibility. Use the first signature instead.
|
||||
|
||||
It sets the given ``<cachevariable>`` to a command-line string as
|
||||
above but without the ``--target`` option.
|
||||
above but without the :option:`--target <cmake--build --target>` option.
|
||||
The ``<makecommand>`` is ignored but should be the full path to
|
||||
devenv, nmake, make or one of the end user build tools
|
||||
for legacy invocations.
|
||||
|
@ -14,6 +14,7 @@ Synopsis
|
||||
cmake_language(`EVAL`_ CODE <code>...)
|
||||
cmake_language(`DEFER`_ <options>... CALL <command> [<arg>...])
|
||||
cmake_language(`SET_DEPENDENCY_PROVIDER`_ <command> SUPPORTED_METHODS <methods>...)
|
||||
cmake_language(`GET_MESSAGE_LOG_LEVEL`_ <out-var>)
|
||||
|
||||
Introduction
|
||||
^^^^^^^^^^^^
|
||||
@ -50,6 +51,7 @@ is equivalent to
|
||||
To ensure consistency of the code, the following commands are not allowed:
|
||||
|
||||
* ``if`` / ``elseif`` / ``else`` / ``endif``
|
||||
* ``block`` / ``endblock``
|
||||
* ``while`` / ``endwhile``
|
||||
* ``foreach`` / ``endforeach``
|
||||
* ``function`` / ``endfunction``
|
||||
@ -491,3 +493,29 @@ calling the provider command recursively for the same dependency.
|
||||
SET_DEPENDENCY_PROVIDER mycomp_provide_dependency
|
||||
SUPPORTED_METHODS FIND_PACKAGE
|
||||
)
|
||||
|
||||
Getting current message log level
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
.. versionadded:: 3.25
|
||||
|
||||
.. _GET_MESSAGE_LOG_LEVEL:
|
||||
.. _query_message_log_level:
|
||||
|
||||
.. code-block:: cmake
|
||||
|
||||
cmake_language(GET_MESSAGE_LOG_LEVEL <output_variable>)
|
||||
|
||||
Writes the current :command:`message` logging level
|
||||
into the given ``<output_variable>``.
|
||||
|
||||
See :command:`message` for the possible logging levels.
|
||||
|
||||
The current message logging level can be set either using the
|
||||
:option:`--log-level <cmake --log-level>`
|
||||
command line option of the :manual:`cmake(1)` program or using
|
||||
the :variable:`CMAKE_MESSAGE_LOG_LEVEL` variable.
|
||||
|
||||
If both the command line option and the variable are set, the command line
|
||||
option takes precedence. If neither are set, the default logging level
|
||||
is returned.
|
||||
|
@ -103,6 +103,47 @@ Calls to the :command:`cmake_minimum_required(VERSION)`,
|
||||
``cmake_policy(VERSION)``, or ``cmake_policy(SET)`` commands
|
||||
influence only the current top of the policy stack.
|
||||
|
||||
.. versionadded:: 3.25
|
||||
The :command:`block` and :command:`endblock` commands offer a more flexible
|
||||
and more secure way to manage the policy stack. The pop action is done
|
||||
automatically when the :command:`endblock` command is executed, so it avoid
|
||||
to call the :command:`cmake_policy(POP)` command before each
|
||||
:command:`return` command.
|
||||
|
||||
.. code-block:: cmake
|
||||
|
||||
# stack management with cmake_policy()
|
||||
function(my_func)
|
||||
cmake_policy(PUSH)
|
||||
cmake_policy(SET ...)
|
||||
if (<cond1>)
|
||||
...
|
||||
cmake_policy(POP)
|
||||
return()
|
||||
elseif(<cond2>)
|
||||
...
|
||||
cmake_policy(POP)
|
||||
return()
|
||||
endif()
|
||||
...
|
||||
cmake_policy(POP)
|
||||
endfunction()
|
||||
|
||||
# stack management with block()/endblock()
|
||||
function(my_func)
|
||||
block(SCOPE_FOR POLICIES)
|
||||
cmake_policy(SET ...)
|
||||
if (<cond1>)
|
||||
...
|
||||
return()
|
||||
elseif(<cond2>)
|
||||
...
|
||||
return()
|
||||
endif()
|
||||
...
|
||||
endblock()
|
||||
endfunction()
|
||||
|
||||
Commands created by the :command:`function` and :command:`macro`
|
||||
commands record policy settings when they are created and
|
||||
use the pre-record policies when they are invoked. If the function or
|
||||
|
@ -9,8 +9,8 @@ Continue to the top of enclosing foreach or while loop.
|
||||
|
||||
continue()
|
||||
|
||||
The ``continue`` command allows a cmake script to abort the rest of a block
|
||||
in a :command:`foreach` or :command:`while` loop, and start at the top of
|
||||
the next iteration.
|
||||
The ``continue()`` command allows a cmake script to abort the rest of the
|
||||
current iteration of a :command:`foreach` or :command:`while` loop, and start
|
||||
at the top of the next iteration.
|
||||
|
||||
See also the :command:`break` command.
|
||||
|
@ -40,8 +40,8 @@ The options are:
|
||||
``CONFIGURATION <config>``
|
||||
Specify the build configuration (e.g. ``Debug``). If not
|
||||
specified the ``CTEST_BUILD_CONFIGURATION`` variable will be checked.
|
||||
Otherwise the ``-C <cfg>`` option given to the :manual:`ctest(1)`
|
||||
command will be used, if any.
|
||||
Otherwise the :option:`-C \<cfg\> <ctest -C>` option given to the
|
||||
:manual:`ctest(1)` command will be used, if any.
|
||||
|
||||
``PARALLEL_LEVEL <parallel>``
|
||||
.. versionadded:: 3.21
|
||||
@ -54,7 +54,7 @@ The options are:
|
||||
Pass additional arguments to the underlying build command.
|
||||
If not specified the ``CTEST_BUILD_FLAGS`` variable will be checked.
|
||||
This can, e.g., be used to trigger a parallel build using the
|
||||
``-j`` option of make. See the :module:`ProcessorCount` module
|
||||
``-j`` option of ``make``. See the :module:`ProcessorCount` module
|
||||
for an example.
|
||||
|
||||
``PROJECT_NAME <project-name>``
|
||||
|
@ -1,15 +1,15 @@
|
||||
ctest_run_script
|
||||
----------------
|
||||
|
||||
runs a ctest -S script
|
||||
runs a :option:`ctest -S` script
|
||||
|
||||
::
|
||||
|
||||
ctest_run_script([NEW_PROCESS] script_file_name script_file_name1
|
||||
script_file_name2 ... [RETURN_VALUE var])
|
||||
|
||||
Runs a script or scripts much like if it was run from ctest -S. If no
|
||||
argument is provided then the current script is run using the current
|
||||
Runs a script or scripts much like if it was run from :option:`ctest -S`.
|
||||
If no argument is provided then the current script is run using the current
|
||||
settings of the variables. If ``NEW_PROCESS`` is specified then each
|
||||
script will be run in a separate process.If ``RETURN_VALUE`` is specified
|
||||
the return value of the last script run will be put into ``var``.
|
||||
|
@ -45,7 +45,7 @@ The parameters are as follows:
|
||||
|
||||
ctest_start(Experimental GROUP GroupExperimental)
|
||||
|
||||
Later, in another ``ctest -S`` script:
|
||||
Later, in another :option:`ctest -S` script:
|
||||
|
||||
.. code-block:: cmake
|
||||
|
||||
|
@ -109,8 +109,9 @@ The options are:
|
||||
While running tests in parallel, try not to start tests when they
|
||||
may cause the CPU load to pass above a given threshold. If not
|
||||
specified the :variable:`CTEST_TEST_LOAD` variable will be checked,
|
||||
and then the ``--test-load`` command-line argument to :manual:`ctest(1)`.
|
||||
See also the ``TestLoad`` setting in the :ref:`CTest Test Step`.
|
||||
and then the :option:`--test-load <ctest --test-load>` command-line
|
||||
argument to :manual:`ctest(1)`. See also the ``TestLoad`` setting
|
||||
in the :ref:`CTest Test Step`.
|
||||
|
||||
``REPEAT <mode>:<n>``
|
||||
.. versionadded:: 3.17
|
||||
@ -176,8 +177,9 @@ See also the :variable:`CTEST_CUSTOM_MAXIMUM_PASSED_TEST_OUTPUT_SIZE`,
|
||||
:variable:`CTEST_CUSTOM_MAXIMUM_FAILED_TEST_OUTPUT_SIZE` and
|
||||
:variable:`CTEST_CUSTOM_TEST_OUTPUT_TRUNCATION` variables, along with their
|
||||
corresponding :manual:`ctest(1)` command line options
|
||||
``--test-output-size-passed``, ``--test-output-size-failed``, and
|
||||
``--test-output-truncation``.
|
||||
:option:`--test-output-size-passed <ctest --test-output-size-passed>`,
|
||||
:option:`--test-output-size-failed <ctest --test-output-size-failed>`, and
|
||||
:option:`--test-output-truncation <ctest --test-output-truncation>`.
|
||||
|
||||
.. _`Additional Test Measurements`:
|
||||
|
||||
|
@ -1,13 +1,14 @@
|
||||
enable_language
|
||||
---------------
|
||||
Enable a language (CXX/C/OBJC/OBJCXX/Fortran/etc)
|
||||
|
||||
Enable languages (CXX/C/OBJC/OBJCXX/Fortran/etc)
|
||||
|
||||
.. code-block:: cmake
|
||||
|
||||
enable_language(<lang> [OPTIONAL] )
|
||||
enable_language(<lang>... [OPTIONAL])
|
||||
|
||||
Enables support for the named language in CMake. This is
|
||||
the same as the :command:`project` command but does not create any of the extra
|
||||
Enables support for the named languages in CMake. This is the same as
|
||||
the :command:`project` command but does not create any of the extra
|
||||
variables that are created by the project command. Example languages
|
||||
are ``CXX``, ``C``, ``CUDA``, ``OBJC``, ``OBJCXX``, ``Fortran``,
|
||||
``HIP``, ``ISPC``, and ``ASM``.
|
||||
|
11
Help/command/endblock.rst
Normal file
11
Help/command/endblock.rst
Normal file
@ -0,0 +1,11 @@
|
||||
endblock
|
||||
--------
|
||||
|
||||
.. versionadded:: 3.25
|
||||
|
||||
Ends a list of commands in a :command:`block` and removes the scopes
|
||||
created by the :command:`block` command.
|
||||
|
||||
.. code-block:: cmake
|
||||
|
||||
endblock()
|
@ -25,7 +25,8 @@ Exporting Targets
|
||||
.. code-block:: cmake
|
||||
|
||||
export(TARGETS <target>... [NAMESPACE <namespace>]
|
||||
[APPEND] FILE <filename> [EXPORT_LINK_INTERFACE_LIBRARIES])
|
||||
[APPEND] FILE <filename> [EXPORT_LINK_INTERFACE_LIBRARIES]
|
||||
[CXX_MODULES_DIRECTORY <directory>])
|
||||
|
||||
Creates a file ``<filename>`` that may be included by outside projects to
|
||||
import targets named by ``<target>...`` from the current project's build tree.
|
||||
@ -52,6 +53,16 @@ The options are:
|
||||
in the export, even when policy :policy:`CMP0022` is NEW. This is useful
|
||||
to support consumers using CMake versions older than 2.8.12.
|
||||
|
||||
``CXX_MODULES_DIRECTORY <directory>``
|
||||
|
||||
.. note ::
|
||||
|
||||
Experimental. Gated by ``CMAKE_EXPERIMENTAL_CXX_MODULE_CMAKE_API``
|
||||
|
||||
Export C++ module properties to files under the given directory. Each file
|
||||
will be named according to the target's export name (without any namespace).
|
||||
These files will automatically be included from the export file.
|
||||
|
||||
This signature requires all targets to be listed explicitly. If a library
|
||||
target is included in the export, but a target to which it links is not
|
||||
included, the behavior is unspecified. See the `export(EXPORT)`_ signature
|
||||
@ -95,7 +106,8 @@ Exporting Targets matching install(EXPORT)
|
||||
|
||||
.. code-block:: cmake
|
||||
|
||||
export(EXPORT <export-name> [NAMESPACE <namespace>] [FILE <filename>])
|
||||
export(EXPORT <export-name> [NAMESPACE <namespace>] [FILE <filename>]
|
||||
[CXX_MODULES_DIRECTORY <directory>])
|
||||
|
||||
Creates a file ``<filename>`` that may be included by outside projects to
|
||||
import targets from the current project's build tree. This is the same
|
||||
|
@ -1121,8 +1121,11 @@ Additional options to ``DOWNLOAD`` are:
|
||||
|
||||
Verify that the downloaded content hash matches the expected value, where
|
||||
``ALGO`` is one of the algorithms supported by ``file(<HASH>)``.
|
||||
If it does not match, the operation fails with an error. It is an error to
|
||||
specify this if ``DOWNLOAD`` is not given a ``<file>``.
|
||||
If the file already exists and matches the hash, the download is skipped.
|
||||
If the file already exists and does not match the hash, the file is
|
||||
downloaded again. If after download the file does not match the hash, the
|
||||
operation fails with an error. It is an error to specify this option if
|
||||
``DOWNLOAD`` is not given a ``<file>``.
|
||||
|
||||
``EXPECTED_MD5 <value>``
|
||||
Historical short-hand for ``EXPECTED_HASH MD5=<value>``. It is an error to
|
||||
|
@ -285,29 +285,40 @@ CMake constructs a set of possible installation prefixes for the
|
||||
package. Under each prefix several directories are searched for a
|
||||
configuration file. The tables below show the directories searched.
|
||||
Each entry is meant for installation trees following Windows (``W``), UNIX
|
||||
(``U``), or Apple (``A``) conventions::
|
||||
(``U``), or Apple (``A``) conventions:
|
||||
|
||||
<prefix>/ (W)
|
||||
<prefix>/(cmake|CMake)/ (W)
|
||||
<prefix>/<name>*/ (W)
|
||||
<prefix>/<name>*/(cmake|CMake)/ (W)
|
||||
<prefix>/(lib/<arch>|lib*|share)/cmake/<name>*/ (U)
|
||||
<prefix>/(lib/<arch>|lib*|share)/<name>*/ (U)
|
||||
<prefix>/(lib/<arch>|lib*|share)/<name>*/(cmake|CMake)/ (U)
|
||||
<prefix>/<name>*/(lib/<arch>|lib*|share)/cmake/<name>*/ (W/U)
|
||||
<prefix>/<name>*/(lib/<arch>|lib*|share)/<name>*/ (W/U)
|
||||
<prefix>/<name>*/(lib/<arch>|lib*|share)/<name>*/(cmake|CMake)/ (W/U)
|
||||
==================================================================== ==========
|
||||
Entry Convention
|
||||
==================================================================== ==========
|
||||
``<prefix>/`` W
|
||||
``<prefix>/(cmake|CMake)/`` W
|
||||
``<prefix>/<name>*/`` W
|
||||
``<prefix>/<name>*/(cmake|CMake)/`` W
|
||||
``<prefix>/<name>*/(cmake|CMake)/<name>*/`` [#]_ W
|
||||
``<prefix>/(lib/<arch>|lib*|share)/cmake/<name>*/`` U
|
||||
``<prefix>/(lib/<arch>|lib*|share)/<name>*/`` U
|
||||
``<prefix>/(lib/<arch>|lib*|share)/<name>*/(cmake|CMake)/`` U
|
||||
``<prefix>/<name>*/(lib/<arch>|lib*|share)/cmake/<name>*/`` W/U
|
||||
``<prefix>/<name>*/(lib/<arch>|lib*|share)/<name>*/`` W/U
|
||||
``<prefix>/<name>*/(lib/<arch>|lib*|share)/<name>*/(cmake|CMake)/`` W/U
|
||||
==================================================================== ==========
|
||||
|
||||
.. [#] .. versionadded:: 3.25
|
||||
|
||||
On systems supporting macOS :prop_tgt:`FRAMEWORK` and :prop_tgt:`BUNDLE`, the
|
||||
following directories are searched for Frameworks or Application Bundles
|
||||
containing a configuration file::
|
||||
containing a configuration file:
|
||||
|
||||
<prefix>/<name>.framework/Resources/ (A)
|
||||
<prefix>/<name>.framework/Resources/CMake/ (A)
|
||||
<prefix>/<name>.framework/Versions/*/Resources/ (A)
|
||||
<prefix>/<name>.framework/Versions/*/Resources/CMake/ (A)
|
||||
<prefix>/<name>.app/Contents/Resources/ (A)
|
||||
<prefix>/<name>.app/Contents/Resources/CMake/ (A)
|
||||
=========================================================== ==========
|
||||
Entry Convention
|
||||
=========================================================== ==========
|
||||
``<prefix>/<name>.framework/Resources/`` A
|
||||
``<prefix>/<name>.framework/Resources/CMake/`` A
|
||||
``<prefix>/<name>.framework/Versions/*/Resources/`` A
|
||||
``<prefix>/<name>.framework/Versions/*/Resources/CMake/`` A
|
||||
``<prefix>/<name>.app/Contents/Resources/`` A
|
||||
``<prefix>/<name>.app/Contents/Resources/CMake/`` A
|
||||
=========================================================== ==========
|
||||
|
||||
In all cases the ``<name>`` is treated as case-insensitive and corresponds
|
||||
to any of the names specified (``<PackageName>`` or names given by ``NAMES``).
|
||||
@ -368,7 +379,7 @@ enabled.
|
||||
See policy :policy:`CMP0074`.
|
||||
|
||||
2. Search paths specified in cmake-specific cache variables. These
|
||||
are intended to be used on the command line with a ``-DVAR=value``.
|
||||
are intended to be used on the command line with a :option:`-DVAR=VALUE <cmake -D>`.
|
||||
The values are interpreted as :ref:`semicolon-separated lists <CMake Language Lists>`.
|
||||
This can be skipped if ``NO_CMAKE_PATH`` is passed or by setting the
|
||||
:variable:`CMAKE_FIND_USE_CMAKE_PATH` to ``FALSE``:
|
||||
|
@ -130,3 +130,11 @@ yields
|
||||
-- en=two, ba=dua
|
||||
-- en=three, ba=tiga
|
||||
-- en=four, ba=
|
||||
|
||||
See Also
|
||||
^^^^^^^^
|
||||
|
||||
* :command:`break`
|
||||
* :command:`continue`
|
||||
* :command:`endforeach`
|
||||
* :command:`while`
|
||||
|
@ -73,3 +73,9 @@ argument. Referencing to ``ARGV#`` arguments beyond ``ARGC`` have
|
||||
undefined behavior. Checking that ``ARGC`` is greater than ``#`` is
|
||||
the only way to ensure that ``ARGV#`` was passed to the function as an
|
||||
extra argument.
|
||||
|
||||
See Also
|
||||
^^^^^^^^
|
||||
|
||||
* :command:`endfunction`
|
||||
* :command:`return`
|
||||
|
@ -16,6 +16,7 @@ relevant parent scope as described for the :command:`define_property`
|
||||
command and if still unable to find the property, ``VAR`` will be set to
|
||||
an empty string.
|
||||
|
||||
For a list of standard properties you can type ``cmake --help-property-list``.
|
||||
For a list of standard properties you can type
|
||||
:option:`cmake --help-property-list`.
|
||||
|
||||
See also the more general :command:`get_property` command.
|
||||
|
@ -424,3 +424,10 @@ There is no automatic evaluation for environment or cache
|
||||
:ref:`Variable References`. Their values must be referenced as
|
||||
``$ENV{<name>}`` or ``$CACHE{<name>}`` wherever the above-documented
|
||||
condition syntax accepts ``<variable|string>``.
|
||||
|
||||
See also
|
||||
^^^^^^^^
|
||||
|
||||
* :command:`else`
|
||||
* :command:`elseif`
|
||||
* :command:`endif`
|
||||
|
@ -132,7 +132,7 @@ Installing Targets
|
||||
install(TARGETS targets... [EXPORT <export-name>]
|
||||
[RUNTIME_DEPENDENCIES args...|RUNTIME_DEPENDENCY_SET <set-name>]
|
||||
[[ARCHIVE|LIBRARY|RUNTIME|OBJECTS|FRAMEWORK|BUNDLE|
|
||||
PRIVATE_HEADER|PUBLIC_HEADER|RESOURCE|FILE_SET <set-name>]
|
||||
PRIVATE_HEADER|PUBLIC_HEADER|RESOURCE|FILE_SET <set-name>|CXX_MODULES_BMI]
|
||||
[DESTINATION <dir>]
|
||||
[PERMISSIONS permissions...]
|
||||
[CONFIGURATIONS [Debug|Release|...]]
|
||||
@ -215,11 +215,21 @@ that may be installed:
|
||||
``/blah/include/myproj/here.h`` with a base directory ``/blah/include``
|
||||
would be installed to ``myproj/here.h`` below the destination.
|
||||
|
||||
``CXX_MODULES_BMI``
|
||||
|
||||
.. note ::
|
||||
|
||||
Experimental. Gated by ``CMAKE_EXPERIMENTAL_CXX_MODULE_CMAKE_API``
|
||||
|
||||
Any module files from C++ modules from ``PUBLIC`` sources in a file set of
|
||||
type ``CXX_MODULES`` will be installed to the given ``DESTINATION``. All
|
||||
modules are placed directly in the destination as no directory structure is
|
||||
derived from the names of the modules. An empty ``DESTINATION`` may be used
|
||||
to suppress installing these files (for use in generic code).
|
||||
|
||||
For each of these arguments given, the arguments following them only apply
|
||||
to the target or file type specified in the argument. If none is given, the
|
||||
installation properties apply to all target types. If only one is given then
|
||||
only targets of that type will be installed (which can be used to install
|
||||
just a DLL or just an import library.)
|
||||
installation properties apply to all target types.
|
||||
|
||||
For regular executables, static libraries and shared libraries, the
|
||||
``DESTINATION`` argument is not required. For these target types, when
|
||||
@ -233,6 +243,14 @@ Apple bundles and frameworks. A destination can be omitted for interface and
|
||||
object libraries, but they are handled differently (see the discussion of this
|
||||
topic toward the end of this section).
|
||||
|
||||
For shared libraries on DLL platforms, if neither ``RUNTIME`` nor ``ARCHIVE``
|
||||
destinations are specified, both the ``RUNTIME`` and ``ARCHIVE`` components are
|
||||
installed to their default destinations. If either a ``RUNTIME`` or ``ARCHIVE``
|
||||
destination is specified, the component is installed to that destination, and
|
||||
the other component is not installed. If both ``RUNTIME`` and ``ARCHIVE``
|
||||
destinations are specified, then both components are installed to their
|
||||
respective destinations.
|
||||
|
||||
The following table shows the target types with their associated variables and
|
||||
built-in defaults that apply when no destination is given:
|
||||
|
||||
@ -778,9 +796,10 @@ Installing Exports
|
||||
.. code-block:: cmake
|
||||
|
||||
install(EXPORT <export-name> DESTINATION <dir>
|
||||
[NAMESPACE <namespace>] [[FILE <name>.cmake]|
|
||||
[NAMESPACE <namespace>] [FILE <name>.cmake]
|
||||
[PERMISSIONS permissions...]
|
||||
[CONFIGURATIONS [Debug|Release|...]]
|
||||
[CONFIGURATIONS [Debug|Release|...]
|
||||
[CXX_MODULES_DIRECTORY <directory>]
|
||||
[EXPORT_LINK_INTERFACE_LIBRARIES]
|
||||
[COMPONENT <component>]
|
||||
[EXCLUDE_FROM_ALL])
|
||||
@ -836,6 +855,18 @@ library is always installed if the headers and CMake export file are present.
|
||||
to an ndk build system complete with transitive dependencies, include flags
|
||||
and defines required to use the libraries.
|
||||
|
||||
``CXX_MODULES_DIRECTORY``
|
||||
|
||||
.. note ::
|
||||
|
||||
Experimental. Gated by ``CMAKE_EXPERIMENTAL_CXX_MODULE_CMAKE_API``
|
||||
|
||||
Specify a subdirectory to store C++ module information for targets in the
|
||||
export set. This directory will be populated with files which add the
|
||||
necessary target property information to the relevant targets. Note that
|
||||
without this information, none of the C++ modules which are part of the
|
||||
targets in the export set will support being imported in consuming targets.
|
||||
|
||||
The ``EXPORT`` form is useful to help outside projects use targets built
|
||||
and installed by the current project. For example, the code
|
||||
|
||||
@ -932,12 +963,12 @@ Generated Installation Script
|
||||
.. note::
|
||||
|
||||
Use of this feature is not recommended. Please consider using the
|
||||
``--install`` argument of :manual:`cmake(1)` instead.
|
||||
:option:`cmake --install` instead.
|
||||
|
||||
The ``install()`` command generates a file, ``cmake_install.cmake``, inside
|
||||
the build directory, which is used internally by the generated install target
|
||||
and by CPack. You can also invoke this script manually with ``cmake -P``. This
|
||||
script accepts several variables:
|
||||
and by CPack. You can also invoke this script manually with
|
||||
:option:`cmake -P`. This script accepts several variables:
|
||||
|
||||
``COMPONENT``
|
||||
Set this variable to install only a single CPack component as opposed to all
|
||||
|
@ -83,8 +83,9 @@ are sent to stderr and are not prefixed with hyphens. The
|
||||
:manual:`CMake GUI <cmake-gui(1)>` displays all messages in its log area.
|
||||
The :manual:`curses interface <ccmake(1)>` shows ``STATUS`` to ``TRACE``
|
||||
messages one at a time on a status line and other messages in an
|
||||
interactive pop-up box. The ``--log-level`` command-line option to each of
|
||||
these tools can be used to control which messages will be shown.
|
||||
interactive pop-up box. The :option:`--log-level <cmake --log-level>`
|
||||
command-line option to each of these tools can be used to control which
|
||||
messages will be shown.
|
||||
|
||||
.. versionadded:: 3.17
|
||||
To make a log level persist between CMake runs, the
|
||||
@ -104,7 +105,7 @@ these tools can be used to control which messages will be shown.
|
||||
list variable to a dot-separated string. The message context will always
|
||||
appear before any indenting content but after any automatically added leading
|
||||
hyphens. By default, message context is not shown, it has to be explicitly
|
||||
enabled by giving the :manual:`cmake <cmake(1)>` ``--log-context``
|
||||
enabled by giving the :option:`cmake --log-context`
|
||||
command-line option or by setting the :variable:`CMAKE_MESSAGE_CONTEXT_SHOW`
|
||||
variable to true. See the :variable:`CMAKE_MESSAGE_CONTEXT` documentation for
|
||||
usage examples.
|
||||
|
@ -5,16 +5,87 @@ Return from a file, directory or function.
|
||||
|
||||
.. code-block:: cmake
|
||||
|
||||
return()
|
||||
return([PROPAGATE <var-name>...])
|
||||
|
||||
Returns from a file, directory or function. When this command is
|
||||
encountered in an included file (via :command:`include` or
|
||||
When this command is encountered in an included file (via :command:`include` or
|
||||
:command:`find_package`), it causes processing of the current file to stop
|
||||
and control is returned to the including file. If it is encountered in a
|
||||
file which is not included by another file, e.g. a ``CMakeLists.txt``,
|
||||
file which is not included by another file, e.g. a ``CMakeLists.txt``,
|
||||
deferred calls scheduled by :command:`cmake_language(DEFER)` are invoked and
|
||||
control is returned to the parent directory if there is one. If return is
|
||||
called in a function, control is returned to the caller of the function.
|
||||
control is returned to the parent directory if there is one.
|
||||
|
||||
Note that a :command:`macro <macro>`, unlike a :command:`function <function>`,
|
||||
If ``return()`` is called in a function, control is returned to the caller
|
||||
of that function. Note that a :command:`macro`, unlike a :command:`function`,
|
||||
is expanded in place and therefore cannot handle ``return()``.
|
||||
|
||||
Policy :policy:`CMP0140` controls the behavior regarding the arguments of the
|
||||
command. All arguments are ignored unless that policy is set to ``NEW``.
|
||||
|
||||
``PROPAGATE``
|
||||
.. versionadded:: 3.25
|
||||
|
||||
This option sets or unsets the specified variables in the parent directory or
|
||||
function caller scope. This is equivalent to :command:`set(PARENT_SCOPE)` or
|
||||
:command:`unset(PARENT_SCOPE)` commands, except for the way it interacts
|
||||
with the :command:`block` command, as described below.
|
||||
|
||||
The ``PROPAGATE`` option can be very useful in conjunction with the
|
||||
:command:`block` command. A :command:`return` will propagate the
|
||||
specified variables through any enclosing block scopes created by the
|
||||
:command:`block` commands. Inside a function, this ensures the variables
|
||||
are propagated to the function's caller, regardless of any blocks within
|
||||
the function. If not inside a function, it ensures the variables are
|
||||
propagated to the parent file or directory scope. For example:
|
||||
|
||||
.. code-block:: cmake
|
||||
:caption: CMakeLists.txt
|
||||
|
||||
cmake_version_required(VERSION 3.25)
|
||||
project(example)
|
||||
|
||||
set(var1 "top-value")
|
||||
|
||||
block(SCOPE_FOR VARIABLES)
|
||||
add_subdirectory(subDir)
|
||||
# var1 has the value "block-nested"
|
||||
endblock()
|
||||
|
||||
# var1 has the value "top-value"
|
||||
|
||||
.. code-block:: cmake
|
||||
:caption: subDir/CMakeLists.txt
|
||||
|
||||
function(multi_scopes result_var1 result_var2)
|
||||
block(SCOPE_FOR VARIABLES)
|
||||
# This would only propagate out of the immediate block, not to
|
||||
# the caller of the function.
|
||||
#set(${result_var1} "new-value" PARENT_SCOPE)
|
||||
#unset(${result_var2} PARENT_SCOPE)
|
||||
|
||||
# This propagates the variables through the enclosing block and
|
||||
# out to the caller of the function.
|
||||
set(${result_var1} "new-value")
|
||||
unset(${result_var2})
|
||||
return(PROPAGATE ${result_var1} ${result_var2})
|
||||
endblock()
|
||||
endfunction()
|
||||
|
||||
set(var1 "some-value")
|
||||
set(var2 "another-value")
|
||||
|
||||
multi_scopes(var1 var2)
|
||||
# Now var1 will hold "new-value" and var2 will be unset
|
||||
|
||||
block(SCOPE_FOR VARIABLES)
|
||||
# This return() will set var1 in the directory scope that included us
|
||||
# via add_subdirectory(). The surrounding block() here does not limit
|
||||
# propagation to the current file, but the block() in the parent
|
||||
# directory scope does prevent propagation going any further.
|
||||
set(var1 "block-nested")
|
||||
return(PROPAGATE var1)
|
||||
endblock()
|
||||
|
||||
See Also
|
||||
^^^^^^^^
|
||||
|
||||
* :command:`block`
|
||||
|
@ -22,12 +22,17 @@ Set Normal Variable
|
||||
Sets the given ``<variable>`` in the current function or directory scope.
|
||||
|
||||
If the ``PARENT_SCOPE`` option is given the variable will be set in
|
||||
the scope above the current scope. Each new directory or function
|
||||
creates a new scope. This command will set the value of a variable
|
||||
into the parent directory or calling function (whichever is applicable
|
||||
to the case at hand). The previous state of the variable's value stays the
|
||||
same in the current scope (e.g., if it was undefined before, it is still
|
||||
undefined and if it had a value, it is still that value).
|
||||
the scope above the current scope. Each new directory or :command:`function`
|
||||
command creates a new scope. A scope can also be created with the
|
||||
:command:`block` command. This command will set the value of a variable into
|
||||
the parent directory, calling function or encompassing scope (whichever is
|
||||
applicable to the case at hand). The previous state of the variable's value
|
||||
stays the same in the current scope (e.g., if it was undefined before, it is
|
||||
still undefined and if it had a value, it is still that value).
|
||||
|
||||
The :command:`block(PROPAGATE)` and :command:`return(PROPAGATE)` commands can
|
||||
be used as an alternate method to the :command:`set(PARENT_SCOPE)` and
|
||||
:command:`unset(PARENT_SCOPE)` commands to update the parent scope.
|
||||
|
||||
Set Cache Entry
|
||||
^^^^^^^^^^^^^^^
|
||||
@ -78,7 +83,7 @@ option is given then the cache entry will be set to the given value.
|
||||
|
||||
It is possible for the cache entry to exist prior to the call but
|
||||
have no type set if it was created on the :manual:`cmake(1)` command
|
||||
line by a user through the ``-D<var>=<value>`` option without
|
||||
line by a user through the :option:`-D\<var\>=\<value\> <cmake -D>` option without
|
||||
specifying a type. In this case the ``set`` command will add the
|
||||
type. Furthermore, if the ``<type>`` is ``PATH`` or ``FILEPATH``
|
||||
and the ``<value>`` provided on the command line is a relative path,
|
||||
|
@ -15,9 +15,9 @@ named ``<target>`` must have been created by a command such as
|
||||
:ref:`ALIAS target <Alias Targets>`.
|
||||
|
||||
The ``INTERFACE``, ``PUBLIC`` and ``PRIVATE`` keywords are required to
|
||||
specify the scope of the following arguments. ``PRIVATE`` and ``PUBLIC``
|
||||
items will populate the :prop_tgt:`COMPILE_DEFINITIONS` property of
|
||||
``<target>``. ``PUBLIC`` and ``INTERFACE`` items will populate the
|
||||
specify the :ref:`scope <Target Usage Requirements>` of the following arguments.
|
||||
``PRIVATE`` and ``PUBLIC`` items will populate the :prop_tgt:`COMPILE_DEFINITIONS`
|
||||
property of ``<target>``. ``PUBLIC`` and ``INTERFACE`` items will populate the
|
||||
:prop_tgt:`INTERFACE_COMPILE_DEFINITIONS` property of ``<target>``.
|
||||
The following arguments specify compile definitions. Repeated calls for the
|
||||
same ``<target>`` append items in the order called.
|
||||
|
@ -22,9 +22,9 @@ If ``BEFORE`` is specified, the content will be prepended to the property
|
||||
instead of being appended.
|
||||
|
||||
The ``INTERFACE``, ``PUBLIC`` and ``PRIVATE`` keywords are required to
|
||||
specify the scope of the following arguments. ``PRIVATE`` and ``PUBLIC``
|
||||
items will populate the :prop_tgt:`COMPILE_OPTIONS` property of
|
||||
``<target>``. ``PUBLIC`` and ``INTERFACE`` items will populate the
|
||||
specify the :ref:`scope <Target Usage Requirements>` of the following arguments.
|
||||
``PRIVATE`` and ``PUBLIC`` items will populate the :prop_tgt:`COMPILE_OPTIONS`
|
||||
property of ``<target>``. ``PUBLIC`` and ``INTERFACE`` items will populate the
|
||||
:prop_tgt:`INTERFACE_COMPILE_OPTIONS` property of ``<target>``.
|
||||
The following arguments specify compile options. Repeated calls for the same
|
||||
``<target>`` append items in the order called.
|
||||
|
@ -18,9 +18,9 @@ By using ``AFTER`` or ``BEFORE`` explicitly, you can select between appending
|
||||
and prepending, independent of the default.
|
||||
|
||||
The ``INTERFACE``, ``PUBLIC`` and ``PRIVATE`` keywords are required to specify
|
||||
the scope of the following arguments. ``PRIVATE`` and ``PUBLIC`` items will
|
||||
populate the :prop_tgt:`INCLUDE_DIRECTORIES` property of ``<target>``.
|
||||
``PUBLIC`` and ``INTERFACE`` items will populate the
|
||||
the :ref:`scope <Target Usage Requirements>` of the following arguments.
|
||||
``PRIVATE`` and ``PUBLIC`` items will populate the :prop_tgt:`INCLUDE_DIRECTORIES`
|
||||
property of ``<target>``. ``PUBLIC`` and ``INTERFACE`` items will populate the
|
||||
:prop_tgt:`INTERFACE_INCLUDE_DIRECTORIES` property of ``<target>``.
|
||||
The following arguments specify include directories.
|
||||
|
||||
|
@ -21,11 +21,12 @@ The named ``<target>`` must have been created by a command such as
|
||||
:ref:`ALIAS target <Alias Targets>`.
|
||||
|
||||
The ``INTERFACE``, ``PUBLIC`` and ``PRIVATE`` keywords are required to
|
||||
specify the scope of the items that follow them. ``PRIVATE`` and
|
||||
``PUBLIC`` items will populate the :prop_tgt:`LINK_DIRECTORIES` property
|
||||
of ``<target>``. ``PUBLIC`` and ``INTERFACE`` items will populate the
|
||||
:prop_tgt:`INTERFACE_LINK_DIRECTORIES` property of ``<target>``
|
||||
(:ref:`IMPORTED targets <Imported Targets>` only support ``INTERFACE`` items).
|
||||
specify the :ref:`scope <Target Usage Requirements>` of the items that follow
|
||||
them. ``PRIVATE`` and ``PUBLIC`` items will populate the
|
||||
:prop_tgt:`LINK_DIRECTORIES` property of ``<target>``. ``PUBLIC`` and
|
||||
``INTERFACE`` items will populate the :prop_tgt:`INTERFACE_LINK_DIRECTORIES`
|
||||
property of ``<target>`` (:ref:`IMPORTED targets <Imported Targets>` only
|
||||
support ``INTERFACE`` items).
|
||||
Each item specifies a link directory and will be converted to an absolute
|
||||
path if necessary before adding it to the relevant property. Repeated
|
||||
calls for the same ``<target>`` append items in the order called.
|
||||
|
@ -146,8 +146,10 @@ Libraries for a Target and/or its Dependents
|
||||
<PRIVATE|PUBLIC|INTERFACE> <item>...
|
||||
[<PRIVATE|PUBLIC|INTERFACE> <item>...]...)
|
||||
|
||||
The ``PUBLIC``, ``PRIVATE`` and ``INTERFACE`` keywords can be used to
|
||||
The ``PUBLIC``, ``PRIVATE`` and ``INTERFACE``
|
||||
:ref:`scope <Target Usage Requirements>` keywords can be used to
|
||||
specify both the link dependencies and the link interface in one command.
|
||||
|
||||
Libraries and targets following ``PUBLIC`` are linked to, and are made
|
||||
part of the link interface. Libraries and targets following ``PRIVATE``
|
||||
are linked to, but are not made part of the link interface. Libraries
|
||||
|
@ -32,9 +32,9 @@ If ``BEFORE`` is specified, the content will be prepended to the property
|
||||
instead of being appended.
|
||||
|
||||
The ``INTERFACE``, ``PUBLIC`` and ``PRIVATE`` keywords are required to
|
||||
specify the scope of the following arguments. ``PRIVATE`` and ``PUBLIC``
|
||||
items will populate the :prop_tgt:`LINK_OPTIONS` property of
|
||||
``<target>``. ``PUBLIC`` and ``INTERFACE`` items will populate the
|
||||
specify the :ref:`scope <Target Usage Requirements>` of the following arguments.
|
||||
``PRIVATE`` and ``PUBLIC`` items will populate the :prop_tgt:`LINK_OPTIONS`
|
||||
property of ``<target>``. ``PUBLIC`` and ``INTERFACE`` items will populate the
|
||||
:prop_tgt:`INTERFACE_LINK_OPTIONS` property of ``<target>``.
|
||||
The following arguments specify link options. Repeated calls for the same
|
||||
``<target>`` append items in the order called.
|
||||
|
@ -25,9 +25,9 @@ The named ``<target>`` must have been created by a command such as
|
||||
:ref:`ALIAS target <Alias Targets>`.
|
||||
|
||||
The ``INTERFACE``, ``PUBLIC`` and ``PRIVATE`` keywords are required to
|
||||
specify the scope of the following arguments. ``PRIVATE`` and ``PUBLIC``
|
||||
items will populate the :prop_tgt:`PRECOMPILE_HEADERS` property of
|
||||
``<target>``. ``PUBLIC`` and ``INTERFACE`` items will populate the
|
||||
specify the :ref:`scope <Target Usage Requirements>` of the following arguments.
|
||||
``PRIVATE`` and ``PUBLIC`` items will populate the :prop_tgt:`PRECOMPILE_HEADERS`
|
||||
property of ``<target>``. ``PUBLIC`` and ``INTERFACE`` items will populate the
|
||||
:prop_tgt:`INTERFACE_PRECOMPILE_HEADERS` property of ``<target>``
|
||||
(:ref:`IMPORTED targets <Imported Targets>` only support ``INTERFACE`` items).
|
||||
Repeated calls for the same ``<target>`` will append items in the order called.
|
||||
|
@ -22,10 +22,10 @@ The named ``<target>`` must have been created by a command such as
|
||||
``<target>`` can be a custom target.
|
||||
|
||||
The ``INTERFACE``, ``PUBLIC`` and ``PRIVATE`` keywords are required to
|
||||
specify the scope of the source file paths (``<items>``) that follow
|
||||
them. ``PRIVATE`` and ``PUBLIC`` items will populate the :prop_tgt:`SOURCES`
|
||||
property of ``<target>``, which are used when building the target itself.
|
||||
``PUBLIC`` and ``INTERFACE`` items will populate the
|
||||
specify the :ref:`scope <Target Usage Requirements>` of the source file paths
|
||||
(``<items>``) that follow them. ``PRIVATE`` and ``PUBLIC`` items will
|
||||
populate the :prop_tgt:`SOURCES` property of ``<target>``, which are used when
|
||||
building the target itself. ``PUBLIC`` and ``INTERFACE`` items will populate the
|
||||
:prop_tgt:`INTERFACE_SOURCES` property of ``<target>``, which are used
|
||||
when building dependents. A target created by :command:`add_custom_target`
|
||||
can only have ``PRIVATE`` scope.
|
||||
@ -75,9 +75,33 @@ File Sets
|
||||
Adds a file set to a target, or adds files to an existing file set. Targets
|
||||
have zero or more named file sets. Each file set has a name, a type, a scope of
|
||||
``INTERFACE``, ``PUBLIC``, or ``PRIVATE``, one or more base directories, and
|
||||
files within those directories. The only acceptable type is ``HEADERS``. The
|
||||
optional default file sets are named after their type. The target may not be a
|
||||
custom target or :prop_tgt:`FRAMEWORK` target.
|
||||
files within those directories. The acceptable types include:
|
||||
|
||||
``HEADERS``
|
||||
|
||||
Sources intended to be used via a language's ``#include`` mechanism.
|
||||
|
||||
``CXX_MODULES``
|
||||
|
||||
.. note ::
|
||||
|
||||
Experimental. Gated by ``CMAKE_EXPERIMENTAL_CXX_MODULE_CMAKE_API``
|
||||
|
||||
Sources which contain C++ interface module or partition units (i.e., those
|
||||
using the ``export`` keyword). This file set type may not have an
|
||||
``INTERFACE`` scope except on ``IMPORTED`` targets.
|
||||
|
||||
``CXX_MODULE_HEADER_UNITS``
|
||||
|
||||
.. note ::
|
||||
|
||||
Experimental. Gated by ``CMAKE_EXPERIMENTAL_CXX_MODULE_CMAKE_API``
|
||||
|
||||
C++ header sources which may be imported by other C++ source code. This file
|
||||
set type may not have an ``INTERFACE`` scope except on ``IMPORTED`` targets.
|
||||
|
||||
The optional default file sets are named after their type. The target may not
|
||||
be a custom target or :prop_tgt:`FRAMEWORK` target.
|
||||
|
||||
Files in a ``PRIVATE`` or ``PUBLIC`` file set are marked as source files for
|
||||
the purposes of IDE integration. Additionally, files in ``HEADERS`` file sets
|
||||
@ -93,16 +117,17 @@ Each ``target_sources(FILE_SET)`` entry starts with ``INTERFACE``, ``PUBLIC``, o
|
||||
|
||||
The name of the file set to create or add to. It must contain only letters,
|
||||
numbers and underscores. Names starting with a capital letter are reserved
|
||||
for built-in file sets predefined by CMake. The only predefined set name is
|
||||
``HEADERS``. All other set names must not start with a capital letter or
|
||||
for built-in file sets predefined by CMake. The only predefined set names
|
||||
are those matching the acceptable types. All other set names must not start
|
||||
with a capital letter or
|
||||
underscore.
|
||||
|
||||
``TYPE <type>``
|
||||
|
||||
Every file set is associated with a particular type of file. ``HEADERS``
|
||||
is currently the only defined type and it is an error to specify anything
|
||||
else. As a special case, if the name of the file set is ``HEADERS``, the
|
||||
type does not need to be specified and the ``TYPE <type>`` arguments can be
|
||||
Every file set is associated with a particular type of file. Only types
|
||||
specified above may be used and it is an error to specify anything else. As
|
||||
a special case, if the name of the file set is one of the types, the type
|
||||
does not need to be specified and the ``TYPE <type>`` arguments can be
|
||||
omitted. For all other file set names, ``TYPE`` is required.
|
||||
|
||||
``BASE_DIRS <dirs>...``
|
||||
@ -134,6 +159,8 @@ Each ``target_sources(FILE_SET)`` entry starts with ``INTERFACE``, ``PUBLIC``, o
|
||||
The following target properties are set by ``target_sources(FILE_SET)``,
|
||||
but they should not generally be manipulated directly:
|
||||
|
||||
For file sets of type ``HEADERS``:
|
||||
|
||||
* :prop_tgt:`HEADER_SETS`
|
||||
* :prop_tgt:`INTERFACE_HEADER_SETS`
|
||||
* :prop_tgt:`HEADER_SET`
|
||||
@ -141,17 +168,37 @@ but they should not generally be manipulated directly:
|
||||
* :prop_tgt:`HEADER_DIRS`
|
||||
* :prop_tgt:`HEADER_DIRS_<NAME>`
|
||||
|
||||
For file sets of type ``CXX_MODULES``:
|
||||
|
||||
* :prop_tgt:`CXX_MODULE_SETS`
|
||||
* :prop_tgt:`INTERFACE_CXX_MODULE_SETS`
|
||||
* :prop_tgt:`CXX_MODULE_SET`
|
||||
* :prop_tgt:`CXX_MODULE_SET_<NAME>`
|
||||
* :prop_tgt:`CXX_MODULE_DIRS`
|
||||
* :prop_tgt:`CXX_MODULE_DIRS_<NAME>`
|
||||
|
||||
For file sets of type ``CXX_MODULE_HEADER_UNITS``:
|
||||
|
||||
* :prop_tgt:`CXX_MODULE_HEADER_UNIT_SETS`
|
||||
* :prop_tgt:`INTERFACE_CXX_MODULE_HEADER_UNIT_SETS`
|
||||
* :prop_tgt:`CXX_MODULE_HEADER_UNIT_SET`
|
||||
* :prop_tgt:`CXX_MODULE_HEADER_UNIT_SET_<NAME>`
|
||||
* :prop_tgt:`CXX_MODULE_HEADER_UNIT_DIRS`
|
||||
* :prop_tgt:`CXX_MODULE_HEADER_UNIT_DIRS_<NAME>`
|
||||
|
||||
Target properties related to include directories are also modified by
|
||||
``target_sources(FILE_SET)`` as follows:
|
||||
|
||||
:prop_tgt:`INCLUDE_DIRECTORIES`
|
||||
|
||||
If the ``TYPE`` is ``HEADERS``, and the scope of the file set is ``PRIVATE``
|
||||
or ``PUBLIC``, all of the ``BASE_DIRS`` of the file set are wrapped in
|
||||
:genex:`$<BUILD_INTERFACE>` and appended to this property.
|
||||
If the ``TYPE`` is ``HEADERS`` or ``CXX_MODULE_HEADER_UNITS``, and the scope
|
||||
of the file set is ``PRIVATE`` or ``PUBLIC``, all of the ``BASE_DIRS`` of
|
||||
the file set are wrapped in :genex:`$<BUILD_INTERFACE>` and appended to this
|
||||
property.
|
||||
|
||||
:prop_tgt:`INTERFACE_INCLUDE_DIRECTORIES`
|
||||
|
||||
If the ``TYPE`` is ``HEADERS``, and the scope of the file set is
|
||||
``INTERFACE`` or ``PUBLIC``, all of the ``BASE_DIRS`` of the file set are
|
||||
wrapped in :genex:`$<BUILD_INTERFACE>` and appended to this property.
|
||||
If the ``TYPE`` is ``HEADERS`` or ``CXX_MODULE_HEADER_UNITS``, and the scope
|
||||
of the file set is ``INTERFACE`` or ``PUBLIC``, all of the ``BASE_DIRS`` of
|
||||
the file set are wrapped in :genex:`$<BUILD_INTERFACE>` and appended to this
|
||||
property.
|
||||
|
@ -14,10 +14,16 @@ Try Compiling Whole Projects
|
||||
|
||||
.. code-block:: cmake
|
||||
|
||||
try_compile(<resultVar> <bindir> <srcdir>
|
||||
<projectName> [<targetName>] [CMAKE_FLAGS <flags>...]
|
||||
try_compile(<resultVar> PROJECT <projectName>
|
||||
SOURCE_DIR <srcdir>
|
||||
[BINARY_DIR <bindir>]
|
||||
[TARGET <targetName>]
|
||||
[NO_CACHE]
|
||||
[CMAKE_FLAGS <flags>...]
|
||||
[OUTPUT_VARIABLE <var>])
|
||||
|
||||
.. versionadded:: 3.25
|
||||
|
||||
Try building a project. The success or failure of the ``try_compile``,
|
||||
i.e. ``TRUE`` or ``FALSE`` respectively, is returned in ``<resultVar>``.
|
||||
|
||||
@ -34,6 +40,17 @@ below for the meaning of other options.
|
||||
Previously this was only done by the
|
||||
:ref:`source file <Try Compiling Source Files>` signature.
|
||||
|
||||
This command also supports an alternate signature
|
||||
which was present in older versions of CMake:
|
||||
|
||||
.. code-block:: cmake
|
||||
|
||||
try_compile(<resultVar> <bindir> <srcdir>
|
||||
<projectName> [<targetName>]
|
||||
[NO_CACHE]
|
||||
[CMAKE_FLAGS <flags>...]
|
||||
[OUTPUT_VARIABLE <var>])
|
||||
|
||||
.. _`Try Compiling Source Files`:
|
||||
|
||||
Try Compiling Source Files
|
||||
@ -41,7 +58,12 @@ Try Compiling Source Files
|
||||
|
||||
.. code-block:: cmake
|
||||
|
||||
try_compile(<resultVar> <bindir> <srcfile|SOURCES srcfile...>
|
||||
try_compile(<resultVar>
|
||||
<SOURCES <srcfile...> |
|
||||
SOURCE_FROM_CONTENT <name> <content> |
|
||||
SOURCE_FROM_VAR <name> <var> |
|
||||
SOURCE_FROM_FILE <name> <path> >...
|
||||
[NO_CACHE]
|
||||
[CMAKE_FLAGS <flags>...]
|
||||
[COMPILE_DEFINITIONS <defs>...]
|
||||
[LINK_OPTIONS <options>...]
|
||||
@ -53,15 +75,19 @@ Try Compiling Source Files
|
||||
[<LANG>_EXTENSIONS <bool>]
|
||||
)
|
||||
|
||||
.. versionadded:: 3.25
|
||||
|
||||
Try building an executable or static library from one or more source files
|
||||
(which one is determined by the :variable:`CMAKE_TRY_COMPILE_TARGET_TYPE`
|
||||
variable). The success or failure of the ``try_compile``, i.e. ``TRUE`` or
|
||||
``FALSE`` respectively, is returned in ``<resultVar>``.
|
||||
|
||||
In this form, one or more source files must be provided. If
|
||||
:variable:`CMAKE_TRY_COMPILE_TARGET_TYPE` is unset or is set to ``EXECUTABLE``,
|
||||
the sources must include a definition for ``main`` and CMake will create a
|
||||
``CMakeLists.txt`` file to build the source(s) as an executable.
|
||||
In this form, one or more source files must be provided. Additionally, one of
|
||||
``SOURCES`` and/or ``SOURCE_FROM_*`` must precede other keywords.
|
||||
|
||||
If :variable:`CMAKE_TRY_COMPILE_TARGET_TYPE` is unset or is set to
|
||||
``EXECUTABLE``, the sources must include a definition for ``main`` and CMake
|
||||
will create a ``CMakeLists.txt`` file to build the source(s) as an executable.
|
||||
If :variable:`CMAKE_TRY_COMPILE_TARGET_TYPE` is set to ``STATIC_LIBRARY``,
|
||||
a static library will be built instead and no definition for ``main`` is
|
||||
required. For an executable, the generated ``CMakeLists.txt`` file would
|
||||
@ -76,11 +102,45 @@ contain something like the following:
|
||||
target_link_options(cmTryCompileExec PRIVATE <LINK_OPTIONS from caller>)
|
||||
target_link_libraries(cmTryCompileExec ${LINK_LIBRARIES})
|
||||
|
||||
CMake automatically generates, for each ``try_compile`` operation, a
|
||||
unique directory under ``${CMAKE_BINARY_DIR}/CMakeFiles/CMakeScratch``
|
||||
with an unspecified name. These directories are cleaned automatically unless
|
||||
:option:`--debug-trycompile <cmake --debug-trycompile>` is passed to ``cmake``.
|
||||
Such directories from previous runs are also unconditionally cleaned at the
|
||||
beginning of any ``cmake`` execution.
|
||||
|
||||
This command also supports an alternate signature
|
||||
which was present in older versions of CMake:
|
||||
|
||||
.. code-block:: cmake
|
||||
|
||||
try_compile(<resultVar> <bindir> <srcfile|SOURCES srcfile...>
|
||||
[NO_CACHE]
|
||||
[CMAKE_FLAGS <flags>...]
|
||||
[COMPILE_DEFINITIONS <defs>...]
|
||||
[LINK_OPTIONS <options>...]
|
||||
[LINK_LIBRARIES <libs>...]
|
||||
[OUTPUT_VARIABLE <var>]
|
||||
[COPY_FILE <fileName> [COPY_FILE_ERROR <var>]]
|
||||
[<LANG>_STANDARD <std>]
|
||||
[<LANG>_STANDARD_REQUIRED <bool>]
|
||||
[<LANG>_EXTENSIONS <bool>]
|
||||
)
|
||||
|
||||
In this version, ``try_compile`` will use ``<bindir>/CMakeFiles/CMakeTmp`` for
|
||||
its operation, and all such files will be cleaned automatically.
|
||||
For debugging, :option:`--debug-trycompile <cmake --debug-trycompile>` can be
|
||||
passed to ``cmake`` to avoid this clean. However, multiple sequential
|
||||
``try_compile`` operations, if given the same ``<bindir>``, will reuse this
|
||||
single output directory, such that you can only debug one such ``try_compile``
|
||||
call at a time. Use of the newer signature is recommended to simplify
|
||||
debugging of multiple ``try_compile`` operations.
|
||||
|
||||
The options are:
|
||||
|
||||
``CMAKE_FLAGS <flags>...``
|
||||
Specify flags of the form ``-DVAR:TYPE=VALUE`` to be passed to
|
||||
the ``cmake`` command-line used to drive the test build.
|
||||
Specify flags of the form :option:`-DVAR:TYPE=VALUE <cmake -D>` to be passed
|
||||
to the :manual:`cmake(1)` command-line used to drive the test build.
|
||||
The above example shows how values for variables
|
||||
``INCLUDE_DIRECTORIES``, ``LINK_DIRECTORIES``, and ``LINK_LIBRARIES``
|
||||
are used.
|
||||
@ -111,9 +171,61 @@ The options are:
|
||||
set the :prop_tgt:`STATIC_LIBRARY_OPTIONS` target property in the generated
|
||||
project, depending on the :variable:`CMAKE_TRY_COMPILE_TARGET_TYPE` variable.
|
||||
|
||||
``NO_CACHE``
|
||||
.. versionadded:: 3.25
|
||||
|
||||
The result will be stored in a normal variable rather than a cache entry.
|
||||
|
||||
The result variable is normally cached so that a simple pattern can be used
|
||||
to avoid repeating the test on subsequent executions of CMake:
|
||||
|
||||
.. code-block:: cmake
|
||||
|
||||
if(NOT DEFINED RESULTVAR)
|
||||
# ...(check-specific setup code)...
|
||||
try_compile(RESULTVAR ...)
|
||||
# ...(check-specific logging and cleanup code)...
|
||||
endif()
|
||||
|
||||
If the guard variable and result variable are not the same (for example, if
|
||||
the test is part of a larger inspection), ``NO_CACHE`` may be useful to avoid
|
||||
leaking the intermediate result variable into the cache.
|
||||
|
||||
``OUTPUT_VARIABLE <var>``
|
||||
Store the output from the build process in the given variable.
|
||||
|
||||
``SOURCE_FROM_CONTENT <name> <content>``
|
||||
.. versionadded:: 3.25
|
||||
|
||||
Write ``<content>`` to a file named ``<name>`` in the operation directory.
|
||||
This can be used to bypass the need to separately write a source file when
|
||||
the contents of the file are dynamically specified. The specified ``<name>``
|
||||
is not allowed to contain path components.
|
||||
|
||||
``SOURCE_FROM_CONTENT`` may be specified multiple times.
|
||||
|
||||
``SOURCE_FROM_FILE <name> <path>``
|
||||
.. versionadded:: 3.25
|
||||
|
||||
Copy ``<path>`` to a file named ``<name>`` in the operation directory. This
|
||||
can be used to consolidate files into the operation directory, which may be
|
||||
useful if a source which already exists (i.e. as a stand-alone file in a
|
||||
project's source repository) needs to refer to other file(s) created by
|
||||
``SOURCE_FROM_*``. (Otherwise, ``SOURCES`` is usually more convenient.) The
|
||||
specified ``<name>`` is not allowed to contain path components.
|
||||
|
||||
``SOURCE_FROM_VAR <name> <var>``
|
||||
.. versionadded:: 3.25
|
||||
|
||||
Write the contents of ``<var>`` to a file named ``<name>`` in the operation
|
||||
directory. This is the same as ``SOURCE_FROM_CONTENT``, but takes the
|
||||
contents from the specified CMake variable, rather than directly, which may
|
||||
be useful when passing arguments through a function which wraps
|
||||
``try_compile``. The specified ``<name>`` is not allowed to contain path
|
||||
components.
|
||||
|
||||
``SOURCE_FROM_VAR`` may be specified multiple times.
|
||||
|
||||
``<LANG>_STANDARD <std>``
|
||||
.. versionadded:: 3.8
|
||||
|
||||
@ -136,17 +248,6 @@ The options are:
|
||||
:prop_tgt:`OBJC_EXTENSIONS`, :prop_tgt:`OBJCXX_EXTENSIONS`,
|
||||
or :prop_tgt:`CUDA_EXTENSIONS` target property of the generated project.
|
||||
|
||||
In this version all files in ``<bindir>/CMakeFiles/CMakeTmp`` will be
|
||||
cleaned automatically. For debugging, ``--debug-trycompile`` can be
|
||||
passed to ``cmake`` to avoid this clean. However, multiple sequential
|
||||
``try_compile`` operations reuse this single output directory. If you use
|
||||
``--debug-trycompile``, you can only debug one ``try_compile`` call at a time.
|
||||
The recommended procedure is to protect all ``try_compile`` calls in your
|
||||
project by ``if(NOT DEFINED <resultVar>)`` logic, configure with cmake
|
||||
all the way through once, then delete the cache entry associated with
|
||||
the try_compile call of interest, and then re-run cmake again with
|
||||
``--debug-trycompile``.
|
||||
|
||||
Other Behavior Settings
|
||||
^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
@ -214,9 +315,15 @@ a build configuration.
|
||||
the generated project (unless overridden by an explicit option).
|
||||
|
||||
.. versionchanged:: 3.14
|
||||
For the :generator:`Green Hills MULTI` generator the GHS toolset and target
|
||||
system customization cache variables are also propagated into the test project.
|
||||
For the :generator:`Green Hills MULTI` generator, the GHS toolset and target
|
||||
system customization cache variables are also propagated into the test
|
||||
project.
|
||||
|
||||
.. versionadded:: 3.24
|
||||
The :variable:`CMAKE_TRY_COMPILE_NO_PLATFORM_VARIABLES` variable may be
|
||||
set to disable passing platform variables into the test project.
|
||||
|
||||
.. versionadded:: 3.25
|
||||
If :policy:`CMP0141` is set to ``NEW``, one can use
|
||||
:variable:`CMAKE_MSVC_DEBUG_INFORMATION_FORMAT` to specify the MSVC debug
|
||||
information format.
|
||||
|
@ -13,68 +13,99 @@ Try Compiling and Running Source Files
|
||||
.. code-block:: cmake
|
||||
|
||||
try_run(<runResultVar> <compileResultVar>
|
||||
<bindir> <srcfile> [CMAKE_FLAGS <flags>...]
|
||||
<SOURCES <srcfile...> |
|
||||
SOURCE_FROM_CONTENT <name> <content> |
|
||||
SOURCE_FROM_VAR <name> <var> |
|
||||
SOURCE_FROM_FILE <name> <path> >...
|
||||
[NO_CACHE]
|
||||
[CMAKE_FLAGS <flags>...]
|
||||
[COMPILE_DEFINITIONS <defs>...]
|
||||
[LINK_OPTIONS <options>...]
|
||||
[LINK_LIBRARIES <libs>...]
|
||||
[COMPILE_OUTPUT_VARIABLE <var>]
|
||||
[COPY_FILE <fileName> [COPY_FILE_ERROR <var>]]
|
||||
[<LANG>_STANDARD <std>]
|
||||
[<LANG>_STANDARD_REQUIRED <bool>]
|
||||
[<LANG>_EXTENSIONS <bool>]
|
||||
[RUN_OUTPUT_VARIABLE <var>]
|
||||
[RUN_OUTPUT_STDOUT_VARIABLE <var>]
|
||||
[RUN_OUTPUT_STDERR_VARIABLE <var>]
|
||||
[OUTPUT_VARIABLE <var>]
|
||||
[WORKING_DIRECTORY <var>]
|
||||
[ARGS <args>...])
|
||||
[ARGS <args>...]
|
||||
)
|
||||
|
||||
.. versionadded:: 3.25
|
||||
|
||||
Try compiling a ``<srcfile>``. Returns ``TRUE`` or ``FALSE`` for success
|
||||
or failure in ``<compileResultVar>``. If the compile succeeded, runs the
|
||||
executable and returns its exit code in ``<runResultVar>``. If the
|
||||
executable was built, but failed to run, then ``<runResultVar>`` will be
|
||||
set to ``FAILED_TO_RUN``. See the :command:`try_compile` command for
|
||||
information on how the test project is constructed to build the source file.
|
||||
documentation of options common to both commands, and for information on how
|
||||
the test project is constructed to build the source file.
|
||||
|
||||
The options are:
|
||||
One or more source files must be provided. Additionally, one of ``SOURCES``
|
||||
and/or ``SOURCE_FROM_*`` must precede other keywords.
|
||||
|
||||
``CMAKE_FLAGS <flags>...``
|
||||
Specify flags of the form ``-DVAR:TYPE=VALUE`` to be passed to
|
||||
the ``cmake`` command-line used to drive the test build.
|
||||
The example in :command:`try_compile` shows how values for variables
|
||||
``INCLUDE_DIRECTORIES``, ``LINK_DIRECTORIES``, and ``LINK_LIBRARIES``
|
||||
are used.
|
||||
This command also supports an alternate signature
|
||||
which was present in older versions of CMake:
|
||||
|
||||
``COMPILE_DEFINITIONS <defs>...``
|
||||
Specify ``-Ddefinition`` arguments to pass to :command:`add_definitions`
|
||||
in the generated test project.
|
||||
.. code-block:: cmake
|
||||
|
||||
try_run(<runResultVar> <compileResultVar>
|
||||
<bindir> <srcfile|SOURCES srcfile...>
|
||||
[NO_CACHE]
|
||||
[CMAKE_FLAGS <flags>...]
|
||||
[COMPILE_DEFINITIONS <defs>...]
|
||||
[LINK_OPTIONS <options>...]
|
||||
[LINK_LIBRARIES <libs>...]
|
||||
[COMPILE_OUTPUT_VARIABLE <var>]
|
||||
[COPY_FILE <fileName> [COPY_FILE_ERROR <var>]]
|
||||
[<LANG>_STANDARD <std>]
|
||||
[<LANG>_STANDARD_REQUIRED <bool>]
|
||||
[<LANG>_EXTENSIONS <bool>]
|
||||
[RUN_OUTPUT_VARIABLE <var>]
|
||||
[RUN_OUTPUT_STDOUT_VARIABLE <var>]
|
||||
[RUN_OUTPUT_STDERR_VARIABLE <var>]
|
||||
[OUTPUT_VARIABLE <var>]
|
||||
[WORKING_DIRECTORY <var>]
|
||||
[ARGS <args>...]
|
||||
)
|
||||
|
||||
The options specific to ``try_run`` are:
|
||||
|
||||
``COMPILE_OUTPUT_VARIABLE <var>``
|
||||
Report the compile step build output in a given variable.
|
||||
|
||||
``LINK_LIBRARIES <libs>...``
|
||||
.. versionadded:: 3.2
|
||||
|
||||
Specify libraries to be linked in the generated project.
|
||||
The list of libraries may refer to system libraries and to
|
||||
:ref:`Imported Targets <Imported Targets>` from the calling project.
|
||||
|
||||
If this option is specified, any ``-DLINK_LIBRARIES=...`` value
|
||||
given to the ``CMAKE_FLAGS`` option will be ignored.
|
||||
|
||||
``LINK_OPTIONS <options>...``
|
||||
.. versionadded:: 3.14
|
||||
|
||||
Specify link step options to pass to :command:`target_link_options` in the
|
||||
generated project.
|
||||
|
||||
``OUTPUT_VARIABLE <var>``
|
||||
Report the compile build output and the output from running the executable
|
||||
in the given variable. This option exists for legacy reasons. Prefer
|
||||
``COMPILE_OUTPUT_VARIABLE`` and ``RUN_OUTPUT_VARIABLE`` instead.
|
||||
in the given variable. This option exists for legacy reasons and is only
|
||||
supported by the old ``try_run`` signature.
|
||||
Prefer ``COMPILE_OUTPUT_VARIABLE`` and ``RUN_OUTPUT_VARIABLE`` instead.
|
||||
|
||||
``RUN_OUTPUT_VARIABLE <var>``
|
||||
Report the output from running the executable in a given variable.
|
||||
|
||||
``RUN_OUTPUT_STDOUT_VARIABLE <var>``
|
||||
.. versionadded:: 3.25
|
||||
|
||||
Report the output of stdout from running the executable in a given variable.
|
||||
|
||||
``RUN_OUTPUT_STDERR_VARIABLE <var>``
|
||||
.. versionadded:: 3.25
|
||||
|
||||
Report the output of stderr from running the executable in a given variable.
|
||||
|
||||
``WORKING_DIRECTORY <var>``
|
||||
.. versionadded:: 3.20
|
||||
|
||||
Run the executable in the given directory. If no ``WORKING_DIRECTORY`` is
|
||||
specified, the executable will run in ``<bindir>``.
|
||||
specified, the executable will run in ``<bindir>`` or the current build
|
||||
directory.
|
||||
|
||||
``ARGS <args>...``
|
||||
Additional arguments to pass to the executable when running it.
|
||||
|
||||
Other Behavior Settings
|
||||
^^^^^^^^^^^^^^^^^^^^^^^
|
||||
@ -110,6 +141,7 @@ These cache entries are:
|
||||
|
||||
In order to make cross compiling your project easier, use ``try_run``
|
||||
only if really required. If you use ``try_run``, use the
|
||||
``RUN_OUTPUT_STDOUT_VARIABLE``, ``RUN_OUTPUT_STDERR_VARIABLE``,
|
||||
``RUN_OUTPUT_VARIABLE`` or ``OUTPUT_VARIABLE`` options only if really
|
||||
required. Using them will require that when cross-compiling, the cache
|
||||
variables will have to be set manually to the output of the executable.
|
||||
|
@ -23,3 +23,11 @@ Per legacy, the :command:`endwhile` command admits
|
||||
an optional ``<condition>`` argument.
|
||||
If used, it must be a verbatim repeat of the argument of the opening
|
||||
``while`` command.
|
||||
|
||||
See Also
|
||||
^^^^^^^^
|
||||
|
||||
* :command:`break`
|
||||
* :command:`continue`
|
||||
* :command:`foreach`
|
||||
* :command:`endwhile`
|
||||
|
@ -57,6 +57,12 @@ Variables specific to CPack Archive generator
|
||||
.. versionadded:: 3.9
|
||||
Per-component ``CPACK_ARCHIVE_<component>_FILE_NAME`` variables.
|
||||
|
||||
.. variable:: CPACK_ARCHIVE_FILE_EXTENSION
|
||||
|
||||
.. versionadded:: 3.25
|
||||
|
||||
Package file extension. Default values are given in the list above.
|
||||
|
||||
.. variable:: CPACK_ARCHIVE_COMPONENT_INSTALL
|
||||
|
||||
Enable component packaging. If enabled (ON), then the archive generator
|
||||
|
@ -57,7 +57,7 @@ List of CPack DEB generator specific variables:
|
||||
.. versionadded:: 3.5
|
||||
Per-component ``CPACK_DEBIAN_<COMPONENT>_PACKAGE_NAME`` variables.
|
||||
|
||||
See https://www.debian.org/doc/debian-policy/ch-controlfields.html#s-f-Source
|
||||
See https://www.debian.org/doc/debian-policy/ch-controlfields.html#s-f-source
|
||||
|
||||
.. variable:: CPACK_DEBIAN_FILE_NAME
|
||||
CPACK_DEBIAN_<COMPONENT>_FILE_NAME
|
||||
@ -399,7 +399,7 @@ List of CPack DEB generator specific variables:
|
||||
.. versionadded:: 3.4
|
||||
Per-component ``CPACK_DEBIAN_<COMPONENT>_PACKAGE_PREDEPENDS`` variables.
|
||||
|
||||
See http://www.debian.org/doc/debian-policy/ch-relationships.html#s-binarydeps
|
||||
See https://www.debian.org/doc/debian-policy/ch-relationships.html#s-binarydeps
|
||||
|
||||
.. variable:: CPACK_DEBIAN_PACKAGE_ENHANCES
|
||||
CPACK_DEBIAN_<COMPONENT>_PACKAGE_ENHANCES
|
||||
@ -419,7 +419,7 @@ List of CPack DEB generator specific variables:
|
||||
.. versionadded:: 3.4
|
||||
Per-component ``CPACK_DEBIAN_<COMPONENT>_PACKAGE_ENHANCES`` variables.
|
||||
|
||||
See http://www.debian.org/doc/debian-policy/ch-relationships.html#s-binarydeps
|
||||
See https://www.debian.org/doc/debian-policy/ch-relationships.html#s-binarydeps
|
||||
|
||||
.. variable:: CPACK_DEBIAN_PACKAGE_BREAKS
|
||||
CPACK_DEBIAN_<COMPONENT>_PACKAGE_BREAKS
|
||||
@ -508,7 +508,7 @@ List of CPack DEB generator specific variables:
|
||||
.. versionadded:: 3.4
|
||||
Per-component ``CPACK_DEBIAN_<COMPONENT>_PACKAGE_REPLACES`` variables.
|
||||
|
||||
See http://www.debian.org/doc/debian-policy/ch-relationships.html#s-binarydeps
|
||||
See https://www.debian.org/doc/debian-policy/ch-relationships.html#s-binarydeps
|
||||
|
||||
.. variable:: CPACK_DEBIAN_PACKAGE_RECOMMENDS
|
||||
CPACK_DEBIAN_<COMPONENT>_PACKAGE_RECOMMENDS
|
||||
@ -527,7 +527,7 @@ List of CPack DEB generator specific variables:
|
||||
.. versionadded:: 3.4
|
||||
Per-component ``CPACK_DEBIAN_<COMPONENT>_PACKAGE_RECOMMENDS`` variables.
|
||||
|
||||
See http://www.debian.org/doc/debian-policy/ch-relationships.html#s-binarydeps
|
||||
See https://www.debian.org/doc/debian-policy/ch-relationships.html#s-binarydeps
|
||||
|
||||
.. variable:: CPACK_DEBIAN_PACKAGE_SUGGESTS
|
||||
CPACK_DEBIAN_<COMPONENT>_PACKAGE_SUGGESTS
|
||||
@ -545,7 +545,7 @@ List of CPack DEB generator specific variables:
|
||||
.. versionadded:: 3.4
|
||||
Per-component ``CPACK_DEBIAN_<COMPONENT>_PACKAGE_SUGGESTS`` variables.
|
||||
|
||||
See http://www.debian.org/doc/debian-policy/ch-relationships.html#s-binarydeps
|
||||
See https://www.debian.org/doc/debian-policy/ch-relationships.html#s-binarydeps
|
||||
|
||||
.. variable:: CPACK_DEBIAN_PACKAGE_GENERATE_SHLIBS
|
||||
|
||||
@ -639,7 +639,7 @@ List of CPack DEB generator specific variables:
|
||||
- :variable:`CPACK_DEBIAN_PACKAGE_SOURCE` for component-based
|
||||
installations.
|
||||
|
||||
See https://www.debian.org/doc/debian-policy/ch-controlfields.html#s-f-Source
|
||||
See https://www.debian.org/doc/debian-policy/ch-controlfields.html#s-f-source
|
||||
|
||||
.. note::
|
||||
|
||||
|
@ -207,8 +207,8 @@ following fields in the root:
|
||||
set.
|
||||
|
||||
``buildConfig``
|
||||
The build configuration given to CPack with the ``-C`` option. Only present
|
||||
if this option is set.
|
||||
The build configuration given to CPack with the :option:`cpack -C` option.
|
||||
Only present if this option is set.
|
||||
|
||||
``defaultDirectoryPermissions``
|
||||
The default directory permissions given in
|
||||
|
@ -62,8 +62,6 @@ the RPM information (e.g. package license).
|
||||
|
||||
- :variable:`CPACK_PACKAGE_DESCRIPTION_SUMMARY` (this is always set
|
||||
by CPack itself, if nothing else sets it explicitly).
|
||||
- :variable:`PROJECT_DESCRIPTION` (this can be set with the DESCRIPTION
|
||||
parameter for :command:`project`).
|
||||
|
||||
.. variable:: CPACK_FREEBSD_PACKAGE_DESCRIPTION
|
||||
|
||||
@ -75,6 +73,10 @@ the RPM information (e.g. package license).
|
||||
|
||||
- :variable:`CPACK_DEBIAN_PACKAGE_DESCRIPTION` (this may be set already
|
||||
for Debian packaging, so it is used as a fallback).
|
||||
- :variable:`CPACK_PACKAGE_DESCRIPTION_SUMMARY` (this is always set
|
||||
by CPack itself, if nothing else sets it explicitly).
|
||||
- :variable:`PROJECT_DESCRIPTION` (this can be set with the DESCRIPTION
|
||||
parameter for :command:`project`).
|
||||
|
||||
.. variable:: CPACK_FREEBSD_PACKAGE_WWW
|
||||
|
||||
@ -85,12 +87,12 @@ the RPM information (e.g. package license).
|
||||
* Mandatory: YES
|
||||
* Default:
|
||||
|
||||
- :variable:`CMAKE_PROJECT_HOMEPAGE_URL`, or if that is not set,
|
||||
:variable:`CPACK_DEBIAN_PACKAGE_HOMEPAGE` (this may be set already
|
||||
- :variable:`CPACK_PACKAGE_HOMEPAGE_URL`, or if that is not set,
|
||||
- :variable:`CPACK_DEBIAN_PACKAGE_HOMEPAGE` (this may be set already
|
||||
for Debian packaging, so it is used as a fallback).
|
||||
|
||||
.. versionadded:: 3.12
|
||||
The ``CMAKE_PROJECT_HOMEPAGE_URL`` variable.
|
||||
The ``CPACK_PACKAGE_HOMEPAGE_URL`` variable.
|
||||
|
||||
.. variable:: CPACK_FREEBSD_PACKAGE_LICENSE
|
||||
|
||||
|
@ -14,7 +14,7 @@ Overview
|
||||
|
||||
This :manual:`cpack generator <cpack-generators(7)>` generates
|
||||
configuration and meta information for the `Qt Installer Framework
|
||||
<http://doc.qt.io/qtinstallerframework/index.html>`_ (QtIFW),
|
||||
<https://doc.qt.io/qtinstallerframework/index.html>`_ (QtIFW),
|
||||
and runs QtIFW tools to generate a Qt installer.
|
||||
|
||||
QtIFW provides tools and utilities to create installers for
|
||||
|
@ -207,3 +207,34 @@ on Windows Nullsoft Scriptable Install System.
|
||||
.. versionadded:: 3.22
|
||||
|
||||
If set, do not display the page containing the license during installation.
|
||||
|
||||
.. variable:: CPACK_NSIS_EXECUTABLE_PRE_ARGUMENTS
|
||||
|
||||
.. versionadded:: 3.25
|
||||
|
||||
This variable is a :ref:`semicolon-separated list <CMake Language Lists>` of
|
||||
arguments to prepend to the nsis script to run.
|
||||
If the arguments do not start with a ``/`` or a ``-``, it will add one
|
||||
automatically to the corresponding arguments.
|
||||
The command that will be run is::
|
||||
|
||||
makensis.exe <preArgs>... "nsisFileName.nsi" <postArgs>...
|
||||
|
||||
where ``<preArgs>...`` is constructed from ``CPACK_NSIS_EXECUTABLE_PRE_ARGUMENTS``
|
||||
and ``<postArgs>...`` is constructed from ``CPACK_NSIS_EXECUTABLE_POST_ARGUMENTS``.
|
||||
|
||||
|
||||
.. variable:: CPACK_NSIS_EXECUTABLE_POST_ARGUMENTS
|
||||
|
||||
.. versionadded:: 3.25
|
||||
|
||||
This variable is a :ref:`semicolon-separated list <CMake Language Lists>` of
|
||||
arguments to append to the nsis script to run.
|
||||
If the arguments do not start with a ``/`` or a ``-``, it will add one
|
||||
automatically to the corresponding arguments.
|
||||
The command that will be run is::
|
||||
|
||||
makensis.exe <preArgs>... "nsisFileName.nsi" <postArgs>...
|
||||
|
||||
where ``<preArgs>...`` is constructed from ``CPACK_NSIS_EXECUTABLE_PRE_ARGUMENTS``
|
||||
and ``<postArgs>...`` is constructed from ``CPACK_NSIS_EXECUTABLE_POST_ARGUMENTS``.
|
||||
|
@ -110,7 +110,7 @@ List of CPack NuGet generator specific variables:
|
||||
.. deprecated:: 3.20
|
||||
Use a local license file
|
||||
(:variable:`CPACK_NUGET_PACKAGE_LICENSE_FILE_NAME`)
|
||||
or a `(SPDX) license identifier`_
|
||||
or a `SPDX license identifier`_
|
||||
(:variable:`CPACK_NUGET_PACKAGE_LICENSE_EXPRESSION`) instead.
|
||||
|
||||
An URL for the package's license, often shown in UI displays as well
|
||||
@ -124,7 +124,7 @@ List of CPack NuGet generator specific variables:
|
||||
|
||||
.. versionadded:: 3.20
|
||||
|
||||
A Software Package Data Exchange `(SPDX) license identifier`_ such as
|
||||
A Software Package Data Exchange `SPDX license identifier`_ such as
|
||||
``MIT``, ``BSD-3-Clause``, or ``LGPL-3.0-or-later``. In the case of a
|
||||
choice of licenses or more complex restrictions, compound license
|
||||
expressions may be formed using boolean operators, for example
|
||||
@ -162,6 +162,14 @@ List of CPack NuGet generator specific variables:
|
||||
* Mandatory : NO
|
||||
* Default : -
|
||||
|
||||
.. variable:: CPACK_NUGET_PACKAGE_REQUIRE_LICENSE_ACCEPTANCE
|
||||
|
||||
When set to a true value, the user will be prompted to accept the license
|
||||
before installing the package.
|
||||
|
||||
* Mandatory : NO
|
||||
* Default : -
|
||||
|
||||
.. variable:: CPACK_NUGET_PACKAGE_ICON
|
||||
CPACK_NUGET_<compName>_PACKAGE_ICON
|
||||
|
||||
@ -247,9 +255,9 @@ List of CPack NuGet generator specific variables:
|
||||
* Default : OFF
|
||||
|
||||
|
||||
.. _nuget.org: http://nuget.org
|
||||
.. _version specification: https://docs.microsoft.com/en-us/nuget/reference/package-versioning#version-ranges-and-wildcards
|
||||
.. _(SPDX) license identifier: https://spdx.org/licenses/
|
||||
.. _SPDX specification: https://spdx.github.io/spdx-spec/appendix-IV-SPDX-license-expressions/
|
||||
.. _nuget.org: https://www.nuget.org
|
||||
.. _version specification: https://learn.microsoft.com/en-us/nuget/concepts/package-versioning#version-ranges
|
||||
.. _SPDX license identifier: https://spdx.github.io/spdx-spec/SPDX-license-list
|
||||
.. _SPDX specification: https://spdx.github.io/spdx-spec/SPDX-license-expressions
|
||||
|
||||
.. NuGet spec docs https://docs.microsoft.com/en-us/nuget/reference/nuspec
|
||||
|
@ -18,7 +18,7 @@ The CPack RPM generator has specific features which are controlled by the specif
|
||||
**grouping name** written in upper case. It may be either a component name or
|
||||
a component GROUP name. Usually those variables correspond to RPM spec file
|
||||
entities. One may find information about spec files here
|
||||
http://www.rpm.org/wiki/Docs
|
||||
https://rpm.org/documentation
|
||||
|
||||
.. versionchanged:: 3.6
|
||||
|
||||
@ -972,7 +972,7 @@ For CMake projects SRPM package would be produced by executing::
|
||||
Produced SRPM package is expected to be built with :manual:`cmake(1)` executable
|
||||
and packaged with :manual:`cpack(1)` executable so CMakeLists.txt has to be
|
||||
located in root source directory and must be able to generate binary rpm
|
||||
packages by executing ``cpack -G`` command. The two executables as well as
|
||||
packages by executing :option:`cpack -G` command. The two executables as well as
|
||||
rpmbuild must also be present when generating binary rpm packages from the
|
||||
produced SRPM package.
|
||||
|
||||
|
@ -111,7 +111,7 @@ Windows using WiX.
|
||||
simply provide the name of the culture. If you specify more than one
|
||||
culture identifier in a comma or semicolon delimited list, the first one
|
||||
that is found will be used. You can find a list of supported languages at:
|
||||
http://wix.sourceforge.net/manual-wix3/WixUI_localization.htm
|
||||
https://wixtoolset.org//documentation/manual/v3/wixui/wixui_localization.html
|
||||
|
||||
.. variable:: CPACK_WIX_TEMPLATE
|
||||
|
||||
|
@ -7,6 +7,23 @@ See documentation on `CMake Development`_ for more information.
|
||||
|
||||
.. _`CMake Development`: README.rst
|
||||
|
||||
Features are gated behind ``CMAKE_EXPERIMENTAL_`` variables which must be set
|
||||
to specific values in order to enable their gated behaviors. Note that the
|
||||
specific values will change over time to reinforce their experimental nature.
|
||||
When used, a warning will be generated to indicate that an experimental
|
||||
feature is in use and that the affected behavior in the project is not part of
|
||||
CMake's stability guarantees.
|
||||
|
||||
C++20 Module APIs
|
||||
=================
|
||||
|
||||
Variable: ``CMAKE_EXPERIMENTAL_CXX_MODULE_CMAKE_API``
|
||||
Value: ``3c375311-a3c9-4396-a187-3227ef642046``
|
||||
|
||||
In order to support C++20 modules, there are a number of behaviors that have
|
||||
CMake APIs to provide the required features to build and export them from a
|
||||
project.
|
||||
|
||||
C++20 Module Dependencies
|
||||
=========================
|
||||
|
||||
@ -22,6 +39,10 @@ they can use it to develop and test their dependency scanning tool.
|
||||
The ``CMAKE_EXPERIMENTAL_CXX_SCANDEP_SOURCE`` variable must also be set
|
||||
to tell CMake how to invoke the C++20 module dependency scanning tool.
|
||||
|
||||
MSVC 19.34 (provided with Visual Studio 17.4) and above contains the support
|
||||
that CMake needs and has these variables already set up as required and only
|
||||
the UUID variable needs to be set.
|
||||
|
||||
For example, add code like the following to a test project:
|
||||
|
||||
.. code-block:: cmake
|
||||
@ -40,13 +61,8 @@ dependencies to the file specified by the ``<DYNDEP_FILE>`` placeholder. The
|
||||
``CMAKE_EXPERIMENTAL_CXX_SCANDEP_DEPFILE_FORMAT`` file may be set to ``msvc``
|
||||
for scandep rules which use ``msvc``-style dependency reporting.
|
||||
|
||||
For tools which need to know the file set the source belongs to, the
|
||||
``CMAKE_EXPERIMENTAL_CXX_MODULE_SOURCE_TYPE_FLAG_<FILE_SET_TYPE>`` flag may
|
||||
be provided so that different source types can be distinguished prior to
|
||||
scanning.
|
||||
|
||||
The module dependencies should be written in the format described
|
||||
by the `P1689r4`_ paper.
|
||||
by the `P1689r5`_ paper.
|
||||
|
||||
Compiler writers may try out their scanning functionality using
|
||||
the `cxx-modules-sandbox`_ test project, modified to set variables
|
||||
@ -73,5 +89,5 @@ the GCC documentation, but the relevant section for the purposes of CMake is:
|
||||
-- GCC module mapper documentation
|
||||
|
||||
.. _`D1483r1`: https://mathstuf.fedorapeople.org/fortran-modules/fortran-modules.html
|
||||
.. _`P1689r4`: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2021/p1689r4.html
|
||||
.. _`P1689r5`: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2022/p1689r5.html
|
||||
.. _`cxx-modules-sandbox`: https://github.com/mathstuf/cxx-modules-sandbox
|
||||
|
@ -3,13 +3,16 @@ ASM<DIALECT>FLAGS
|
||||
|
||||
.. include:: ENV_VAR.txt
|
||||
|
||||
Default compilation flags to be used when compiling a specific dialect of an
|
||||
assembly language. ``ASM<DIALECT>FLAGS`` can be ``ASMFLAGS``, ``ASM_NASMFLAGS``,
|
||||
``ASM_MASMFLAGS`` or ``ASM-ATTFLAGS``. Will only be used by CMake on the
|
||||
first configuration to determine ``ASM_<DIALECT>`` default compilation
|
||||
flags, after which the value for ``ASM<DIALECT>FLAGS`` is stored in the cache
|
||||
as ``CMAKE_ASM<DIALECT>_FLAGS <CMAKE_<LANG>_FLAGS>``. For any configuration
|
||||
run (including the first), the environment variable will be ignored, if the
|
||||
``CMAKE_ASM<DIALECT>_FLAGS <CMAKE_<LANG>_FLAGS>`` variable is defined.
|
||||
Add default compilation flags to be used when compiling a specific dialect
|
||||
of an assembly language. ``ASM<DIALECT>FLAGS`` can be one of:
|
||||
|
||||
* ``ASMFLAGS``
|
||||
* ``ASM_NASMFLAGS``
|
||||
* ``ASM_MASMFLAGS``
|
||||
* ``ASM-ATTFLAGS``
|
||||
|
||||
.. |CMAKE_LANG_FLAGS| replace:: :variable:`CMAKE_ASM<DIALECT>_FLAGS <CMAKE_<LANG>_FLAGS>`
|
||||
.. |LANG| replace:: ``ASM<DIALECT>``
|
||||
.. include:: LANG_FLAGS.txt
|
||||
|
||||
See also :variable:`CMAKE_ASM<DIALECT>_FLAGS_INIT <CMAKE_<LANG>_FLAGS_INIT>`.
|
||||
|
@ -3,11 +3,10 @@ CFLAGS
|
||||
|
||||
.. include:: ENV_VAR.txt
|
||||
|
||||
Default compilation flags to be used when compiling ``C`` files. Will only be
|
||||
used by CMake on the first configuration to determine ``CC`` default compilation
|
||||
flags, after which the value for ``CFLAGS`` is stored in the cache
|
||||
as :variable:`CMAKE_C_FLAGS <CMAKE_<LANG>_FLAGS>`. For any configuration run
|
||||
(including the first), the environment variable will be ignored if the
|
||||
:variable:`CMAKE_C_FLAGS <CMAKE_<LANG>_FLAGS>` variable is defined.
|
||||
Add default compilation flags to be used when compiling ``C`` files.
|
||||
|
||||
.. |CMAKE_LANG_FLAGS| replace:: :variable:`CMAKE_C_FLAGS <CMAKE_<LANG>_FLAGS>`
|
||||
.. |LANG| replace:: ``C``
|
||||
.. include:: LANG_FLAGS.txt
|
||||
|
||||
See also :variable:`CMAKE_C_FLAGS_INIT <CMAKE_<LANG>_FLAGS_INIT>`.
|
||||
|
@ -6,9 +6,9 @@ CMAKE_GENERATOR
|
||||
.. include:: ENV_VAR.txt
|
||||
|
||||
Specifies the CMake default generator to use when no generator is supplied
|
||||
with ``-G``. If the provided value doesn't name a generator known by CMake,
|
||||
the internal default is used. Either way the resulting generator selection
|
||||
is stored in the :variable:`CMAKE_GENERATOR` variable.
|
||||
with :option:`-G <cmake -G>`. If the provided value doesn't name a generator
|
||||
known by CMake, the internal default is used. Either way the resulting
|
||||
generator selection is stored in the :variable:`CMAKE_GENERATOR` variable.
|
||||
|
||||
Some generators may be additionally configured using the environment
|
||||
variables:
|
||||
|
@ -6,5 +6,5 @@ CMAKE_GENERATOR_PLATFORM
|
||||
.. include:: ENV_VAR.txt
|
||||
|
||||
Default value for :variable:`CMAKE_GENERATOR_PLATFORM` if no Cache entry
|
||||
is present and no value is specified by :manual:`cmake(1)` ``-A`` option.
|
||||
is present and no value is specified by :option:`cmake -A` option.
|
||||
This value is only applied if :envvar:`CMAKE_GENERATOR` is set.
|
||||
|
@ -6,5 +6,5 @@ CMAKE_GENERATOR_TOOLSET
|
||||
.. include:: ENV_VAR.txt
|
||||
|
||||
Default value for :variable:`CMAKE_GENERATOR_TOOLSET` if no Cache entry
|
||||
is present and no value is specified by :manual:`cmake(1)` ``-T`` option.
|
||||
is present and no value is specified by :option:`cmake -T` option.
|
||||
This value is only applied if :envvar:`CMAKE_GENERATOR` is set.
|
||||
|
@ -5,11 +5,10 @@ CSFLAGS
|
||||
|
||||
.. include:: ENV_VAR.txt
|
||||
|
||||
Default compilation flags to be used when compiling ``CSharp`` files. Will only be
|
||||
used by CMake on the first configuration to determine ``CSharp`` default
|
||||
compilation flags, after which the value for ``CSFLAGS`` is stored in the cache
|
||||
as :variable:`CMAKE_CSharp_FLAGS <CMAKE_<LANG>_FLAGS>`. For any configuration
|
||||
run (including the first), the environment variable will be ignored if the
|
||||
:variable:`CMAKE_CSharp_FLAGS <CMAKE_<LANG>_FLAGS>` variable is defined.
|
||||
Add default compilation flags to be used when compiling ``CSharp`` files.
|
||||
|
||||
.. |CMAKE_LANG_FLAGS| replace:: :variable:`CMAKE_CSharp_FLAGS <CMAKE_<LANG>_FLAGS>`
|
||||
.. |LANG| replace:: ``CSharp``
|
||||
.. include:: LANG_FLAGS.txt
|
||||
|
||||
See also :variable:`CMAKE_CSharp_FLAGS_INIT <CMAKE_<LANG>_FLAGS_INIT>`.
|
||||
|
@ -14,5 +14,5 @@ variable is not set or has a value that evaluates to false, output is reported
|
||||
normally with each test having its own start and end lines logged to the
|
||||
output.
|
||||
|
||||
The ``--progress`` option to :manual:`ctest <ctest(1)>` overrides this
|
||||
environment variable if both are given.
|
||||
The :option:`--progress <ctest --progress>` option to :manual:`ctest <ctest(1)>`
|
||||
overrides this environment variable if both are given.
|
||||
|
@ -5,11 +5,10 @@ CUDAFLAGS
|
||||
|
||||
.. include:: ENV_VAR.txt
|
||||
|
||||
Default compilation flags to be used when compiling ``CUDA`` files. Will only be
|
||||
used by CMake on the first configuration to determine ``CUDA`` default
|
||||
compilation flags, after which the value for ``CUDAFLAGS`` is stored in the
|
||||
cache as :variable:`CMAKE_CUDA_FLAGS <CMAKE_<LANG>_FLAGS>`. For any configuration
|
||||
run (including the first), the environment variable will be ignored if
|
||||
the :variable:`CMAKE_CUDA_FLAGS <CMAKE_<LANG>_FLAGS>` variable is defined.
|
||||
Add default compilation flags to be used when compiling ``CUDA`` files.
|
||||
|
||||
.. |CMAKE_LANG_FLAGS| replace:: :variable:`CMAKE_CUDA_FLAGS <CMAKE_<LANG>_FLAGS>`
|
||||
.. |LANG| replace:: ``CUDA``
|
||||
.. include:: LANG_FLAGS.txt
|
||||
|
||||
See also :variable:`CMAKE_CUDA_FLAGS_INIT <CMAKE_<LANG>_FLAGS_INIT>`.
|
||||
|
@ -3,11 +3,10 @@ CXXFLAGS
|
||||
|
||||
.. include:: ENV_VAR.txt
|
||||
|
||||
Default compilation flags to be used when compiling ``CXX`` (C++) files. Will
|
||||
only be used by CMake on the first configuration to determine ``CXX`` default
|
||||
compilation flags, after which the value for ``CXXFLAGS`` is stored in the cache
|
||||
as :variable:`CMAKE_CXX_FLAGS <CMAKE_<LANG>_FLAGS>`. For any configuration run (
|
||||
including the first), the environment variable will be ignored if
|
||||
the :variable:`CMAKE_CXX_FLAGS <CMAKE_<LANG>_FLAGS>` variable is defined.
|
||||
Add default compilation flags to be used when compiling ``CXX`` (C++) files.
|
||||
|
||||
.. |CMAKE_LANG_FLAGS| replace:: :variable:`CMAKE_CXX_FLAGS <CMAKE_<LANG>_FLAGS>`
|
||||
.. |LANG| replace:: ``CXX``
|
||||
.. include:: LANG_FLAGS.txt
|
||||
|
||||
See also :variable:`CMAKE_CXX_FLAGS_INIT <CMAKE_<LANG>_FLAGS_INIT>`.
|
||||
|
@ -20,8 +20,9 @@ The packaging tool may then construct the package from the content of the
|
||||
|
||||
See the :variable:`CMAKE_INSTALL_PREFIX` variable to control the
|
||||
installation prefix when configuring a build tree. Or, when using
|
||||
the :manual:`cmake(1)` command-line tool's ``--install`` mode,
|
||||
one may specify a different prefix using the ``--prefix`` option.
|
||||
the :manual:`cmake(1)` command-line tool's :option:`--install <cmake --install>`
|
||||
mode, one may specify a different prefix using the
|
||||
:option:`--prefix <cmake--install --prefix>` option.
|
||||
|
||||
.. note::
|
||||
|
||||
|
@ -3,11 +3,10 @@ FFLAGS
|
||||
|
||||
.. include:: ENV_VAR.txt
|
||||
|
||||
Default compilation flags to be used when compiling ``Fortran`` files. Will only
|
||||
be used by CMake on the first configuration to determine ``Fortran`` default
|
||||
compilation flags, after which the value for ``FFLAGS`` is stored in the cache
|
||||
as :variable:`CMAKE_Fortran_FLAGS <CMAKE_<LANG>_FLAGS>`. For any configuration
|
||||
run (including the first), the environment variable will be ignored if
|
||||
the :variable:`CMAKE_Fortran_FLAGS <CMAKE_<LANG>_FLAGS>` variable is defined.
|
||||
Add default compilation flags to be used when compiling ``Fortran`` files.
|
||||
|
||||
.. |CMAKE_LANG_FLAGS| replace:: :variable:`CMAKE_Fortran_FLAGS <CMAKE_<LANG>_FLAGS>`
|
||||
.. |LANG| replace:: ``Fortran``
|
||||
.. include:: LANG_FLAGS.txt
|
||||
|
||||
See also :variable:`CMAKE_Fortran_FLAGS_INIT <CMAKE_<LANG>_FLAGS_INIT>`.
|
||||
|
@ -5,11 +5,10 @@ HIPFLAGS
|
||||
|
||||
.. include:: ENV_VAR.txt
|
||||
|
||||
Default compilation flags to be used when compiling ``HIP`` files. Will only be
|
||||
used by CMake on the first configuration to determine ``HIP`` default
|
||||
compilation flags, after which the value for ``HIPFLAGS`` is stored in the
|
||||
cache as :variable:`CMAKE_HIP_FLAGS <CMAKE_<LANG>_FLAGS>`. For any configuration
|
||||
run (including the first), the environment variable will be ignored if
|
||||
the :variable:`CMAKE_HIP_FLAGS <CMAKE_<LANG>_FLAGS>` variable is defined.
|
||||
Add default compilation flags to be used when compiling ``HIP`` files.
|
||||
|
||||
.. |CMAKE_LANG_FLAGS| replace:: :variable:`CMAKE_HIP_FLAGS <CMAKE_<LANG>_FLAGS>`
|
||||
.. |LANG| replace:: ``HIP``
|
||||
.. include:: LANG_FLAGS.txt
|
||||
|
||||
See also :variable:`CMAKE_HIP_FLAGS_INIT <CMAKE_<LANG>_FLAGS_INIT>`.
|
||||
|
@ -5,11 +5,10 @@ ISPCFLAGS
|
||||
|
||||
.. include:: ENV_VAR.txt
|
||||
|
||||
Default compilation flags to be used when compiling ``ISPC`` files. Will only be
|
||||
used by CMake on the first configuration to determine ``ISPC`` default
|
||||
compilation flags, after which the value for ``ISPCFLAGS`` is stored in the
|
||||
cache as :variable:`CMAKE_ISPC_FLAGS <CMAKE_<LANG>_FLAGS>`. For any configuration
|
||||
run (including the first), the environment variable will be ignored if
|
||||
the :variable:`CMAKE_ISPC_FLAGS <CMAKE_<LANG>_FLAGS>` variable is defined.
|
||||
Add default compilation flags to be used when compiling ``ISPC`` files.
|
||||
|
||||
.. |CMAKE_LANG_FLAGS| replace:: :variable:`CMAKE_ISPC_FLAGS <CMAKE_<LANG>_FLAGS>`
|
||||
.. |LANG| replace:: ``ISPC``
|
||||
.. include:: LANG_FLAGS.txt
|
||||
|
||||
See also :variable:`CMAKE_ISPC_FLAGS_INIT <CMAKE_<LANG>_FLAGS_INIT>`.
|
||||
|
6
Help/envvar/LANG_FLAGS.txt
Normal file
6
Help/envvar/LANG_FLAGS.txt
Normal file
@ -0,0 +1,6 @@
|
||||
CMake uses this environment variable value, in combination with its own
|
||||
builtin default flags for the toolchain, to initialize and store the
|
||||
|CMAKE_LANG_FLAGS| cache entry.
|
||||
This occurs the first time a build tree is configured for language |LANG|.
|
||||
For any configuration run (including the first), the environment variable
|
||||
will be ignored if the |CMAKE_LANG_FLAGS| variable is already defined.
|
@ -3,11 +3,10 @@ RCFLAGS
|
||||
|
||||
.. include:: ENV_VAR.txt
|
||||
|
||||
Default compilation flags to be used when compiling ``resource`` files. Will
|
||||
only be used by CMake on the first configuration to determine ``resource``
|
||||
default compilation flags, after which the value for ``RCFLAGS`` is stored in
|
||||
the cache as :variable:`CMAKE_RC_FLAGS <CMAKE_<LANG>_FLAGS>`. For any
|
||||
configuration run (including the first), the environment variable will be ignored
|
||||
if the :variable:`CMAKE_RC_FLAGS <CMAKE_<LANG>_FLAGS>` variable is defined.
|
||||
Add default compilation flags to be used when compiling ``RC`` (resource) files.
|
||||
|
||||
.. |CMAKE_LANG_FLAGS| replace:: :variable:`CMAKE_RC_FLAGS <CMAKE_<LANG>_FLAGS>`
|
||||
.. |LANG| replace:: ``RC``
|
||||
.. include:: LANG_FLAGS.txt
|
||||
|
||||
See also :variable:`CMAKE_RC_FLAGS_INIT <CMAKE_<LANG>_FLAGS_INIT>`.
|
||||
|
9
Help/envvar/SSL_CERT_DIR.rst
Normal file
9
Help/envvar/SSL_CERT_DIR.rst
Normal file
@ -0,0 +1,9 @@
|
||||
SSL_CERT_DIR
|
||||
------------
|
||||
|
||||
.. versionadded:: 3.25
|
||||
|
||||
.. include:: ENV_VAR.txt
|
||||
|
||||
Specify default directory containing CA certificates. It overrides
|
||||
the default CA directory used.
|
9
Help/envvar/SSL_CERT_FILE.rst
Normal file
9
Help/envvar/SSL_CERT_FILE.rst
Normal file
@ -0,0 +1,9 @@
|
||||
SSL_CERT_FILE
|
||||
-------------
|
||||
|
||||
.. versionadded:: 3.25
|
||||
|
||||
.. include:: ENV_VAR.txt
|
||||
|
||||
Specify the file name containing CA certificates. It overrides the
|
||||
default, os-specific CA file used.
|
@ -28,12 +28,12 @@ Otherwise the ``primaryTarget`` will be composed from the values of :variable:`C
|
||||
and ``GHS_TARGET_PLATFORM``. Defaulting to the value of ``arm_integrity.tgt``
|
||||
|
||||
* The :variable:`CMAKE_GENERATOR_PLATFORM` variable may be set, perhaps
|
||||
via the :manual:`cmake(1)` ``-A`` option.
|
||||
via the :option:`cmake -A` option.
|
||||
|
||||
| Typical values of ``arm``, ``ppc``, ``86``, etcetera, are used.
|
||||
|
||||
* The variable ``GHS_TARGET_PLATFORM`` may be set, perhaps via the :manual:`cmake(1)`
|
||||
``-D`` option.
|
||||
* The variable ``GHS_TARGET_PLATFORM`` may be set, perhaps via the :option:`cmake -D`
|
||||
option.
|
||||
|
||||
| Defaults to ``integrity``.
|
||||
| Usual values are ``integrity``, ``threadx``, ``uvelosity``, ``velosity``,
|
||||
@ -55,11 +55,11 @@ The generator searches for the latest compiler or can be given a location to use
|
||||
``GHS_TOOLSET_ROOT`` is the directory that is checked for the latest compiler.
|
||||
|
||||
* The :variable:`CMAKE_GENERATOR_TOOLSET` option may be set, perhaps
|
||||
via the :manual:`cmake(1)` ``-T`` option, to specify the location of the toolset.
|
||||
via the :option:`cmake -T` option, to specify the location of the toolset.
|
||||
Both absolute and relative paths are valid. Paths are relative to ``GHS_TOOLSET_ROOT``.
|
||||
|
||||
* The variable ``GHS_TOOLSET_ROOT`` may be set, perhaps via the :manual:`cmake(1)`
|
||||
``-D`` option.
|
||||
* The variable ``GHS_TOOLSET_ROOT`` may be set, perhaps via the :option:`cmake -D`
|
||||
option.
|
||||
|
||||
| Root path for toolset searches and relative paths.
|
||||
| Defaults to ``C:/ghs`` in Windows or ``/usr/ghs`` in Linux.
|
||||
|
@ -20,8 +20,8 @@ are intended to be run with ``ninja -f build-<Config>.ninja``. A
|
||||
:variable:`CMAKE_CONFIGURATION_TYPES`.
|
||||
|
||||
``cmake --build . --config <Config>`` will always use ``build-<Config>.ninja``
|
||||
to build. If no ``--config`` argument is specified, ``cmake --build .`` will
|
||||
use ``build.ninja``.
|
||||
to build. If no :option:`--config <cmake--build --config>` argument is
|
||||
specified, :option:`cmake --build . <cmake --build>` will use ``build.ninja``.
|
||||
|
||||
Each ``build-<Config>.ninja`` file contains ``<target>`` targets as well as
|
||||
``<target>:<Config>`` targets, where ``<Config>`` is the same as the
|
||||
|
@ -1,52 +1,8 @@
|
||||
Visual Studio 10 2010
|
||||
---------------------
|
||||
|
||||
Deprecated. Generates Visual Studio 10 (VS 2010) project files.
|
||||
|
||||
.. note::
|
||||
This generator is deprecated and will be removed in a future version
|
||||
of CMake. It will still be possible to build with VS 10 2010 tools
|
||||
using the :generator:`Visual Studio 11 2012` (or above) generator
|
||||
with :variable:`CMAKE_GENERATOR_TOOLSET` set to ``v100``, or by
|
||||
using the :generator:`NMake Makefiles` generator.
|
||||
|
||||
For compatibility with CMake versions prior to 3.0, one may specify this
|
||||
generator using the name ``Visual Studio 10`` without the year component.
|
||||
|
||||
Project Types
|
||||
^^^^^^^^^^^^^
|
||||
|
||||
Only Visual C++ and C# projects may be generated (and Fortran with
|
||||
Intel compiler integration). Other types of projects (Database,
|
||||
Website, etc.) are not supported.
|
||||
|
||||
Platform Selection
|
||||
^^^^^^^^^^^^^^^^^^
|
||||
|
||||
The default target platform name (architecture) is ``Win32``.
|
||||
|
||||
.. versionadded:: 3.1
|
||||
The :variable:`CMAKE_GENERATOR_PLATFORM` variable may be set, perhaps
|
||||
via the :manual:`cmake(1)` ``-A`` option, to specify a target platform
|
||||
name (architecture). For example:
|
||||
|
||||
* ``cmake -G "Visual Studio 10 2010" -A Win32``
|
||||
* ``cmake -G "Visual Studio 10 2010" -A x64``
|
||||
* ``cmake -G "Visual Studio 10 2010" -A Itanium``
|
||||
|
||||
For compatibility with CMake versions prior to 3.1, one may specify
|
||||
a target platform name optionally at the end of the generator name.
|
||||
This is supported only for:
|
||||
|
||||
``Visual Studio 10 2010 Win64``
|
||||
Specify target platform ``x64``.
|
||||
|
||||
``Visual Studio 10 2010 IA64``
|
||||
Specify target platform ``Itanium``.
|
||||
|
||||
Toolset Selection
|
||||
^^^^^^^^^^^^^^^^^
|
||||
|
||||
The ``v100`` toolset that comes with Visual Studio 10 2010 is selected by
|
||||
default. The :variable:`CMAKE_GENERATOR_TOOLSET` option may be set, perhaps
|
||||
via the :manual:`cmake(1)` ``-T`` option, to specify another toolset.
|
||||
Removed. This once generated Visual Studio 10 2010 project files, but
|
||||
the generator has been removed since CMake 3.25. It is still possible
|
||||
to build with VS 10 2010 tools using the :generator:`Visual Studio 12 2013`
|
||||
(or above) generator with :variable:`CMAKE_GENERATOR_TOOLSET` set to
|
||||
``v100``, or by using the :generator:`NMake Makefiles` generator.
|
||||
|
@ -1,7 +1,14 @@
|
||||
Visual Studio 11 2012
|
||||
---------------------
|
||||
|
||||
Generates Visual Studio 11 (VS 2012) project files.
|
||||
Deprecated. Generates Visual Studio 11 (VS 2012) project files.
|
||||
|
||||
.. note::
|
||||
This generator is deprecated and will be removed in a future version
|
||||
of CMake. It will still be possible to build with VS 11 2012 tools
|
||||
using the :generator:`Visual Studio 12 2013` (or above) generator
|
||||
with :variable:`CMAKE_GENERATOR_TOOLSET` set to ``v110``, or by
|
||||
using the :generator:`NMake Makefiles` generator.
|
||||
|
||||
For compatibility with CMake versions prior to 3.0, one may specify this
|
||||
generator using the name "Visual Studio 11" without the year component.
|
||||
@ -20,7 +27,7 @@ The default target platform name (architecture) is ``Win32``.
|
||||
|
||||
.. versionadded:: 3.1
|
||||
The :variable:`CMAKE_GENERATOR_PLATFORM` variable may be set, perhaps
|
||||
via the :manual:`cmake(1)` ``-A`` option, to specify a target platform
|
||||
via the :option:`cmake -A` option, to specify a target platform
|
||||
name (architecture). For example:
|
||||
|
||||
* ``cmake -G "Visual Studio 11 2012" -A Win32``
|
||||
@ -47,4 +54,4 @@ Toolset Selection
|
||||
|
||||
The ``v110`` toolset that comes with Visual Studio 11 2012 is selected by
|
||||
default. The :variable:`CMAKE_GENERATOR_TOOLSET` option may be set, perhaps
|
||||
via the :manual:`cmake(1)` ``-T`` option, to specify another toolset.
|
||||
via the :option:`cmake -T` option, to specify another toolset.
|
||||
|
@ -20,7 +20,7 @@ The default target platform name (architecture) is ``Win32``.
|
||||
|
||||
.. versionadded:: 3.1
|
||||
The :variable:`CMAKE_GENERATOR_PLATFORM` variable may be set, perhaps
|
||||
via the :manual:`cmake(1)` ``-A`` option, to specify a target platform
|
||||
via the :option:`cmake -A` option, to specify a target platform
|
||||
name (architecture). For example:
|
||||
|
||||
* ``cmake -G "Visual Studio 12 2013" -A Win32``
|
||||
@ -42,7 +42,7 @@ Toolset Selection
|
||||
|
||||
The ``v120`` toolset that comes with Visual Studio 12 2013 is selected by
|
||||
default. The :variable:`CMAKE_GENERATOR_TOOLSET` option may be set, perhaps
|
||||
via the :manual:`cmake(1)` ``-T`` option, to specify another toolset.
|
||||
via the :option:`cmake -T` option, to specify another toolset.
|
||||
|
||||
.. |VS_TOOLSET_HOST_ARCH_DEFAULT| replace::
|
||||
By default this generator uses the 32-bit variant even on a 64-bit host.
|
||||
|
@ -18,7 +18,7 @@ Platform Selection
|
||||
The default target platform name (architecture) is ``Win32``.
|
||||
|
||||
The :variable:`CMAKE_GENERATOR_PLATFORM` variable may be set, perhaps
|
||||
via the :manual:`cmake(1)` ``-A`` option, to specify a target platform
|
||||
via the :option:`cmake -A` option, to specify a target platform
|
||||
name (architecture). For example:
|
||||
|
||||
* ``cmake -G "Visual Studio 14 2015" -A Win32``
|
||||
@ -40,7 +40,7 @@ Toolset Selection
|
||||
|
||||
The ``v140`` toolset that comes with Visual Studio 14 2015 is selected by
|
||||
default. The :variable:`CMAKE_GENERATOR_TOOLSET` option may be set, perhaps
|
||||
via the :manual:`cmake(1)` ``-T`` option, to specify another toolset.
|
||||
via the :option:`cmake -T` option, to specify another toolset.
|
||||
|
||||
.. |VS_TOOLSET_HOST_ARCH_DEFAULT| replace::
|
||||
By default this generator uses the 32-bit variant even on a 64-bit host.
|
||||
|
@ -26,7 +26,7 @@ Platform Selection
|
||||
The default target platform name (architecture) is ``Win32``.
|
||||
|
||||
The :variable:`CMAKE_GENERATOR_PLATFORM` variable may be set, perhaps
|
||||
via the :manual:`cmake(1)` ``-A`` option, to specify a target platform
|
||||
via the :option:`cmake -A` option, to specify a target platform
|
||||
name (architecture). For example:
|
||||
|
||||
* ``cmake -G "Visual Studio 15 2017" -A Win32``
|
||||
@ -49,7 +49,7 @@ Toolset Selection
|
||||
|
||||
The ``v141`` toolset that comes with Visual Studio 15 2017 is selected by
|
||||
default. The :variable:`CMAKE_GENERATOR_TOOLSET` option may be set, perhaps
|
||||
via the :manual:`cmake(1)` ``-T`` option, to specify another toolset.
|
||||
via the :option:`cmake -T` option, to specify another toolset.
|
||||
|
||||
.. |VS_TOOLSET_HOST_ARCH_DEFAULT| replace::
|
||||
By default this generator uses the 32-bit variant even on a 64-bit host.
|
||||
|
@ -25,7 +25,7 @@ The default target platform name (architecture) is that of the host
|
||||
and is provided in the :variable:`CMAKE_VS_PLATFORM_NAME_DEFAULT` variable.
|
||||
|
||||
The :variable:`CMAKE_GENERATOR_PLATFORM` variable may be set, perhaps
|
||||
via the :manual:`cmake(1)` ``-A`` option, to specify a target platform
|
||||
via the :option:`cmake -A` option, to specify a target platform
|
||||
name (architecture). For example:
|
||||
|
||||
* ``cmake -G "Visual Studio 16 2019" -A Win32``
|
||||
@ -38,7 +38,7 @@ Toolset Selection
|
||||
|
||||
The ``v142`` toolset that comes with Visual Studio 16 2019 is selected by
|
||||
default. The :variable:`CMAKE_GENERATOR_TOOLSET` option may be set, perhaps
|
||||
via the :manual:`cmake(1)` ``-T`` option, to specify another toolset.
|
||||
via the :option:`cmake -T` option, to specify another toolset.
|
||||
|
||||
.. |VS_TOOLSET_HOST_ARCH_DEFAULT| replace::
|
||||
By default this generator uses the 64-bit variant on x64 hosts and
|
||||
|
@ -25,7 +25,7 @@ The default target platform name (architecture) is that of the host
|
||||
and is provided in the :variable:`CMAKE_VS_PLATFORM_NAME_DEFAULT` variable.
|
||||
|
||||
The :variable:`CMAKE_GENERATOR_PLATFORM` variable may be set, perhaps
|
||||
via the :manual:`cmake(1)` ``-A`` option, to specify a target platform
|
||||
via the :option:`cmake -A` option, to specify a target platform
|
||||
name (architecture). For example:
|
||||
|
||||
* ``cmake -G "Visual Studio 17 2022" -A Win32``
|
||||
@ -38,7 +38,7 @@ Toolset Selection
|
||||
|
||||
The ``v143`` toolset that comes with VS 17 2022 is selected by default.
|
||||
The :variable:`CMAKE_GENERATOR_TOOLSET` option may be set, perhaps
|
||||
via the :manual:`cmake(1)` ``-T`` option, to specify another toolset.
|
||||
via the :option:`cmake -T` option, to specify another toolset.
|
||||
|
||||
.. |VS_TOOLSET_HOST_ARCH_DEFAULT| replace::
|
||||
By default this generator uses the 64-bit variant on x64 hosts and
|
||||
|
@ -10,7 +10,7 @@ The default target platform name (architecture) is ``Win32``.
|
||||
|
||||
.. versionadded:: 3.1
|
||||
The :variable:`CMAKE_GENERATOR_PLATFORM` variable may be set, perhaps
|
||||
via the :manual:`cmake(1)` ``-A`` option, to specify a target platform
|
||||
via the :option:`cmake -A` option, to specify a target platform
|
||||
name (architecture). For example:
|
||||
|
||||
* ``cmake -G "Visual Studio 9 2008" -A Win32``
|
||||
|
@ -13,7 +13,7 @@ Toolset and Build System Selection
|
||||
|
||||
By default Xcode is allowed to select its own default toolchain.
|
||||
The :variable:`CMAKE_GENERATOR_TOOLSET` option may be set, perhaps
|
||||
via the :manual:`cmake(1)` ``-T`` option, to specify another toolset.
|
||||
via the :option:`cmake -T` option, to specify another toolset.
|
||||
|
||||
.. versionadded:: 3.19
|
||||
This generator supports toolset specification using one of these forms:
|
||||
@ -34,7 +34,7 @@ Supported pairs are:
|
||||
See the :variable:`CMAKE_XCODE_BUILD_SYSTEM` variable for allowed values.
|
||||
|
||||
For example, to select the original build system under Xcode 12,
|
||||
run :manual:`cmake(1)` with the option ``-T buildsystem=1``.
|
||||
run :manual:`cmake(1)` with the option :option:`-T buildsystem=1 <cmake -T>`.
|
||||
|
||||
Swift Support
|
||||
^^^^^^^^^^^^^
|
||||
@ -44,3 +44,13 @@ Swift Support
|
||||
When using the :generator:`Xcode` generator with Xcode 6.1 or higher,
|
||||
one may enable the ``Swift`` language with the :command:`enable_language`
|
||||
command or the :command:`project`.
|
||||
|
||||
Limitations
|
||||
^^^^^^^^^^^
|
||||
|
||||
The Xcode generator does not support per-configuration sources.
|
||||
Code like the following will result in a generation error:
|
||||
|
||||
.. code-block:: cmake
|
||||
|
||||
add_executable(MyApp mymain-$<CONFIG>.cpp)
|
||||
|
@ -47,8 +47,9 @@ does, and present the user with the presets listed in the file. Users should be
|
||||
able to see (and possibly edit) the CMake cache variables, environment
|
||||
variables, and command line options that are defined for a given preset. The
|
||||
IDE should then construct the list of appropriate :manual:`cmake(1)` command
|
||||
line arguments based on these settings, rather than using the ``--preset=``
|
||||
option directly. The ``--preset=`` option is intended only as a convenient
|
||||
line arguments based on these settings, rather than using the
|
||||
:option:`--preset= <cmake --preset>` option directly. The
|
||||
:option:`--preset= <cmake --preset>` option is intended only as a convenient
|
||||
frontend for command line users, and should not be used by the IDE.
|
||||
|
||||
For example, if a preset named ``ninja`` specifies ``Ninja`` as the generator
|
||||
@ -66,10 +67,9 @@ run:
|
||||
cmake -S /path/to/source -B /path/to/source/build -G Ninja
|
||||
|
||||
In cases where a preset contains lots of cache variables, and passing all of
|
||||
them as ``-D`` flags would cause the command line length limit of the platform
|
||||
to be exceeded, the IDE should instead construct a temporary cache script and
|
||||
pass it with the ``-C`` flag. See :ref:`CMake Options` for details on how the
|
||||
``-C`` flag is used.
|
||||
them as :option:`-D <cmake -D>` flags would cause the command line length limit
|
||||
of the platform to be exceeded, the IDE should instead construct a temporary
|
||||
cache script and pass it with the :option:`-C <cmake -C>` flag.
|
||||
|
||||
While reading, parsing, and evaluating the contents of ``CMakePresets.json`` is
|
||||
straightforward, it is not trivial. In addition to the documentation, IDE
|
||||
@ -110,8 +110,9 @@ Building
|
||||
|
||||
If a Makefile or Ninja generator is used to generate the build tree, it is not
|
||||
recommended to invoke ``make`` or ``ninja`` directly. Instead, it is
|
||||
recommended that the IDE invoke :manual:`cmake(1)` with the ``--build``
|
||||
argument, which will in turn invoke the appropriate build tool.
|
||||
recommended that the IDE invoke :manual:`cmake(1)` with the
|
||||
:option:`--build <cmake --build>` argument, which will in turn invoke the
|
||||
appropriate build tool.
|
||||
|
||||
If an IDE project generator is used, such as :generator:`Xcode` or one of the
|
||||
Visual Studio generators, and the IDE understands the project format used, the
|
||||
|
@ -1,34 +1,81 @@
|
||||
Step 1: A Basic Starting Point
|
||||
==============================
|
||||
|
||||
The most basic project is an executable built from source code files.
|
||||
For simple projects, a three line ``CMakeLists.txt`` file is all that is
|
||||
required. This will be the starting point for our tutorial. Create a
|
||||
``CMakeLists.txt`` file in the ``Step1`` directory that looks like:
|
||||
Where do I start with CMake? This step will provide an introduction to some of
|
||||
CMake's basic syntax, commands, and variables. As these concepts are
|
||||
introduced, we will work through three exercises and create a simple CMake
|
||||
project.
|
||||
|
||||
.. code-block:: cmake
|
||||
:caption: CMakeLists.txt
|
||||
:name: CMakeLists.txt-start
|
||||
Each exercise in this step will start with some background information. Then, a
|
||||
goal and list of helpful resources are provided. Each file in the
|
||||
``Files to Edit`` section is in the ``Step1`` directory and contains one or
|
||||
more ``TODO`` comments. Each ``TODO`` represents a line or two of code to
|
||||
change or add. The ``TODO`` s are intended to be completed in numerical order,
|
||||
first complete ``TODO 1`` then ``TODO 2``, etc. The ``Getting Started``
|
||||
section will give some helpful hints and guide you through the exercise. Then
|
||||
the ``Build and Run`` section will walk step-by-step through how to build and
|
||||
test the exercise. Finally, at the end of each exercise the intended solution
|
||||
is discussed.
|
||||
|
||||
cmake_minimum_required(VERSION 3.10)
|
||||
Also note that each step in the tutorial builds on the next. So, for example,
|
||||
the starting code for ``Step2`` is the complete solution to ``Step1``.
|
||||
|
||||
# set the project name
|
||||
project(Tutorial)
|
||||
Exercise 1 - Building a Basic Project
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
# add the executable
|
||||
add_executable(Tutorial tutorial.cxx)
|
||||
The most basic CMake project is an executable built from a single source code
|
||||
file. For simple projects like this, a ``CMakeLists.txt`` file with three
|
||||
commands is all that is required.
|
||||
|
||||
**Note:** Although upper, lower and mixed case commands are supported by CMake,
|
||||
lower case commands are preferred and will be used throughout the tutorial.
|
||||
|
||||
Note that this example uses lower case commands in the ``CMakeLists.txt`` file.
|
||||
Upper, lower, and mixed case commands are supported by CMake. The source
|
||||
code for ``tutorial.cxx`` is provided in the ``Step1`` directory and can be
|
||||
used to compute the square root of a number.
|
||||
Any project's top most CMakeLists.txt must start by specifying a minimum CMake
|
||||
version using the :command:`cmake_minimum_required` command. This establishes
|
||||
policy settings and ensures that the following CMake functions are run with a
|
||||
compatible version of CMake.
|
||||
|
||||
To start a project, we use the :command:`project` command to set the project
|
||||
name. This call is required with every project and should be called soon after
|
||||
:command:`cmake_minimum_required`. As we will see later, this command can
|
||||
also be used to specify other project level information such as the language
|
||||
or version number.
|
||||
|
||||
Finally, the :command:`add_executable` command tells CMake to create an
|
||||
executable using the specified source code files.
|
||||
|
||||
Goal
|
||||
----
|
||||
|
||||
Understand how to create a simple CMake project.
|
||||
|
||||
Helpful Resources
|
||||
-----------------
|
||||
|
||||
* :command:`add_executable`
|
||||
* :command:`cmake_minimum_required`
|
||||
* :command:`project`
|
||||
|
||||
Files to Edit
|
||||
-------------
|
||||
|
||||
* ``CMakeLists.txt``
|
||||
|
||||
Getting Started
|
||||
----------------
|
||||
|
||||
The source code for ``tutorial.cxx`` is provided in the
|
||||
``Help/guide/tutorial/Step1`` directory and can be used to compute the square
|
||||
root of a number. This file does not need to be edited in this step.
|
||||
|
||||
In the same directory is a ``CMakeLists.txt`` file which you will complete.
|
||||
Start with ``TODO 1`` and work through ``TODO 3``.
|
||||
|
||||
Build and Run
|
||||
-------------
|
||||
|
||||
That's all that is needed - we can build and run our project now! First, run
|
||||
the :manual:`cmake <cmake(1)>` executable or the
|
||||
Once ``TODO 1`` through ``TODO 3`` have been completed, we are ready to build
|
||||
and run our project! First, run the :manual:`cmake <cmake(1)>` executable or the
|
||||
:manual:`cmake-gui <cmake-gui(1)>` to configure the project and then build it
|
||||
with your chosen build tool.
|
||||
|
||||
@ -40,8 +87,9 @@ build directory:
|
||||
|
||||
mkdir Step1_build
|
||||
|
||||
Next, navigate to the build directory and run CMake to configure the project
|
||||
and generate a native build system:
|
||||
Next, navigate to that build directory and run
|
||||
:manual:`cmake <cmake(1)>` to configure the project and generate a native build
|
||||
system:
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
@ -62,108 +110,113 @@ Finally, try to use the newly built ``Tutorial`` with these commands:
|
||||
Tutorial 10
|
||||
Tutorial
|
||||
|
||||
Solution
|
||||
--------
|
||||
|
||||
Adding a Version Number and Configured Header File
|
||||
--------------------------------------------------
|
||||
As mentioned above, a three line ``CMakeLists.txt`` is all that we need to get
|
||||
up and running. The first line is to use :command:`cmake_minimum_required` to
|
||||
set the CMake version as follows:
|
||||
|
||||
The first feature we will add is to provide our executable and project with a
|
||||
version number. While we could do this exclusively in the source code, using
|
||||
``CMakeLists.txt`` provides more flexibility.
|
||||
.. raw:: html
|
||||
|
||||
First, modify the ``CMakeLists.txt`` file to use the :command:`project` command
|
||||
to set the project name and version number.
|
||||
<details><summary>TODO 1: Click to show/hide answer</summary>
|
||||
|
||||
.. literalinclude:: Step2/CMakeLists.txt
|
||||
:caption: CMakeLists.txt
|
||||
:name: CMakeLists.txt-project-VERSION
|
||||
:caption: TODO 1: CMakeLists.txt
|
||||
:name: CMakeLists.txt-cmake_minimum_required
|
||||
:language: cmake
|
||||
:end-before: # specify the C++ standard
|
||||
:end-before: # set the project name and version
|
||||
|
||||
Then, configure a header file to pass the version number to the source
|
||||
code:
|
||||
.. raw:: html
|
||||
|
||||
</details>
|
||||
|
||||
The next step to make a basic project is to use the :command:`project`
|
||||
command as follows to set the project name:
|
||||
|
||||
.. raw:: html
|
||||
|
||||
<details><summary>TODO 2: Click to show/hide answer</summary>
|
||||
|
||||
.. code-block:: cmake
|
||||
:caption: TODO 2: CMakeLists.txt
|
||||
:name: CMakeLists.txt-project
|
||||
|
||||
project(Tutorial)
|
||||
|
||||
.. raw:: html
|
||||
|
||||
</details>
|
||||
|
||||
The last command to call for a basic project is
|
||||
:command:`add_executable`. We call it as follows:
|
||||
|
||||
.. raw:: html
|
||||
|
||||
<details><summary>TODO 3: Click to show/hide answer</summary>
|
||||
|
||||
.. literalinclude:: Step2/CMakeLists.txt
|
||||
:caption: CMakeLists.txt
|
||||
:name: CMakeLists.txt-configure_file
|
||||
:caption: TODO 3: CMakeLists.txt
|
||||
:name: CMakeLists.txt-add_executable
|
||||
:language: cmake
|
||||
:start-after: # to the source code
|
||||
:end-before: # add the executable
|
||||
:start-after: # add the executable
|
||||
:end-before: # TODO 9:
|
||||
|
||||
Since the configured file will be written into the binary tree, we
|
||||
must add that directory to the list of paths to search for include
|
||||
files. Add the following lines to the end of the ``CMakeLists.txt`` file:
|
||||
.. raw:: html
|
||||
|
||||
.. literalinclude:: Step2/CMakeLists.txt
|
||||
:caption: CMakeLists.txt
|
||||
:name: CMakeLists.txt-target_include_directories
|
||||
:language: cmake
|
||||
:start-after: # so that we will find TutorialConfig.h
|
||||
</details>
|
||||
|
||||
Using your favorite editor, create ``TutorialConfig.h.in`` in the source
|
||||
directory with the following contents:
|
||||
Exercise 2 - Specifying the C++ Standard
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
.. literalinclude:: Step2/TutorialConfig.h.in
|
||||
:caption: TutorialConfig.h.in
|
||||
:name: TutorialConfig.h.in
|
||||
:language: c++
|
||||
CMake has some special variables that are either created behind the scenes or
|
||||
have meaning to CMake when set by project code. Many of these variables start
|
||||
with ``CMAKE_``. Avoid this naming convention when creating variables for your
|
||||
projects. Two of these special user settable variables are
|
||||
:variable:`CMAKE_CXX_STANDARD` and :variable:`CMAKE_CXX_STANDARD_REQUIRED`.
|
||||
These may be used together to specify the C++ standard needed to build the
|
||||
project.
|
||||
|
||||
When CMake configures this header file the values for
|
||||
``@Tutorial_VERSION_MAJOR@`` and ``@Tutorial_VERSION_MINOR@`` will be
|
||||
replaced.
|
||||
Goal
|
||||
----
|
||||
|
||||
Next modify ``tutorial.cxx`` to include the configured header file,
|
||||
``TutorialConfig.h``.
|
||||
Add a feature that requires C++11.
|
||||
|
||||
Finally, let's print out the executable name and version number by updating
|
||||
``tutorial.cxx`` as follows:
|
||||
Helpful Resources
|
||||
-----------------
|
||||
|
||||
.. literalinclude:: Step2/tutorial.cxx
|
||||
:caption: tutorial.cxx
|
||||
:name: tutorial.cxx-print-version
|
||||
:language: c++
|
||||
:start-after: {
|
||||
:end-before: // convert input to double
|
||||
* :variable:`CMAKE_CXX_STANDARD`
|
||||
* :variable:`CMAKE_CXX_STANDARD_REQUIRED`
|
||||
* :command:`set`
|
||||
|
||||
Specify the C++ Standard
|
||||
-------------------------
|
||||
Files to Edit
|
||||
-------------
|
||||
|
||||
Next let's add some C++11 features to our project by replacing ``atof`` with
|
||||
``std::stod`` in ``tutorial.cxx``. At the same time, remove
|
||||
``#include <cstdlib>``.
|
||||
* ``CMakeLists.txt``
|
||||
* ``tutorial.cxx``
|
||||
|
||||
.. literalinclude:: Step2/tutorial.cxx
|
||||
:caption: tutorial.cxx
|
||||
:name: tutorial.cxx-cxx11
|
||||
:language: c++
|
||||
:start-after: // convert input to double
|
||||
:end-before: // calculate square root
|
||||
Getting Started
|
||||
---------------
|
||||
|
||||
We will need to explicitly state in the CMake code that it should use the
|
||||
correct flags. The easiest way to enable support for a specific C++ standard
|
||||
in CMake is by using the :variable:`CMAKE_CXX_STANDARD` variable. For this
|
||||
tutorial, set the :variable:`CMAKE_CXX_STANDARD` variable in the
|
||||
``CMakeLists.txt`` file to ``11`` and :variable:`CMAKE_CXX_STANDARD_REQUIRED`
|
||||
to ``True``. Make sure to add the ``CMAKE_CXX_STANDARD`` declarations above the
|
||||
call to ``add_executable``.
|
||||
Continue editing files in the ``Step1`` directory. Start with ``TODO 4`` and
|
||||
complete through ``TODO 6``.
|
||||
|
||||
.. literalinclude:: Step2/CMakeLists.txt
|
||||
:caption: CMakeLists.txt
|
||||
:name: CMakeLists.txt-CXX_STANDARD
|
||||
:language: cmake
|
||||
:end-before: # configure a header file to pass some of the CMake settings
|
||||
First, edit ``tutorial.cxx`` by adding a feature that requires C++11. Then
|
||||
update ``CMakeLists.txt`` to require C++11.
|
||||
|
||||
Rebuild
|
||||
-------
|
||||
Build and Run
|
||||
-------------
|
||||
|
||||
Let's build our project again. We already created a build directory and ran
|
||||
CMake, so we can skip to the build step:
|
||||
Let's build our project again. Since we already created a build directory and
|
||||
ran CMake for Exercise 1, we can skip to the build step:
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
cd Step1_build
|
||||
cmake --build .
|
||||
|
||||
Now we can try to use the newly built ``Tutorial`` with same commands as before:
|
||||
Now we can try to use the newly built ``Tutorial`` with same commands as
|
||||
before:
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
@ -171,5 +224,238 @@ Now we can try to use the newly built ``Tutorial`` with same commands as before:
|
||||
Tutorial 10
|
||||
Tutorial
|
||||
|
||||
Check that the version number is now reported when running the executable without
|
||||
any arguments.
|
||||
Solution
|
||||
--------
|
||||
|
||||
We start by adding some C++11 features to our project by replacing
|
||||
``atof`` with ``std::stod`` in ``tutorial.cxx``. This looks like
|
||||
the following:
|
||||
|
||||
.. raw:: html
|
||||
|
||||
<details><summary>TODO 4: Click to show/hide answer</summary>
|
||||
|
||||
.. literalinclude:: Step2/tutorial.cxx
|
||||
:caption: TODO 4: tutorial.cxx
|
||||
:name: tutorial.cxx-cxx11
|
||||
:language: c++
|
||||
:start-after: // convert input to double
|
||||
:end-before: // TODO 12:
|
||||
|
||||
.. raw:: html
|
||||
|
||||
</details>
|
||||
|
||||
To complete ``TODO 5``, simply remove ``#include <cstdlib>``.
|
||||
|
||||
We will need to explicitly state in the CMake code that it should use the
|
||||
correct flags. One way to enable support for a specific C++ standard in CMake
|
||||
is by using the :variable:`CMAKE_CXX_STANDARD` variable. For this tutorial, set
|
||||
the :variable:`CMAKE_CXX_STANDARD` variable in the ``CMakeLists.txt`` file to
|
||||
``11`` and :variable:`CMAKE_CXX_STANDARD_REQUIRED` to ``True``. Make sure to
|
||||
add the :variable:`CMAKE_CXX_STANDARD` declarations above the call to
|
||||
:command:`add_executable`.
|
||||
|
||||
.. raw:: html
|
||||
|
||||
<details><summary>TODO 6: Click to show/hide answer</summary>
|
||||
|
||||
.. literalinclude:: Step2/CMakeLists.txt
|
||||
:caption: TODO 6: CMakeLists.txt
|
||||
:name: CMakeLists.txt-CXX_STANDARD
|
||||
:language: cmake
|
||||
:start-after: # specify the C++ standard
|
||||
:end-before: # TODO 7:
|
||||
|
||||
.. raw:: html
|
||||
|
||||
</details>
|
||||
|
||||
Exercise 3 - Adding a Version Number and Configured Header File
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
Sometimes it may be useful to have a variable that is defined in your
|
||||
``CMakelists.txt`` file also be available in your source code. In this case, we
|
||||
would like to print the project version.
|
||||
|
||||
One way to accomplish this is by using a configured header file. We create an
|
||||
input file with one or more variables to replace. These variables have special
|
||||
syntax which looks like ``@VAR@``.
|
||||
Then, we use the :command:`configure_file` command to copy the input file to a
|
||||
given output file and replace these variables with the current value of ``VAR``
|
||||
in the ``CMakelists.txt`` file.
|
||||
|
||||
While we could edit the version directly in the source code, using this
|
||||
feature is preferred since it creates a single source of truth and avoids
|
||||
duplication.
|
||||
|
||||
Goal
|
||||
----
|
||||
|
||||
Define and report the project's version number.
|
||||
|
||||
Helpful Resources
|
||||
-----------------
|
||||
|
||||
* :variable:`<PROJECT-NAME>_VERSION_MAJOR`
|
||||
* :variable:`<PROJECT-NAME>_VERSION_MINOR`
|
||||
* :command:`configure_file`
|
||||
* :command:`target_include_directories`
|
||||
|
||||
Files to Edit
|
||||
-------------
|
||||
|
||||
* ``CMakeLists.txt``
|
||||
* ``tutorial.cxx``
|
||||
|
||||
Getting Started
|
||||
---------------
|
||||
|
||||
Continue to edit files from ``Step1``. Start on ``TODO 7`` and complete through
|
||||
``TODO 12``. In this exercise, we start by adding a project version number in
|
||||
``CMakeLists.txt``. In that same file, use :command:`configure_file` to copy a
|
||||
given input file to an output file and substitute some variable values in the
|
||||
input file content.
|
||||
|
||||
Next, create an input header file ``TutorialConfig.h.in`` defining version
|
||||
numbers which will accept variables passed from :command:`configure_file`.
|
||||
|
||||
Finally, update ``tutorial.cxx`` to print out its version number.
|
||||
|
||||
Build and Run
|
||||
-------------
|
||||
|
||||
Let's build our project again. As before, we already created a build directory
|
||||
and ran CMake so we can skip to the build step:
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
cd Step1_build
|
||||
cmake --build .
|
||||
|
||||
Verify that the version number is now reported when running the executable
|
||||
without any arguments.
|
||||
|
||||
Solution
|
||||
--------
|
||||
|
||||
In this exercise, we improve our executable by printing a version number.
|
||||
While we could do this exclusively in the source code, using ``CMakeLists.txt``
|
||||
lets us maintain a single source of data for the version number.
|
||||
|
||||
First, we modify the ``CMakeLists.txt`` file to use the
|
||||
:command:`project` command to set both the project name and version number.
|
||||
When the :command:`project` command is called, CMake defines
|
||||
``Tutorial_VERSION_MAJOR`` and ``Tutorial_VERSION_MINOR`` behind the scenes.
|
||||
|
||||
.. raw:: html
|
||||
|
||||
<details><summary>TODO 7: Click to show/hide answer</summary>
|
||||
|
||||
.. literalinclude:: Step2/CMakeLists.txt
|
||||
:caption: TODO 7: CMakeLists.txt
|
||||
:name: CMakeLists.txt-project-VERSION
|
||||
:language: cmake
|
||||
:start-after: # set the project name and version
|
||||
:end-before: # specify the C++ standard
|
||||
|
||||
.. raw:: html
|
||||
|
||||
</details>
|
||||
|
||||
Then we used :command:`configure_file` to copy the input file with the
|
||||
specified CMake variables replaced:
|
||||
|
||||
.. raw:: html
|
||||
|
||||
<details><summary>TODO 8: Click to show/hide answer</summary>
|
||||
|
||||
.. literalinclude:: Step2/CMakeLists.txt
|
||||
:caption: TODO 8: CMakeLists.txt
|
||||
:name: CMakeLists.txt-configure_file
|
||||
:language: cmake
|
||||
:start-after: # to the source code
|
||||
:end-before: # TODO 8:
|
||||
|
||||
.. raw:: html
|
||||
|
||||
</details>
|
||||
|
||||
Since the configured file will be written into the project binary
|
||||
directory, we must add that directory to the list of paths to search for
|
||||
include files.
|
||||
|
||||
**Note:** Throughout this tutorial, we will refer to the project build and
|
||||
the project binary directory interchangeably. These are the same and are not
|
||||
meant to refer to a `bin/` directory.
|
||||
|
||||
We used :command:`target_include_directories` to specify
|
||||
where the executable target should look for include files.
|
||||
|
||||
.. raw:: html
|
||||
|
||||
<details><summary>TODO 9: Click to show/hide answer</summary>
|
||||
|
||||
.. literalinclude:: Step2/CMakeLists.txt
|
||||
:caption: TODO 9: CMakeLists.txt
|
||||
:name: CMakeLists.txt-target_include_directories
|
||||
:language: cmake
|
||||
:start-after: # so that we will find TutorialConfig.h
|
||||
|
||||
.. raw:: html
|
||||
|
||||
</details>
|
||||
|
||||
``TutorialConfig.h.in`` is the input header file to be configured.
|
||||
When :command:`configure_file` is called from our ``CMakeLists.txt``, the
|
||||
values for ``@Tutorial_VERSION_MAJOR@`` and ``@Tutorial_VERSION_MINOR@`` will
|
||||
be replaced with the corresponding version numbers from the project in
|
||||
``TutorialConfig.h``.
|
||||
|
||||
.. raw:: html
|
||||
|
||||
<details><summary>TODO 10: Click to show/hide answer</summary>
|
||||
|
||||
.. literalinclude:: Step2/TutorialConfig.h.in
|
||||
:caption: TODO 10: TutorialConfig.h.in
|
||||
:name: TutorialConfig.h.in
|
||||
:language: c++
|
||||
:end-before: // TODO 13:
|
||||
|
||||
.. raw:: html
|
||||
|
||||
</details>
|
||||
|
||||
Next, we need to modify ``tutorial.cxx`` to include the configured header file,
|
||||
``TutorialConfig.h``.
|
||||
|
||||
.. raw:: html
|
||||
|
||||
<details><summary>TODO 11: Click to show/hide answer</summary>
|
||||
|
||||
.. code-block:: c++
|
||||
:caption: TODO 11: tutorial.cxx
|
||||
|
||||
#include "TutorialConfig.h"
|
||||
|
||||
.. raw:: html
|
||||
|
||||
</details>
|
||||
|
||||
Finally, we print out the executable name and version number by updating
|
||||
``tutorial.cxx`` as follows:
|
||||
|
||||
.. raw:: html
|
||||
|
||||
<details><summary>TODO 12: Click to show/hide answer</summary>
|
||||
|
||||
.. literalinclude:: Step2/tutorial.cxx
|
||||
:caption: TODO 12 : tutorial.cxx
|
||||
:name: tutorial.cxx-print-version
|
||||
:language: c++
|
||||
:start-after: {
|
||||
:end-before: // convert input to double
|
||||
|
||||
.. raw:: html
|
||||
|
||||
</details>
|
||||
|
@ -21,7 +21,7 @@ in ``MathFunctions/CMakeLists.txt`` to look like:
|
||||
:caption: MathFunctions/CMakeLists.txt
|
||||
:name: MathFunctions/CMakeLists.txt-install-TARGETS-EXPORT
|
||||
:language: cmake
|
||||
:start-after: # install rules
|
||||
:start-after: # install libs
|
||||
|
||||
Now that we have ``MathFunctions`` being exported, we also need to explicitly
|
||||
install the generated ``MathFunctionsTargets.cmake`` file. This is done by
|
||||
|
@ -1,4 +1,4 @@
|
||||
Step 10: Adding Generator Expressions
|
||||
Step 4: Adding Generator Expressions
|
||||
=====================================
|
||||
|
||||
:manual:`Generator expressions <cmake-generator-expressions(7)>` are evaluated
|
||||
@ -27,58 +27,280 @@ expressions are the ``0`` and ``1`` expressions. A ``$<0:...>`` results in the
|
||||
empty string, and ``<1:...>`` results in the content of ``...``. They can also
|
||||
be nested.
|
||||
|
||||
Exercise 1 - Setting the C++ Standard with Interface Libraries
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
Before we use :manual:`generator expressions <cmake-generator-expressions(7)>`
|
||||
let's refactor our existing code to use an ``INTERFACE`` library. We will
|
||||
use that library in the next step to demonstrate a common use for
|
||||
:manual:`generator expressions <cmake-generator-expressions(7)>`.
|
||||
|
||||
Goal
|
||||
----
|
||||
|
||||
Add an ``INTERFACE`` library target to specify the required C++ standard.
|
||||
|
||||
Helpful Resources
|
||||
-----------------
|
||||
|
||||
* :command:`add_library`
|
||||
* :command:`target_compile_features`
|
||||
* :command:`target_link_libraries`
|
||||
|
||||
Files to Edit
|
||||
-------------
|
||||
|
||||
* ``CMakeLists.txt``
|
||||
* ``MathFunctions/CMakeLists.txt``
|
||||
|
||||
Getting Started
|
||||
---------------
|
||||
|
||||
In this exercise, we will refactor our code to use an ``INTERFACE`` library to
|
||||
specify the C++ standard.
|
||||
|
||||
The starting source code is provided in the ``Step4`` directory. In this
|
||||
exercise, complete ``TODO 1`` through ``TODO 3``.
|
||||
|
||||
Start by editing the top level ``CMakeLists.txt`` file. Construct an
|
||||
``INTERFACE`` library target called ``tutorial_compiler_flags`` and
|
||||
specify ``cxx_std_11`` as a target compiler feature.
|
||||
|
||||
Modify ``CMakeLists.txt`` and ``MathFunctions/CMakeLists.txt`` so that all
|
||||
targets have a :command:`target_link_libraries` call to
|
||||
``tutorial_compiler_flags``.
|
||||
|
||||
Build and Run
|
||||
-------------
|
||||
|
||||
Make a new directory called ``Step4_build``, run the :manual:`cmake <cmake(1)>`
|
||||
executable or the :manual:`cmake-gui <cmake-gui(1)>` to configure the project
|
||||
and then build it with your chosen build tool or by using ``cmake --build .``
|
||||
from the build directory.
|
||||
|
||||
Here's a refresher of what that looks like from the command line:
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
mkdir Step4_build
|
||||
cd Step4_build
|
||||
cmake ../Step4
|
||||
cmake --build .
|
||||
|
||||
Next, use the newly built ``Tutorial`` and verify that it is working as
|
||||
expected.
|
||||
|
||||
Solution
|
||||
--------
|
||||
|
||||
Let's update our code from the previous step to use interface libraries
|
||||
to set our C++ requirements.
|
||||
|
||||
To start, we need to remove the two :command:`set` calls on the variables
|
||||
:variable:`CMAKE_CXX_STANDARD` and :variable:`CMAKE_CXX_STANDARD_REQUIRED`.
|
||||
The specific lines to remove are as follows:
|
||||
|
||||
.. literalinclude:: Step4/CMakeLists.txt
|
||||
:caption: CMakeLists.txt
|
||||
:name: CMakeLists.txt-CXX_STANDARD-variable-remove
|
||||
:language: cmake
|
||||
:start-after: # specify the C++ standard
|
||||
:end-before: # TODO 5: Create helper variables
|
||||
|
||||
Next, we need to create an interface library, ``tutorial_compiler_flags``. And
|
||||
then use :command:`target_compile_features` to add the compiler feature
|
||||
``cxx_std_11``.
|
||||
|
||||
|
||||
.. raw:: html
|
||||
|
||||
<details><summary>TODO 1: Click to show/hide answer</summary>
|
||||
|
||||
.. literalinclude:: Step5/CMakeLists.txt
|
||||
:caption: TODO 1: CMakeLists.txt
|
||||
:name: CMakeLists.txt-cxx_std-feature
|
||||
:language: cmake
|
||||
:start-after: # specify the C++ standard
|
||||
:end-before: # add compiler warning flags just
|
||||
|
||||
.. raw:: html
|
||||
|
||||
</details>
|
||||
|
||||
Finally, with our interface library set up, we need to link our
|
||||
executable ``Target`` and our ``MathFunctions`` library to our new
|
||||
``tutorial_compiler_flags`` library. Respectively, the code will look like
|
||||
this:
|
||||
|
||||
.. raw:: html
|
||||
|
||||
<details><summary>TODO 2: Click to show/hide answer</summary>
|
||||
|
||||
.. literalinclude:: Step5/CMakeLists.txt
|
||||
:caption: TODO 2: CMakeLists.txt
|
||||
:name: CMakeLists.txt-target_link_libraries-step4
|
||||
:language: cmake
|
||||
:start-after: add_executable(Tutorial tutorial.cxx)
|
||||
:end-before: # add the binary tree to the search path for include file
|
||||
|
||||
.. raw:: html
|
||||
|
||||
</details>
|
||||
|
||||
and this:
|
||||
|
||||
.. raw:: html
|
||||
|
||||
<details><summary>TODO 3: Click to show/hide answer</summary>
|
||||
|
||||
.. literalinclude:: Step5/MathFunctions/CMakeLists.txt
|
||||
:caption: TODO 3: MathFunctions/CMakeLists.txt
|
||||
:name: MathFunctions-CMakeLists.txt-target_link_libraries-step4
|
||||
:language: cmake
|
||||
:start-after: # link our compiler flags interface library
|
||||
:end-before: # TODO 1
|
||||
|
||||
.. raw:: html
|
||||
|
||||
</details>
|
||||
|
||||
With this, all of our code still requires C++ 11 to build. Notice
|
||||
though that with this method, it gives us the ability to be specific about
|
||||
which targets get specific requirements. In addition, we create a single
|
||||
source of truth in our interface library.
|
||||
|
||||
Exercise 2 - Adding Compiler Warning Flags with Generator Expressions
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
A common usage of
|
||||
:manual:`generator expressions <cmake-generator-expressions(7)>` is to
|
||||
conditionally add compiler flags, such as those for language levels or
|
||||
warnings. A nice pattern is to associate this information to an ``INTERFACE``
|
||||
target allowing this information to propagate. Let's start by constructing an
|
||||
``INTERFACE`` target and specifying the required C++ standard level of ``11``
|
||||
instead of using :variable:`CMAKE_CXX_STANDARD`.
|
||||
target allowing this information to propagate.
|
||||
|
||||
So the following code:
|
||||
Goal
|
||||
----
|
||||
|
||||
.. literalinclude:: Step10/CMakeLists.txt
|
||||
:caption: CMakeLists.txt
|
||||
:name: CMakeLists.txt-CXX_STANDARD-variable-remove
|
||||
Add compiler warning flags when building but not for installed versions.
|
||||
|
||||
Helpful Resources
|
||||
-----------------
|
||||
|
||||
* :manual:`cmake-generator-expressions(7)`
|
||||
* :command:`cmake_minimum_required`
|
||||
* :command:`set`
|
||||
* :command:`target_compile_options`
|
||||
|
||||
Files to Edit
|
||||
-------------
|
||||
|
||||
* ``CMakeLists.txt``
|
||||
|
||||
Getting Started
|
||||
---------------
|
||||
|
||||
Start with the resulting files from Exercise 1. Complete ``TODO 4`` through
|
||||
``TODO 7``.
|
||||
|
||||
First, in the top level ``CMakeLists.txt`` file, we need to set the
|
||||
:command:`cmake_minimum_required` to ``3.15``. In this exercise we are going
|
||||
to use a generator expression which was introduced in CMake 3.15.
|
||||
|
||||
Next we add the desired compiler warning flags that we want for our project.
|
||||
As warning flags vary based on the compiler, we use the
|
||||
``COMPILE_LANG_AND_ID`` generator expression to control which flags to apply
|
||||
given a language and a set of compiler ids.
|
||||
|
||||
Build and Run
|
||||
-------------
|
||||
|
||||
Since we have our build directory already configured from Exercise 1, simply
|
||||
rebuild our code by calling the following:
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
cd Step4_build
|
||||
cmake --build .
|
||||
|
||||
Solution
|
||||
--------
|
||||
|
||||
Update the :command:`cmake_minimum_required` to require at least CMake
|
||||
version ``3.15``:
|
||||
|
||||
.. raw:: html
|
||||
|
||||
<details><summary>TODO 4: Click to show/hide answer</summary>
|
||||
|
||||
.. literalinclude:: Step5/CMakeLists.txt
|
||||
:caption: TODO 4: CMakeLists.txt
|
||||
:name: MathFunctions-CMakeLists.txt-minimum-required-step4
|
||||
:language: cmake
|
||||
:start-after: project(Tutorial VERSION 1.0)
|
||||
:end-before: # control where the static and shared libraries are built so that on windows
|
||||
:end-before: # set the project name and version
|
||||
|
||||
Would be replaced with:
|
||||
.. raw:: html
|
||||
|
||||
.. literalinclude:: Step11/CMakeLists.txt
|
||||
:caption: CMakeLists.txt
|
||||
:name: CMakeLists.txt-cxx_std-feature
|
||||
:language: cmake
|
||||
:start-after: project(Tutorial VERSION 1.0)
|
||||
:end-before: # add compiler warning flags just when building this project via
|
||||
</details>
|
||||
|
||||
**Note**: This upcoming section will require a change to the
|
||||
:command:`cmake_minimum_required` usage in the code. The Generator Expression
|
||||
that is about to be used was introduced in `3.15`. Update the call to require
|
||||
that more recent version:
|
||||
Next we determine which compiler our system is currently using to build
|
||||
since warning flags vary based on the compiler we use. This is done with
|
||||
the ``COMPILE_LANG_AND_ID`` generator expression. We set the result in the
|
||||
variables ``gcc_like_cxx`` and ``msvc_cxx`` as follows:
|
||||
|
||||
.. code-block:: cmake
|
||||
:caption: CMakeLists.txt
|
||||
:name: CMakeLists.txt-version-update
|
||||
.. raw:: html
|
||||
|
||||
cmake_minimum_required(VERSION 3.15)
|
||||
<details><summary>TODO 5: Click to show/hide answer</summary>
|
||||
|
||||
Next we add the desired compiler warning flags that we want for our project. As
|
||||
warning flags vary based on the compiler we use the ``COMPILE_LANG_AND_ID``
|
||||
generator expression to control which flags to apply given a language and a set
|
||||
of compiler ids as seen below:
|
||||
|
||||
.. literalinclude:: Step11/CMakeLists.txt
|
||||
:caption: CMakeLists.txt
|
||||
:name: CMakeLists.txt-target_compile_options-genex
|
||||
.. literalinclude:: Step5/CMakeLists.txt
|
||||
:caption: TODO 5: CMakeLists.txt
|
||||
:name: CMakeLists.txt-compile_lang_and_id
|
||||
:language: cmake
|
||||
:start-after: # the BUILD_INTERFACE genex
|
||||
:end-before: # control where the static and shared libraries are built so that on windows
|
||||
:end-before: target_compile_options(tutorial_compiler_flags INTERFACE
|
||||
|
||||
Looking at this we see that the warning flags are encapsulated inside a
|
||||
``BUILD_INTERFACE`` condition. This is done so that consumers of our installed
|
||||
project will not inherit our warning flags.
|
||||
.. raw:: html
|
||||
|
||||
**Exercise**: Modify ``MathFunctions/CMakeLists.txt`` so that all targets have
|
||||
a :command:`target_link_libraries` call to ``tutorial_compiler_flags``.
|
||||
</details>
|
||||
|
||||
Next we add the desired compiler warning flags that we want for our project.
|
||||
Using our variables ``gcc_like_cxx`` and ``msvc_cxx``, we can use another
|
||||
generator expression to apply the respective flags only when the variables are
|
||||
true. We use :command:`target_compile_options` to apply these flags to our
|
||||
interface library.
|
||||
|
||||
.. raw:: html
|
||||
|
||||
<details><summary>TODO 6: Click to show/hide answer</summary>
|
||||
|
||||
.. code-block:: cmake
|
||||
:caption: TODO 6: CMakeLists.txt
|
||||
:name: CMakeLists.txt-compile_flags
|
||||
|
||||
target_compile_options(tutorial_compiler_flags INTERFACE
|
||||
"$<${gcc_like_cxx}:-Wall;-Wextra;-Wshadow;-Wformat=2;-Wunused>"
|
||||
"$<${msvc_cxx}:-W3>"
|
||||
)
|
||||
|
||||
.. raw:: html
|
||||
|
||||
</details>
|
||||
|
||||
Lastly, we only want these warning flags to be used during builds. Consumers
|
||||
of our installed project should not inherit our warning flags. To specify
|
||||
this, we wrap our flags in a generator expression using the ``BUILD_INTERFACE``
|
||||
condition. The resulting full code looks like the following:
|
||||
|
||||
.. raw:: html
|
||||
|
||||
<details><summary>TODO 7: Click to show/hide answer</summary>
|
||||
|
||||
.. literalinclude:: Step5/CMakeLists.txt
|
||||
:caption: TODO 7: CMakeLists.txt
|
||||
:name: CMakeLists.txt-target_compile_options-genex
|
||||
:language: cmake
|
||||
:start-after: set(msvc_cxx "$<COMPILE_LANG_AND_ID:CXX,MSVC>")
|
||||
:end-before: # should we use our own math functions
|
||||
|
||||
.. raw:: html
|
||||
|
||||
</details>
|
||||
|
@ -1,4 +1,4 @@
|
||||
Step 8: Adding Support for a Testing Dashboard
|
||||
Step 6: Adding Support for a Testing Dashboard
|
||||
==============================================
|
||||
|
||||
Adding support for submitting our test results to a dashboard is simple. We
|
||||
@ -9,21 +9,21 @@ we include the :module:`CTest` module in our top-level ``CMakeLists.txt``.
|
||||
|
||||
Replace:
|
||||
|
||||
.. code-block:: cmake
|
||||
.. literalinclude:: Step6/CMakeLists.txt
|
||||
:caption: CMakeLists.txt
|
||||
:name: CMakeLists.txt-enable_testing-remove
|
||||
|
||||
# enable testing
|
||||
enable_testing()
|
||||
:language: cmake
|
||||
:start-after: # enable testing
|
||||
:end-before: # does the application run
|
||||
|
||||
With:
|
||||
|
||||
.. code-block:: cmake
|
||||
.. literalinclude:: Step7/CMakeLists.txt
|
||||
:caption: CMakeLists.txt
|
||||
:name: CMakeLists.txt-include-CTest
|
||||
|
||||
# enable dashboard scripting
|
||||
include(CTest)
|
||||
:language: cmake
|
||||
:start-after: # enable testing
|
||||
:end-before: # does the application run
|
||||
|
||||
The :module:`CTest` module will automatically call ``enable_testing()``, so we
|
||||
can remove it from our CMake files.
|
||||
@ -46,7 +46,7 @@ downloaded from the ``Settings`` page of the project on the CDash
|
||||
instance that will host and display the test results. Once downloaded from
|
||||
CDash, the file should not be modified locally.
|
||||
|
||||
.. literalinclude:: Step9/CTestConfig.cmake
|
||||
.. literalinclude:: Step7/CTestConfig.cmake
|
||||
:caption: CTestConfig.cmake
|
||||
:name: CTestConfig.cmake
|
||||
:language: cmake
|
||||
|
@ -1,4 +1,4 @@
|
||||
Step 5: Adding System Introspection
|
||||
Step 7: Adding System Introspection
|
||||
===================================
|
||||
|
||||
Let us consider adding some code to our project that depends on features the
|
||||
@ -15,7 +15,7 @@ these functions using the :module:`CheckCXXSourceCompiles` module in
|
||||
Add the checks for ``log`` and ``exp`` to ``MathFunctions/CMakeLists.txt``,
|
||||
after the call to :command:`target_include_directories`:
|
||||
|
||||
.. literalinclude:: Step6/MathFunctions/CMakeLists.txt
|
||||
.. literalinclude:: Step8/MathFunctions/CMakeLists.txt
|
||||
:caption: MathFunctions/CMakeLists.txt
|
||||
:name: MathFunctions/CMakeLists.txt-check_cxx_source_compiles
|
||||
:language: cmake
|
||||
@ -25,19 +25,19 @@ after the call to :command:`target_include_directories`:
|
||||
If available, use :command:`target_compile_definitions` to specify
|
||||
``HAVE_LOG`` and ``HAVE_EXP`` as ``PRIVATE`` compile definitions.
|
||||
|
||||
.. literalinclude:: Step6/MathFunctions/CMakeLists.txt
|
||||
.. literalinclude:: Step8/MathFunctions/CMakeLists.txt
|
||||
:caption: MathFunctions/CMakeLists.txt
|
||||
:name: MathFunctions/CMakeLists.txt-target_compile_definitions
|
||||
:language: cmake
|
||||
:start-after: # add compile definitions
|
||||
:end-before: # install rules
|
||||
:end-before: # install libs
|
||||
|
||||
If ``log`` and ``exp`` are available on the system, then we will use them to
|
||||
compute the square root in the ``mysqrt`` function. Add the following code to
|
||||
the ``mysqrt`` function in ``MathFunctions/mysqrt.cxx`` (don't forget the
|
||||
``#endif`` before returning the result!):
|
||||
|
||||
.. literalinclude:: Step6/MathFunctions/mysqrt.cxx
|
||||
.. literalinclude:: Step8/MathFunctions/mysqrt.cxx
|
||||
:caption: MathFunctions/mysqrt.cxx
|
||||
:name: MathFunctions/mysqrt.cxx-ifdef
|
||||
:language: c++
|
||||
@ -46,7 +46,7 @@ the ``mysqrt`` function in ``MathFunctions/mysqrt.cxx`` (don't forget the
|
||||
|
||||
We will also need to modify ``mysqrt.cxx`` to include ``cmath``.
|
||||
|
||||
.. literalinclude:: Step6/MathFunctions/mysqrt.cxx
|
||||
.. literalinclude:: Step8/MathFunctions/mysqrt.cxx
|
||||
:caption: MathFunctions/mysqrt.cxx
|
||||
:name: MathFunctions/mysqrt.cxx-include-cmath
|
||||
:language: c++
|
||||
|
@ -1,52 +1,147 @@
|
||||
Step 3: Adding Usage Requirements for a Library
|
||||
===============================================
|
||||
|
||||
Usage requirements allow for far better control over a library or executable's
|
||||
link and include line while also giving more control over the transitive
|
||||
property of targets inside CMake. The primary commands that leverage usage
|
||||
requirements are:
|
||||
Exercise 1 - Adding Usage Requirements for a Library
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
- :command:`target_compile_definitions`
|
||||
- :command:`target_compile_options`
|
||||
- :command:`target_include_directories`
|
||||
- :command:`target_link_libraries`
|
||||
:ref:`Usage requirements <Target Usage Requirements>` of a target parameters
|
||||
allow for far better control over a library or executable's link and include
|
||||
line while also giving more control over the transitive property of targets
|
||||
inside CMake. The primary commands that
|
||||
leverage usage requirements are:
|
||||
|
||||
Let's refactor our code from :guide:`tutorial/Adding a Library` to use the
|
||||
modern CMake approach of usage requirements. We first state that anybody
|
||||
linking to ``MathFunctions`` needs to include the current source directory,
|
||||
while ``MathFunctions`` itself doesn't. So this can become an ``INTERFACE``
|
||||
usage requirement.
|
||||
* :command:`target_compile_definitions`
|
||||
* :command:`target_compile_options`
|
||||
* :command:`target_include_directories`
|
||||
* :command:`target_link_directories`
|
||||
* :command:`target_link_options`
|
||||
* :command:`target_precompile_headers`
|
||||
* :command:`target_sources`
|
||||
|
||||
Remember ``INTERFACE`` means things that consumers require but the producer
|
||||
doesn't. Add the following lines to the end of
|
||||
``MathFunctions/CMakeLists.txt``:
|
||||
|
||||
Goal
|
||||
----
|
||||
|
||||
Add usage requirements for a library.
|
||||
|
||||
Helpful Materials
|
||||
-----------------
|
||||
|
||||
* :variable:`CMAKE_CURRENT_SOURCE_DIR`
|
||||
|
||||
Files to Edit
|
||||
-------------
|
||||
|
||||
* ``MathFunctions/CMakeLists.txt``
|
||||
* ``CMakeLists.txt``
|
||||
|
||||
Getting Started
|
||||
---------------
|
||||
|
||||
In this exercise, we will refactor our code from
|
||||
:guide:`tutorial/Adding a Library` to use the modern CMake approach. We will
|
||||
let our library define its own usage requirements so they are passed
|
||||
transitively to other targets as necessary. In this case, ``MathFunctions``
|
||||
will specify any needed include directories itself. Then, the consuming target
|
||||
``Tutorial`` simply needs to link to ``MathFunctions`` and not worry about
|
||||
any additional include directories.
|
||||
|
||||
The starting source code is provided in the ``Step3`` directory. In this
|
||||
exercise, complete ``TODO 1`` through ``TODO 3``.
|
||||
|
||||
First, add a call to :command:`target_include_directories` in
|
||||
``MathFunctions/CMakeLists``. Remember that
|
||||
:variable:`CMAKE_CURRENT_SOURCE_DIR` is the path to the source directory
|
||||
currently being processed.
|
||||
|
||||
Then, update (and simplify!) the call to
|
||||
:command:`target_include_directories` in the top-level ``CMakeLists.txt``.
|
||||
|
||||
Build and Run
|
||||
-------------
|
||||
|
||||
Make a new directory called ``Step3_build``, run the :manual:`cmake
|
||||
<cmake(1)>` executable or the :manual:`cmake-gui <cmake-gui(1)>` to
|
||||
configure the project and then build it with your chosen build tool or by
|
||||
using :option:`cmake --build . <cmake --build>` from the build directory.
|
||||
Here's a refresher of what that looks like from the command line:
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
mkdir Step3_build
|
||||
cd Step3_build
|
||||
cmake ../Step3
|
||||
cmake --build .
|
||||
|
||||
Next, use the newly built ``Tutorial`` and verify that it is working as
|
||||
expected.
|
||||
|
||||
Solution
|
||||
--------
|
||||
|
||||
Let's update the code from the previous step to use the modern CMake
|
||||
approach of usage requirements.
|
||||
|
||||
We want to state that anybody linking to ``MathFunctions`` needs to include
|
||||
the current source directory, while ``MathFunctions`` itself doesn't. This
|
||||
can be expressed with an ``INTERFACE`` usage requirement. Remember
|
||||
``INTERFACE`` means things that consumers require but the producer doesn't.
|
||||
|
||||
At the end of ``MathFunctions/CMakeLists.txt``, use
|
||||
:command:`target_include_directories` with the ``INTERFACE`` keyword, as
|
||||
follows:
|
||||
|
||||
.. raw:: html
|
||||
|
||||
<details><summary>TODO 1: Click to show/hide answer</summary>
|
||||
|
||||
.. literalinclude:: Step4/MathFunctions/CMakeLists.txt
|
||||
:caption: MathFunctions/CMakeLists.txt
|
||||
:caption: TODO 1: MathFunctions/CMakeLists.txt
|
||||
:name: MathFunctions/CMakeLists.txt-target_include_directories-INTERFACE
|
||||
:language: cmake
|
||||
:start-after: # to find MathFunctions.h
|
||||
:end-before: # TODO 3: Link to
|
||||
|
||||
Now that we've specified usage requirements for ``MathFunctions`` we can safely
|
||||
remove our uses of the ``EXTRA_INCLUDES`` variable from the top-level
|
||||
.. raw:: html
|
||||
|
||||
</details>
|
||||
|
||||
Now that we've specified usage requirements for ``MathFunctions`` we can
|
||||
safely remove our uses of the ``EXTRA_INCLUDES`` variable from the top-level
|
||||
``CMakeLists.txt``, here:
|
||||
|
||||
.. raw:: html
|
||||
|
||||
<details><summary>TODO 2: Click to show/hide answer</summary>
|
||||
|
||||
.. literalinclude:: Step4/CMakeLists.txt
|
||||
:caption: CMakeLists.txt
|
||||
:caption: TODO 2: CMakeLists.txt
|
||||
:name: CMakeLists.txt-remove-EXTRA_INCLUDES
|
||||
:language: cmake
|
||||
:start-after: # add the MathFunctions library
|
||||
:end-before: # add the executable
|
||||
|
||||
.. raw:: html
|
||||
|
||||
</details>
|
||||
|
||||
And here:
|
||||
|
||||
.. raw:: html
|
||||
|
||||
<details><summary>TODO 3: Click to show/hide answer</summary>
|
||||
|
||||
.. literalinclude:: Step4/CMakeLists.txt
|
||||
:caption: CMakeLists.txt
|
||||
:caption: TODO 3: CMakeLists.txt
|
||||
:name: CMakeLists.txt-target_include_directories-remove-EXTRA_INCLUDES
|
||||
:language: cmake
|
||||
:start-after: # so that we will find TutorialConfig.h
|
||||
|
||||
Once this is done, run the :manual:`cmake <cmake(1)>` executable or the
|
||||
:manual:`cmake-gui <cmake-gui(1)>` to configure the project and then build it
|
||||
with your chosen build tool or by using ``cmake --build .`` from the build
|
||||
directory.
|
||||
.. raw:: html
|
||||
|
||||
</details>
|
||||
|
||||
Notice that with this technique, the only thing our executable target does to
|
||||
use our library is call :command:`target_link_libraries` with the name
|
||||
of the library target. In larger projects, the classic method of specifying
|
||||
library dependencies manually becomes very complicated very quickly.
|
||||
|
@ -1,4 +1,4 @@
|
||||
Step 6: Adding a Custom Command and Generated File
|
||||
Step 8: Adding a Custom Command and Generated File
|
||||
==================================================
|
||||
|
||||
Suppose, for the purpose of this tutorial, we decide that we never want to use
|
||||
@ -26,7 +26,7 @@ accomplish this.
|
||||
First, at the top of ``MathFunctions/CMakeLists.txt``, the executable for
|
||||
``MakeTable`` is added as any other executable would be added.
|
||||
|
||||
.. literalinclude:: Step7/MathFunctions/CMakeLists.txt
|
||||
.. literalinclude:: Step9/MathFunctions/CMakeLists.txt
|
||||
:caption: MathFunctions/CMakeLists.txt
|
||||
:name: MathFunctions/CMakeLists.txt-add_executable-MakeTable
|
||||
:language: cmake
|
||||
@ -36,7 +36,7 @@ First, at the top of ``MathFunctions/CMakeLists.txt``, the executable for
|
||||
Then we add a custom command that specifies how to produce ``Table.h``
|
||||
by running MakeTable.
|
||||
|
||||
.. literalinclude:: Step7/MathFunctions/CMakeLists.txt
|
||||
.. literalinclude:: Step9/MathFunctions/CMakeLists.txt
|
||||
:caption: MathFunctions/CMakeLists.txt
|
||||
:name: MathFunctions/CMakeLists.txt-add_custom_command-Table.h
|
||||
:language: cmake
|
||||
@ -47,7 +47,7 @@ Next we have to let CMake know that ``mysqrt.cxx`` depends on the generated
|
||||
file ``Table.h``. This is done by adding the generated ``Table.h`` to the list
|
||||
of sources for the library MathFunctions.
|
||||
|
||||
.. literalinclude:: Step7/MathFunctions/CMakeLists.txt
|
||||
.. literalinclude:: Step9/MathFunctions/CMakeLists.txt
|
||||
:caption: MathFunctions/CMakeLists.txt
|
||||
:name: MathFunctions/CMakeLists.txt-add_library-Table.h
|
||||
:language: cmake
|
||||
@ -57,17 +57,17 @@ of sources for the library MathFunctions.
|
||||
We also have to add the current binary directory to the list of include
|
||||
directories so that ``Table.h`` can be found and included by ``mysqrt.cxx``.
|
||||
|
||||
.. literalinclude:: Step7/MathFunctions/CMakeLists.txt
|
||||
.. literalinclude:: Step9/MathFunctions/CMakeLists.txt
|
||||
:caption: MathFunctions/CMakeLists.txt
|
||||
:name: MathFunctions/CMakeLists.txt-target_include_directories-Table.h
|
||||
:language: cmake
|
||||
:start-after: # state that we depend on our bin
|
||||
:end-before: # install rules
|
||||
:end-before: # install libs
|
||||
|
||||
Now let's use the generated table. First, modify ``mysqrt.cxx`` to include
|
||||
``Table.h``. Next, we can rewrite the ``mysqrt`` function to use the table:
|
||||
|
||||
.. literalinclude:: Step7/MathFunctions/mysqrt.cxx
|
||||
.. literalinclude:: Step9/MathFunctions/mysqrt.cxx
|
||||
:caption: MathFunctions/mysqrt.cxx
|
||||
:name: MathFunctions/mysqrt.cxx
|
||||
:language: c++
|
||||
|
@ -1,136 +1,459 @@
|
||||
Step 2: Adding a Library
|
||||
========================
|
||||
|
||||
Now we will add a library to our project. This library will contain our own
|
||||
At this point, we have seen how to create a basic project using CMake. In this
|
||||
step, we will learn how to create and use a library in our project. We will
|
||||
also see how to make the use of our library optional.
|
||||
|
||||
Exercise 1 - Creating a Library
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
To add a library in CMake, use the :command:`add_library` command and specify
|
||||
which source files should make up the library.
|
||||
|
||||
Rather than placing all of the source files in one directory, we can organize
|
||||
our project with one or more subdirectories. In this case, we will create a
|
||||
subdirectory specifically for our library. Here, we can add a new
|
||||
``CMakeLists.txt`` file and one or more source files. In the top level
|
||||
``CMakeLists.txt`` file, we will use the :command:`add_subdirectory` command
|
||||
to add the subdirectory to the build.
|
||||
|
||||
Once the library is created, it is connected to our executable target with
|
||||
:command:`target_include_directories` and :command:`target_link_libraries`.
|
||||
|
||||
Goal
|
||||
----
|
||||
|
||||
Add and use a library.
|
||||
|
||||
Helpful Resources
|
||||
-----------------
|
||||
|
||||
* :command:`add_library`
|
||||
* :command:`add_subdirectory`
|
||||
* :command:`target_include_directories`
|
||||
* :command:`target_link_libraries`
|
||||
* :variable:`PROJECT_SOURCE_DIR`
|
||||
|
||||
Files to Edit
|
||||
-------------
|
||||
|
||||
* ``CMakeLists.txt``
|
||||
* ``tutorial.cxx``
|
||||
* ``MathFunctions/CMakeLists.txt``
|
||||
|
||||
Getting Started
|
||||
---------------
|
||||
|
||||
In this exercise, we will add a library to our project that contains our own
|
||||
implementation for computing the square root of a number. The executable can
|
||||
then use this library instead of the standard square root function provided by
|
||||
the compiler.
|
||||
|
||||
For this tutorial we will put the library into a subdirectory
|
||||
called ``MathFunctions``. This directory already contains a header file,
|
||||
``MathFunctions.h``, and a source file ``mysqrt.cxx``. The source file has one
|
||||
function called ``mysqrt`` that provides similar functionality to the
|
||||
compiler's ``sqrt`` function.
|
||||
For this tutorial we will put the library into a subdirectory called
|
||||
``MathFunctions``. This directory already contains a header file,
|
||||
``MathFunctions.h``, and a source file ``mysqrt.cxx``. We will not need to
|
||||
modify either of these files. The source file has one function called
|
||||
``mysqrt`` that provides similar functionality to the compiler's ``sqrt``
|
||||
function.
|
||||
|
||||
Add the following one line ``CMakeLists.txt`` file to the ``MathFunctions``
|
||||
directory:
|
||||
From the ``Help/guide/tutorial/Step2`` directory, start with ``TODO 1`` and
|
||||
complete through ``TODO 6``.
|
||||
|
||||
.. literalinclude:: Step3/MathFunctions/CMakeLists.txt
|
||||
:caption: MathFunctions/CMakeLists.txt
|
||||
:name: MathFunctions/CMakeLists.txt
|
||||
:language: cmake
|
||||
First, fill in the one line ``CMakeLists.txt`` in the ``MathFunctions``
|
||||
subdirectory.
|
||||
|
||||
To make use of the new library we will add an :command:`add_subdirectory`
|
||||
call in the top-level ``CMakeLists.txt`` file so that the library will get
|
||||
built. We add the new library to the executable, and add ``MathFunctions`` as
|
||||
an include directory so that the ``MathFunctions.h`` header file can be found.
|
||||
The last few lines of the top-level ``CMakeLists.txt`` file should now look
|
||||
like:
|
||||
Next, edit the top level ``CMakeLists.txt``.
|
||||
|
||||
.. code-block:: cmake
|
||||
:caption: CMakeLists.txt
|
||||
:name: CMakeLists.txt-add_subdirectory
|
||||
Finally, use the newly created ``MathFunctions`` library in ``tutorial.cxx``
|
||||
|
||||
# add the MathFunctions library
|
||||
add_subdirectory(MathFunctions)
|
||||
|
||||
# add the executable
|
||||
add_executable(Tutorial tutorial.cxx)
|
||||
|
||||
target_link_libraries(Tutorial PUBLIC MathFunctions)
|
||||
|
||||
# add the binary tree to the search path for include files
|
||||
# so that we will find TutorialConfig.h
|
||||
target_include_directories(Tutorial PUBLIC
|
||||
"${PROJECT_BINARY_DIR}"
|
||||
"${PROJECT_SOURCE_DIR}/MathFunctions"
|
||||
)
|
||||
|
||||
Now let us make the ``MathFunctions`` library optional. While for the tutorial
|
||||
there really isn't any need to do so, for larger projects this is a common
|
||||
occurrence. The first step is to add an option to the top-level
|
||||
``CMakeLists.txt`` file.
|
||||
|
||||
.. literalinclude:: Step3/CMakeLists.txt
|
||||
:caption: CMakeLists.txt
|
||||
:name: CMakeLists.txt-option
|
||||
:language: cmake
|
||||
:start-after: # should we use our own math functions
|
||||
:end-before: # add the MathFunctions library
|
||||
|
||||
This option will be displayed in the :manual:`cmake-gui <cmake-gui(1)>` and
|
||||
:manual:`ccmake <ccmake(1)>`
|
||||
with a default value of ``ON`` that can be changed by the user. This setting
|
||||
will be stored in the cache so that the user does not need to set the value
|
||||
each time they run CMake on a build directory.
|
||||
|
||||
The next change is to make building and linking the ``MathFunctions`` library
|
||||
conditional. To do this, we will create an ``if`` statement which checks the
|
||||
value of the option. Inside the ``if`` block, put the
|
||||
:command:`add_subdirectory` command from above with some additional list
|
||||
commands to store information needed to link to the library and add the
|
||||
subdirectory as an include directory in the ``Tutorial`` target.
|
||||
The end of the top-level ``CMakeLists.txt`` file will now look like the
|
||||
following:
|
||||
|
||||
.. literalinclude:: Step3/CMakeLists.txt
|
||||
:caption: CMakeLists.txt
|
||||
:name: CMakeLists.txt-target_link_libraries-EXTRA_LIBS
|
||||
:language: cmake
|
||||
:start-after: # add the MathFunctions library
|
||||
|
||||
Note the use of the variable ``EXTRA_LIBS`` to collect up any optional
|
||||
libraries to later be linked into the executable. The variable
|
||||
``EXTRA_INCLUDES`` is used similarly for optional header files. This is a
|
||||
classic approach when dealing with many optional components, we will cover
|
||||
the modern approach in the next step.
|
||||
|
||||
The corresponding changes to the source code are fairly straightforward.
|
||||
First, in ``tutorial.cxx``, include the ``MathFunctions.h`` header if we
|
||||
need it:
|
||||
|
||||
.. literalinclude:: Step3/tutorial.cxx
|
||||
:caption: tutorial.cxx
|
||||
:name: tutorial.cxx-ifdef-include
|
||||
:language: c++
|
||||
:start-after: // should we include the MathFunctions header
|
||||
:end-before: int main
|
||||
|
||||
Then, in the same file, make ``USE_MYMATH`` control which square root
|
||||
function is used:
|
||||
|
||||
.. literalinclude:: Step3/tutorial.cxx
|
||||
:caption: tutorial.cxx
|
||||
:name: tutorial.cxx-ifdef-const
|
||||
:language: c++
|
||||
:start-after: // which square root function should we use?
|
||||
:end-before: std::cout << "The square root of
|
||||
|
||||
Since the source code now requires ``USE_MYMATH`` we can add it to
|
||||
``TutorialConfig.h.in`` with the following line:
|
||||
|
||||
.. literalinclude:: Step3/TutorialConfig.h.in
|
||||
:caption: TutorialConfig.h.in
|
||||
:name: TutorialConfig.h.in-cmakedefine
|
||||
:language: c++
|
||||
:lines: 4
|
||||
|
||||
**Exercise**: Why is it important that we configure ``TutorialConfig.h.in``
|
||||
after the option for ``USE_MYMATH``? What would happen if we inverted the two?
|
||||
Build and Run
|
||||
-------------
|
||||
|
||||
Run the :manual:`cmake <cmake(1)>` executable or the
|
||||
:manual:`cmake-gui <cmake-gui(1)>` to configure the project and then build it
|
||||
with your chosen build tool. Then run the built Tutorial executable.
|
||||
with your chosen build tool.
|
||||
|
||||
Now let's update the value of ``USE_MYMATH``. The easiest way is to use the
|
||||
:manual:`cmake-gui <cmake-gui(1)>` or :manual:`ccmake <ccmake(1)>` if you're
|
||||
in the terminal. Or, alternatively, if you want to change the option from the
|
||||
command-line, try:
|
||||
Below is a refresher of what that looks like from the command line:
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
mkdir Step2_build
|
||||
cd Step2_build
|
||||
cmake ../Step2
|
||||
cmake --build .
|
||||
|
||||
Try to use the newly built ``Tutorial`` and ensure that it is still
|
||||
producing accurate square root values.
|
||||
|
||||
Solution
|
||||
--------
|
||||
|
||||
In the ``CMakeLists.txt`` file in the ``MathFunctions`` directory, we create
|
||||
a library target called ``MathFunctions`` with :command:`add_library`. The
|
||||
source file for the library is passed as an argument to
|
||||
:command:`add_library`. This looks like the following line:
|
||||
|
||||
.. raw:: html
|
||||
|
||||
<details><summary>TODO 1: Click to show/hide answer</summary>
|
||||
|
||||
.. literalinclude:: Step3/MathFunctions/CMakeLists.txt
|
||||
:caption: TODO 1: MathFunctions/CMakeLists.txt
|
||||
:name: MathFunctions/CMakeLists.txt-add_library
|
||||
:language: cmake
|
||||
:end-before: # TODO 1
|
||||
|
||||
.. raw:: html
|
||||
|
||||
</details>
|
||||
|
||||
To make use of the new library we will add an :command:`add_subdirectory`
|
||||
call in the top-level ``CMakeLists.txt`` file so that the library will get
|
||||
built.
|
||||
|
||||
.. raw:: html
|
||||
|
||||
<details><summary>TODO 2: Click to show/hide answer</summary>
|
||||
|
||||
.. code-block:: cmake
|
||||
:caption: TODO 2: CMakeLists.txt
|
||||
:name: CMakeLists.txt-add_subdirectory
|
||||
|
||||
add_subdirectory(MathFunctions)
|
||||
|
||||
.. raw:: html
|
||||
|
||||
</details>
|
||||
|
||||
Next, the new library target is linked to the executable target using
|
||||
:command:`target_link_libraries`.
|
||||
|
||||
.. raw:: html
|
||||
|
||||
<details><summary>TODO 3: Click to show/hide answer</summary>
|
||||
|
||||
.. code-block:: cmake
|
||||
:caption: TODO 3: CMakeLists.txt
|
||||
:name: CMakeLists.txt-target_link_libraries
|
||||
|
||||
target_link_libraries(Tutorial PUBLIC MathFunctions)
|
||||
|
||||
.. raw:: html
|
||||
|
||||
</details>
|
||||
|
||||
Finally we need to specify the library's header file location. Modify
|
||||
:command:`target_include_directories` to add the ``MathFunctions`` subdirectory
|
||||
as an include directory so that the ``MathFunctions.h`` header file can be
|
||||
found.
|
||||
|
||||
.. raw:: html
|
||||
|
||||
<details><summary>TODO 4: Click to show/hide answer</summary>
|
||||
|
||||
.. code-block:: cmake
|
||||
:caption: TODO 4: CMakeLists.txt
|
||||
:name: CMakeLists.txt-target_include_directories-step2
|
||||
|
||||
target_include_directories(Tutorial PUBLIC
|
||||
"${PROJECT_BINARY_DIR}"
|
||||
"${PROJECT_SOURCE_DIR}/MathFunctions"
|
||||
)
|
||||
|
||||
.. raw:: html
|
||||
|
||||
</details>
|
||||
|
||||
Now let's use our library. In ``tutorial.cxx``, include ``MathFunctions.h``:
|
||||
|
||||
.. raw:: html
|
||||
|
||||
<details><summary>TODO 5: Click to show/hide answer</summary>
|
||||
|
||||
.. code-block:: c++
|
||||
:caption: TODO 5 : tutorial.cxx
|
||||
:name: tutorial.cxx-include_MathFunctions.h
|
||||
|
||||
#include "MathFunctions.h"
|
||||
|
||||
.. raw:: html
|
||||
|
||||
</details>
|
||||
|
||||
Lastly, replace ``sqrt`` with our library function ``mysqrt``.
|
||||
|
||||
.. raw:: html
|
||||
|
||||
<details><summary>TODO 6: Click to show/hide answer</summary>
|
||||
|
||||
.. code-block:: c++
|
||||
:caption: TODO 6 : tutorial.cxx
|
||||
:name: tutorial.cxx-call_mysqrt
|
||||
|
||||
const double outputValue = mysqrt(inputValue);
|
||||
|
||||
.. raw:: html
|
||||
|
||||
</details>
|
||||
|
||||
Exercise 2 - Making Our Library Optional
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
Now let us make the MathFunctions library optional. While for the tutorial
|
||||
there really isn't any need to do so, for larger projects this is a common
|
||||
occurrence.
|
||||
|
||||
CMake can do this using the :command:`option` command. This gives users a
|
||||
variable which they can change when configuring their cmake build. This
|
||||
setting will be stored in the cache so that the user does not need to set
|
||||
the value each time they run CMake on a build directory.
|
||||
|
||||
Goal
|
||||
----
|
||||
|
||||
Add the option to build without ``MathFunctions``.
|
||||
|
||||
|
||||
Helpful Resources
|
||||
-----------------
|
||||
|
||||
* :command:`if`
|
||||
* :command:`list`
|
||||
* :command:`option`
|
||||
* :command:`cmakedefine <configure_file>`
|
||||
|
||||
Files to Edit
|
||||
-------------
|
||||
|
||||
* ``CMakeLists.txt``
|
||||
* ``tutorial.cxx``
|
||||
* ``TutorialConfig.h.in``
|
||||
|
||||
Getting Started
|
||||
---------------
|
||||
|
||||
Start with the resulting files from Exercise 1. Complete ``TODO 7`` through
|
||||
``TODO 13``.
|
||||
|
||||
First create a variable ``USE_MYMATH`` using the :command:`option` command
|
||||
in the top-level ``CMakeLists.txt`` file. In that same file, use that option
|
||||
to determine whether to build and use the ``MathFunctions`` library.
|
||||
|
||||
Then, update ``tutorial.cxx`` and ``TutorialConfig.h.in`` to use
|
||||
``USE_MYMATH``.
|
||||
|
||||
Build and Run
|
||||
-------------
|
||||
|
||||
Since we have our build directory already configured from Exercise 1, we can
|
||||
rebuild by simply calling the following:
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
cd ../Step2_build
|
||||
cmake --build .
|
||||
|
||||
Next, run the ``Tutorial`` executable on a few numbers to verify that it's
|
||||
still correct.
|
||||
|
||||
Now let's update the value of ``USE_MYMATH`` to ``OFF``. The easiest way is to
|
||||
use the :manual:`cmake-gui <cmake-gui(1)>` or :manual:`ccmake <ccmake(1)>`
|
||||
if you're in the terminal. Or, alternatively, if you want to change the
|
||||
option from the command-line, try:
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
cmake ../Step2 -DUSE_MYMATH=OFF
|
||||
|
||||
Rebuild and run the tutorial again.
|
||||
Now, rebuild the code with the following:
|
||||
|
||||
Which function gives better results, ``sqrt`` or ``mysqrt``?
|
||||
.. code-block:: console
|
||||
|
||||
cmake --build .
|
||||
|
||||
Then, run the executable again to ensure that it still works with
|
||||
``USE_MYMATH`` set to ``OFF``. Which function gives better results, ``sqrt``
|
||||
or ``mysqrt``?
|
||||
|
||||
Solution
|
||||
--------
|
||||
|
||||
The first step is to add an option to the top-level ``CMakeLists.txt`` file.
|
||||
This option will be displayed in the :manual:`cmake-gui <cmake-gui(1)>` and
|
||||
:manual:`ccmake <ccmake(1)>` with a default value of ``ON`` that can be
|
||||
changed by the user.
|
||||
|
||||
.. raw:: html
|
||||
|
||||
<details><summary>TODO 7: Click to show/hide answer</summary>
|
||||
|
||||
.. literalinclude:: Step3/CMakeLists.txt
|
||||
:caption: TODO 7: CMakeLists.txt
|
||||
:name: CMakeLists.txt-option
|
||||
:language: cmake
|
||||
:start-after: # should we use our own math functions
|
||||
:end-before: # configure a header file to pass some of the CMake settings
|
||||
|
||||
.. raw:: html
|
||||
|
||||
</details>
|
||||
|
||||
Next, make building and linking the ``MathFunctions`` library
|
||||
conditional.
|
||||
|
||||
Start by creating a :command:`list` of the optional library targets for our
|
||||
project. At the moment, it is just ``MathFunctions``. Let's name our list
|
||||
``EXTRA_LIBS``.
|
||||
|
||||
Similarly, we need to make a :command:`list` for the optional includes which
|
||||
we will call ``EXTRA_INCLUDES``. In this list, we will ``APPEND`` the path of
|
||||
the header file needed for our library.
|
||||
|
||||
Next, create an :command:`if` statement which checks the value of
|
||||
``USE_MYMATH``. Inside the :command:`if` block, put the
|
||||
:command:`add_subdirectory` command from Exercise 1 with the additional
|
||||
:command:`list` commands.
|
||||
|
||||
When ``USE_MYMATH`` is ``ON``, the lists will be generated and will be added to
|
||||
our project. When ``USE_MYMATH`` is ``OFF``, the lists stay empty. With this
|
||||
strategy, we allow users to toggle ``USE_MYMATH`` to manipulate what library is
|
||||
used in the build.
|
||||
|
||||
The top-level CMakeLists.txt file will now look like the following:
|
||||
|
||||
.. raw:: html
|
||||
|
||||
<details><summary>TODO 8: Click to show/hide answer</summary>
|
||||
|
||||
.. literalinclude:: Step3/CMakeLists.txt
|
||||
:caption: TODO 8: CMakeLists.txt
|
||||
:name: CMakeLists.txt-USE_MYMATH
|
||||
:language: cmake
|
||||
:start-after: # add the MathFunctions library
|
||||
:end-before: # add the executable
|
||||
|
||||
.. raw:: html
|
||||
|
||||
</details>
|
||||
|
||||
Now that we have these two lists, we need to update
|
||||
:command:`target_link_libraries` and :command:`target_include_directories` to
|
||||
use them. Changing them is fairly straightforward.
|
||||
|
||||
For :command:`target_link_libraries`, we replace the written out
|
||||
library names with ``EXTRA_LIBS``. This looks like the following:
|
||||
|
||||
.. raw:: html
|
||||
|
||||
<details><summary>TODO 9: Click to show/hide answer</summary>
|
||||
|
||||
.. literalinclude:: Step3/CMakeLists.txt
|
||||
:caption: TODO 9: CMakeLists.txt
|
||||
:name: CMakeLists.txt-target_link_libraries-EXTRA_LIBS
|
||||
:language: cmake
|
||||
:start-after: add_executable(Tutorial tutorial.cxx)
|
||||
:end-before: # TODO 3
|
||||
|
||||
.. raw:: html
|
||||
|
||||
</details>
|
||||
|
||||
Then, we do the same thing with :command:`target_include_directories` and
|
||||
``EXTRA_INCLUDES``.
|
||||
|
||||
.. raw:: html
|
||||
|
||||
<details><summary>TODO 10: Click to show/hide answer</summary>
|
||||
|
||||
.. literalinclude:: Step3/CMakeLists.txt
|
||||
:caption: TODO 10 : CMakeLists.txt
|
||||
:name: CMakeLists.txt-target_link_libraries-EXTRA_INCLUDES
|
||||
:language: cmake
|
||||
:start-after: # so that we will find TutorialConfig.h
|
||||
|
||||
.. raw:: html
|
||||
|
||||
</details>
|
||||
|
||||
Note that this is a classic approach when dealing with many components. We
|
||||
will cover the modern approach in the Step 3 of the tutorial.
|
||||
|
||||
The corresponding changes to the source code are fairly straightforward.
|
||||
First, in ``tutorial.cxx``, we include the ``MathFunctions.h`` header if
|
||||
``USE_MYMATH`` is defined.
|
||||
|
||||
.. raw:: html
|
||||
|
||||
<details><summary>TODO 11: Click to show/hide answer</summary>
|
||||
|
||||
.. literalinclude:: Step3/tutorial.cxx
|
||||
:caption: TODO 11 : tutorial.cxx
|
||||
:name: tutorial.cxx-ifdef-include
|
||||
:language: c++
|
||||
:start-after: // should we include the MathFunctions header
|
||||
:end-before: int main
|
||||
|
||||
.. raw:: html
|
||||
|
||||
</details>
|
||||
|
||||
Then, in the same file, we make ``USE_MYMATH`` control which square root
|
||||
function is used:
|
||||
|
||||
.. raw:: html
|
||||
|
||||
<details><summary>TODO 12: Click to show/hide answer</summary>
|
||||
|
||||
.. literalinclude:: Step3/tutorial.cxx
|
||||
:caption: TODO 12 : tutorial.cxx
|
||||
:name: tutorial.cxx-ifdef-const
|
||||
:language: c++
|
||||
:start-after: // which square root function should we use?
|
||||
:end-before: std::cout << "The square root of
|
||||
|
||||
.. raw:: html
|
||||
|
||||
</details>
|
||||
|
||||
Since the source code now requires ``USE_MYMATH`` we can add it to
|
||||
``TutorialConfig.h.in`` with the following line:
|
||||
|
||||
.. raw:: html
|
||||
|
||||
<details><summary>TODO 13: Click to show/hide answer</summary>
|
||||
|
||||
.. literalinclude:: Step3/TutorialConfig.h.in
|
||||
:caption: TODO 13 : TutorialConfig.h.in
|
||||
:name: TutorialConfig.h.in-cmakedefine
|
||||
:language: c++
|
||||
:lines: 4
|
||||
|
||||
.. raw:: html
|
||||
|
||||
</details>
|
||||
|
||||
With these changes, our library is now completely optional to whoever is
|
||||
building and using it.
|
||||
|
||||
Bonus Question
|
||||
--------------
|
||||
|
||||
Why is it important that we configure ``TutorialConfig.h.in``
|
||||
after the option for ``USE_MYMATH``? What would happen if we inverted the two?
|
||||
|
||||
Answer
|
||||
------
|
||||
|
||||
.. raw:: html
|
||||
|
||||
<details><summary>Click to show/hide answer</summary>
|
||||
|
||||
We configure after because ``TutorialConfig.h.in`` uses the value of
|
||||
``USE_MYMATH``. If we configure the file before
|
||||
calling :command:`option`, we won't be using the expected value of
|
||||
``USE_MYMATH``.
|
||||
|
||||
.. raw:: html
|
||||
|
||||
</details>
|
||||
|
@ -41,7 +41,7 @@ add_subdirectory(MathFunctions)
|
||||
add_executable(Tutorial tutorial.cxx)
|
||||
set_target_properties(Tutorial PROPERTIES DEBUG_POSTFIX ${CMAKE_DEBUG_POSTFIX})
|
||||
|
||||
target_link_libraries(Tutorial PUBLIC MathFunctions)
|
||||
target_link_libraries(Tutorial PUBLIC MathFunctions tutorial_compiler_flags)
|
||||
|
||||
# add the binary tree to the search path for include files
|
||||
# so that we will find TutorialConfig.h
|
||||
@ -84,6 +84,7 @@ do_test(Tutorial 25 "25 is 5")
|
||||
do_test(Tutorial -25 "-25 is (-nan|nan|0)")
|
||||
do_test(Tutorial 0.0001 "0.0001 is 0.01")
|
||||
|
||||
# setup installer
|
||||
include(InstallRequiredSystemLibraries)
|
||||
set(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_CURRENT_SOURCE_DIR}/License.txt")
|
||||
set(CPACK_PACKAGE_VERSION_MAJOR "${Tutorial_VERSION_MAJOR}")
|
||||
|
@ -1,2 +1,2 @@
|
||||
This is the open source License.txt file introduced in
|
||||
CMake/Tutorial/Step7...
|
||||
CMake/Tutorial/Step9...
|
||||
|
@ -56,7 +56,7 @@ target_compile_definitions(MathFunctions PRIVATE "EXPORTING_MYMATH")
|
||||
set_property(TARGET MathFunctions PROPERTY VERSION "1.0.0")
|
||||
set_property(TARGET MathFunctions PROPERTY SOVERSION "1")
|
||||
|
||||
# install rules
|
||||
# install libs
|
||||
set(installable_libs MathFunctions tutorial_compiler_flags)
|
||||
if(TARGET SqrtLibrary)
|
||||
list(APPEND installable_libs SqrtLibrary)
|
||||
@ -64,4 +64,5 @@ endif()
|
||||
install(TARGETS ${installable_libs}
|
||||
EXPORT MathFunctionsTargets
|
||||
DESTINATION lib)
|
||||
# install include headers
|
||||
install(FILES MathFunctions.h DESTINATION include)
|
||||
|
@ -1,95 +1,311 @@
|
||||
Step 4: Installing and Testing
|
||||
Step 5: Installing and Testing
|
||||
==============================
|
||||
|
||||
Now we can start adding install rules and testing support to our project.
|
||||
.. _`Tutorial Testing Support`:
|
||||
|
||||
Install Rules
|
||||
Exercise 1 - Install Rules
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
Often, it is not enough to only build an executable, it should also be
|
||||
installable. With CMake, we can specify install rules using the
|
||||
:command:`install` command. Supporting local installations for your builds in
|
||||
CMake is often as simple as specifying an install location and the targets and
|
||||
files to be installed.
|
||||
|
||||
Goal
|
||||
----
|
||||
|
||||
Install the ``Tutorial`` executable and the ``MathFunctions`` library.
|
||||
|
||||
Helpful Materials
|
||||
-----------------
|
||||
|
||||
* :command:`install`
|
||||
|
||||
Files to Edit
|
||||
-------------
|
||||
|
||||
The install rules are fairly simple: for ``MathFunctions`` we want to install
|
||||
the library and header file and for the application we want to install the
|
||||
executable and configured header.
|
||||
* ``MathFunctions/CMakeLists.txt``
|
||||
* ``CMakeLists.txt``
|
||||
|
||||
So to the end of ``MathFunctions/CMakeLists.txt`` we add:
|
||||
Getting Started
|
||||
---------------
|
||||
|
||||
.. literalinclude:: Step5/MathFunctions/CMakeLists.txt
|
||||
:caption: MathFunctions/CMakeLists.txt
|
||||
:name: MathFunctions/CMakeLists.txt-install-TARGETS
|
||||
:language: cmake
|
||||
:start-after: # install rules
|
||||
The starting code is provided in the ``Step5`` directory. In this
|
||||
exercise, complete ``TODO 1`` through ``TODO 4``.
|
||||
|
||||
And to the end of the top-level ``CMakeLists.txt`` we add:
|
||||
First, update ``MathFunctions/CMakeLists.txt`` to install the
|
||||
``MathFunctions`` and ``tutorial_compiler_flags`` libraries to the ``lib``
|
||||
directory. In that same file, specify the install rules needed to install
|
||||
``MathFunctions.h`` to the ``include`` directory.
|
||||
|
||||
.. literalinclude:: Step5/CMakeLists.txt
|
||||
:caption: CMakeLists.txt
|
||||
:name: CMakeLists.txt-install-TARGETS
|
||||
:language: cmake
|
||||
:start-after: # add the install targets
|
||||
:end-before: # enable testing
|
||||
Then, update the top level ``CMakeLists.txt`` to install
|
||||
the ``Tutorial`` executable to the ``bin`` directory. Lastly, any header files
|
||||
should be installed to the ``include`` directory. Remember that
|
||||
``TutorialConfig.h`` is in the :variable:`PROJECT_BINARY_DIR`.
|
||||
|
||||
That is all that is needed to create a basic local install of the tutorial.
|
||||
Build and Run
|
||||
-------------
|
||||
|
||||
Now run the :manual:`cmake <cmake(1)>` executable or the
|
||||
Make a new directory called ``Step5_build``. Run the
|
||||
:manual:`cmake <cmake(1)>` executable or the
|
||||
:manual:`cmake-gui <cmake-gui(1)>` to configure the project and then build it
|
||||
with your chosen build tool.
|
||||
|
||||
Then run the install step by using the ``install`` option of the
|
||||
:manual:`cmake <cmake(1)>` command (introduced in 3.15, older versions of
|
||||
CMake must use ``make install``) from the command line. For
|
||||
multi-configuration tools, don't forget to use the ``--config`` argument to
|
||||
specify the configuration. If using an IDE, simply build the ``INSTALL``
|
||||
target. This step will install the appropriate header files, libraries, and
|
||||
executables. For example:
|
||||
Then, run the install step by using the :option:`--install <cmake --install>`
|
||||
option of the :manual:`cmake <cmake(1)>` command (introduced in 3.15, older
|
||||
versions of CMake must use ``make install``) from the command line. This step
|
||||
will install the appropriate header files, libraries, and executables.
|
||||
For example:
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
cmake --install .
|
||||
|
||||
For multi-configuration tools, don't forget to use the
|
||||
:option:`--config <cmake--build --config>` argument to specify the configuration.
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
cmake --install . --config Release
|
||||
|
||||
If using an IDE, simply build the ``INSTALL`` target. You can build the same
|
||||
install target from the command line like the following:
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
cmake --build . --target install --config Debug
|
||||
|
||||
The CMake variable :variable:`CMAKE_INSTALL_PREFIX` is used to determine the
|
||||
root of where the files will be installed. If using the ``cmake --install``
|
||||
command, the installation prefix can be overridden via the ``--prefix``
|
||||
argument. For example:
|
||||
root of where the files will be installed. If using the :option:`cmake --install`
|
||||
command, the installation prefix can be overridden via the
|
||||
:option:`--prefix <cmake--install --prefix>` argument. For example:
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
cmake --install . --prefix "/home/myuser/installdir"
|
||||
|
||||
Navigate to the install directory and verify that the installed Tutorial runs.
|
||||
Navigate to the install directory and verify that the installed ``Tutorial``
|
||||
runs.
|
||||
|
||||
.. _`Tutorial Testing Support`:
|
||||
Solution
|
||||
--------
|
||||
|
||||
Testing Support
|
||||
The install rules for our project are fairly simple:
|
||||
|
||||
* For ``MathFunctions``, we want to install the libraries and header file to
|
||||
the ``lib`` and ``include`` directories respectively.
|
||||
|
||||
* For the ``Tutorial`` executable, we want to install the executable and
|
||||
configured header file to the ``bin`` and ``include`` directories
|
||||
respectively.
|
||||
|
||||
So to the end of ``MathFunctions/CMakeLists.txt`` we add:
|
||||
|
||||
.. raw:: html
|
||||
|
||||
<details><summary>TODO 1: Click to show/hide answer</summary>
|
||||
|
||||
.. literalinclude:: Step6/MathFunctions/CMakeLists.txt
|
||||
:caption: TODO 1: MathFunctions/CMakeLists.txt
|
||||
:name: MathFunctions/CMakeLists.txt-install-TARGETS
|
||||
:language: cmake
|
||||
:start-after: # install libs
|
||||
:end-before: # install include headers
|
||||
|
||||
.. raw:: html
|
||||
|
||||
</details>
|
||||
|
||||
and
|
||||
|
||||
.. raw:: html
|
||||
|
||||
<details><summary>TODO 2: Click to show/hide answer</summary>
|
||||
|
||||
.. literalinclude:: Step6/MathFunctions/CMakeLists.txt
|
||||
:caption: TODO 2: MathFunctions/CMakeLists.txt
|
||||
:name: MathFunctions/CMakeLists.txt-install-headers
|
||||
:language: cmake
|
||||
:start-after: # install include headers
|
||||
|
||||
.. raw:: html
|
||||
|
||||
</details>
|
||||
|
||||
The install rules for the ``Tutorial`` executable and configured header file
|
||||
are similar. To the end of the top-level ``CMakeLists.txt`` we add:
|
||||
|
||||
.. raw:: html
|
||||
|
||||
<details><summary>TODO 3,4: Click to show/hide answer</summary>
|
||||
|
||||
.. literalinclude:: Step6/CMakeLists.txt
|
||||
:caption: CMakeLists.txt
|
||||
:name: TODO 3,4: CMakeLists.txt-install-TARGETS
|
||||
:language: cmake
|
||||
:start-after: # add the install targets
|
||||
:end-before: # enable testing
|
||||
|
||||
.. raw:: html
|
||||
|
||||
</details>
|
||||
|
||||
That is all that is needed to create a basic local
|
||||
install of the tutorial.
|
||||
|
||||
Exercise 2 - Testing Support
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
CTest offers a way to easily manage tests for your project. Tests can be
|
||||
added through the :command:`add_test` command. Although it is not
|
||||
explicitly covered in this tutorial, there is a lot of compatibility
|
||||
between CTest and other testing frameworks such as :module:`GoogleTest`.
|
||||
|
||||
Goal
|
||||
----
|
||||
|
||||
Create unit tests for our executable using CTest.
|
||||
|
||||
Helpful Materials
|
||||
-----------------
|
||||
|
||||
* :command:`enable_testing`
|
||||
* :command:`add_test`
|
||||
* :command:`function`
|
||||
* :command:`set_tests_properties`
|
||||
* :manual:`ctest <ctest(1)>`
|
||||
|
||||
Files to Edit
|
||||
-------------
|
||||
|
||||
* ``CMakeLists.txt``
|
||||
|
||||
Getting Started
|
||||
---------------
|
||||
|
||||
Next let's test our application. At the end of the top-level ``CMakeLists.txt``
|
||||
file we can enable testing and then add a number of basic tests to verify that
|
||||
the application is working correctly.
|
||||
The starting source code is provided in the ``Step5`` directory. In this
|
||||
exercise, complete ``TODO 5`` through ``TODO 9``.
|
||||
|
||||
.. literalinclude:: Step5/CMakeLists.txt
|
||||
:caption: CMakeLists.txt
|
||||
First, we need to enable testing. Next, begin adding tests to our project
|
||||
using :command:`add_test`. We will work through adding 3 simple tests and
|
||||
then you can add additional testing as you see fit.
|
||||
|
||||
Build and Run
|
||||
-------------
|
||||
|
||||
Navigate to the build directory and rebuild the application. Then, run the
|
||||
``ctest`` executable: :option:`ctest -N` and :option:`ctest -VV`. For
|
||||
multi-config generators (e.g. Visual Studio), the configuration type must be
|
||||
specified with the :option:`-C \<mode\> <ctest -C>` flag. For example, to run tests in Debug
|
||||
mode use ``ctest -C Debug -VV`` from the build directory
|
||||
(not the Debug subdirectory!). Release mode would be executed from the same
|
||||
location but with a ``-C Release``. Alternatively, build the ``RUN_TESTS``
|
||||
target from the IDE.
|
||||
|
||||
Solution
|
||||
--------
|
||||
|
||||
Let's test our application. At the end of the top-level ``CMakeLists.txt``
|
||||
file we first need to enable testing with the
|
||||
:command:`enable_testing` command.
|
||||
|
||||
.. raw:: html
|
||||
|
||||
<details><summary>TODO 5: Click to show/hide answer</summary>
|
||||
|
||||
.. literalinclude:: Step6/CMakeLists.txt
|
||||
:caption: TODO 5: CMakeLists.txt
|
||||
:name: CMakeLists.txt-enable_testing
|
||||
:language: cmake
|
||||
:start-after: # enable testing
|
||||
:end-before: # does the application run
|
||||
|
||||
The first test simply verifies that the application runs, does not segfault or
|
||||
otherwise crash, and has a zero return value. This is the basic form of a
|
||||
CTest test.
|
||||
.. raw:: html
|
||||
|
||||
The next test makes use of the :prop_test:`PASS_REGULAR_EXPRESSION` test
|
||||
property to verify that the output of the test contains certain strings. In
|
||||
this case, verifying that the usage message is printed when an incorrect number
|
||||
of arguments are provided.
|
||||
</details>
|
||||
|
||||
Lastly, we have a function called ``do_test`` that runs the application and
|
||||
verifies that the computed square root is correct for given input. For each
|
||||
invocation of ``do_test``, another test is added to the project with a name,
|
||||
input, and expected results based on the passed arguments.
|
||||
With testing enabled, we will add a number of basic tests to verify
|
||||
that the application is working correctly. First, we create a test using
|
||||
:command:`add_test` which runs the ``Tutorial`` executable with the
|
||||
parameter 25 passed in. For this test, we are not going to check the
|
||||
executable's computed answer. This test will verify that
|
||||
application runs, does not segfault or otherwise crash, and has a zero
|
||||
return value. This is the basic form of a CTest test.
|
||||
|
||||
Rebuild the application and then cd to the binary directory and run the
|
||||
:manual:`ctest <ctest(1)>` executable: ``ctest -N`` and ``ctest -VV``. For
|
||||
multi-config generators (e.g. Visual Studio), the configuration type must be
|
||||
specified with the ``-C <mode>`` flag. For example, to run tests in Debug
|
||||
mode use ``ctest -C Debug -VV`` from the binary directory
|
||||
(not the Debug subdirectory!). Release mode would be executed from the same
|
||||
location but with a ``-C Release``. Alternatively, build the ``RUN_TESTS``
|
||||
target from the IDE.
|
||||
.. raw:: html
|
||||
|
||||
<details><summary>TODO 6: Click to show/hide answer</summary>
|
||||
|
||||
.. literalinclude:: Step6/CMakeLists.txt
|
||||
:caption: TODO 6: CMakeLists.txt
|
||||
:name: CMakeLists.txt-test-runs
|
||||
:language: cmake
|
||||
:start-after: # does the application run
|
||||
:end-before: # does the usage message work
|
||||
|
||||
.. raw:: html
|
||||
|
||||
</details>
|
||||
|
||||
Next, let's use the :prop_test:`PASS_REGULAR_EXPRESSION` test property to
|
||||
verify that the output of the test contains certain strings. In this case,
|
||||
verifying that the usage message is printed when an incorrect number of
|
||||
arguments are provided.
|
||||
|
||||
.. raw:: html
|
||||
|
||||
<details><summary>TODO 7: Click to show/hide answer</summary>
|
||||
|
||||
.. literalinclude:: Step6/CMakeLists.txt
|
||||
:caption: TODO 7: CMakeLists.txt
|
||||
:name: CMakeLists.txt-test-usage
|
||||
:language: cmake
|
||||
:start-after: # does the usage message work?
|
||||
:end-before: # define a function to simplify adding tests
|
||||
|
||||
.. raw:: html
|
||||
|
||||
</details>
|
||||
|
||||
The next test we will add verifies the computed value is truly the
|
||||
square root.
|
||||
|
||||
.. raw:: html
|
||||
|
||||
<details><summary>TODO 8: Click to show/hide answer</summary>
|
||||
|
||||
.. code-block:: cmake
|
||||
:caption: TODO 8: CMakeLists.txt
|
||||
:name: CMakeLists.txt-test-standard
|
||||
|
||||
add_test(NAME StandardUse COMMAND Tutorial 4)
|
||||
set_tests_properties(StandardUse
|
||||
PROPERTIES PASS_REGULAR_EXPRESSION "4 is 2"
|
||||
)
|
||||
|
||||
.. raw:: html
|
||||
|
||||
</details>
|
||||
|
||||
This one test is not enough to give us confidence that it will
|
||||
work for all values passed in. We should add more tests to verify this.
|
||||
To easily add more tests, we make a function called ``do_test`` that runs the
|
||||
application and verifies that the computed square root is correct for
|
||||
given input. For each invocation of ``do_test``, another test is added to
|
||||
the project with a name, input, and expected results based on the passed
|
||||
arguments.
|
||||
|
||||
.. raw:: html
|
||||
|
||||
<details><summary>TODO 9: Click to show/hide answer</summary>
|
||||
|
||||
.. literalinclude:: Step6/CMakeLists.txt
|
||||
:caption: TODO 9: CMakeLists.txt
|
||||
:name: CMakeLists.txt-generalized-tests
|
||||
:language: cmake
|
||||
:start-after: # define a function to simplify adding tests
|
||||
|
||||
.. raw:: html
|
||||
|
||||
</details>
|
||||
|
@ -10,8 +10,8 @@ possible, however, to setup CPack to bundle multiple build directories and
|
||||
construct a package that contains multiple configurations of the same project.
|
||||
|
||||
First, we want to ensure that the debug and release builds use different names
|
||||
for the executables and libraries that will be installed. Let's use `d` as the
|
||||
postfix for the debug executable and libraries.
|
||||
for the libraries that will be installed. Let's use `d` as the
|
||||
postfix for the debug libraries.
|
||||
|
||||
Set :variable:`CMAKE_DEBUG_POSTFIX` near the beginning of the top-level
|
||||
``CMakeLists.txt`` file:
|
||||
@ -41,10 +41,10 @@ Let's also add version numbering to the ``MathFunctions`` library. In
|
||||
:name: MathFunctions/CMakeLists.txt-VERSION-properties
|
||||
:language: cmake
|
||||
:start-after: # setup the version numbering
|
||||
:end-before: # install rules
|
||||
:end-before: # install libs
|
||||
|
||||
From the ``Step12`` directory, create ``debug`` and ``release``
|
||||
subbdirectories. The layout will look like:
|
||||
subdirectories. The layout will look like:
|
||||
|
||||
.. code-block:: none
|
||||
|
||||
|
@ -1,4 +1,4 @@
|
||||
Step 7: Packaging an Installer
|
||||
Step 9: Packaging an Installer
|
||||
==============================
|
||||
|
||||
Next suppose that we want to distribute our project to other people so that
|
||||
@ -11,7 +11,7 @@ installations and package management features. To accomplish this we will use
|
||||
CPack to create platform specific installers. Specifically we need to add a
|
||||
few lines to the bottom of our top-level ``CMakeLists.txt`` file.
|
||||
|
||||
.. literalinclude:: Step8/CMakeLists.txt
|
||||
.. literalinclude:: Step10/CMakeLists.txt
|
||||
:caption: CMakeLists.txt
|
||||
:name: CMakeLists.txt-include-CPack
|
||||
:language: cmake
|
||||
@ -38,15 +38,15 @@ binary directory run:
|
||||
|
||||
cpack
|
||||
|
||||
To specify the generator, use the ``-G`` option. For multi-config builds, use
|
||||
``-C`` to specify the configuration. For example:
|
||||
To specify the generator, use the :option:`-G <cpack -G>` option. For multi-config builds,
|
||||
use :option:`-C <cpack -C>` to specify the configuration. For example:
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
cpack -G ZIP -C Debug
|
||||
|
||||
For a list of available generators, see :manual:`cpack-generators(7)` or call
|
||||
``cpack --help``. An :cpack_gen:`archive generator <CPack Archive Generator>`
|
||||
:option:`cpack --help`. An :cpack_gen:`archive generator <CPack Archive Generator>`
|
||||
like ZIP creates a compressed archive of all *installed* files.
|
||||
|
||||
To create an archive of the *full* source tree you would type:
|
||||
|
@ -1,5 +1,5 @@
|
||||
Step 9: Selecting Static or Shared Libraries
|
||||
============================================
|
||||
Step 10: Selecting Static or Shared Libraries
|
||||
=============================================
|
||||
|
||||
In this section we will show how the :variable:`BUILD_SHARED_LIBS` variable can
|
||||
be used to control the default behavior of :command:`add_library`,
|
||||
@ -19,7 +19,7 @@ library.
|
||||
The first step is to update the starting section of the top-level
|
||||
``CMakeLists.txt`` to look like:
|
||||
|
||||
.. literalinclude:: Step10/CMakeLists.txt
|
||||
.. literalinclude:: Step11/CMakeLists.txt
|
||||
:caption: CMakeLists.txt
|
||||
:name: CMakeLists.txt-option-BUILD_SHARED_LIBS
|
||||
:language: cmake
|
||||
@ -33,7 +33,7 @@ explicitly require that SqrtLibrary is built statically.
|
||||
|
||||
The end result is that ``MathFunctions/CMakeLists.txt`` should look like:
|
||||
|
||||
.. literalinclude:: Step10/MathFunctions/CMakeLists.txt
|
||||
.. literalinclude:: Step11/MathFunctions/CMakeLists.txt
|
||||
:caption: MathFunctions/CMakeLists.txt
|
||||
:name: MathFunctions/CMakeLists.txt-add_library-STATIC
|
||||
:language: cmake
|
||||
@ -42,7 +42,7 @@ The end result is that ``MathFunctions/CMakeLists.txt`` should look like:
|
||||
Next, update ``MathFunctions/mysqrt.cxx`` to use the ``mathfunctions`` and
|
||||
``detail`` namespaces:
|
||||
|
||||
.. literalinclude:: Step10/MathFunctions/mysqrt.cxx
|
||||
.. literalinclude:: Step11/MathFunctions/mysqrt.cxx
|
||||
:caption: MathFunctions/mysqrt.cxx
|
||||
:name: MathFunctions/mysqrt.cxx-namespace
|
||||
:language: c++
|
||||
@ -56,7 +56,7 @@ uses ``USE_MYMATH``:
|
||||
|
||||
Finally, update ``MathFunctions/MathFunctions.h`` to use dll export defines:
|
||||
|
||||
.. literalinclude:: Step10/MathFunctions/MathFunctions.h
|
||||
.. literalinclude:: Step11/MathFunctions/MathFunctions.h
|
||||
:caption: MathFunctions/MathFunctions.h
|
||||
:name: MathFunctions/MathFunctions.h
|
||||
:language: c++
|
||||
@ -67,7 +67,7 @@ library that has position independent code. The solution to this is to
|
||||
explicitly set the :prop_tgt:`POSITION_INDEPENDENT_CODE` target property of
|
||||
SqrtLibrary to be ``True`` no matter the build type.
|
||||
|
||||
.. literalinclude:: Step10/MathFunctions/CMakeLists.txt
|
||||
.. literalinclude:: Step11/MathFunctions/CMakeLists.txt
|
||||
:caption: MathFunctions/CMakeLists.txt
|
||||
:name: MathFunctions/CMakeLists.txt-POSITION_INDEPENDENT_CODE
|
||||
:language: cmake
|
||||
|
16
Help/guide/tutorial/Step1/CMakeLists.txt
Normal file
16
Help/guide/tutorial/Step1/CMakeLists.txt
Normal file
@ -0,0 +1,16 @@
|
||||
# TODO 1: Set the minimum required version of CMake to be 3.10
|
||||
|
||||
# TODO 2: Create a project named Tutorial
|
||||
|
||||
# TODO 7: Set the project version number as 1.0 in the above project command
|
||||
|
||||
# TODO 6: Set the variable CMAKE_CXX_STANDARD to 11
|
||||
# and the variable CMAKE_CXX_STANDARD_REQUIRED to True
|
||||
|
||||
# TODO 8: Use configure_file to configure and copy TutorialConfig.h.in to
|
||||
# TutorialConfig.h
|
||||
|
||||
# TODO 3: Add an executable called Tutorial to the project
|
||||
# Hint: Be sure to specify the source file as tutorial.cxx
|
||||
|
||||
# TODO 9: Use target_include_directories to include ${PROJECT_BINARY_DIR}
|
2
Help/guide/tutorial/Step1/TutorialConfig.h.in
Normal file
2
Help/guide/tutorial/Step1/TutorialConfig.h.in
Normal file
@ -0,0 +1,2 @@
|
||||
// the configured options and settings for Tutorial
|
||||
// TODO 10: Define Tutorial_VERSION_MAJOR and Tutorial_VERSION_MINOR
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user