diff --git a/.gitea/workflows/release.yml b/.gitea/workflows/release.yml index 0bb20a6..b405730 100644 --- a/.gitea/workflows/release.yml +++ b/.gitea/workflows/release.yml @@ -48,13 +48,7 @@ jobs: [ "$testing" = "ON" ] && ctest --test-dir "build-$name" --output-on-failure pkg="datarouter-$name" - mkdir -p "dist/$pkg" - for f in datarouter.h datarouter_config_template.h LICENSE README.md; do - if [ -f "$f" ]; then cp "$f" "dist/$pkg/"; fi - done - for f in libDataRouter.a libDataRouter.so libDataRouter.dll libDataRouter.dll.a example example.exe; do - if [ -f "build-$name/$f" ]; then cp "build-$name/$f" "dist/$pkg/"; fi - done + cmake --install "build-$name" --prefix "dist/$pkg" done - name: Create release & upload assets diff --git a/.idea/ctestState.xml b/.idea/ctestState.xml new file mode 100644 index 0000000..61d31e4 --- /dev/null +++ b/.idea/ctestState.xml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/CMakeLists.txt b/CMakeLists.txt index 81ee1eb..020b1d6 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -28,3 +28,50 @@ if(BUILD_TESTING OR NOT DEFINED BUILD_TESTING) target_link_libraries(test_datarouter DataRouter) add_test(NAME datarouter COMMAND test_datarouter) endif() + +# ======== 安装规则 ======== + +# 静态库 → lib/ +install(TARGETS DataRouter + EXPORT DataRouterTargets + ARCHIVE DESTINATION lib +) + +# 共享库 → lib/(可选) +if(TARGET DataRouter_shared) + install(TARGETS DataRouter_shared + EXPORT DataRouterTargets + ARCHIVE DESTINATION lib # .lib (Windows import lib) + LIBRARY DESTINATION lib # .so + RUNTIME DESTINATION lib # .dll + ) +endif() + +# 示例 → bin/ +if(TARGET example) + install(TARGETS example RUNTIME DESTINATION bin) +endif() + +# 头文件 → include/ +install(FILES datarouter.h DESTINATION include) + +# 文档 → share/ +install(FILES datarouter_config_template.h LICENSE DESTINATION share) +if(EXISTS ${CMAKE_SOURCE_DIR}/README.md) + install(FILES README.md DESTINATION share) +endif() + +# CMake 包配置文件 → cmake/ +set(INCLUDE_INSTALL_DIR include) +set(LIB_INSTALL_DIR lib) + +include(CMakePackageConfigHelpers) +configure_package_config_file( + cmake/DataRouterConfig.cmake.in + ${CMAKE_CURRENT_BINARY_DIR}/DataRouterConfig.cmake + INSTALL_DESTINATION cmake + PATH_VARS INCLUDE_INSTALL_DIR LIB_INSTALL_DIR +) + +install(FILES ${CMAKE_CURRENT_BINARY_DIR}/DataRouterConfig.cmake DESTINATION cmake) +install(EXPORT DataRouterTargets FILE DataRouterTargets.cmake DESTINATION cmake) diff --git a/cmake/DataRouterConfig.cmake.in b/cmake/DataRouterConfig.cmake.in new file mode 100644 index 0000000..ead61c9 --- /dev/null +++ b/cmake/DataRouterConfig.cmake.in @@ -0,0 +1,16 @@ +@PACKAGE_INIT@ + +set_and_check(DataRouter_INCLUDE_DIR "@PACKAGE_INCLUDE_INSTALL_DIR@") +set_and_check(DataRouter_LIBRARY_DIR "@PACKAGE_LIB_INSTALL_DIR@") + +include("${CMAKE_CURRENT_LIST_DIR}/DataRouterTargets.cmake" OPTIONAL) + +if(NOT TARGET DataRouter::DataRouter) + add_library(DataRouter::DataRouter STATIC IMPORTED) + set_target_properties(DataRouter::DataRouter PROPERTIES + IMPORTED_LOCATION "${DataRouter_LIBRARY_DIR}/${CMAKE_STATIC_LIBRARY_PREFIX}DataRouter${CMAKE_STATIC_LIBRARY_SUFFIX}" + INTERFACE_INCLUDE_DIRECTORIES "${DataRouter_INCLUDE_DIR}" + ) +endif() + +check_required_components(DataRouter)