Cleaned up CMake build. Added namespace targets for subdirectory builds.

This commit is contained in:
fpagliughi
2024-05-06 09:13:31 -04:00
parent 36af577f73
commit 96711b6dff
10 changed files with 218 additions and 296 deletions

View File

@@ -5,7 +5,7 @@
# ---------------------------------------------------------------------------
# This file is part of the "sockpp" C++ socket library.
#
# Copyright (c) 2017-2023 Frank Pagliughi
# Copyright (c) 2017-2024 Frank Pagliughi
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
@@ -67,19 +67,34 @@ endif()
# --- Setting naming variables ---
set(SOCKPP_SHARED_LIBRARY sockpp)
set(SOCKPP_STATIC_LIBRARY sockpp-static)
set(SOCKPP_OBJECT_LIBRARY sockpp-objs)
set(SOCKPP_INCLUDE_DIR ${PROJECT_SOURCE_DIR}/include)
set(SOCKPP_GENERATED_DIR ${CMAKE_CURRENT_BINARY_DIR}/generated)
# --- Collect the targets names ---
if(${SOCKPP_BUILD_SHARED})
list(APPEND SOCKPP_TARGETS sockpp-shared)
endif()
if(${SOCKPP_BUILD_STATIC})
list(APPEND SOCKPP_TARGETS sockpp-static)
endif()
if(NOT SOCKPP_TARGETS)
message(FATAL_ERROR "No targets are specified")
endif()
# --- Project uses C++17 ---
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)
if(WIN32)
set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS ON)
set(LIBS_SYSTEM ws2_32)
endif()
# --- Generate a version header ---
configure_file(
@@ -92,125 +107,18 @@ configure_file(
add_subdirectory(src)
# --- System libraries ---
if(WIN32)
set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS ON)
set(LIBS_SYSTEM ws2_32)
endif()
# --- Collect the targets names ---
if(${SOCKPP_BUILD_SHARED})
list(APPEND SOCKPP_TARGETS ${SOCKPP_SHARED_LIBRARY})
endif()
if(${SOCKPP_BUILD_STATIC})
list(APPEND SOCKPP_TARGETS ${SOCKPP_STATIC_LIBRARY})
endif()
# --- Create the libraries and export them ---
if(NOT SOCKPP_TARGETS)
message(FATAL_ERROR "No targets are specified")
endif()
if(${SOCKPP_BUILD_SHARED})
message(STATUS "Creating shared library: ${SOCKPP_SHARED_LIBRARY}")
add_library(${SOCKPP_SHARED_LIBRARY} SHARED $<TARGET_OBJECTS:${SOCKPP_OBJECT_LIBRARY}>)
target_include_directories(${SOCKPP_SHARED_LIBRARY}
PUBLIC
$<BUILD_INTERFACE:${SOCKPP_INCLUDE_DIR}>
$<INSTALL_INTERFACE:include>
PRIVATE
${SOCKPP_GENERATED_DIR}/include
)
target_link_libraries(${SOCKPP_SHARED_LIBRARY} PUBLIC ${LIBS_SYSTEM})
if(SOCKPP_WITH_OPENSSL)
target_link_libraries(${SOCKPP_SHARED_LIBRARY} PUBLIC OpenSSL::SSL OpenSSL::Crypto)
endif()
set_target_properties(${SOCKPP_SHARED_LIBRARY} PROPERTIES
VERSION ${PROJECT_VERSION}
SOVERSION ${PROJECT_VERSION_MAJOR}
)
list(APPEND TARGET_FILES ${SOCKPP_SHARED_LIBRARY})
if(SOCKPP_WITH_OPENSSL)
target_link_libraries(${SOCKPP_SHARED_LIBRARY}
PUBLIC
OpenSSL::SSL
OpenSSL::Crypto
)
elseif(SOCKPP_WITH_MBEDTLS)
target_link_libraries(${SOCKPP_SHARED_LIBRARY}
PUBLIC
MbedTLS::mbedtls
MbedTLS::mbedcrypto
MbedTLS::mbedx509
)
endif()
endif()
if(${SOCKPP_BUILD_STATIC})
message(STATUS "Creating static library: ${SOCKPP_STATIC_LIBRARY}")
add_library(${SOCKPP_STATIC_LIBRARY} STATIC $<TARGET_OBJECTS:${SOCKPP_OBJECT_LIBRARY}>)
target_include_directories(${SOCKPP_STATIC_LIBRARY}
PUBLIC
$<BUILD_INTERFACE:${SOCKPP_INCLUDE_DIR}>
$<INSTALL_INTERFACE:include>
PRIVATE
${SOCKPP_GENERATED_DIR}/include
)
target_link_libraries(${SOCKPP_STATIC_LIBRARY} PUBLIC ${LIBS_SYSTEM})
if(SOCKPP_WITH_OPENSSL)
target_link_libraries(${SOCKPP_STATIC_LIBRARY} PUBLIC OpenSSL::SSL OpenSSL::Crypto)
endif()
# On *nix systems, the static library can have the same base filename
# as the shared library, thus 'libsockpp.a' for the static lib.
# On Windows they need different names to tell the static lib from the
# DLL import library.
if(UNIX)
set_target_properties(${SOCKPP_STATIC_LIBRARY} PROPERTIES
OUTPUT_NAME ${SOCKPP_SHARED_LIBRARY}
)
endif()
list(APPEND TARGET_FILES ${SOCKPP_STATIC_LIBRARY})
if(SOCKPP_WITH_OPENSSL)
target_link_libraries(${SOCKPP_STATIC_LIBRARY}
PUBLIC
OpenSSL::SSL
OpenSSL::Crypto
)
elseif(SOCKPP_WITH_MBEDTLS)
target_link_libraries(${SOCKPP_STATIC_LIBRARY} PUBLIC
MbedTLS::mbedtls
MbedTLS::mbedcrypto
MbedTLS::mbedx509
)
endif()
endif()
# --- Install Targets ---
include(GNUInstallDirs)
install(TARGETS ${TARGET_FILES}
EXPORT sockpp-targets
install(TARGETS ${SOCKPP_TARGETS}
EXPORT Sockpp
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
)
install(EXPORT sockpp-targets
install(EXPORT Sockpp
FILE
sockppTargets.cmake
NAMESPACE
@@ -222,13 +130,17 @@ install(EXPORT sockpp-targets
include(CMakePackageConfigHelpers)
write_basic_package_version_file(
${SOCKPP_GENERATED_DIR}/cmake/sockppConfigVersion.cmake
VERSION ${PROJECT_VERSION}
COMPATIBILITY AnyNewerVersion
${SOCKPP_GENERATED_DIR}/cmake/sockppConfigVersion.cmake
VERSION ${PROJECT_VERSION}
COMPATIBILITY AnyNewerVersion
)
install(DIRECTORY include/ ${SOCKPP_GENERATED_DIR}/include/
DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
install(
DIRECTORY
include/
${SOCKPP_GENERATED_DIR}/include/
DESTINATION
${CMAKE_INSTALL_INCLUDEDIR}
)
install(
@@ -245,14 +157,6 @@ if(SOCKPP_BUILD_DOCUMENTATION)
add_subdirectory(doc)
endif()
# --- Default library for examples and unit tests ---
if(SOCKPP_BUILD_SHARED)
set(SOCKPP_LIB ${SOCKPP_SHARED_LIBRARY})
else()
set(SOCKPP_LIB ${SOCKPP_STATIC_LIBRARY})
endif()
# --- Example applications ---
if(SOCKPP_BUILD_EXAMPLES)

View File

@@ -1,14 +1,29 @@
# sockppConfig.cmake
#
# The following import targets may be created depending on configuration:
# The following import target is always created:
#
# Sockpp::sockpp
#
# This is for whichever target is build (shared or static).
# If both are built it is for the shared target.
#
# One or both of the following import targets will be created depending
# on the configuration:
#
# Sockpp::sockpp-shared
# Sockpp::sockpp-static
#
include(CMakeFindDependencyMacro)
if(NOT TARGET Sockpp::sockpp AND NOT TARGET Sockpp::sockpp-static)
if(NOT TARGET Sockpp::sockpp-shared AND NOT TARGET Sockpp::sockpp-static)
include("${CMAKE_CURRENT_LIST_DIR}/sockppTargets.cmake")
if(TARGET Sockpp::sockpp-shared)
add_library(Sockpp::sockpp ALIAS Sockpp::sockpp-shared)
else()
add_library(Sockpp::sockpp ALIAS Sockpp::sockpp-static)
endif()
endif()

View File

@@ -45,16 +45,8 @@ set(EXECUTABLES
)
foreach(EXECUTABLE ${EXECUTABLES})
add_executable(${EXECUTABLE} ${EXECUTABLE}.cpp)
target_include_directories(${EXECUTABLE}
PUBLIC
${SOCKPP_INCLUDE_DIR}
PRIVATE
${SOCKPP_GENERATED_DIR}/include
)
target_link_libraries(${EXECUTABLE} ${SOCKPP_LIB})
add_executable(${EXECUTABLE} ${EXECUTABLE}.cpp)
target_link_libraries(${EXECUTABLE} Sockpp::sockpp)
endforeach()
# --- Install examples ---

View File

@@ -45,29 +45,21 @@ find_package(Threads REQUIRED)
# --- Executables ---
set(THREADED_EXECUTABLES
tcpechosvr
tcpechomt
tcp6echosvr
tcpechosvr
tcpechomt
tcp6echosvr
)
set(EXECUTABLES
tcpecho
tcpechotest
tcp6echo
${THREADED_EXECUTABLES}
tcpecho
tcpechotest
tcp6echo
${THREADED_EXECUTABLES}
)
foreach(EXECUTABLE ${EXECUTABLES})
add_executable(${EXECUTABLE} ${EXECUTABLE}.cpp)
target_include_directories(${EXECUTABLE}
PUBLIC
${SOCKPP_INCLUDE_DIR}
PRIVATE
${SOCKPP_GENERATED_DIR}/include
)
target_link_libraries(${EXECUTABLE} ${SOCKPP_LIB})
add_executable(${EXECUTABLE} ${EXECUTABLE}.cpp)
target_link_libraries(${EXECUTABLE} Sockpp::sockpp)
endforeach()
# --- Additional linkage to Threads ---

View File

@@ -48,28 +48,20 @@ set(THREADED_EXECUTABLES
)
set(EXECUTABLES
tlscli
tlsconn
${THREADED_EXECUTABLES}
tlscli
tlsconn
${THREADED_EXECUTABLES}
)
foreach(EXECUTABLE ${EXECUTABLES})
add_executable(${EXECUTABLE} ${EXECUTABLE}.cpp)
target_include_directories(${EXECUTABLE}
PUBLIC
${SOCKPP_INCLUDE_DIR}
PRIVATE
${SOCKPP_GENERATED_DIR}/include
)
target_link_libraries(${EXECUTABLE} ${SOCKPP_LIB})
add_executable(${EXECUTABLE} ${EXECUTABLE}.cpp)
target_link_libraries(${EXECUTABLE} Sockpp::sockpp)
endforeach()
# --- Additional linkage to Threads ---
foreach(EXECUTABLE ${THREADED_EXECUTABLES})
target_link_libraries(${EXECUTABLE} Threads::Threads)
target_link_libraries(${EXECUTABLE} Threads::Threads)
endforeach()
# --- Install examples ---

View File

@@ -45,32 +45,24 @@ find_package(Threads REQUIRED)
# --- Executables ---
set(THREADED_EXECUTABLES
udpechosvr
udpechosvr
)
set(EXECUTABLES
udpecho
udp6echo
${THREADED_EXECUTABLES}
udpecho
udp6echo
${THREADED_EXECUTABLES}
)
foreach(EXECUTABLE ${EXECUTABLES})
add_executable(${EXECUTABLE} ${EXECUTABLE}.cpp)
target_include_directories(${EXECUTABLE}
PUBLIC
${SOCKPP_INCLUDE_DIR}
PRIVATE
${SOCKPP_GENERATED_DIR}/include
)
target_link_libraries(${EXECUTABLE} ${SOCKPP_LIB})
add_executable(${EXECUTABLE} ${EXECUTABLE}.cpp)
target_link_libraries(${EXECUTABLE} Sockpp::sockpp)
endforeach()
# --- Additional linkage to Threads ---
foreach(EXECUTABLE ${THREADED_EXECUTABLES})
target_link_libraries(${EXECUTABLE} Threads::Threads)
target_link_libraries(${EXECUTABLE} Threads::Threads)
endforeach()
# --- Install examples ---

View File

@@ -45,36 +45,28 @@ find_package(Threads REQUIRED)
# --- Executables ---
set(THREADED_EXECUTABLES
unechosvr
undgramechosvr
unechosvr
undgramechosvr
)
set(EXECUTABLES
unecho
unechotest
undgramecho
${THREADED_EXECUTABLES}
unecho
unechotest
undgramecho
${THREADED_EXECUTABLES}
)
# --- Executables ---
foreach(EXECUTABLE ${EXECUTABLES})
add_executable(${EXECUTABLE} ${EXECUTABLE}.cpp)
target_include_directories(${EXECUTABLE}
PUBLIC
${SOCKPP_INCLUDE_DIR}
PRIVATE
${SOCKPP_GENERATED_DIR}/include
)
target_link_libraries(${EXECUTABLE} ${SOCKPP_LIB})
add_executable(${EXECUTABLE} ${EXECUTABLE}.cpp)
target_link_libraries(${EXECUTABLE} Sockpp::sockpp)
endforeach()
# --- Additional linkage to Threads ---
foreach(EXECUTABLE ${THREADED_EXECUTABLES})
target_link_libraries(${EXECUTABLE} Threads::Threads)
target_link_libraries(${EXECUTABLE} Threads::Threads)
endforeach()
# --- Install examples ---

View File

@@ -5,7 +5,7 @@
# ---------------------------------------------------------------------------
# This file is part of the "sockpp" C++ socket library.
#
# Copyright (c) 2017-2023 Frank Pagliughi
# Copyright (c) 2017-2024 Frank Pagliughi
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
@@ -36,73 +36,130 @@
# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
# ---------------------------------------------------------------------------
add_library(sockpp-objs OBJECT
acceptor.cpp
connector.cpp
datagram_socket.cpp
error.cpp
inet_address.cpp
inet6_address.cpp
socket.cpp
stream_socket.cpp
include(GenerateExportHeader)
# The common sources.
# Additional files are added below, as configured.
set(SOURCES
acceptor.cpp
connector.cpp
datagram_socket.cpp
error.cpp
inet_address.cpp
inet6_address.cpp
socket.cpp
stream_socket.cpp
)
# Additional sources (platform & config)
if(UNIX)
target_sources(sockpp-objs PUBLIC
${CMAKE_CURRENT_SOURCE_DIR}/unix/unix_address.cpp
)
if(SOCKPP_WITH_CAN)
target_sources(sockpp-objs PUBLIC
${CMAKE_CURRENT_SOURCE_DIR}/linux/can_address.cpp
${CMAKE_CURRENT_SOURCE_DIR}/linux/can_socket.cpp
)
endif()
list(APPEND SOURCES
${CMAKE_CURRENT_SOURCE_DIR}/unix/unix_address.cpp
)
if(SOCKPP_WITH_CAN)
list(APPEND SOURCES
${CMAKE_CURRENT_SOURCE_DIR}/linux/can_address.cpp
${CMAKE_CURRENT_SOURCE_DIR}/linux/can_socket.cpp
)
endif()
endif()
# Secure TLS library, is one selected
if(SOCKPP_WITH_OPENSSL)
target_sources(sockpp-objs PUBLIC
${CMAKE_CURRENT_SOURCE_DIR}/tls/openssl_context.cpp
${CMAKE_CURRENT_SOURCE_DIR}/tls/openssl_socket.cpp
${CMAKE_CURRENT_SOURCE_DIR}/tls/openssl_error.cpp
)
target_link_libraries(sockpp-objs
PUBLIC
OpenSSL::SSL
OpenSSL::Crypto
)
list(APPEND SOURCES
${CMAKE_CURRENT_SOURCE_DIR}/tls/openssl_context.cpp
${CMAKE_CURRENT_SOURCE_DIR}/tls/openssl_socket.cpp
${CMAKE_CURRENT_SOURCE_DIR}/tls/openssl_error.cpp
)
elseif(SOCKPP_WITH_MBEDTLS)
target_sources(sockpp-objs PUBLIC
${CMAKE_CURRENT_SOURCE_DIR}/tls/mbedtls_context.cpp
${CMAKE_CURRENT_SOURCE_DIR}/tls/mbedtls_socket.cpp
${CMAKE_CURRENT_SOURCE_DIR}/tls/mbedtls_error.cpp
)
target_link_libraries(sockpp-objs
PUBLIC
MbedTLS::mbedtls
MbedTLS::mbedcrypto
MbedTLS::mbedx509
)
list(APPEND SOURCES
${CMAKE_CURRENT_SOURCE_DIR}/tls/mbedtls_context.cpp
${CMAKE_CURRENT_SOURCE_DIR}/tls/mbedtls_socket.cpp
${CMAKE_CURRENT_SOURCE_DIR}/tls/mbedtls_error.cpp
)
endif()
# -- The shared library (if configured) ---
set_target_properties(sockpp-objs PROPERTIES POSITION_INDEPENDENT_CODE 1)
if(${SOCKPP_BUILD_SHARED})
message(STATUS "Creating shared library")
target_include_directories(sockpp-objs
PUBLIC
$<BUILD_INTERFACE:${SOCKPP_INCLUDE_DIR}>
$<INSTALL_INTERFACE:include>
PRIVATE
${SOCKPP_GENERATED_DIR}/include
${CMAKE_SOURCE_DIR}/src
)
add_library(sockpp-shared SHARED ${SOURCES})
# --- Warnings ---
add_library(Sockpp::sockpp-shared ALIAS sockpp-shared)
add_library(Sockpp::sockpp ALIAS sockpp-shared)
target_compile_options(sockpp-objs PRIVATE
$<$<CXX_COMPILER_ID:MSVC>:/W3>
$<$<CXX_COMPILER_ID:Clang>:-Wall -Wextra -Wpedantic -Wdocumentation>
$<$<NOT:$<OR:$<CXX_COMPILER_ID:MSVC>,$<CXX_COMPILER_ID:Clang>>>:-Wall -Wextra -Wpedantic>
)
set_target_properties(sockpp-shared PROPERTIES
OUTPUT_NAME sockpp
VERSION ${PROJECT_VERSION}
SOVERSION ${PROJECT_VERSION_MAJOR}
)
generate_export_header(sockpp-shared
BASE_NAME sockpp
EXPORT_FILE_NAME ${SOCKPP_GENERATED_DIR}/include/sockpp/export.h
)
endif()
# -- The static library (if configured) ---
if(${SOCKPP_BUILD_STATIC})
message(STATUS "Creating static library")
add_library(sockpp-static STATIC ${SOURCES})
add_library(Sockpp::sockpp-static ALIAS sockpp-static)
if(${SOCKPP_BUILD_SHARED})
target_compile_definitions(sockpp-static PRIVATE SOCKPP_STATIC_DEFINE)
else()
add_library(Sockpp::sockpp ALIAS sockpp-static)
generate_export_header(sockpp-static
BASE_NAME sockpp
EXPORT_FILE_NAME ${SOCKPP_GENERATED_DIR}/include/sockpp/export.h
)
endif()
# On *nix systems, the static library can have the same base filename
# as the shared library, thus 'libsockpp.a' for the static lib.
# On Windows they need different names to tell the static lib from the
# DLL import library.
if(UNIX)
set_target_properties(sockpp-static PROPERTIES OUTPUT_NAME sockpp)
endif()
endif()
foreach(TARGET ${SOCKPP_TARGETS})
target_include_directories(${TARGET} PUBLIC
$<BUILD_INTERFACE:${SOCKPP_INCLUDE_DIR}>
$<BUILD_INTERFACE:${SOCKPP_GENERATED_DIR}/include>
$<INSTALL_INTERFACE:include>
)
target_link_libraries(${TARGET} PUBLIC ${LIBS_SYSTEM})
# Secure TLS library (if one is configured)
if(SOCKPP_WITH_OPENSSL)
target_link_libraries(${TARGET} PUBLIC
OpenSSL::SSL
OpenSSL::Crypto
)
elseif(SOCKPP_WITH_MBEDTLS)
target_link_libraries(${TARGET} PUBLIC
MbedTLS::mbedtls
MbedTLS::mbedcrypto
MbedTLS::mbedx509
)
endif()
# --- Warnings ---
target_compile_options(${TARGET} PRIVATE
$<$<CXX_COMPILER_ID:MSVC>:/W3>
$<$<CXX_COMPILER_ID:Clang>:-Wall -Wextra -Wpedantic -Wdocumentation>
$<$<NOT:$<OR:$<CXX_COMPILER_ID:MSVC>,$<CXX_COMPILER_ID:Clang>>>:-Wall -Wextra -Wpedantic>
)
endforeach()

View File

@@ -38,10 +38,6 @@
# ----- Mbed TLS -----
#target_sources(sockpp-objs PUBLIC
# ${CMAKE_CURRENT_SOURCE_DIR}/mbedtls/mbedtls_context.cpp
#)
# ----- OpenSSL -----

View File

@@ -54,49 +54,39 @@ find_package(Threads REQUIRED)
# --- Executables ---
add_executable(unit_tests
unit_tests.cpp
test_inet_address.cpp
test_inet6_address.cpp
test_socket.cpp
test_sock_address.cpp
test_stream_socket.cpp
test_tcp_socket.cpp
test_datagram_socket.cpp
test_acceptor.cpp
test_connector.cpp
test_result.cpp
unit_tests.cpp
test_inet_address.cpp
test_inet6_address.cpp
test_socket.cpp
test_sock_address.cpp
test_stream_socket.cpp
test_tcp_socket.cpp
test_datagram_socket.cpp
test_acceptor.cpp
test_connector.cpp
test_result.cpp
)
if(UNIX)
target_sources(unit_tests
PUBLIC
${CMAKE_CURRENT_SOURCE_DIR}/test_unix_address.cpp
${CMAKE_CURRENT_SOURCE_DIR}/test_unix_stream_socket.cpp
${CMAKE_CURRENT_SOURCE_DIR}/test_unix_dgram_socket.cpp
)
target_sources(unit_tests PUBLIC
${CMAKE_CURRENT_SOURCE_DIR}/test_unix_address.cpp
${CMAKE_CURRENT_SOURCE_DIR}/test_unix_stream_socket.cpp
${CMAKE_CURRENT_SOURCE_DIR}/test_unix_dgram_socket.cpp
)
endif()
if(SOCKPP_WITH_CAN)
target_sources(unit_tests
PUBLIC
${CMAKE_CURRENT_SOURCE_DIR}/test_can_address.cpp
)
target_sources(unit_tests PUBLIC
${CMAKE_CURRENT_SOURCE_DIR}/test_can_address.cpp
)
endif()
target_include_directories(unit_tests
PUBLIC
${SOCKPP_INCLUDE_DIR}
PRIVATE
${SOCKPP_GENERATED_DIR}/include
${CMAKE_CURRENT_SOURCE_DIR}
)
# --- Link for executables ---
target_link_libraries(unit_tests
${SOCKPP_LIB}
Catch2::Catch2
Threads::Threads
Sockpp::sockpp
Catch2::Catch2
Threads::Threads
)
include(CTest)