diff --git a/CMakeLists.txt b/CMakeLists.txt index 2c4c97382..736502b34 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -196,3 +196,24 @@ find_package(Threads REQUIRED) add_subdirectory(src/spider) add_subdirectory(tests) + +include(CMakePackageConfigHelpers) + +configure_package_config_file( + ${CMAKE_CURRENT_SOURCE_DIR}/cmake/Config.cmake.in + ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}Config.cmake + INSTALL_DESTINATION share/cmake/${PROJECT_NAME} +) + +write_basic_package_version_file( + ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}ConfigVersion.cmake + VERSION ${PROJECT_VERSION} + COMPATIBILITY SameMajorVersion +) + +install( + FILES + ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}Config.cmake + ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}ConfigVersion.cmake + DESTINATION share/cmake/${PROJECT_NAME} +) diff --git a/cmake/Config.cmake.in b/cmake/Config.cmake.in new file mode 100644 index 000000000..b9d3190e6 --- /dev/null +++ b/cmake/Config.cmake.in @@ -0,0 +1,25 @@ +@PACKAGE_INIT@ + +include(CMakeFindDependencyMacro) + +find_package(Boost 1.74 REQUIRED COMPONENTS headers process program_options filesystem system) +find_package(fmt 8.0.1 REQUIRED) +find_package(spdlog 1.9.2 REQUIRED) +find_package(MariaDBClientCpp 1.0 REQUIRED) +find_package(msgpack-cxx 7.0.0 REQUIRED) +find_package(outcome REQUIRED) +find_package(absl REQUIRED) +find_package(Threads REQUIRED) + +if(NOT DEFINED SPIDER_YSTDLIB_SOURCE_DIRECTORY) + message(FATAL_ERROR "SPIDER_YSTDLIB_SOURCE_DIRECTORY must be set to use spider") +endif() + +add_subdirectory( + "${SPIDER_YSTDLIB_SOURCE_DIRECTORY}" + "${CMAKE_BINARY_DIR}/ystdlib" + EXCLUDE_FROM_ALL +) + +include("${CMAKE_CURRENT_LIST_DIR}/spider_core_export.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/spider_client_export.cmake") diff --git a/cmake/Modules/FindMariaDBClientCpp.cmake b/cmake/Modules/FindMariaDBClientCpp.cmake index 86f7250c6..da1a12da8 100644 --- a/cmake/Modules/FindMariaDBClientCpp.cmake +++ b/cmake/Modules/FindMariaDBClientCpp.cmake @@ -13,7 +13,7 @@ set(mariadbclientcpp_LIBNAME "mariadbcpp") -include(cmake/Modules/FindLibraryDependencies.cmake) +include(${CMAKE_CURRENT_LIST_DIR}/FindLibraryDependencies.cmake) # Run pkg-config find_package(PkgConfig) diff --git a/examples/quick-start/CMakeLists.txt b/examples/quick-start/CMakeLists.txt index 1173f89c5..9fc69d667 100644 --- a/examples/quick-start/CMakeLists.txt +++ b/examples/quick-start/CMakeLists.txt @@ -1,13 +1,9 @@ cmake_minimum_required(VERSION 3.22.1) project(spider_getting_started) -if(PROJECT_IS_TOP_LEVEL) - # Include dependency settings if the project isn't being included as a subproject. - include("${CMAKE_SOURCE_DIR}/../../build/deps/cmake-settings/all.cmake") -endif() - -# Add the Spider library -add_subdirectory(../../ spider EXCLUDE_FROM_ALL) +include("../../build/deps/cmake-settings/all.cmake") +set(SPIDER_YSTDLIB_SOURCE_DIRECTORY "../../build/deps/ystdlib/ystdlib-src") +find_package(spider REQUIRED) # Add the tasks library add_library( @@ -18,7 +14,7 @@ add_library( ) # Link the Spider library to the tasks library -target_link_libraries(tasks PRIVATE spider::spider) +target_link_libraries(tasks PRIVATE spider::spider_client) # Add the client add_executable(client src/client.cpp) @@ -27,6 +23,6 @@ add_executable(client src/client.cpp) target_link_libraries( client PRIVATE - spider::spider + spider::spider_client tasks ) diff --git a/src/spider/CMakeLists.txt b/src/spider/CMakeLists.txt index b3f92f4ab..90d229072 100644 --- a/src/spider/CMakeLists.txt +++ b/src/spider/CMakeLists.txt @@ -43,7 +43,13 @@ set(SPIDER_CORE_HEADERS add_library(spider_core) target_sources(spider_core PRIVATE ${SPIDER_CORE_SOURCES}) -target_sources(spider_core PUBLIC ${SPIDER_CORE_HEADERS}) +target_sources(spider_core PRIVATE ${SPIDER_CORE_HEADERS}) +target_include_directories( + spider_core + PUBLIC + $ + $ +) target_link_libraries( spider_core PUBLIC @@ -55,6 +61,75 @@ target_link_libraries( ystdlib::error_handling ) target_link_libraries(spider_core PRIVATE fmt::fmt) +add_library(${PROJECT_NAME}::spider_core ALIAS spider_core) + +install( + FILES + ${CMAKE_CURRENT_SOURCE_DIR}/core/Error.hpp + ${CMAKE_CURRENT_SOURCE_DIR}/core/Data.hpp + ${CMAKE_CURRENT_SOURCE_DIR}/core/Driver.hpp + ${CMAKE_CURRENT_SOURCE_DIR}/core/KeyValueData.hpp + ${CMAKE_CURRENT_SOURCE_DIR}/core/Task.hpp + ${CMAKE_CURRENT_SOURCE_DIR}/core/TaskGraph.hpp + ${CMAKE_CURRENT_SOURCE_DIR}/core/JobMetadata.hpp + DESTINATION include/${PROJECT_NAME}/core +) + +install( + FILES + ${CMAKE_CURRENT_SOURCE_DIR}/io/BoostAsio.hpp + ${CMAKE_CURRENT_SOURCE_DIR}/io/MsgPack.hpp + ${CMAKE_CURRENT_SOURCE_DIR}/io/msgpack_message.hpp + ${CMAKE_CURRENT_SOURCE_DIR}/io/Serializer.hpp + DESTINATION include/${PROJECT_NAME}/io +) + +install( + FILES + ${CMAKE_CURRENT_SOURCE_DIR}/utils/LruCache.hpp + DESTINATION include/${PROJECT_NAME}/utils +) + +install( + FILES + ${CMAKE_CURRENT_SOURCE_DIR}/storage/MetadataStorage.hpp + ${CMAKE_CURRENT_SOURCE_DIR}/storage/DataStorage.hpp + ${CMAKE_CURRENT_SOURCE_DIR}/storage/StorageConnection.hpp + ${CMAKE_CURRENT_SOURCE_DIR}/storage/mysql/mysql_stmt.hpp + ${CMAKE_CURRENT_SOURCE_DIR}/storage/mysql/MySqlConnection.hpp + ${CMAKE_CURRENT_SOURCE_DIR}/storage/mysql/MySqlStorageFactory.hpp + ${CMAKE_CURRENT_SOURCE_DIR}/storage/mysql/MySqlStorage.hpp + ${CMAKE_CURRENT_SOURCE_DIR}/storage/mysql/MySqlJobSubmissionBatch.hpp + ${CMAKE_CURRENT_SOURCE_DIR}/storage/JobSubmissionBatch.hpp + ${CMAKE_CURRENT_SOURCE_DIR}/storage/StorageFactory.hpp + DESTINATION include/${PROJECT_NAME}/storage +) + +install( + FILES + ${CMAKE_CURRENT_SOURCE_DIR}/worker/FunctionManager.hpp + ${CMAKE_CURRENT_SOURCE_DIR}/worker/FunctionNameManager.hpp + ${CMAKE_CURRENT_SOURCE_DIR}/worker/TaskExecutorMessage.hpp + DESTINATION include/${PROJECT_NAME}/worker +) + +install(TARGETS spider_core EXPORT spider_core_export) + +install( + EXPORT spider_core_export + FILE spider_core_export.cmake + NAMESPACE ${PROJECT_NAME}:: + DESTINATION share/cmake/${PROJECT_NAME} +) + +install(TARGETS error_handling EXPORT ystdlib_error_handling_export) + +install( + EXPORT ystdlib_error_handling_export + FILE ystdlib_error_handling_export.cmake + NAMESPACE ystdlib:: + DESTINATION share/cmake/ystdlib +) set(SPIDER_WORKER_SOURCES worker/ChildPid.hpp @@ -175,8 +250,13 @@ set(SPIDER_CLIENT_SHARED_HEADERS add_library(spider_client) target_sources(spider_client PRIVATE ${SPIDER_CLIENT_SHARED_SOURCES}) -target_sources(spider_client PUBLIC ${SPIDER_CLIENT_SHARED_HEADERS}) -target_include_directories(spider_client PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/..) +target_sources(spider_client PRIVATE ${SPIDER_CLIENT_SHARED_HEADERS}) +target_include_directories( + spider_client + PUBLIC + $ + $ +) target_link_libraries( spider_client PUBLIC @@ -186,4 +266,35 @@ target_link_libraries( fmt::fmt ) -add_library(spider::spider ALIAS spider_client) +add_library(${PROJECT_NAME}::spider ALIAS spider_client) + +install( + FILES + ${CMAKE_CURRENT_SOURCE_DIR}/client/Data.hpp + ${CMAKE_CURRENT_SOURCE_DIR}/client/Driver.hpp + ${CMAKE_CURRENT_SOURCE_DIR}/client/Job.hpp + ${CMAKE_CURRENT_SOURCE_DIR}/client/task.hpp + ${CMAKE_CURRENT_SOURCE_DIR}/client/spider.hpp + ${CMAKE_CURRENT_SOURCE_DIR}/client/TaskContext.hpp + ${CMAKE_CURRENT_SOURCE_DIR}/client/TaskGraph.hpp + ${CMAKE_CURRENT_SOURCE_DIR}/client/type_utils.hpp + ${CMAKE_CURRENT_SOURCE_DIR}/client/Exception.hpp + DESTINATION include/${PROJECT_NAME}/client +) + +install( + FILES + ${CMAKE_CURRENT_SOURCE_DIR}/core/DataImpl.hpp + ${CMAKE_CURRENT_SOURCE_DIR}/core/TaskContextImpl.hpp + ${CMAKE_CURRENT_SOURCE_DIR}/core/TaskGraphImpl.hpp + DESTINATION include/${PROJECT_NAME}/core +) + +install(TARGETS spider_client EXPORT spider_client_export) + +install( + EXPORT spider_client_export + FILE spider_client_export.cmake + NAMESPACE ${PROJECT_NAME}:: + DESTINATION share/cmake/${PROJECT_NAME} +) diff --git a/taskfile.yaml b/taskfile.yaml index 556ef3486..b317ce8db 100644 --- a/taskfile.yaml +++ b/taskfile.yaml @@ -42,8 +42,9 @@ tasks: - "{{.G_EXAMPLES_CMAKE_CACHE}}" - "{{.G_EXAMPLES_COMPILE_COMMANDS_DB}}" cmds: - - "cmake -S '{{.ROOT_DIR}}' -B '{{.G_BUILD_SPIDER_DIR}}'" - - "cmake -S '{{.ROOT_DIR}}/examples/quick-start' -B '{{.G_BUILD_EXAMPLES_DIR}}'" + - "cmake -S '{{.ROOT_DIR}}' -B '{{.G_BUILD_SPIDER_DIR}}' -DCMAKE_INSTALL_PREFIX='{{.ROOT_DIR}}/install-test'" + - "cmake --build '{{.G_BUILD_SPIDER_DIR}}' --target install -j$(nproc)" + - "cmake -S '{{.ROOT_DIR}}/examples/quick-start' -B '{{.G_BUILD_EXAMPLES_DIR}}' -DCMAKE_PREFIX_PATH='{{.ROOT_DIR}}/install-test;' -DCMAKE_MODULE_PATH='{{.ROOT_DIR}}/cmake/Modules;'" init: internal: true