# CMake 3.4 Release Notes

Changes made since CMake 3.3 include the following.

## New Features

### Generators

- The `Visual Studio 14 2015` generator learned to select a Windows 10 SDK based on the value of the `CMAKE_SYSTEM_VERSION` variable and the SDKs available on the host.

- CMake learned rudimentary support for the Apple Swift language. When using the `Xcode` generator with Xcode 6.1 or higher, one may enable the `Swift` language with the `enable_language()` command or the `project()` command (this is an error with other generators or when Xcode is too old). Then one may list `.swift` source files in targets for compilation.

### Commands

- The `find_program()` command learned a `NAMES_PER_DIR` option to consider all given `NAMES` in each directory before moving on to the next directory.

- The `get_filename_component()` command learned a new `BASE_DIR` subcommand. This is used to specify a base directory when calculating an absolute path from a relative path.

- The `if()` command learned a new `TEST` operator that evaluates to true if a given test name has been defined by the `add_test()` command. See policy `CMP0064`.

- The `install(DIRECTORY)` command `DESTINATION` option learned to support `generator expressions`.

- The `install(FILES)` command `DESTINATION` option learned to support `generator expressions`.

- The `string()` command learned a new `APPEND` subcommand.

### Variables

- The Makefile Generators and the `Ninja` generator learned to add compiler launcher tools like distcc and ccache along with the compiler for `C` and `CXX` languages. See the `CMAKE_<LANG>_COMPILER_LAUNCHER` variable and `<LANG>_COMPILER_LAUNCHER` target property for details.

- New `CMAKE_LINK_SEARCH_START_STATIC` and `CMAKE_LINK_SEARCH_END_STATIC` variables were introduced to initialize the `LINK_SEARCH_START_STATIC` and `LINK_SEARCH_END_STATIC` target properties, respectively.

### Properties

- Visual Studio Generators learned to support additional target properties to customize projects for NVIDIA Nsight Tegra Visual Studio Edition:

  - `ANDROID_ANT_ADDITIONAL_OPTIONS`

  - `ANDROID_ARCH`

  - `ANDROID_ASSETS_DIRECTORIES`

  - `ANDROID_JAR_DEPENDENCIES`

  - `ANDROID_JAR_DIRECTORIES`

  - `ANDROID_JAVA_SOURCE_DIR`

  - `ANDROID_NATIVE_LIB_DEPENDENCIES`

  - `ANDROID_NATIVE_LIB_DIRECTORIES`

  - `ANDROID_PROCESS_MAX`

  - `ANDROID_PROGUARD`

  - `ANDROID_PROGUARD_CONFIG_PATH`

  - `ANDROID_SECURE_PROPS_PATH`

  - `ANDROID_SKIP_ANT_STEP`

  - `ANDROID_STL_TYPE`

- The `ARCHIVE_OUTPUT_DIRECTORY`, `LIBRARY_OUTPUT_DIRECTORY`, and `RUNTIME_OUTPUT_DIRECTORY` target properties learned to support `generator expressions`.

- The `SOURCE_DIR` and `BINARY_DIR` target properties were introduced to allow project code to query where a target is defined.

- The `OUTPUT_NAME` target property and its variants learned to support `generator expressions`.

- A `TARGET_MESSAGES` global property was added to tell the Makefile Generators whether to generate commands to print output after each target is completed.

- On Windows with MS-compatible tools, CMake learned to optionally generate a module definition (`.def`) file for `SHARED` libraries. See the `WINDOWS_EXPORT_ALL_SYMBOLS` target property.

### Modules

- The `ExternalProject` module `ExternalProject_Add()` function `GIT_SUBMODULES` option now also limits the set of submodules that are initialized in addition to the prior behavior of limiting the set of submodules that are updated.

- The `ExternalProject` module learned new `USES_TERMINAL` arguments for giving steps exclusive terminal access. This is useful with the `Ninja` generator to monitor CMake superbuild progress and prevent CPU oversubscription.

- The `FindBISON` module `bison_target()` command learned a new `DEFINES_FILE` option to specify a custom output header to be generated.

- The `FindHDF5` module learend a new `HDF5_PREFER_PARALLEL` option allowing users to specify that a parallel HDF5 tool is preferred if both are available.

- The `FindIce` module now provides imported targets.

- The `FindJava` module learned to optionally find the `idlj` and `jarsigner` tools.

- The `FindOpenSSL` module now provides imported targets.

- The `FindOpenSSL` module learned a new `OPENSSL_USE_STATIC_LIBS` option to search only for static libraries.

- The `FindPkgConfig` learned a new `pkg_get_variable()` command which may be used to query for arbitrary variables from a package (such as for related tools or data and plugin install paths).

- The `FindProtobuf` module gained a new `protobuf_generate_python()` command to generate Python sources from `.proto` files.

- The `FindTIFF` module learned to search separately for debug and release variants.

- The `FindwxWidgets` module learned to support version requests.

- The `FindXercesC` module learned to search separately for debug and release variants.

- The `FindZLIB` module learned to search separately for debug and release variants.

- The `GNUInstallDirs` module learned special default values for certain installation prefixes according to the GNU Coding Standards and the Filesystem Hierarchy Standard.

- The `UseJava` module `add_jar` function learned to support response files (e.g. `@srcs.txt`) for source specification.

- The `UseJava` module `install_jar` function learned new `DESTINATION` and `COMPONENT` options to specify the corresponding `install()` command options.

- The `UseJava` module gained a new `create_javah` function to create C headers from Java classes.

### Generator Expressions

- A new `$<SHELL_PATH:...>` `generator expression` has been added.

### CTest

- CTest learned to optionally measure the CPU load during parallel testing and avoid starting tests that may cause the load to exceed a given threshold. See the `ctest(1)` command `--test-load` option, the `TestLoad` setting of the CTest Test Step, the `CTEST_TEST_LOAD` variable, and the `TEST_LOAD` option of the `ctest_test()` command.

- `ctest(1)` learned options `--test-output-size-passed` and `--test-output-size-failed` to customize the limit on test output size submitted when running as a Dashboard Client.

### CPack

- The `CPack DEB Generator` learned to set package dependencies per component. See variables:

  - `CPACK_DEBIAN_<COMPONENT>_PACKAGE_BREAKS`

  - `CPACK_DEBIAN_<COMPONENT>_PACKAGE_CONFLICTS`

  - `CPACK_DEBIAN_<COMPONENT>_PACKAGE_ENHANCES`

  - `CPACK_DEBIAN_<COMPONENT>_PACKAGE_PREDEPENDS`

  - `CPACK_DEBIAN_<COMPONENT>_PACKAGE_PROVIDES`

  - `CPACK_DEBIAN_<COMPONENT>_PACKAGE_RECOMMENDS`

  - `CPACK_DEBIAN_<COMPONENT>_PACKAGE_REPLACES`

  - `CPACK_DEBIAN_<COMPONENT>_PACKAGE_SUGGESTS`

- The `CPack` module learned to package empty directories.

- The `CPack` module gained a new setting, `CPACK_VERBATIM_VARIABLES`, which can be used to ensure the cpack program receives the settings' values exactly as they were set, even if they contain CMake-special characters. For compatibility, it's off by default.

### Other

- The `Compile Features` functionality is now aware of features supported by GNU C compilers on Windows.

- CMake learned to honor `*.manifest` source files with MSVC tools. Manifest files named as sources of `.exe` and `.dll` targets will be merged with linker-generated manifests and embedded in the binary.

- The Concurrent Fortran 77 compiler is now supported. Its `compiler id` is `CCur`.

- `cmake(1)` gained a new `--trace-expand` command line option that is like `--trace` but expands variable references in the output.

## Deprecated and Removed Features

- The `CMakeExpandImportedTargets` module is now documented as deprecated. See module documentation for an explanation.

- The `CMAKE_USE_RELATIVE_PATHS` variable no longer has any effect. Previously it was partially implemented and unreliable.

## Other Changes

- The `CheckFunctionExists`, `CheckLibraryExists`, `CheckSymbolExists`, and `FindThreads` modules learned to work in environments where only CXX is enabled.

- The `CPack DEB Generator` now correctly excludes symlinks during package checksum calculation.

- The `CPack DEB Generator` no longer uses fakeroot and system tar program for packaging.

- The `CPack` module no longer mangles settings with CMake-special characters when they're used as defaults for other settings. The macro `cpack_set_if_not_set`, which was responsible for this, is now deprecated.

- CMake no longer links executables with flags to export symbols unless the `ENABLE_EXPORTS` target property is set. See policy `CMP0065`.

- The `SONAME` field is no longer set for `MODULE` libraries created with the `add_library()` command. `MODULE` libraries are meant for explicit dynamic loading at runtime. They cannot be linked so `SONAME` is not useful.

- The internal `CMAKE_<LANG>_COMPILE_OBJECT` rule variable now substitutes compiler include flags in a separate `<INCLUDES>` placeholder instead of the main `<FLAGS>` placeholder.