Skip to content

Commit

Permalink
cmake: Add options to disable shared/static builds
Browse files Browse the repository at this point in the history
Also fix package config and other placed where static build alone wasn't
expected to be the case.

Signed-off-by: Siddharth Chandrasekaran <[email protected]>
  • Loading branch information
sidcha committed Mar 20, 2024
1 parent d53d033 commit 7c20380
Show file tree
Hide file tree
Showing 2 changed files with 74 additions and 30 deletions.
2 changes: 1 addition & 1 deletion misc/libosdp.pc.in
Original file line number Diff line number Diff line change
Expand Up @@ -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}
102 changes: 73 additions & 29 deletions src/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -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")
Expand All @@ -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)

Expand Down Expand Up @@ -102,22 +104,40 @@ 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)
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
$<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/include>
Expand All @@ -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)
Expand All @@ -143,19 +194,13 @@ 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)
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}
Expand All @@ -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)
Expand All @@ -179,29 +238,14 @@ 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(
${PROJECT_SOURCE_DIR}/misc/libosdp.pc.in
${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
Expand Down

0 comments on commit 7c20380

Please sign in to comment.