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.