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>]
[SHARED_PREFIX <prefix>] # since 6.19
[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.
SHARED_PREFIX works similar to PREFIX. It though assumes the original
headers will be installed in the same subdirectory as the forwarding headers.
So the generated files will include the original ones locally without any prefix.
And the above mentioned pre-installation convenience forwarding headers based on
the original names will be placed in the same subdirectory
(e.g. KParts/part.h), to allow includes like "#include <KParts/Part>" to
be used before installation and working properly. Since 6.19.0.
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 or SHARED_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 add to the
INCLUDE_DIRECTORIES property of the library target the output_dir.
If OUTPUT_DIR is CMAKE_CURRENT_BINARY_DIR (the default) and
CMAKE_INCLUDE_CURRENT_DIR_IN_INTERFACE is ON (as set by
KDECMakeSettings), this is automatically done.
Otherwise you could do (adapt if OUTPUT_DIR is something else)
target_include_directories(MyLib PUBLIC "$<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}>")
Example usage (without PREFIX pr SHARED_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)
Example usage (with SHARED_PREFIX):
ecm_generate_headers(
MyLib_FORWARDING_HEADERS
HEADERS
Foo
# several classes are contained in bar.h, so generate
# additional files
Bar,BarList
# etc
SHARED_PREFIX MyLib
REQUIRED_HEADERS MyLib_HEADERS
)
install(FILES ${MyLib_FORWARDING_HEADERS} ${MyLib_HEADERS}
DESTINATION ${CMAKE_INSTALL_PREFIX}/include/MyLib
COMPONENT Devel)
Since pre-1.0.0.