From c426afce67cfd4fd037a377be2b842aefa24cbd3 Mon Sep 17 00:00:00 2001 From: Max Wash Date: Thu, 19 Feb 2026 19:25:44 +0000 Subject: [PATCH] cmake: templates: add support for builting shared and static versions of a library --- cmake/Templates.cmake | 164 +++++++++++++++++++++++++++++++++--------- 1 file changed, 132 insertions(+), 32 deletions(-) diff --git a/cmake/Templates.cmake b/cmake/Templates.cmake index 5fa534a..3ef4eaa 100644 --- a/cmake/Templates.cmake +++ b/cmake/Templates.cmake @@ -1,6 +1,6 @@ function(rosetta_add_executable) set(options) - set(one_value_args NAME SYSROOT_PATH) + set(one_value_args NAME) set(multi_value_args SUBDIRS EXTRA_SOURCES) @@ -33,11 +33,77 @@ function(rosetta_add_executable) endfunction(rosetta_add_executable) function(rosetta_add_library) - set(options SHARED) - set(one_value_args NAME SYSROOT_PATH) + set(options STATIC SHARED) + set(one_value_args NAME) set(multi_value_args - SOURCE_DIRS - EXTRA_SOURCES) + PUBLIC_INCLUDE_DIRS + SOURCES + HEADERS) + cmake_parse_arguments(PARSE_ARGV 0 arg + "${options}" + "${one_value_args}" + "${multi_value_args}") + + set(lib_name ${arg_NAME}) + set(targets) + + if ((NOT ${arg_STATIC}) AND (NOT ${arg_SHARED})) + message(FATAL_ERROR "rosetta_add_library(${arg_NAME}): must specified SHARED and/or STATIC") + endif () + + set(static_lib_name ${lib_name}) + set(shared_lib_name ${lib_name}) + + if (${arg_STATIC} AND ${arg_SHARED}) + set(static_lib_name ${lib_name}-static) + endif () + + message(STATUS "Building library ${lib_name}") + if (${arg_STATIC}) + add_library(${static_lib_name} STATIC + ${arg_SOURCES} + ${arg_HEADERS}) + set(targets ${targets} ${static_lib_name}) + + if (arg_PUBLIC_INCLUDE_DIRS) + meta_target_add_header_directory( + TARGET ${static_lib_name} + PATH ${arg_PUBLIC_INCLUDE_DIRS}) + endif () + endif() + + if (${arg_SHARED}) + add_library(${shared_lib_name} SHARED + ${arg_SOURCES} + ${arg_HEADERS}) + set(targets ${targets} ${shared_lib_name}) + set(soname ${shared_lib_name}.so) + + if (arg_PUBLIC_INCLUDE_DIRS) + meta_target_add_header_directory( + TARGET ${shared_lib_name} + PATH ${arg_PUBLIC_INCLUDE_DIRS}) + endif () + + set_target_properties(${shared_lib_name} PROPERTIES + SOVERSION 1) + target_link_options(${shared_lib_name} PRIVATE -Wl,--soname,${soname}) + endif() + + target_include_directories(${targets} PUBLIC ${arg_PUBLIC_INCLUDE_DIRS}) + set_target_properties(${targets} PROPERTIES + POSITION_INDEPENDENT_CODE ON + src_header_dir ${CMAKE_CURRENT_SOURCE_DIR}/include + PREFIX "") +endfunction(rosetta_add_library) + +function(rosetta_add_object_library) + set(options) + set(one_value_args NAME) + set(multi_value_args + PUBLIC_INCLUDE_DIRS + SOURCES + HEADERS) cmake_parse_arguments(PARSE_ARGV 0 arg "${options}" "${one_value_args}" @@ -45,36 +111,70 @@ function(rosetta_add_library) set(lib_name ${arg_NAME}) - get_property(libs GLOBAL PROPERTY rosetta_library_list) - set_property(GLOBAL PROPERTY rosetta_library_list ${libs} ${lib_name}) - - file(GLOB sources *.c *.h) - file(GLOB_RECURSE headers include/*.h) - - foreach (dir ${arg_SOURCE_DIRS}) - file(GLOB dir_sources ${dir}/*.c ${dir}/*.h) - set(sources ${sources} ${dir_sources}) - endforeach (dir) - message(STATUS "Building library ${lib_name}") - if (arg_SHARED) - add_library(${lib_name} SHARED - ${sources} - ${headers} - ${arg_EXTRA_SOURCES}) - else () - add_library(${lib_name} STATIC - ${sources} - ${headers} - ${arg_EXTRA_SOURCES}) - endif () + add_library(${lib_name} OBJECT + ${arg_SOURCES} + ${arg_HEADERS}) - target_include_directories(${lib_name} PUBLIC - ${CMAKE_CURRENT_SOURCE_DIR}/include) + target_include_directories(${lib_name} PUBLIC ${arg_PUBLIC_INCLUDE_DIRS}) set_target_properties(${lib_name} PROPERTIES POSITION_INDEPENDENT_CODE ON src_header_dir ${CMAKE_CURRENT_SOURCE_DIR}/include - sys_header_dir ${arg_SYSROOT_PATH}/include - sys_bin_dir ${arg_SYSROOT_PATH}/lib PREFIX "") -endfunction(rosetta_add_library) +endfunction(rosetta_add_object_library) + +function(rosetta_wrap_library) + set(options) + set(one_value_args NAME) + set(multi_value_args + PUBLIC_INCLUDE_DIRS) + cmake_parse_arguments(PARSE_ARGV 0 arg + "${options}" + "${one_value_args}" + "${multi_value_args}") + + set(lib_name ${arg_NAME}) + + message(STATUS "Building library ${lib_name}") + + if (arg_PUBLIC_INCLUDE_DIRS) + meta_target_add_header_directory( + TARGET ${lib_name} + PATH ${arg_PUBLIC_INCLUDE_DIRS}) + endif () + + set_target_properties(${lib_name} PROPERTIES + POSITION_INDEPENDENT_CODE ON + src_header_dir ${CMAKE_CURRENT_SOURCE_DIR}/include + PREFIX "") +endfunction(rosetta_wrap_library) + +function(rosetta_add_object_library) + set(options) + set(one_value_args NAME) + set(multi_value_args + PUBLIC_INCLUDE_DIRS + SOURCES + HEADERS) + cmake_parse_arguments(PARSE_ARGV 0 arg + "${options}" + "${one_value_args}" + "${multi_value_args}") + + set(lib_name ${arg_NAME}) + + message(STATUS "Building library ${lib_name}") + add_library(${lib_name} OBJECT + ${arg_SOURCES} + ${arg_HEADERS}) + #add_library(${lib_name} STATIC + # ${sources} + # ${headers} + # ${arg_EXTRA_SOURCES}) + + target_include_directories(${lib_name} PUBLIC ${arg_PUBLIC_INCLUDE_DIRS}) + set_target_properties(${lib_name} PROPERTIES + POSITION_INDEPENDENT_CODE ON + src_header_dir ${CMAKE_CURRENT_SOURCE_DIR}/include + PREFIX "") +endfunction(rosetta_add_object_library)