From bb56ba5d47c13cb0484ddeb0596a6dfaa5d70108 Mon Sep 17 00:00:00 2001 From: Jonah Beckford <71855677+jonahbeckford@users.noreply.github.com> Date: Wed, 27 Sep 2023 14:41:10 -0700 Subject: [PATCH] Add target variants -Shared, etc. --- CHANGES.md | 2 + CMakeLists.txt | 101 ++++++++++++++++++++++++++++++++++++++++--------- 2 files changed, 86 insertions(+), 17 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index 73c5c28..2b85bd3 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -13,6 +13,8 @@ preprocessor statements in auto-generated header file. - `extendedattribute` attribute: Text in front of auto-generated functions, like `__declspec(dllexport)` +- Add target variants `CapnC::Runtime-Shared`, `CapnC::Runtime-Static` and + `CapnC::Runtime-StaticExports` ## 0.9.0 diff --git a/CMakeLists.txt b/CMakeLists.txt index 2be4eba..a4b2332 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -51,29 +51,96 @@ if(NOT BUILD_HYGIENE STREQUAL DISABLED) ${find_program_args}) endif() -add_library(CapnC_Runtime - lib/capn.c - lib/capn-malloc.c - lib/capn-stream.c - lib/capnp_c.h) -add_library(CapnC::Runtime ALIAS CapnC_Runtime) -set_target_properties(CapnC_Runtime PROPERTIES - EXPORT_NAME Runtime - POSITION_INDEPENDENT_CODE ON - WINDOWS_EXPORT_ALL_SYMBOLS ON) -target_include_directories(CapnC_Runtime - PUBLIC - $ - $ - $) +# add_runtime_library( +# NAME_SUFFIX +# [EXCLUDE_FROM_ALL] +# [MODE STATIC|STATIC_EXPORTS|SHARED] +# ) +# +# Without a MODE the library is built according to CMake conventions (BUILD_SHARED_LIBS). +# +# NAME_SUFFIX +# A suffix added to the CMake names. +# +# The target will be named `CapnC_Runtime`. +# The alias will be named `CapnC::Runtime`. +# +# EXCLUDE_FROM_ALL +# +# Do not add the library to the ALL target. +# +# MODE STATIC|STATIC_EXPORTS|SHARED +# +# STATIC +# Build a static library without export symbols, regardless of BUILD_SHARED_LIBS. +# +# STATIC_EXPORTS +# Build a static library with export symbols, regardless of BUILD_SHARED_LIBS. +# +# SHARED +# Build a shared library, regardless of BUILD_SHARED_LIBS. +function(add_runtime_library) + set(noValues EXCLUDE_FROM_ALL) + set(singleValues NAME_SUFFIX MODE) + set(multiValues) + cmake_parse_arguments(PARSE_ARGV 0 ARG "${noValues}" "${singleValues}" "${multiValues}") + + # Nice names which can be used without shadowing even in add_subdirectory() + set(C_CAPNPROTO_ALIAS CapnC::Runtime${ARG_NAME_SUFFIX}) + set(C_CAPNPROTO_TARGET CapnC_Runtime${ARG_NAME_SUFFIX}) + set(C_CAPNPROTO_EXPORTS ${BUILD_SHARED_LIBS}) + set(C_CAPNPROTO_LINKAGE) + set(PROP_EXCLUDE_FROM_ALL) + if(ARG_EXCLUDE_FROM_ALL) + set(PROP_EXCLUDE_FROM_ALL EXCLUDE_FROM_ALL) + endif() + if(NOT ARG_MODE) + elseif(ARG_MODE STREQUAL STATIC) + set(C_CAPNPROTO_EXPORTS OFF) + set(C_CAPNPROTO_LINKAGE STATIC) + elseif(ARG_MODE STREQUAL STATIC_EXPORTS) + set(C_CAPNPROTO_EXPORTS ON) + set(C_CAPNPROTO_LINKAGE STATIC) + elseif(ARG_MODE STREQUAL SHARED) + set(C_CAPNPROTO_EXPORTS ON) + set(C_CAPNPROTO_LINKAGE SHARED) + else() + message(FATAL_ERROR "No [MODE ${ARG_MODE}] is supported") + endif() + + add_library(${C_CAPNPROTO_TARGET} ${C_CAPNPROTO_LINKAGE} ${PROP_EXCLUDE_FROM_ALL} + lib/capn.c + lib/capn-malloc.c + lib/capn-stream.c + lib/capnp_c.h) + add_library(${C_CAPNPROTO_ALIAS} ALIAS ${C_CAPNPROTO_TARGET}) + set_target_properties(${C_CAPNPROTO_TARGET} PROPERTIES + EXPORT_NAME Runtime${ARG_NAME_SUFFIX} + POSITION_INDEPENDENT_CODE ON + WINDOWS_EXPORT_ALL_SYMBOLS ON) + target_include_directories(${C_CAPNPROTO_TARGET} + PUBLIC + $ + $ + $) + if(C_CAPNPROTO_EXPORTS) + set_target_properties(${C_CAPNPROTO_TARGET} PROPERTIES + WINDOWS_EXPORT_ALL_SYMBOLS ON) + endif() +endfunction() + +add_runtime_library() +add_runtime_library(NAME_SUFFIX -Shared EXCLUDE_FROM_ALL MODE SHARED) +add_runtime_library(NAME_SUFFIX -Static EXCLUDE_FROM_ALL MODE STATIC) +add_runtime_library(NAME_SUFFIX -StaticExports EXCLUDE_FROM_ALL MODE STATIC_EXPORTS) add_executable(capnpc-c compiler/capnpc-c.c compiler/schema.capnp.c compiler/str.c) -target_link_libraries(capnpc-c CapnC_Runtime) +target_link_libraries(capnpc-c CapnC::Runtime) target_include_directories(capnpc-c - PRIVATE lib) + PRIVATE lib) # Boilerplate DK CMAKE PROJ 2023-05-17.3 if(BUILD_SHARED_LIBS)