diff --git a/misc/libosdp.pc.in b/misc/libosdp.pc.in index a905703..f940e9e 100644 --- a/misc/libosdp.pc.in +++ b/misc/libosdp.pc.in @@ -7,5 +7,5 @@ Name: @PROJECT_NAME@ Description: @PROJECT_DESCRIPTION@ URL: @PROJECT_URL@ Version: @PROJECT_VERSION@ -Libs: -L${libdir} -losdp +Libs: -L${libdir} -l@LIB_TARGET@ Cflags: -I${includedir} diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 112d268..530bda4 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -10,6 +10,12 @@ option(CONFIG_OSDP_DATA_TRACE "Enable command/reply data buffer tracing" OFF) option(CONFIG_OSDP_SKIP_MARK_BYTE "Don't send the leading mark byte (0xFF)" OFF) option(CONFIG_DISABLE_PRETTY_LOGGING "Don't colorize log ouputs" OFF) option(CONFIG_BUILD_ASAN "Address sanitizer enabled builds" OFF) +option(CONFIG_BUILD_STATIC "Build static library" ON) +option(CONFIG_BUILD_SHARED "Build shared library" ON) + +if (NOT CONFIG_BUILD_STATIC AND NOT CONFIG_BUILD_SHARED) + message(FATAL_ERROR "Both static and shared builds must not be disabled") +endif() if (CONFIG_OSDP_PACKET_TRACE) list(APPEND LIB_OSDP_DEFINITIONS "-DCONFIG_OSDP_PACKET_TRACE") @@ -31,10 +37,6 @@ if (CONFIG_OSDP_STATIC_PD) list(APPEND LIB_OSDP_DEFINITIONS "-DCONFIG_OSDP_STATIC_PD") endif() -# static and shared library names -set(LIB_OSDP_SHARED osdp) -set(LIB_OSDP_STATIC osdpstatic) - # optionally, find and use OpenSSL or MbedTLS find_package(OpenSSL) @@ -102,9 +104,15 @@ list(APPEND LIB_OSDP_UTILS_SRC ${PROJECT_SOURCE_DIR}/utils/src/logger.c ) +list(APPEND LIB_OSDP_HEADERS + ${PROJECT_SOURCE_DIR}/include/osdp.h + ${PROJECT_SOURCE_DIR}/include/osdp.hpp +) + # These variables are used in other parts of this projects for rebuilding # LibOSDP as they see fit. For instance pyosdp is built by setuptools. set(LIB_OSDP_SOURCES ${LIB_OSDP_SOURCES} PARENT_SCOPE) +set(LIB_OSDP_HEADERS ${LIB_OSDP_HEADERS} PARENT_SCOPE) set(LIB_OSDP_LIBRARIES ${LIB_OSDP_LIBRARIES} PARENT_SCOPE) set(LIB_OSDP_INCLUDE_DIRS ${LIB_OSDP_INCLUDE_DIRS} PARENT_SCOPE) set(LIB_OSDP_PRIVATE_INCLUDE_DIRS ${LIB_OSDP_PRIVATE_INCLUDE_DIRS} PARENT_SCOPE) @@ -112,12 +120,24 @@ set(LIB_OSDP_DEFINITIONS ${LIB_OSDP_DEFINITIONS} PARENT_SCOPE) add_definitions(${LIB_OSDP_DEFINITIONS}) -## build libosdpstatic.a +################################################ +## +## Build Static Library (CONFIG_BUILD_SHARED=on) +## +################################################ +if (CONFIG_BUILD_STATIC) +set(LIB_OSDP_STATIC osdpstatic) +set(LIB_TARGET ${LIB_OSDP_STATIC}) ## to be used in libosdp.pc.in add_library(${LIB_OSDP_STATIC} STATIC ${LIB_OSDP_SOURCES} ${LIB_OSDP_UTILS_SRC}) -set_target_properties(${LIB_OSDP_STATIC} PROPERTIES COMPILE_FLAGS -DOSDP_STATIC_DEFINE) target_link_libraries(${LIB_OSDP_STATIC} ${LIB_OSDP_LIBRARIES}) +set_target_properties(${LIB_OSDP_STATIC} PROPERTIES + VERSION ${PROJECT_VERSION} + COMPILE_FLAGS -DOSDP_STATIC_DEFINE + PUBLIC_HEADER "${LIB_OSDP_HEADERS}" +) + target_include_directories(${LIB_OSDP_STATIC} PUBLIC $ @@ -128,8 +148,39 @@ target_include_directories(${LIB_OSDP_STATIC} ${PROJECT_SOURCE_DIR}/utils/include ) -## build libosdp.so +if (CONFIG_BUILD_ASAN) + target_compile_options(${LIB_OSDP_STATIC} PRIVATE -fsanitize=address) + target_link_options(${LIB_OSDP_STATIC} PRIVATE -fsanitize=address) +endif() + +install( + TARGETS ${LIB_OSDP_STATIC} + COMPONENT distributables + EXPORT LibOSDPTargets + LIBRARY DESTINATION ${LIBOSDP_LIBRARY_DIR} + ARCHIVE DESTINATION ${LIBOSDP_LIBRARY_DIR} + PUBLIC_HEADER DESTINATION include/libosdp +) + +# generate osdp_export.h for OSDP_EXPORT() macro +# must be placed after the target definitions. +include(GenerateExportHeader) +generate_export_header(${LIB_OSDP_STATIC} + BASE_NAME OSDP + EXPORT_FILE_NAME ${CMAKE_CURRENT_BINARY_DIR}/osdp_export.h +) + +endif() # CONFIG_BUILD_STATIC +################################################ +## +## Build Shared Library (CONFIG_BUILD_SHARED=on) +## +################################################ +if (CONFIG_BUILD_SHARED) + +set(LIB_OSDP_SHARED osdp) +set(LIB_TARGET ${LIB_OSDP_SHARED}) ## to be used in libosdp.pc.in # keep all symbols hidden by default (-fvisibility=hidden) for shared library set(CMAKE_CXX_VISIBILITY_PRESET hidden) set(CMAKE_C_VISIBILITY_PRESET hidden) @@ -143,7 +194,6 @@ endif() set(LIB_OSDP_UTILS_SRC ${LIB_OSDP_UTILS_SRC} PARENT_SCOPE) -# add source files of utils instead of linking it. See comment above. add_library(${LIB_OSDP_SHARED} SHARED ${LIB_OSDP_SOURCES} ${LIB_OSDP_UTILS_SRC}) if (OpenSSL_FOUND) target_link_libraries(${LIB_OSDP_SHARED} PUBLIC OpenSSL::Crypto) @@ -151,11 +201,6 @@ elseif (MbedTLS_FOUND) target_link_libraries(${LIB_OSDP_SHARED} PUBLIC MbedTLS::mbedcrypto) endif() -list(APPEND LIB_OSDP_HEADERS - ${PROJECT_SOURCE_DIR}/include/osdp.h - ${PROJECT_SOURCE_DIR}/include/osdp.hpp -) - set_target_properties(${LIB_OSDP_SHARED} PROPERTIES VERSION ${PROJECT_VERSION} SOVERSION ${PROJECT_VERSION_MAJOR} @@ -171,6 +216,20 @@ target_include_directories(${LIB_OSDP_SHARED} ${PROJECT_SOURCE_DIR}/utils/include ) +if (CONFIG_BUILD_ASAN) + target_compile_options(${LIB_OSDP_SHARED} PRIVATE -fsanitize=address) + target_link_options(${LIB_OSDP_SHARED} PRIVATE -fsanitize=address) +endif() + +install( + TARGETS ${LIB_OSDP_SHARED} + COMPONENT distributables + EXPORT LibOSDPTargets + LIBRARY DESTINATION ${LIBOSDP_LIBRARY_DIR} + ARCHIVE DESTINATION ${LIBOSDP_LIBRARY_DIR} + PUBLIC_HEADER DESTINATION include/libosdp +) + # generate osdp_export.h for OSDP_EXPORT() macro # must be placed after the target definitions. include(GenerateExportHeader) @@ -179,12 +238,7 @@ generate_export_header(${LIB_OSDP_SHARED} EXPORT_FILE_NAME ${CMAKE_CURRENT_BINARY_DIR}/osdp_export.h ) -if (CONFIG_BUILD_ASAN) - target_compile_options(${LIB_OSDP_SHARED} PRIVATE -fsanitize=address) - target_compile_options(${LIB_OSDP_STATIC} PRIVATE -fsanitize=address) - target_link_options(${LIB_OSDP_SHARED} PRIVATE -fsanitize=address) - target_link_options(${LIB_OSDP_STATIC} PRIVATE -fsanitize=address) -endif() +endif() # CONFIG_BUILD_SHARED # pkg-config file configure_file( @@ -192,16 +246,6 @@ configure_file( ${CMAKE_BINARY_DIR}/libosdp.pc @ONLY ) -## Install targets - -install( - TARGETS ${LIB_OSDP_SHARED} ${LIB_OSDP_STATIC} - COMPONENT distributables - EXPORT LibOSDPTargets - LIBRARY DESTINATION ${LIBOSDP_LIBRARY_DIR} - ARCHIVE DESTINATION ${LIBOSDP_LIBRARY_DIR} - PUBLIC_HEADER DESTINATION include/libosdp -) install( FILES ${CMAKE_BINARY_DIR}/libosdp.pc