cmake: templates: add support for builting shared and static versions of a library

This commit is contained in:
2026-02-19 19:25:44 +00:00
parent f5daf972a8
commit c426afce67

View File

@@ -1,6 +1,6 @@
function(rosetta_add_executable) function(rosetta_add_executable)
set(options) set(options)
set(one_value_args NAME SYSROOT_PATH) set(one_value_args NAME)
set(multi_value_args set(multi_value_args
SUBDIRS SUBDIRS
EXTRA_SOURCES) EXTRA_SOURCES)
@@ -33,11 +33,77 @@ function(rosetta_add_executable)
endfunction(rosetta_add_executable) endfunction(rosetta_add_executable)
function(rosetta_add_library) function(rosetta_add_library)
set(options SHARED) set(options STATIC SHARED)
set(one_value_args NAME SYSROOT_PATH) set(one_value_args NAME)
set(multi_value_args set(multi_value_args
SOURCE_DIRS PUBLIC_INCLUDE_DIRS
EXTRA_SOURCES) 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 cmake_parse_arguments(PARSE_ARGV 0 arg
"${options}" "${options}"
"${one_value_args}" "${one_value_args}"
@@ -45,36 +111,70 @@ function(rosetta_add_library)
set(lib_name ${arg_NAME}) 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}") message(STATUS "Building library ${lib_name}")
if (arg_SHARED) add_library(${lib_name} OBJECT
add_library(${lib_name} SHARED ${arg_SOURCES}
${sources} ${arg_HEADERS})
${headers}
${arg_EXTRA_SOURCES})
else ()
add_library(${lib_name} STATIC
${sources}
${headers}
${arg_EXTRA_SOURCES})
endif ()
target_include_directories(${lib_name} PUBLIC target_include_directories(${lib_name} PUBLIC ${arg_PUBLIC_INCLUDE_DIRS})
${CMAKE_CURRENT_SOURCE_DIR}/include)
set_target_properties(${lib_name} PROPERTIES set_target_properties(${lib_name} PROPERTIES
POSITION_INDEPENDENT_CODE ON POSITION_INDEPENDENT_CODE ON
src_header_dir ${CMAKE_CURRENT_SOURCE_DIR}/include src_header_dir ${CMAKE_CURRENT_SOURCE_DIR}/include
sys_header_dir ${arg_SYSROOT_PATH}/include
sys_bin_dir ${arg_SYSROOT_PATH}/lib
PREFIX "") 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)