Add options ENABLE_STATIC and ENABLE_SHARED.

Stick a cautious toe in the water of CMake options, and add enabling/disabling shared/static library builds, because that's easy.
This commit is contained in:
Jim Hague 2019-10-24 10:51:28 +01:00
parent d447999c60
commit 60eb113770
1 changed files with 78 additions and 62 deletions

View File

@ -110,6 +110,12 @@ else ()
endif () endif ()
# Options. # Options.
option(ENABLE_SHARED "build shared libraries" ON)
option(ENABLE_STATIC "build static libraries" ON)
if ((NOT ENABLE_SHARED) AND (NOT ENABLE_STATIC))
message(FATAL_ERROR "You must build either static or shared libraries.")
endif ()
set(DNSSEC_ROADBLOCK_AVOIDANCE 1) # Nail on, as build fails if off. set(DNSSEC_ROADBLOCK_AVOIDANCE 1) # Nail on, as build fails if off.
set(STUB_NATIVE_DNSSEC 1) # Nail on for now. set(STUB_NATIVE_DNSSEC 1) # Nail on for now.
set(MAXIMUM_UPSTREAM_OPTION_SPACE 3000) set(MAXIMUM_UPSTREAM_OPTION_SPACE 3000)
@ -465,42 +471,49 @@ set_property(TARGET getdns_objects PROPERTY POSITION_INDEPENDENT_CODE 1)
set_property(TARGET getdns_objects PROPERTY C_STANDARD 11) set_property(TARGET getdns_objects PROPERTY C_STANDARD 11)
# Static library version of main library. # Static library version of main library.
add_library(getdns STATIC $<TARGET_OBJECTS:getdns_objects>) if (ENABLE_STATIC)
target_include_directories(getdns PUBLIC add_library(getdns STATIC $<TARGET_OBJECTS:getdns_objects>)
target_include_directories(getdns PUBLIC
"$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/src>" "$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/src>"
) )
target_link_libraries(getdns target_link_libraries(getdns
PUBLIC PUBLIC
OpenSSL::SSL OpenSSL::SSL
OpenSSL::Crypto OpenSSL::Crypto
Threads::Threads Threads::Threads
${getdns_system_libs} ${getdns_system_libs}
) )
set_target_properties(getdns PROPERTIES OUTPUT_NAME getdns${static_lib_suffix}) set_target_properties(getdns PROPERTIES OUTPUT_NAME getdns${static_lib_suffix})
endif ()
# Shared library version of main library. # Shared library version of main library.
add_library(getdns_shared SHARED $<TARGET_OBJECTS:getdns_objects>) if (ENABLE_SHARED)
target_include_directories(getdns_shared PUBLIC add_library(getdns_shared SHARED $<TARGET_OBJECTS:getdns_objects>)
target_include_directories(getdns_shared PUBLIC
"$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/src>" "$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/src>"
) )
target_link_libraries(getdns_shared target_link_libraries(getdns_shared
PUBLIC PUBLIC
OpenSSL::SSL OpenSSL::SSL
OpenSSL::Crypto OpenSSL::Crypto
Threads::Threads Threads::Threads
${getdns_system_libs} ${getdns_system_libs}
) )
set_target_properties(getdns_shared PROPERTIES OUTPUT_NAME getdns) set_target_properties(getdns_shared PROPERTIES OUTPUT_NAME getdns)
# Generate platform-specific link file with the export symbols. if (NOT ENABLE_STATIC)
file(STRINGS src/libgetdns.symbols symbols) add_library(getdns ALIAS getdns_shared)
if (WIN32) endif ()
# Generate platform-specific link file with the export symbols.
file(STRINGS src/libgetdns.symbols symbols)
if (WIN32)
file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/getdns.def" "LIBRARY GETDNS\n VERSION ${GETDNS_VERSION_CURRENT}.${GETDNS_VERSION_REVISION}\n EXPORTS\n") file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/getdns.def" "LIBRARY GETDNS\n VERSION ${GETDNS_VERSION_CURRENT}.${GETDNS_VERSION_REVISION}\n EXPORTS\n")
foreach (symbol IN LISTS symbols) foreach (symbol IN LISTS symbols)
file(APPEND "${CMAKE_CURRENT_BINARY_DIR}/getdns.def" " ${symbol}\n") file(APPEND "${CMAKE_CURRENT_BINARY_DIR}/getdns.def" " ${symbol}\n")
endforeach () endforeach ()
target_sources(getdns_shared PRIVATE "${CMAKE_CURRENT_BINARY_DIR}/getdns.def") target_sources(getdns_shared PRIVATE "${CMAKE_CURRENT_BINARY_DIR}/getdns.def")
elseif (APPLE) elseif (APPLE)
file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/getdns.syms" "") file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/getdns.syms" "")
foreach (symbol IN LISTS symbols) foreach (symbol IN LISTS symbols)
file(APPEND "${CMAKE_CURRENT_BINARY_DIR}/getdns.syms" "_${symbol}\n") file(APPEND "${CMAKE_CURRENT_BINARY_DIR}/getdns.syms" "_${symbol}\n")
@ -515,7 +528,7 @@ elseif (APPLE)
set_target_properties(getdns_shared PROPERTIES VERSION "${dynlib_version}") set_target_properties(getdns_shared PROPERTIES VERSION "${dynlib_version}")
target_link_libraries(getdns_shared PRIVATE "-compatibility_version ${major_version}") target_link_libraries(getdns_shared PRIVATE "-compatibility_version ${major_version}")
target_link_libraries(getdns_shared PRIVATE "-current_version ${major_version}.${GETDNS_VERSION_REVISION}") target_link_libraries(getdns_shared PRIVATE "-current_version ${major_version}.${GETDNS_VERSION_REVISION}")
else () else ()
# Assume GNU ld. # Assume GNU ld.
file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/getdns.ver" "{ global:\n") file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/getdns.ver" "{ global:\n")
foreach (symbol IN LISTS symbols) foreach (symbol IN LISTS symbols)
@ -527,6 +540,7 @@ else ()
# Again, follow libtool. Major version is current-age. # Again, follow libtool. Major version is current-age.
math(EXPR compat_version "${GETDNS_VERSION_CURRENT}-${GETDNS_VERSION_AGE}") math(EXPR compat_version "${GETDNS_VERSION_CURRENT}-${GETDNS_VERSION_AGE}")
set_target_properties(getdns_shared PROPERTIES VERSION "${compat_version}.${GETDNS_VERSION_AGE}.${GETDNS_VERSION_REVISION}" SOVERSION "${compat_version}") set_target_properties(getdns_shared PROPERTIES VERSION "${compat_version}.${GETDNS_VERSION_AGE}.${GETDNS_VERSION_REVISION}" SOVERSION "${compat_version}")
endif ()
endif () endif ()
@ -635,11 +649,13 @@ set(prefix ${CMAKE_INSTALL_PREFIX})
configure_file(getdns.pc.in getdns.pc @ONLY) configure_file(getdns.pc.in getdns.pc @ONLY)
# Installing. # Installing.
install(TARGETS getdns getdns_shared getdns_query getdns_server_mon if (ENABLE_STATIC)
RUNTIME DESTINATION bin install(TARGETS getdns LIBRARY DESTINATION lib ARCHIVE DESTINATION lib)
LIBRARY DESTINATION lib endif ()
ARCHIVE DESTINATION lib if (ENABLE_SHARED)
) install(TARGETS getdns_shared LIBRARY DESTINATION lib ARCHIVE DESTINATION lib)
endif ()
install(TARGETS getdns_query getdns_server_mon RUNTIME DESTINATION bin)
install(DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/getdns DESTINATION include) install(DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/getdns DESTINATION include)
install(DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/man3 DESTINATION share/man) install(DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/man3 DESTINATION share/man)