3FS/cmake/Target.cmake
2025-02-27 21:53:53 +08:00

110 lines
3.5 KiB
CMake

# Check if IPO is supported
include(CheckIPOSupported)
check_ipo_supported(RESULT HAVE_IPO)
# Enable IPO in non-debug build
macro(target_enable_ipo NAME)
if(NOT CMAKE_BUILD_TYPE_UC STREQUAL "DEBUG" AND HAVE_IPO)
set_property(TARGET ${NAME} PROPERTY INTERPROCEDURAL_OPTIMIZATION TRUE)
message (STATUS "Enabled IPO for target: ${NAME}")
endif()
endmacro()
macro(target_add_lib NAME)
file(GLOB_RECURSE FILES CONFIGURE_DEPENDS RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} "*.cc" "*.h")
add_library(${NAME} STATIC ${FILES} ${FBS_FILES})
target_include_directories(${NAME}
PUBLIC
$<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/src>
${PROJECT_SOURCE_DIR}
${PROJECT_BINARY_DIR}/src
${PROJECT_BINARY_DIR}
)
target_link_libraries(${NAME} ${ARGN} "")
endmacro()
macro(target_add_shared_lib NAME)
file(GLOB_RECURSE FILES CONFIGURE_DEPENDS RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} "*.cc" "*.h")
add_library(${NAME} SHARED ${FILES} ${FBS_FILES})
target_include_directories(${NAME}
PUBLIC
$<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/src>
${PROJECT_SOURCE_DIR}
${PROJECT_BINARY_DIR}/src
${PROJECT_BINARY_DIR}
)
target_link_libraries(${NAME} ${ARGN} "")
target_enable_ipo(${NAME})
endmacro()
macro(target_add_bin NAME MAIN_FILE)
add_executable(${NAME} ${MAIN_FILE})
target_link_libraries(${NAME} ${ARGN} "")
target_include_directories(${NAME}
PUBLIC
$<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/src>
${PROJECT_SOURCE_DIR}
${PROJECT_SOURCE_DIR}/src/lib/api
${PROJECT_BINARY_DIR}/src
${PROJECT_BINARY_DIR}
)
set_target_properties(${NAME} PROPERTIES RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin")
target_enable_ipo(${NAME})
endmacro()
macro(target_add_test NAME)
file(GLOB_RECURSE FILES CONFIGURE_DEPENDS RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} "*.cc")
add_executable(${NAME} ${FILES})
target_link_libraries(${NAME} gmock test_main ${ARGN} "")
target_include_directories(${NAME}
PUBLIC
$<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/src>
${PROJECT_SOURCE_DIR}
${PROJECT_BINARY_DIR}/src
${PROJECT_BINARY_DIR}
)
add_test(NAME ${NAME} COMMAND ${NAME})
set_target_properties(${NAME} PROPERTIES RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/tests")
endmacro()
macro(target_add_fbs NAME PATH)
cmake_parse_arguments(FBS "SERVICE" "" "DEPS" ${ARGN})
message("Fbs " ${NAME} " FBS_SERVICE " ${FBS_SERVICE} " ARGN " ${ARGN})
set(FLATBUFFERS_FLATC_SCHEMA_EXTRA_ARGS
--scoped-enums
--gen-object-api
--gen-mutable
--gen-compare
--cpp-std=c++17
--python
--hf3fs
--keep-prefix
)
get_filename_component(NAME_WE ${PATH} NAME_WE)
get_filename_component(DIR ${PATH} DIRECTORY)
build_flatbuffers(${PATH}
"${CMAKE_CURRENT_SOURCE_DIR}/${DIR};${CMAKE_SOURCE_DIR}/src"
"${NAME_WE}-generated"
""
"${CMAKE_CURRENT_BINARY_DIR}/${DIR}"
""
""
)
add_library(${NAME} INTERFACE)
target_link_libraries(${NAME} INTERFACE common)
target_include_directories(${NAME}
INTERFACE
$<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/src>
${PROJECT_SOURCE_DIR}
${PROJECT_BINARY_DIR}/src
${PROJECT_BINARY_DIR}
)
add_dependencies(${NAME} "${NAME_WE}-generated" ${FBS_DEPS})
endmacro()