Changes made since CMake 3.0 include the following.
- Generators for Visual Studio 11 (2012) and above learned to generate
projects for Windows Phone and Windows Store. One may set the
CMAKE_SYSTEM_NAME variable to WindowsPhone
or WindowsStore on the cmake(1) command-line
or in a CMAKE_TOOLCHAIN_FILE to activate these platforms.
Also set CMAKE_SYSTEM_VERSION to 8.0 or 8.1 to
specify the version of Windows to be targeted.
- Generators for Visual Studio 10 (2010) and above learned to generate
projects for NVIDIA Nsight Tegra Visual Studio Edition. One may set
the CMAKE_SYSTEM_NAME variable to Android on the
cmake(1) command-line or in a CMAKE_TOOLCHAIN_FILE
to activate this platform.
- The Visual Studio generators for versions 8 (2005) and above
learned to read the target platform name from a new
CMAKE_GENERATOR_PLATFORM variable when it is
not specified as part of the generator name. The platform
name may be specified on the cmake(1) command line
with the -A option, e.g. -G "Visual Studio 12 2013" -A x64.
- The CMAKE_GENERATOR_TOOLSET variable may now be
initialized in a toolchain file specified by the
CMAKE_TOOLCHAIN_FILE variable. This is useful
when cross-compiling with the Xcode or Visual Studio
generators.
- The CMAKE_INSTALL_MESSAGE variable was introduced to
optionally reduce output installation.
- The BundleUtilities module learned to resolve and replace
@rpath placeholders on OS X to correctly bundle applications
using them.
- The CMakePackageConfigHelpers module
configure_package_config_file() command learned a new
INSTALL_PREFIX option to generate package configuration files
meant for a prefix other than CMAKE_INSTALL_PREFIX.
- The CheckFortranSourceCompiles module was added to
provide a CHECK_Fortran_SOURCE_COMPILES macro.
- The ExternalData module learned to tolerate a DATA{}
reference to a missing source file with a warning instead of
rejecting it with an error. This helps developers write new
DATA{} references to test reference outputs that have not
yet been created.
- The ExternalProject module learned to support lzma-compressed
source tarballs with .7z, .tar.xz, and .txz extensions.
- The ExternalProject module ExternalProject_Add command
learned a new BUILD_ALWAYS option to cause the external project
build step to run every time the host project is built.
- The ExternalProject module ExternalProject_Add command
learned a new EXCLUDE_FROM_ALL option to cause the external
project target to have the EXCLUDE_FROM_ALL target
property set.
- The ExternalProject module ExternalProject_Add_Step command
learned a new EXCLUDE_FROM_MAIN option to cause the step to not be
a direct dependency of the main external project target.
- The ExternalProject module ExternalProject_Add command
learned a new DOWNLOAD_NO_PROGRESS option to disable progress
output while downloading the source tarball.
- The FeatureSummary module feature_summary API
learned to accept multiple values for the WHAT option and
combine them appropriately.
- The FindCUDA module learned to support fatbin and cubin
modules.
- The FindGTest module gtest_add_tests macro learned
a new AUTO option to automatically read the SOURCES
target property of the test executable and scan the source files
for tests to be added.
- The FindGLEW module now provides imported targets.
- The FindGLUT module now provides imported targets.
- The FindHg module gained a new Hg_WC_INFO macro to
help run hg to extract information about a Mercurial work copy.
- The FindOpenCL module was introduced.
- The FindOpenMP module learned to support Fortran.
- The FindPkgConfig module learned to use the PKG_CONFIG
environment variable value as the pkg-config executable, if set.
- The FindXercesC module was introduced.
- The FindZLIB module now provides imported targets.
- The GenerateExportHeader module generate_export_header
function learned to allow use with Object Libraries.
- The InstallRequiredSystemLibraries module gained a new
CMAKE_INSTALL_OPENMP_LIBRARIES option to install MSVC OpenMP
runtime libraries.
- The UseSWIG module learned to detect the module name
from .i source files if possible to avoid the need to set
the SWIG_MODULE_NAME source file property explicitly.
- The WriteCompilerDetectionHeader module was added to allow
creation of a portable header file for compiler optional feature detection.
- New COMPILE_FEATURES
generator expression allows
setting build properties based on available compiler features.
- The ctest_coverage() command learned to read variable
CTEST_COVERAGE_EXTRA_FLAGS to set CoverageExtraFlags.
- The ctest_coverage() command learned to support
Intel coverage files with the codecov tool.
- The ctest_memcheck() command learned to support sanitizer
modes, including AddressSanitizer, MemorySanitizer,
ThreadSanitizer, and UndefinedBehaviorSanitizer.
Options may be set using the new
CTEST_MEMORYCHECK_SANITIZER_OPTIONS variable.
- The cmake(1) -E option learned a new env command.
- The cmake(1) -E tar command learned to support
lzma-compressed files.
- Object Libraries may now have extra sources that do not
compile to object files so long as they would not affect linking
of a normal library (e.g. .dat is okay but not .def).
- Visual Studio generators for VS 8 and later learned to support
the ASM_MASM language.
- The Visual Studio generators learned to treat .hlsl source
files as High Level Shading Language sources (using FXCompile
in .vcxproj files). Source file properties
VS_SHADER_TYPE, VS_SHADER_MODEL, and
VS_SHADER_ENTRYPOINT were added added to specify the
shader type, model, and entry point name.
In CMake 3.0 the target_link_libraries() command
accidentally began allowing unquoted arguments to use
generator expressions
containing a (; separated) list within them. For example:
set(libs B C)
target_link_libraries(A PUBLIC $<BUILD_INTERFACE:${libs}>)
This is equivalent to writing:
target_link_libraries(A PUBLIC $<BUILD_INTERFACE:B C>)
and was never intended to work. It did not work in CMake 2.8.12.
Such generator expressions should be in quoted arguments:
set(libs B C)
target_link_libraries(A PUBLIC "$<BUILD_INTERFACE:${libs}>")
CMake 3.1 again requires the quotes for this to work correctly.
Prior to CMake 3.1 the Makefile generators did not escape #
correctly inside make variable assignments used in generated
makefiles, causing them to be treated as comments. This made
code like:
add_compile_options(-Wno-#pragma-messages)
not work in Makefile generators, but work in other generators.
Now it is escaped correctly, making the behavior consistent
across generators. However, some projects may have tried to
workaround the original bug with code like:
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-\\#pragma-messages")
This added the needed escape for Makefile generators but also
caused other generators to pass -Wno-\#pragma-messages to
the shell, which would work only in POSIX shells.
Unfortunately the escaping fix could not be made in a compatible
way so this platform- and generator-specific workaround no
longer works. Project code may test the CMAKE_VERSION
variable value to make the workaround version-specific too.
Callbacks established by the variable_watch() command will no
longer receive the ALLOWED_UNKNOWN_READ_ACCESS access type when
the undocumented CMAKE_ALLOW_UNKNOWN_VARIABLE_READ_ACCESS variable is
set. Uninitialized variable accesses will always be reported as
UNKNOWN_READ_ACCESS.
The CMakeDetermineVSServicePack module now warns that
it is deprecated and should not longer be used. Use the
CMAKE_<LANG>_COMPILER_VERSION variable instead.
The FindITK module has been removed altogether.
It was a thin-wrapper around find_package(ITK ... NO_MODULE).
This produces much clearer error messages when ITK is not found.
The FindVTK module has been removed altogether.
It was a thin-wrapper around find_package(VTK ... NO_MODULE).
This produces much clearer error messages when VTK is not found.
The module also provided compatibility support for finding VTK 4.0.
This capability has been dropped.
- The cmake-gui(1) learned to capture output from child
processes started by the execute_process() command
and display it in the output window.
- The cmake-language(7) internal implementation of generator
expression and list expansion parsers have been optimized and shows
non-trivial speedup on large projects.
- The Makefile generators learned to use response files with GNU tools
on Windows to pass library directories and names to the linker.
- When generating linker command-lines, CMake now avoids repeating
items corresponding to SHARED library targets.
- Support for the Open Watcom compiler has been overhauled.
The CMAKE_<LANG>_COMPILER_ID is now OpenWatcom,
and the CMAKE_<LANG>_COMPILER_VERSION now uses
the Open Watcom external version numbering. The external
version numbers are lower than the internal version number
by 11.
- The cmake-mode.el major Emacs editing mode no longer
treats _ as part of words, making it more consistent
with other major modes.