CMake 3.12.0-rc1 is ready for testing
June 14, 2018
I am proud to announce the first CMake 3.12 release candidate.
https://cmake.org/download/
Documentation is available at:
https://cmake.org/cmake/help/v3.12
Release notes appear below and are also published at
https://cmake.org/cmake/help/v3.12/release/3.12.html
Some of the more significant changes in CMake 3.12 are:
- The “target_link_libraries()” command now supports Object
Libraries. Linking to an object library uses its object files in
direct dependents and also propagates usage requirements. - The “target_link_libraries()” command may now be called to modify
targets created outside the current directory. - The “file(GLOB)” and “file(GLOB_RECURSE)” commands learned a new
flag “CONFIGURE_DEPENDS” which enables expression of build system
dependency on globbed directory’s contents. - The “Compile Features” functionality is now aware of C++ 20. No
specific features are yet enumerated besides the “cxx_std_20” meta-
feature. - The Visual Studio Generators for VS 2017 learned to support a
“version=14.##” option in the “CMAKE_GENERATOR_TOOLSET” value (e.g.
via the “cmake(1)” “-T” option) to specify a toolset version number. - The “cmake(1)” Build Tool Mode (“cmake –build”) gained “–
parallel [<jobs>]” and “-j [<jobs>]” options to specify a parallel
build level. They map to corresponding options of the native build
tool. - The “add_compile_definitions()” command was added to set
preprocessor definitions at directory level. This supersedes
“add_definitions()”. - The “cmake_minimum_required()” and “cmake_policy(VERSION)”
commands now accept a version range using the form
“<min>[…<max>]”. The “<min>” version is required but policies are
set based on the “<max>” version. This allows projects to specify a
range of versions for which they have been updated and avoid
explicit policy settings. - The “find_package()” command now searches a prefix specified by a
“PackageName_ROOT” CMake or environment variable. Package roots are
maintained as a stack so nested calls to all “find_*” commands
inside find modules also search the roots as prefixes. See policy
“CMP0074”. - A new “$<GENEX_EVAL:…>” and “$<TARGET_GENEX_EVAL:target,…>”
“generator expression” has been added to enable consumption of
generator expressions whose evaluation results itself in generator
expressions. - A new “$<TARGET_EXISTS:…>” “generator expression” has been
added. - A new “$<TARGET_NAME_IF_EXISTS:…>” “generator expression” has
been added. - The “FindCURL” module now provides imported targets.
- The “FindJPEG” module now provides imported targets.
- A “FindODBC” module was added to find an Open Database
Connectivity (ODBC) library. - New “FindPython3” and “FindPython2” modules, as well as a new
“FindPython” module, have been added to provide a new way to locate
python environments.
CMake 3.12 Release Notes ************************ Changes made since CMake 3.11 include the following. New Features ============ Generators ---------- * The Visual Studio Generators for VS 2017 learned to support a "version=14.##" option in the "CMAKE_GENERATOR_TOOLSET" value (e.g. via the "cmake(1)" "-T" option) to specify a toolset version number. Command-Line ------------ * The "cmake(1)" Build Tool Mode ("cmake --build") gained "-- parallel [<jobs>]" and "-j [<jobs>]" options to specify a parallel build level. They map to corresponding options of the native build tool. Commands -------- * The "add_compile_definitions()" command was added to set preprocessor definitions at directory level. This supersedes "add_definitions()". * The "cmake_minimum_required()" and "cmake_policy(VERSION)" commands now accept a version range using the form "<min>[...<max>]". The "<min>" version is required but policies are set based on the "<max>" version. This allows projects to specify a range of versions for which they have been updated and avoid explicit policy settings. * The "file(GLOB)" and "file(GLOB_RECURSE)" commands learned a new flag "CONFIGURE_DEPENDS" which enables expression of build system dependency on globbed directory's contents. * The "file(TOUCH)" and "file(TOUCH_NOCREATE)" commands were added to expose "TOUCH" functionality without having to use CMake's command- line tool mode with "execute_process()". * The "find_package()" command now searches a prefix specified by a "PackageName_ROOT" CMake or environment variable. Package roots are maintained as a stack so nested calls to all "find_*" commands inside find modules also search the roots as prefixes. See policy "CMP0074". * The "install()" command learned an optional "NAMELINK_COMPONENT" parameter, which allows you to change the component for a shared library's namelink. If none is specified, the value of "COMPONENT" is used by default. * The "list()" command learned a "JOIN" sub-command to concatenate list's elements separated by a glue string. * The "list()" command learned a "SUBLIST" sub-command to get a sublist of the list. * The "list()" command learned a "TRANSFORM" sub-command to apply various string transformation to list's elements. * The "project()" command learned an optional "HOMEPAGE_URL" parameter which has the effect of setting variables like "PROJECT_HOMEPAGE_URL", "<PROJECT-NAME>_HOMEPAGE_URL" and "CMAKE_PROJECT_HOMEPAGE_URL". * The "string()" command learned a "JOIN" sub-command to concatenate input strings separated by a glue string. * "target_compile_options()" and "add_compile_options()" commands gained a "SHELL:" prefix to specify a group of related options using shell-like quoting. * The "target_link_libraries()" command now supports Object Libraries. Linking to an object library uses its object files in direct dependents and also propagates usage requirements. * The "target_link_libraries()" command may now be called to modify targets created outside the current directory. Variables --------- * The "CMAKE_FOLDER" variable was added to initialize the "FOLDER" property on all targets. * The "CMAKE_DOTNET_TARGET_FRAMEWORK_VERSION" variable was defined to initialize all "DOTNET_TARGET_FRAMEWORK_VERSION" target properties. * "CMAKE_PROJECT_VERSION*" variables have been introduced: * "CMAKE_PROJECT_VERSION" * "CMAKE_PROJECT_VERSION_MAJOR" * "CMAKE_PROJECT_VERSION_MINOR" * "CMAKE_PROJECT_VERSION_PATCH" * "CMAKE_PROJECT_VERSION_TWEAK" * The "CMAKE_SUPPRESS_REGENERATION" variable was extended to support the "Ninja" and Makefile Generators. It is also now documented. * "CMAKE_VS_SDK_*_DIRECTORIES" variables were defined to tell Visual Studio Generators for VS 2010 and above how to populate fields in ".vcxproj" files that specify SDK directories. The variables are: * "CMAKE_VS_SDK_EXCLUDE_DIRECTORIES" * "CMAKE_VS_SDK_EXECUTABLE_DIRECTORIES" * "CMAKE_VS_SDK_INCLUDE_DIRECTORIES" * "CMAKE_VS_SDK_LIBRARY_DIRECTORIES" * "CMAKE_VS_SDK_LIBRARY_WINRT_DIRECTORIES" * "CMAKE_VS_SDK_REFERENCE_DIRECTORIES" * "CMAKE_VS_SDK_SOURCE_DIRECTORIES" * A "MSVC_TOOLSET_VERSION" variable was added to provide the MSVC toolset version associated with the current MSVC compiler version in "MSVC_VERSION". Properties ---------- * The "COMMON_LANGUAGE_RUNTIME" target property was introduced to configure the use of managed C++ for Visual Studio Generators for VS 2010 and above. A corresponding "IMPORTED_COMMON_LANGUAGE_RUNTIME" target property was added to support "C++/CLI" for imported targets. * The "DOTNET_TARGET_FRAMEWORK_VERSION" target property was introduced as replacement for "VS_DOTNET_TARGET_FRAMEWORK_VERSION", which is considered deprecated now. * An "EXPORT_PROPERTIES" target property was added to specify a custom list of target properties to include in targets exported by the "install(EXPORT)" and "export()" commands. * The "PDB_OUTPUT_DIRECTORY" property learned to support "generator expressions". * A "TESTS" directory property was added to hold the list of tests defined by the "add_test()" command. * A "VS_DEBUGGER_COMMAND" target property was created to set the debugging command line with Visual Studio Generators for VS 2010 and above. * HLSL source file properties "VS_SHADER_DISABLE_OPTIMIZATIONS" and "VS_SHADER_ENABLE_DEBUG" gained support for generator expressions. * HLSL source file property "VS_SHADER_OBJECT_FILE_NAME" has been added to the Visual Studio Generators for VS 2010 and above. The property specifies the file name of the compiled shader object. Modules ------- * The "FindALSA" module now provides imported targets. * The "FindCURL" module now provides imported targets. * The "FindJPEG" module now provides imported targets. * The "FindLibXml2" module now provides imported targets. * A "FindODBC" module was added to find an Open Database Connectivity (ODBC) library. * The "FindPkgConfig" module has learned to export the found libraries with full path for direct consumption with the "target_link_libraries()" command. * New "FindPython3" and "FindPython2" modules, as well as a new "FindPython" module, have been added to provide a new way to locate python environments. * The "UseSWIG" module gained a whole refresh and is now more consistent with standard CMake commands to generate libraries and is fully configurable through properties. * The "UseSWIG" module learned to manage multiple behaviors through "UseSWIG_MODULE_VERSION" variable to ensure legacy support as well as more robust handling of "SWIG" advanced features (like "%template"). * The "UseSWIG" module learned to support CSHARP variant wrapper files. * The "WriteCompilerDetectionHeader" module gained a "BARE_FEATURES" option to add a compatibility define for the exact keyword of a new language feature. Generator Expressions --------------------- * A new "$<GENEX_EVAL:...>" and "$<TARGET_GENEX_EVAL:target,...>" "generator expression" has been added to enable consumption of generator expressions whose evaluation results itself in generator expressions. * A new "$<IN_LIST:...>" "generator expression" has been added. * A new "$<TARGET_EXISTS:...>" "generator expression" has been added. * A new "$<TARGET_NAME_IF_EXISTS:...>" "generator expression" has been added. CTest ----- * The "ctest_start()" command has been reworked so that you can simply call "ctest_start(APPEND)" and it will read all the needed information from the TAG file. The argument parsing has also been relaxed so that the order of the arguments is less significant. * A "PROCESSOR_AFFINITY" test property was added to request that CTest run a test with CPU affinity for a set of processors disjoint from other concurrently running tests with the property set. CPack ----- * The "CPack" module now uses variables "CMAKE_PROJECT_VERSION_MAJOR", "CMAKE_PROJECT_VERSION_MINOR" and "CMAKE_PROJECT_VERSION_PATCH" to initialize corresponding CPack variables. * "cpack(1)" gained basic support for NuGet. See the "CPackNuGet" module. Other ----- * The "Compile Features" functionality is now aware of C++ 20. No specific features are yet enumerated besides the "cxx_std_20" meta- feature. * The "Compile Features" functionality is now aware of the availability of C features in MSVC since VS 2010. * The "Compile Features" functionality is now aware of C language standards supported by Texas Instruments C compilers. Deprecated and Removed Features =============================== * The "Visual Studio 8 2005" generator has been removed. * CMake no longer produces "<tgt>_LIB_DEPENDS" cache entries for library targets. See policy "CMP0073". Other Changes ============= * Include flags for directories marked as "SYSTEM" are now moved after non-system directories. The "-isystem" flag does this automatically, so moving them explicitly to the end makes the behavior consistent on compilers that do not have any "-isystem" flag. * Fortran dependency scanning now supports dependencies implied by Fortran Submodules. * The existence and functionality of the file "${CMAKE_BINARY_DIR}/cmake_install.cmake" has now been documented in the "install()" documentation so that external packaging software can take advantage of CPack-style component installs. * The "CheckIncludeFile" module "check_include_file" macro learned to honor the "CMAKE_REQUIRED_LIBRARIES" variable. See policy "CMP0075". * The "CheckIncludeFileCXX" module "check_include_file_cxx" macro learned to honor the "CMAKE_REQUIRED_LIBRARIES" variable. See policy "CMP0075". * The "CheckIncludeFiles" module "check_include_files" macro learned to honor the "CMAKE_REQUIRED_LIBRARIES" variable. See policy "CMP0075". * The "cmake(1)" "-E copy_directory" tool now fails when the source directory does not exist. Previously it succeeded by creating an empty destination directory. * The "UseSWIG" module "swig_add_library()" command (and legacy "swig_add_module" command) now set the prefix of Java modules to """" for MINGW, MSYS, and CYGWIN environments.
I’m super excited about this update to come out of RC and use it everywhere. This is an awesome update. target_link_libraries with object libraries is going to clean up a lot of my code.
Using parallel feature for “–build” is going to make my life easier for doing multi-platform testing with my Jenkins pipeline.
Great job you guys!