ECMGenerateHeaders

Generate C/C++ CamelCase forwarding headers.

ecm_generate_headers(<camelcase_forwarding_headers_var>
    HEADER_NAMES <CamelCaseName> [<CamelCaseName> [...]]
    [ORIGINAL <CAMELCASE|LOWERCASE>]
    [HEADER_EXTENSION <header_extension>]
    [OUTPUT_DIR <output_dir>]
    [PREFIX <prefix>]
    [REQUIRED_HEADERS <variable>]
    [COMMON_HEADER <HeaderName>]
    [RELATIVE <relative_path>])

For each CamelCase header name passed to HEADER_NAMES, a file of that name will be generated that will include a version with .h or, if set, .<header_extension> appended. For example, the generated header ClassA will include classa.h (or ClassA.h, see ORIGINAL). If a CamelCaseName consists of multiple comma-separated files, e.g. ClassA,ClassB,ClassC, then multiple camelcase header files will be generated which are redirects to the first header file. The file locations of these generated headers will be stored in <camelcase_forwarding_headers_var>.

ORIGINAL specifies how the name of the original header is written: lowercased or also camelcased. The default is LOWERCASE. Since 1.8.0.

HEADER_EXTENSION specifies what file name extension is used for the header files. The default is “h”. Since 5.48.0.

PREFIX places the generated headers in subdirectories. This should be a CamelCase name like KParts, which will cause the CamelCase forwarding headers to be placed in the KParts directory (e.g. KParts/Part). It will also, for the convenience of code in the source distribution, generate forwarding headers based on the original names (e.g. kparts/part.h). This allows includes like "#include <kparts/part.h>" to be used before installation, as long as the include_directories are set appropriately.

OUTPUT_DIR specifies where the files will be generated; this should be within the build directory. By default, ${CMAKE_CURRENT_BINARY_DIR} will be used. This option can be used to avoid file conflicts.

REQUIRED_HEADERS specifies an output variable name where all the required headers will be appended so that they can be installed together with the generated ones. This is mostly intended as a convenience so that adding a new header to a project only requires specifying the CamelCase variant in the CMakeLists.txt file; the original variant will then be added to this variable.

COMMON_HEADER generates an additional convenience header which includes all other header files.

The RELATIVE argument indicates where the original headers can be found relative to CMAKE_CURRENT_SOURCE_DIR. It does not affect the generated CamelCase forwarding files, but ecm_generate_headers() uses it when checking that the original header exists, and to generate originally named forwarding headers when PREFIX is set.

To allow other parts of the source distribution (eg: tests) to use the generated headers before installation, it may be desirable to set the INCLUDE_DIRECTORIES property for the library target to output_dir. For example, if OUTPUT_DIR is CMAKE_CURRENT_BINARY_DIR (the default), you could do

target_include_directories(MyLib PUBLIC "$<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}>")

Example usage (without PREFIX):

ecm_generate_headers(
    MyLib_FORWARDING_HEADERS
    HEADERS
        MLFoo
        MLBar
        # etc
    REQUIRED_HEADERS MyLib_HEADERS
    COMMON_HEADER MLGeneral
)
install(FILES ${MyLib_FORWARDING_HEADERS} ${MyLib_HEADERS}
        DESTINATION ${CMAKE_INSTALL_PREFIX}/include
        COMPONENT Devel)

Example usage (with PREFIX):

ecm_generate_headers(
    MyLib_FORWARDING_HEADERS
    HEADERS
        Foo
        # several classes are contained in bar.h, so generate
        # additional files
        Bar,BarList
        # etc
    PREFIX MyLib
    REQUIRED_HEADERS MyLib_HEADERS
)
install(FILES ${MyLib_FORWARDING_HEADERS}
        DESTINATION ${CMAKE_INSTALL_PREFIX}/include/MyLib
        COMPONENT Devel)
install(FILES ${MyLib_HEADERS}
        DESTINATION ${CMAKE_INSTALL_PREFIX}/include/mylib
        COMPONENT Devel)

Since pre-1.0.0.