CMake 3.11 Release Notes — CMake 4.3.1 Documentation

# CMake 3.11 Release Notes

Changes made since CMake 3.10 include the following.

## New Features

### Platforms

- TI C/C++ compilers are now supported by the `Ninja` generator.

### Generators

- The `CodeBlocks` extra generator learned to check a `CMAKE_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 the `Fortran` language (`C`, `CXX`, and `CUDA` were supported previously). See the `CMAKE_<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-wide `COMPILE_DEFINITIONS`, `INCLUDE_DIRECTORIES`, `COMPILE_OPTIONS`, and `file(GENERATE)`. See generator expression documentation for caveats.

- The `Xcode` generator learned to support the `COMPILE_LANGUAGE` `generator expression` in target-wide `COMPILE_DEFINITIONS` and `INCLUDE_DIRECTORIES`. It previously supported only `COMPILE_OPTIONS` and `file(GENERATE)`. See generator expression documentation for caveats.

### Commands

- `add_library()` and `add_executable()` commands can now be called without any sources and will not complain as long as sources are added later via the `target_sources()` command.

- The `file(DOWNLOAD)` and `file(UPLOAD)` commands gained `NETRC` and `NETRC_FILE` options to specify use of a `.netrc` file.

- The `target_compile_definitions()` command learned to set the `INTERFACE_COMPILE_DEFINITIONS` property on Imported Targets.

- The `target_compile_features()` command learned to set the `INTERFACE_COMPILE_FEATURES` property on Imported Targets.

- The `target_compile_options()` command learned to set the `INTERFACE_COMPILE_OPTIONS` property on Imported Targets.

- The `target_include_directories()` command learned to set the `INTERFACE_INCLUDE_DIRECTORIES` property on Imported Targets.

- The `target_sources()` command learned to set the `INTERFACE_SOURCES` property on Imported Targets.

- The `target_link_libraries()` command learned to set the `INTERFACE_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 the `Visual 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 by `install()` and `file(INSTALL)`, e.g. during `make install`.

- A `CMAKE_JOB_POOLS` variable was added specify a value to use for the `JOB_POOLS` property. This enables control over build parallelism with command line configuration parameters when using the Ninja generator.

- The `CMAKE_NETRC` and `CMAKE_NETRC_FILE` variables were added to specify use of a `.netrc` file by the `file(DOWNLOAD)` and `file(UPLOAD)` commands and the `ExternalProject` module.

- A `CMAKE_CUDA_SEPARABLE_COMPILATION` variable was added to initialize the `CUDA_SEPARABLE_COMPILATION` target property on targets when they are created.

### Properties

- The `COMPILE_DEFINITIONS` source file property learned to support `generator 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 the `GLOBAL` option to `add_library()` or `add_executable()`. Additionally, project code may now promote a local imported target to be globally visible by setting this property to `TRUE`.

- An `INCLUDE_DIRECTORIES` source file property was added to specify list of preprocessor include file search directories.

- Source file properties `VS_SHADER_DISABLE_OPTIMIZATIONS` and `VS_SHADER_ENABLE_DEBUG` have been added to specify more details of `.hlsl` sources with Visual Studio Generators.

### Modules

- The `CheckIncludeFiles` module `check_include_files()` command gained a `LANGUAGE` option to specify whether to check using the `C` or `CXX` compiler.

- The `CMakePackageConfigHelpers` module `write_basic_package_version_file()` command learned a new `SameMinorVersion` mode for the `COMPATIBILITY` argument.

- The `ExternalProject` module learned to substitute `<DOWNLOAD_DIR>` in comments, commands, working directory and byproducts.

- The `ExternalProject` module gained `NETRC` and `NETRC_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 by `ExternalProject_Add()`. This allows the content to be used immediately during the configure stage, such as with `add_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` and `FindLAPACK` modules learned to support FLAME `blis` and `libflame`.

- The `FindDoxygen` module `doxygen_add_docs()` command now supports a new `DOXYGEN_VERBATIM_VARS` list variable. Any `DOXYGEN_...` variable contained in that list will bypass the automatic quoting logic, leaving its contents untouched when transferring them to the output `Doxyfile`.

- A `FindIconv` module was added to locate iconv support.

- The `GenerateExportHeader` module `generate_export_header` command gained an `INCLUDE_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` module `add_jar` command gained a `GENERATE_NATIVE_HEADERS` option to generate native header files using `javac -h` for `javac` 1.8 or above. This supersedes `create_javah`, which no longer works with JDK 1.10 and above due to removal of the `javah` tool by JEP 313.

### Autogen

- When using `AUTOMOC` or `AUTOUIC`, CMake now starts multiple parallel `moc` or `uic` processes to reduce the build time. A new `CMAKE_AUTOGEN_PARALLEL` variable and `AUTOGEN_PARALLEL` target property may be set to specify the number of parallel `moc` or `uic` processes to start. The default is derived from the number of CPUs on the host.

### CTest

- The `ctest_start()` command no longer sets `CTEST_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, setting `CTEST_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 new `CPACK_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. See `CPACK_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 the `CMAKE_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 to `add_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 for `INTERFACE` 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` through `CMP0054` (`CMP0036` and below were already deprecated). The `cmake-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 as `test` and `package`, unless the corresponding feature is enabled.

- The `FindOpenGL` module now prefers GLVND libraries if available. See policy `CMP0072`.

- 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 by `CMAKE_OSX_SYSROOT`. For example, if the sysroot variable specifies an iOS SDK then the value in `CMAKE_OSX_DEPLOYMENT_TARGET` is interpreted as minimum iOS version.

- The `Xcode` generator behavior of generating one project file per `project()` command may now be controlled with the `CMAKE_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 the `ZERO_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` module `check_include_file()` command, `CheckIncludeFileCXX` module `check_include_file_cxx()` command, and `CheckIncludeFiles` module `check_include_files()` command were taught to honor the `CMAKE_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` module `qt4_wrap_cpp`, `qt4_wrap_ui` and `qt4_add_resources` macros now set `SKIP_AUTOMOC` and `SKIP_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 policy `CMP0071`.

### 3.11.3

- CMake 3.11.0 introduced support for resolving symbolic links on Windows in code paths that typically do so on UNIX. This has been reverted due to breakage on `subst` drives.