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