Skip to content

Instantly share code, notes, and snippets.

@madmongo1
Created November 12, 2020 21:10
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save madmongo1/d50d8de71fac43135be3fda8dc6148fd to your computer and use it in GitHub Desktop.
Save madmongo1/d50d8de71fac43135be3fda8dc6148fd to your computer and use it in GitHub Desktop.
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