cmake: templates: add support for builting shared and static versions of a library
This commit is contained in:
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user