# INTERFACE_INCLUDE_DIRECTORIES

List of public include directories requirements for a library.

Targets may populate this property to publish the include directories required to compile against the headers for the target. The `target_include_directories()` command populates this property with values given to the `PUBLIC` and `INTERFACE` keywords. Projects may also get and set the property directly.

When target dependencies are specified using `target_link_libraries()`, CMake will read this property from all target dependencies to determine the build properties of the consumer.

Contents of `INTERFACE_INCLUDE_DIRECTORIES` may use "generator expressions" with the syntax `$<...>`. See the `cmake-generator-expressions(7)` manual for available expressions. See the `cmake-buildsystem(7)` -manual for more on defining buildsystem properties.

Include directories usage requirements commonly differ between the build-tree and the install-tree. The `BUILD_INTERFACE` and `INSTALL_INTERFACE` generator expressions can be used to describe separate usage requirements based on the usage location. Relative paths are allowed within the `INSTALL_INTERFACE` expression and are interpreted relative to the installation prefix. For example:

    target_include_directories(mylib INTERFACE
      $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include/mylib>
      $<INSTALL_INTERFACE:include/mylib>  # <prefix>/include/mylib
    )

## Creating Relocatable Packages

Note that it is not advisable to populate the `INSTALL_INTERFACE` of the `INTERFACE_INCLUDE_DIRECTORIES` of a target with absolute paths to the include directories of dependencies. That would hard-code into installed packages the include directory paths for dependencies as found on the machine the package was made on.

The `INSTALL_INTERFACE` of the `INTERFACE_INCLUDE_DIRECTORIES` is only suitable for specifying the required include directories for headers provided with the target itself, not those provided by the transitive dependencies listed in its `INTERFACE_LINK_LIBRARIES` target property. Those dependencies should themselves be targets that specify their own header locations in `INTERFACE_INCLUDE_DIRECTORIES`.

See the Creating Relocatable Packages section of the `cmake-packages(7)` manual for discussion of additional care that must be taken when specifying usage requirements while creating packages for redistribution.