Created
November 12, 2020 21:10
-
-
Save madmongo1/d50d8de71fac43135be3fda8dc6148fd to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
if(PRICER_CMAKE_BUILD_LIBRARY) | |
return() | |
else() | |
set(PRICER_CMAKE_BUILD_LIBRARY 1) | |
endif() | |
macro(BuildLibrary) | |
cmake_parse_arguments(pbl | |
"" #options | |
"NAMESPACE;NAME;VERSION" #single value | |
"DEPENDENCIES;DEFINITIONS" # multi value | |
${ARGN} | |
) | |
if (NOT DEFINED pbl_NAMESPACE) | |
message(FATAL_ERROR "BuildLibrary: No Namespace") | |
endif() | |
if (NOT DEFINED pbl_NAME) | |
get_filename_component(pbl_NAME "${CMAKE_CURRENT_SOURCE_DIR}" NAME) | |
endif() | |
if (NOT DEFINED pbl_VERSION) | |
set(pbl_VERSION "0.1") | |
endif() | |
message(STATUS "[BuildLibrary] ${pbl_NAMESPACE}::${pbl_NAME} : Definitions=${pbl_DEFINITIONS} : Dependencies=${pbl_DEPENDENCIES} : Version=${pbl_VERSION}") | |
set(pbl_ALIAS "${pbl_NAMESPACE}::${pbl_NAME}") | |
project("${pbl_NAMESPACE}_${pbl_NAME}" VERSION ${pbl_VERSION}) | |
file(GLOB_RECURSE | |
in_files | |
LIST_DIRECTORIES false | |
CONFIGURE_DEPENDS | |
"src/*.in") | |
foreach (in_file IN LISTS in_files) | |
file(RELATIVE_PATH in_rel "${CMAKE_CURRENT_SOURCE_DIR}" "${in_file}") | |
string(REGEX REPLACE "^(.*)\\.in$" "\\1" target_rel "${in_rel}") | |
message(STATUS "[${pbl_ALIAS}] configuring ${target_rel}") | |
configure_file(${in_rel} ${target_rel} @ONLY) | |
endforeach() | |
file(GLOB_RECURSE | |
pbl_src_files | |
LIST_DIRECTORIES false | |
CONFIGURE_DEPENDS | |
"src/*.cpp" "${CMAKE_CURRENT_BINARY_DIR}/src/*.cpp") | |
file(GLOB_RECURSE | |
hdr_files | |
LIST_DIRECTORIES false | |
CONFIGURE_DEPENDS | |
"src/*.hpp" "${CMAKE_CURRENT_BINARY_DIR}/src/*.hpp") | |
list(APPEND hdr_files ${generated_hdr_files}) | |
set(pbl_spec_files ${pbl_src_files}) | |
list(FILTER pbl_spec_files INCLUDE REGEX "^.*.\\.spec\\.cpp$") | |
list(FILTER pbl_spec_files EXCLUDE REGEX "^.*\\main.spec.cpp$") | |
list(FILTER pbl_src_files EXCLUDE REGEX "^.*.\\.spec\\.cpp$") | |
if ("${pbl_src_files}" STREQUAL "") | |
add_library(${PROJECT_NAME} INTERFACE) | |
set(pbl_IFACE_OR_PUBLIC "INTERFACE") | |
set(pbl_is_interface_lib ON) | |
message(STATUS "[${pbl_ALIAS}] is INTERFACE library") | |
else() | |
add_library(${PROJECT_NAME} ${pbl_src_files} ${hdr_files}) | |
set(pbl_IFACE_OR_PUBLIC "PUBLIC") | |
set(pbl_is_interface_lib OFF) | |
message(STATUS "[${pbl_ALIAS}] is PUBLIC library") | |
endif() | |
target_link_libraries(${PROJECT_NAME} ${pbl_IFACE_OR_PUBLIC} ${pbl_DEPENDENCIES}) | |
target_compile_definitions(${PROJECT_NAME} ${pbl_IFACE_OR_PUBLIC} ${pbl_DEFINITIONS}) | |
target_include_directories(${PROJECT_NAME} | |
${pbl_IFACE_OR_PUBLIC} | |
"$<INSTALL_INTERFACE:include") | |
if (EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/include) | |
target_include_directories(${PROJECT_NAME} | |
${pbl_IFACE_OR_PUBLIC} | |
"$<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}/include>" | |
"$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>") | |
endif() | |
if (NOT pbl_is_interface_lib) | |
target_include_directories(${PROJECT_NAME} | |
PRIVATE | |
"$<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}/src>" | |
"$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/src>") | |
endif() | |
set_target_properties(${PROJECT_NAME} PROPERTIES EXPORT_NAME "${pbl_NAME}") | |
add_library("${pbl_ALIAS}" ALIAS "${PROJECT_NAME}") | |
list(APPEND all_libs ${PROJECT_NAME}) | |
list(APPEND all_spec_files ${pbl_spec_files}) | |
if (NOT "${pbl_spec_files}" STREQUAL "") | |
add_executable("${PROJECT_NAME}_test" ${pbl_spec_files} src/main.spec.cpp) | |
target_link_libraries("${PROJECT_NAME}_test" "${pbl_ALIAS}") | |
endif() | |
set(all_libs "${all_libs}" PARENT_SCOPE) | |
set(all_spec_files "${all_pbl_spec_files}" PARENT_SCOPE) | |
endmacro() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment