diff --git a/cmake/modules/LibraryTarget.cmake b/cmake/modules/LibraryTarget.cmake index e6bb08c..bc2e15f 100644 --- a/cmake/modules/LibraryTarget.cmake +++ b/cmake/modules/LibraryTarget.cmake @@ -53,7 +53,7 @@ endif () # add global library-specific header find_template_file("global.h" CPP_UTILITIES GLOBAL_H_TEMPLATE_FILE) 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 () set(GENERAL_GLOBAL_H_INCLUDE_PATH "") endif () @@ -121,14 +121,37 @@ endif () # add custom 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 if (META_HEADER_ONLY_LIB) add_library(${META_TARGET_NAME} INTERFACE) target_link_libraries(${META_TARGET_NAME} INTERFACE ${META_ADDITIONAL_LINK_FLAGS} "${PUBLIC_LIBRARIES}" "${PRIVATE_LIBRARIES}") target_include_directories( - ${META_TARGET_NAME} INTERFACE $ - $ ${PUBLIC_INCLUDE_DIRS}) + ${META_TARGET_NAME} + INTERFACE $ + $ + $ ${PUBLIC_INCLUDE_DIRS}) target_compile_definitions(${META_TARGET_NAME} INTERFACE "${META_PUBLIC_COMPILE_DEFINITIONS}" "${META_PRIVATE_COMPILE_DEFINITIONS}") 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}" PRIVATE "${PRIVATE_LIBRARIES}") if (META_IS_PLUGIN) - target_include_directories(${META_TARGET_NAME} PRIVATE $ - "${PRIVATE_INCLUDE_DIRS}") + target_include_directories( + ${META_TARGET_NAME} PRIVATE $ + $ "${PRIVATE_INCLUDE_DIRS}") else () target_include_directories( ${META_TARGET_NAME} PUBLIC $ + $ $ ${PUBLIC_INCLUDE_DIRS} PRIVATE "${PRIVATE_INCLUDE_DIRS}") endif () @@ -196,6 +221,7 @@ else () add_library(${META_TARGET_NAME}-headers INTERFACE) target_include_directories( ${META_TARGET_NAME}-headers INTERFACE $ + $ $ ${PUBLIC_INCLUDE_DIRS}) target_compile_definitions(${META_TARGET_NAME}-headers INTERFACE "${META_PUBLIC_COMPILE_DEFINITIONS}" "${META_PRIVATE_COMPILE_DEFINITIONS}") @@ -557,6 +583,10 @@ if (NOT META_NO_INSTALL_TARGETS AND ENABLE_INSTALL_TARGETS) FILES "${VERSION_HEADER_FILE}" DESTINATION "${INCLUDE_SUBDIR}/${META_PROJECT_NAME}" COMPONENT header) + install( + FILES "${TARGET_DEFINITIONS_HEADER}" + DESTINATION "${INCLUDE_SUBDIR}/${META_PROJECT_NAME}" + COMPONENT header) if (NOT TARGET install-header) add_custom_target(install-header COMMAND "${CMAKE_COMMAND}" -DCMAKE_INSTALL_COMPONENT=header -P "${CMAKE_BINARY_DIR}/cmake_install.cmake") diff --git a/cmake/templates/global.h.in b/cmake/templates/global.h.in index fef609e..ff3605d 100644 --- a/cmake/templates/global.h.in +++ b/cmake/templates/global.h.in @@ -4,6 +4,7 @@ #ifndef @META_PROJECT_VARNAME_UPPER@_GLOBAL #define @META_PROJECT_VARNAME_UPPER@_GLOBAL +#include "@META_TARGET_NAME@-definitions.h" #include @GENERAL_GLOBAL_H_INCLUDE_PATH@ #ifdef @META_PROJECT_VARNAME_UPPER@_STATIC diff --git a/global.h b/global.h index 218eca8..bb23e45 100644 --- a/global.h +++ b/global.h @@ -4,7 +4,8 @@ #ifndef 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 #define CPP_UTILITIES_EXPORT