Allow writing public compile definitions to a header file
This is useful as it makes consuming libraries less dependent on using the CMake module or pkg-config file correctly. This should especially decrease the likelihood of running into linker errors when consuming a static build of the libraries where e.g. `CPP_UTILITIES_STATIC` needs to be defined.
This commit is contained in:
parent
27043d2be0
commit
a7fdc1af1b
|
@ -53,7 +53,7 @@ endif ()
|
||||||
# add global library-specific header
|
# add global library-specific header
|
||||||
find_template_file("global.h" CPP_UTILITIES GLOBAL_H_TEMPLATE_FILE)
|
find_template_file("global.h" CPP_UTILITIES GLOBAL_H_TEMPLATE_FILE)
|
||||||
if ("${META_PROJECT_NAME}" STREQUAL "c++utilities")
|
if ("${META_PROJECT_NAME}" STREQUAL "c++utilities")
|
||||||
set(GENERAL_GLOBAL_H_INCLUDE_PATH "\"./application/global.h\"")
|
set(GENERAL_GLOBAL_H_INCLUDE_PATH "\"application/global.h\"")
|
||||||
else ()
|
else ()
|
||||||
set(GENERAL_GLOBAL_H_INCLUDE_PATH "<c++utilities/application/global.h>")
|
set(GENERAL_GLOBAL_H_INCLUDE_PATH "<c++utilities/application/global.h>")
|
||||||
endif ()
|
endif ()
|
||||||
|
@ -121,14 +121,37 @@ endif ()
|
||||||
# add custom libraries
|
# add custom libraries
|
||||||
append_user_defined_additional_libraries()
|
append_user_defined_additional_libraries()
|
||||||
|
|
||||||
|
# allow writing public compile definitions to a header file instead of just relying on CMake/pkg-config
|
||||||
|
option(USE_HEADER_FOR_PUBLIC_COMPILE_DEFINITIONS "writes public compile definitions to a header file" ON)
|
||||||
|
set(DEFS_FOR_HEADER "")
|
||||||
|
if (USE_HEADER_FOR_PUBLIC_COMPILE_DEFINITIONS)
|
||||||
|
foreach (DEF ${META_PUBLIC_COMPILE_DEFINITIONS})
|
||||||
|
if (DEF MATCHES "([A-Za-z0-9_]+)=([A-Za-z0-9_ ]+)")
|
||||||
|
set(DEF_NAME "${CMAKE_MATCH_1}")
|
||||||
|
set(DEF_VALUE " ${CMAKE_MATCH_2}")
|
||||||
|
elseif (DEF MATCHES "([A-Za-z0-9_]+)")
|
||||||
|
set(DEF_NAME "${CMAKE_MATCH_1}")
|
||||||
|
set(DEF_VALUE "")
|
||||||
|
endif ()
|
||||||
|
if (DEF_NAME)
|
||||||
|
set(DEFS_FOR_HEADER "${DEFS_FOR_HEADER}#ifndef ${DEF_NAME}\n#define ${DEF_NAME}${DEF_VALUE}\n#endif\n")
|
||||||
|
endif ()
|
||||||
|
endforeach ()
|
||||||
|
endif ()
|
||||||
|
set(TARGET_GENERATED_INCLUDE_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/include")
|
||||||
|
set(TARGET_DEFINITIONS_HEADER "${TARGET_GENERATED_INCLUDE_DIRECTORY}/${META_TARGET_NAME}-definitions.h")
|
||||||
|
file(WRITE "${TARGET_DEFINITIONS_HEADER}" "${DEFS_FOR_HEADER}")
|
||||||
|
|
||||||
# add library to be created, set libs to link against, set version and C++ standard
|
# add library to be created, set libs to link against, set version and C++ standard
|
||||||
if (META_HEADER_ONLY_LIB)
|
if (META_HEADER_ONLY_LIB)
|
||||||
add_library(${META_TARGET_NAME} INTERFACE)
|
add_library(${META_TARGET_NAME} INTERFACE)
|
||||||
target_link_libraries(${META_TARGET_NAME} INTERFACE ${META_ADDITIONAL_LINK_FLAGS} "${PUBLIC_LIBRARIES}"
|
target_link_libraries(${META_TARGET_NAME} INTERFACE ${META_ADDITIONAL_LINK_FLAGS} "${PUBLIC_LIBRARIES}"
|
||||||
"${PRIVATE_LIBRARIES}")
|
"${PRIVATE_LIBRARIES}")
|
||||||
target_include_directories(
|
target_include_directories(
|
||||||
${META_TARGET_NAME} INTERFACE $<BUILD_INTERFACE:${TARGET_INCLUDE_DIRECTORY_BUILD_INTERFACE}>
|
${META_TARGET_NAME}
|
||||||
$<INSTALL_INTERFACE:${HEADER_INSTALL_DESTINATION}> ${PUBLIC_INCLUDE_DIRS})
|
INTERFACE $<BUILD_INTERFACE:${TARGET_INCLUDE_DIRECTORY_BUILD_INTERFACE}>
|
||||||
|
$<BUILD_INTERFACE:${TARGET_GENERATED_INCLUDE_DIRECTORY}>
|
||||||
|
$<INSTALL_INTERFACE:${HEADER_INSTALL_DESTINATION}> ${PUBLIC_INCLUDE_DIRS})
|
||||||
target_compile_definitions(${META_TARGET_NAME} INTERFACE "${META_PUBLIC_COMPILE_DEFINITIONS}"
|
target_compile_definitions(${META_TARGET_NAME} INTERFACE "${META_PUBLIC_COMPILE_DEFINITIONS}"
|
||||||
"${META_PRIVATE_COMPILE_DEFINITIONS}")
|
"${META_PRIVATE_COMPILE_DEFINITIONS}")
|
||||||
target_compile_options(${META_TARGET_NAME} INTERFACE "${META_PUBLIC_COMPILE_OPTIONS}" "${META_PRIVATE_COMPILE_OPTIONS}")
|
target_compile_options(${META_TARGET_NAME} INTERFACE "${META_PUBLIC_COMPILE_OPTIONS}" "${META_PRIVATE_COMPILE_OPTIONS}")
|
||||||
|
@ -139,12 +162,14 @@ else ()
|
||||||
PUBLIC ${META_ADDITIONAL_LINK_FLAGS} "${PUBLIC_LIBRARIES}"
|
PUBLIC ${META_ADDITIONAL_LINK_FLAGS} "${PUBLIC_LIBRARIES}"
|
||||||
PRIVATE "${PRIVATE_LIBRARIES}")
|
PRIVATE "${PRIVATE_LIBRARIES}")
|
||||||
if (META_IS_PLUGIN)
|
if (META_IS_PLUGIN)
|
||||||
target_include_directories(${META_TARGET_NAME} PRIVATE $<BUILD_INTERFACE:${TARGET_INCLUDE_DIRECTORY_BUILD_INTERFACE}>
|
target_include_directories(
|
||||||
"${PRIVATE_INCLUDE_DIRS}")
|
${META_TARGET_NAME} PRIVATE $<BUILD_INTERFACE:${TARGET_INCLUDE_DIRECTORY_BUILD_INTERFACE}>
|
||||||
|
$<BUILD_INTERFACE:${TARGET_GENERATED_INCLUDE_DIRECTORY}> "${PRIVATE_INCLUDE_DIRS}")
|
||||||
else ()
|
else ()
|
||||||
target_include_directories(
|
target_include_directories(
|
||||||
${META_TARGET_NAME}
|
${META_TARGET_NAME}
|
||||||
PUBLIC $<BUILD_INTERFACE:${TARGET_INCLUDE_DIRECTORY_BUILD_INTERFACE}>
|
PUBLIC $<BUILD_INTERFACE:${TARGET_INCLUDE_DIRECTORY_BUILD_INTERFACE}>
|
||||||
|
$<BUILD_INTERFACE:${TARGET_GENERATED_INCLUDE_DIRECTORY}>
|
||||||
$<INSTALL_INTERFACE:${HEADER_INSTALL_DESTINATION}> ${PUBLIC_INCLUDE_DIRS}
|
$<INSTALL_INTERFACE:${HEADER_INSTALL_DESTINATION}> ${PUBLIC_INCLUDE_DIRS}
|
||||||
PRIVATE "${PRIVATE_INCLUDE_DIRS}")
|
PRIVATE "${PRIVATE_INCLUDE_DIRS}")
|
||||||
endif ()
|
endif ()
|
||||||
|
@ -196,6 +221,7 @@ else ()
|
||||||
add_library(${META_TARGET_NAME}-headers INTERFACE)
|
add_library(${META_TARGET_NAME}-headers INTERFACE)
|
||||||
target_include_directories(
|
target_include_directories(
|
||||||
${META_TARGET_NAME}-headers INTERFACE $<BUILD_INTERFACE:${TARGET_INCLUDE_DIRECTORY_BUILD_INTERFACE}>
|
${META_TARGET_NAME}-headers INTERFACE $<BUILD_INTERFACE:${TARGET_INCLUDE_DIRECTORY_BUILD_INTERFACE}>
|
||||||
|
$<BUILD_INTERFACE:${TARGET_GENERATED_INCLUDE_DIRECTORY}>
|
||||||
$<INSTALL_INTERFACE:${HEADER_INSTALL_DESTINATION}> ${PUBLIC_INCLUDE_DIRS})
|
$<INSTALL_INTERFACE:${HEADER_INSTALL_DESTINATION}> ${PUBLIC_INCLUDE_DIRS})
|
||||||
target_compile_definitions(${META_TARGET_NAME}-headers INTERFACE "${META_PUBLIC_COMPILE_DEFINITIONS}"
|
target_compile_definitions(${META_TARGET_NAME}-headers INTERFACE "${META_PUBLIC_COMPILE_DEFINITIONS}"
|
||||||
"${META_PRIVATE_COMPILE_DEFINITIONS}")
|
"${META_PRIVATE_COMPILE_DEFINITIONS}")
|
||||||
|
@ -557,6 +583,10 @@ if (NOT META_NO_INSTALL_TARGETS AND ENABLE_INSTALL_TARGETS)
|
||||||
FILES "${VERSION_HEADER_FILE}"
|
FILES "${VERSION_HEADER_FILE}"
|
||||||
DESTINATION "${INCLUDE_SUBDIR}/${META_PROJECT_NAME}"
|
DESTINATION "${INCLUDE_SUBDIR}/${META_PROJECT_NAME}"
|
||||||
COMPONENT header)
|
COMPONENT header)
|
||||||
|
install(
|
||||||
|
FILES "${TARGET_DEFINITIONS_HEADER}"
|
||||||
|
DESTINATION "${INCLUDE_SUBDIR}/${META_PROJECT_NAME}"
|
||||||
|
COMPONENT header)
|
||||||
if (NOT TARGET install-header)
|
if (NOT TARGET install-header)
|
||||||
add_custom_target(install-header COMMAND "${CMAKE_COMMAND}" -DCMAKE_INSTALL_COMPONENT=header -P
|
add_custom_target(install-header COMMAND "${CMAKE_COMMAND}" -DCMAKE_INSTALL_COMPONENT=header -P
|
||||||
"${CMAKE_BINARY_DIR}/cmake_install.cmake")
|
"${CMAKE_BINARY_DIR}/cmake_install.cmake")
|
||||||
|
|
|
@ -4,6 +4,7 @@
|
||||||
#ifndef @META_PROJECT_VARNAME_UPPER@_GLOBAL
|
#ifndef @META_PROJECT_VARNAME_UPPER@_GLOBAL
|
||||||
#define @META_PROJECT_VARNAME_UPPER@_GLOBAL
|
#define @META_PROJECT_VARNAME_UPPER@_GLOBAL
|
||||||
|
|
||||||
|
#include "@META_TARGET_NAME@-definitions.h"
|
||||||
#include @GENERAL_GLOBAL_H_INCLUDE_PATH@
|
#include @GENERAL_GLOBAL_H_INCLUDE_PATH@
|
||||||
|
|
||||||
#ifdef @META_PROJECT_VARNAME_UPPER@_STATIC
|
#ifdef @META_PROJECT_VARNAME_UPPER@_STATIC
|
||||||
|
|
3
global.h
3
global.h
|
@ -4,7 +4,8 @@
|
||||||
#ifndef CPP_UTILITIES_GLOBAL
|
#ifndef CPP_UTILITIES_GLOBAL
|
||||||
#define CPP_UTILITIES_GLOBAL
|
#define CPP_UTILITIES_GLOBAL
|
||||||
|
|
||||||
#include "./application/global.h"
|
#include "c++utilities-devel-definitions.h"
|
||||||
|
#include "application/global.h"
|
||||||
|
|
||||||
#ifdef CPP_UTILITIES_STATIC
|
#ifdef CPP_UTILITIES_STATIC
|
||||||
#define CPP_UTILITIES_EXPORT
|
#define CPP_UTILITIES_EXPORT
|
||||||
|
|
Loading…
Reference in New Issue