CMake 3.11 Release Notes¶
Contents
Changes made since CMake 3.10 include the following.
New Features¶
Generators¶
- The
CodeBlocks
extra generator learned to check aCMAKE_CODEBLOCKS_COMPILER_ID
variable for a custom compiler identification value to place in the project file. - The Makefile Generators and the
Ninja
generator learned to add compiler launcher tools along with the compiler for theFortran
language (C
,CXX
, andCUDA
were supported previously). See theCMAKE_<LANG>_COMPILER_LAUNCHER
variable and<LANG>_COMPILER_LAUNCHER
target property for details. - Visual Studio Generators learned to support the
COMPILE_LANGUAGE
generator expression
in target-wideCOMPILE_DEFINITIONS
,INCLUDE_DIRECTORIES
,COMPILE_OPTIONS
, andfile(GENERATE)
. See generator expression documentation for caveats. - The
Xcode
generator learned to support theCOMPILE_LANGUAGE
generator expression
in target-wideCOMPILE_DEFINITIONS
andINCLUDE_DIRECTORIES
. It previously supported onlyCOMPILE_OPTIONS
andfile(GENERATE)
. See generator expression documentation for caveats.
Commands¶
add_library()
andadd_executable()
commands can now be called without any sources and will not complain as long as sources are added later via thetarget_sources()
command.- The
file(DOWNLOAD)
andfile(UPLOAD)
commands gainedNETRC
andNETRC_FILE
options to specify use of a.netrc
file. - The
target_compile_definitions()
command learned to set theINTERFACE_COMPILE_DEFINITIONS
property on Imported Targets. - The
target_compile_features()
command learned to set theINTERFACE_COMPILE_FEATURES
property on Imported Targets. - The
target_compile_options()
command learned to set theINTERFACE_COMPILE_OPTIONS
property on Imported Targets. - The
target_include_directories()
command learned to set theINTERFACE_INCLUDE_DIRECTORIES
property on Imported Targets. - The
target_sources()
command learned to set theINTERFACE_SOURCES
property on Imported Targets. - The
target_link_libraries()
command learned to set theINTERFACE_LINK_LIBRARIES
property on Imported Targets.
Variables¶
- A
CMAKE_GENERATOR_INSTANCE
variable was introduced to hold the selected instance of the generator’s corresponding native tools if multiple are available. This is used by theVisual Studio 15 2017
generator to hold the selected instance of Visual Studio persistently. - A
CMAKE_INSTALL_DEFAULT_DIRECTORY_PERMISSIONS
variable was added to enable setting of default permissions for directories created implicitly during installation of files byinstall()
andfile(INSTALL)
, e.g. duringmake install
. - A
CMAKE_JOB_POOLS
variable was added specify a value to use for theJOB_POOLS
property. This enables control over build parallelism with command line configuration parameters when using the Ninja generator. - The
CMAKE_NETRC
andCMAKE_NETRC_FILE
variables were added to specify use of a.netrc
file by thefile(DOWNLOAD)
andfile(UPLOAD)
commands and theExternalProject
module. - A
CMAKE_CUDA_SEPARABLE_COMPILATION
variable was added to initialize theCUDA_SEPARABLE_COMPILATION
target property on targets when they are created.
Properties¶
- The
COMPILE_DEFINITIONS
source file property learned to supportgenerator expressions
. - A
COMPILE_OPTIONS
source file property was added to manage list of options to pass to the compiler. - An
IMPORTED_GLOBAL
target property was added to indicate whether an IMPORTED target is globally visible. It is automatically set to a true value for targets created with theGLOBAL
option toadd_library()
oradd_executable()
. Additionally, project code may now promote a local imported target to be globally visible by setting this property toTRUE
. - An
INCLUDE_DIRECTORIES
source file property was added to specify list of preprocessor include file search directories. - Source file properties
VS_SHADER_DISABLE_OPTIMIZATIONS
andVS_SHADER_ENABLE_DEBUG
have been added to specify more details of.hlsl
sources with Visual Studio Generators.
Modules¶
- The
CheckIncludeFiles
moduleCHECK_INCLUDE_FILES()
command gained aLANGUAGE
option to specify whether to check using theC
orCXX
compiler. - The
CMakePackageConfigHelpers
modulewrite_basic_package_version_file()
command learned a newSameMinorVersion
mode for theCOMPATIBILITY
argument. - The
ExternalProject
module learned to substitute<DOWNLOAD_DIR>
in comments, commands, working directory and byproducts. - The
ExternalProject
module gainedNETRC
andNETRC_FILE
options to specify use of a.netrc
file. - A new
FetchContent
module was added which supports populating content at configure time using any of the download/update methods supported byExternalProject_Add()
. This allows the content to be used immediately during the configure stage, such as withadd_subdirectory()
, etc. Hierarchical project structures are well supported, allowing parent projects to override the content details of child projects and ensuring content is not populated multiple times throughout the whole project tree. - The
FindBLAS
andFindLAPACK
modules learned to support FLAMEblis
andlibflame
. - The
FindDoxygen
moduledoxygen_add_docs()
function now supports a newDOXYGEN_VERBATIM_VARS
list variable. AnyDOXYGEN_...
variable contained in that list will bypass the automatic quoting logic, leaving its contents untouched when transferring them to the outputDoxyfile
. - A
FindIconv
module was added to locate iconv support. - The
GenerateExportHeader
moduleGENERATE_EXPORT_HEADER
command gained anINCLUDE_GUARD_NAME
option to change the name of the include guard symbol written to the generated export header. Additionally, it now adds a comment after the closing#endif
on the generated export header’s include guard. - The
UseJava
moduleadd_jar
command gained aGENERATE_NATIVE_HEADERS
option to generate native header files usingjavac -h
forjavac
1.8 or above. This supersedescreate_javah
, which no longer works with JDK 1.10 and above due to removal of thejavah
tool by JEP 313.
Autogen¶
- When using
AUTOMOC
orAUTOUIC
, CMake now starts multiple parallelmoc
oruic
processes to reduce the build time. A newCMAKE_AUTOGEN_PARALLEL
variable andAUTOGEN_PARALLEL
target property may be set to specify the number of parallelmoc
oruic
processes to start. The default is derived from the number of CPUs on the host.
CTest¶
- The
ctest_start()
command no longer setsCTEST_RUN_CURRENT_SCRIPT
due to issues with scoping if it is called from inside a function. Instead, it sets an internal variable in CTest. However, settingCTEST_RUN_CURRENT_SCRIPT
to 0 at the global scope still prevents the script from being re-run at the end.
CPack¶
cpack(1)
gained--trace
and--trace-expand
options.- The
CPack IFW Generator
gained newCPACK_IFW_PACKAGE_REMOVE_TARGET_DIR
variable to control if the target directory should not be deleted when uninstalling. - The
CPack RPM Generator
learned to enable enforcing of execute privileges on programs and shared libraries. SeeCPACK_RPM_INSTALL_WITH_EXEC
variable. - A
CPACK_INSTALL_DEFAULT_DIRECTORY_PERMISSIONS
variable was added which serves the same purpose during packaging (e.g.make package
) as theCMAKE_INSTALL_DEFAULT_DIRECTORY_PERMISSIONS
variable serves during installation (e.g.make install
).
Other¶
- Alias Targets may now alias Imported Targets that are
created with the
GLOBAL
option toadd_library()
. - Interface Libraries may now have custom properties set on them if
they start with either an underscore (
_
) or a lowercase ASCII character. The original intention was to only allow properties which made sense forINTERFACE
libraries, but it also blocked usage of custom properties. - The
cmake(1)
--open <dir>
command-line option was added to open generated IDE projects like Visual Studio solutions or Xcode projects.
Deprecated and Removed Features¶
- An explicit deprecation diagnostic was added for policies
CMP0037
throughCMP0054
(CMP0036
and below were already deprecated). Thecmake-policies(7)
manual explains that the OLD behaviors of all policies are deprecated and that projects should port to the NEW behaviors. - The
KDevelop3
generator has been removed.
Other Changes¶
- Policy
CMP0037
no longer reserves target names associated with optional features, such astest
andpackage
, unless the corresponding feature is enabled. - The
FindOpenGL
module now prefers GLVND libraries if available. See policyCMP0072
. - The minimum deployment target set in the
CMAKE_OSX_DEPLOYMENT_TARGET
variable used to be only applied for macOS regardless of the selected SDK. It is now properly set for the target platform selected byCMAKE_OSX_SYSROOT
. For example, if the sysroot variable specifies an iOS SDK then the value inCMAKE_OSX_DEPLOYMENT_TARGET
is interpreted as minimum iOS version. - The
Xcode
generator behavior of generating one project file perproject()
command may now be controlled with theCMAKE_XCODE_GENERATE_TOP_LEVEL_PROJECT_ONLY
variable. This could be useful to speed up the CMake generation step for large projects and to work-around a bug in theZERO_CHECK
logic. - Since the
CMakeCache.txt
format does not support newlines in values, values containing newlines are now truncated before writing to the file. In addition, a warning comment is written to the cache file, and a warning message is displayed to the user on the console.
Updates¶
Changes made since CMake 3.11.0 include the following.
3.11.1¶
- The
CheckIncludeFile
modulecheck_include_file
macro,CheckIncludeFileCXX
modulecheck_include_file_cxx
macro, andCheckIncludeFiles
modulecheck_include_files
macro were taught to honor theCMAKE_REQUIRED_LIBRARIES
variable in CMake 3.11.0. This has been reverted due to changing behavior of checks for existing projects. It may be restored in the future with a policy for compatibility.
3.11.2¶
- Calling
add_library()
to create an alias of an imported target that is not globally visible now causes an error again as it did prior to 3.11.0. This diagnostic was accidentally dropped from CMake 3.11.0 and 3.11.1 by the change to allow globally visible imported targets to be aliased. - The
FindQt4
moduleqt4_wrap_cpp
,qt4_wrap_ui
andqt4_add_resources
macros now setSKIP_AUTOMOC
andSKIP_AUTOUIC
on their generated files. These files never need to be processed by moc or uic, and we must say so explicitly to account for policyCMP0071
.