# 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 a Project (`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 older of the running CMake version and the version specified by `<max>`. 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 prefixes specified by the `<PackageName>_ROOT` CMake variable and the `<PackageName>_ROOT` 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.

### 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.

- The `FindMatlab` module now supports the Matlab Runtime Compiler (MCR) for compiling and linking matlab extensions.

- 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.

- A `CPack NuGet Generator` was was added with basic support for NuGet.

### 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.