From 51d0c766aefc6aad7c645478635d649ed3234011 Mon Sep 17 00:00:00 2001 From: dajiaohuang Date: Fri, 16 Oct 2026 08:27:06 +0800 Subject: [PATCH] Resolve installed Boost dependencies from the producer configuration --- CMakeLists.txt | 6 ++++++ cliConfig.cmake.in | 4 ++-- test/cmake/consumer/CMakeLists.txt | 6 ++++++ test/cmake/consumer/main.cpp | 13 +++++++++++++ test/cmake/install-consumer.cmake | 26 ++++++++++++++++++++++++++ 5 files changed, 53 insertions(+), 2 deletions(-) create mode 100644 test/cmake/consumer/CMakeLists.txt create mode 100644 test/cmake/consumer/main.cpp create mode 100644 test/cmake/install-consumer.cmake diff --git a/CMakeLists.txt b/CMakeLists.txt index 7afe32a..96746c1 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -64,6 +64,7 @@ target_link_libraries(cli INTERFACE Threads::Threads) # --------------------------------------------------------------- # Boost.Asio support # --------------------------------------------------------------- +set(CLI_BOOST_COMPILED OFF) if(CLI_UseBoostAsio) if(POLICY CMP0074) cmake_policy(SET CMP0074 NEW) # _ROOT @@ -83,6 +84,7 @@ if(CLI_UseBoostAsio) add_definitions(-DBOOST_ALL_NO_LIB) # for windows if(Boost_FOUND) + set(CLI_BOOST_COMPILED ON) message(STATUS "Using compiled Boost libraries on ${CMAKE_SYSTEM_NAME}") target_link_libraries(cli INTERFACE Boost::system Boost::date_time) else() @@ -150,6 +152,10 @@ endif() if(CLI_BuildTests) enable_testing() add_subdirectory(test) + add_test(NAME cli_install_consumer + COMMAND ${CMAKE_COMMAND} + -DTEST_BINARY_DIR=${CMAKE_CURRENT_BINARY_DIR}/install-consumer + -P ${CMAKE_CURRENT_SOURCE_DIR}/test/cmake/install-consumer.cmake) endif() # --------------------------------------------------------------- diff --git a/cliConfig.cmake.in b/cliConfig.cmake.in index b685226..26c58da 100644 --- a/cliConfig.cmake.in +++ b/cliConfig.cmake.in @@ -2,8 +2,8 @@ include(CMakeFindDependencyMacro) -if (CLI_UseBoostAsio) - find_dependency(Boost REQUIRED COMPONENTS system) +if (@CLI_BOOST_COMPILED@) + find_dependency(Boost REQUIRED COMPONENTS system date_time) endif() find_dependency(Threads REQUIRED) diff --git a/test/cmake/consumer/CMakeLists.txt b/test/cmake/consumer/CMakeLists.txt new file mode 100644 index 0000000..555d85c --- /dev/null +++ b/test/cmake/consumer/CMakeLists.txt @@ -0,0 +1,6 @@ +cmake_minimum_required(VERSION 3.8...3.27) +project(cli_install_consumer LANGUAGES CXX) + +find_package(cli CONFIG REQUIRED) +add_executable(consumer main.cpp) +target_link_libraries(consumer PRIVATE cli::cli) diff --git a/test/cmake/consumer/main.cpp b/test/cmake/consumer/main.cpp new file mode 100644 index 0000000..cddefe2 --- /dev/null +++ b/test/cmake/consumer/main.cpp @@ -0,0 +1,13 @@ +#include +#include + +int main() +{ + auto menu = std::make_unique("cli"); + menu->Insert("add", [](std::ostream& out, int a, int b){ out << a + b; }); + cli::Cli app(std::move(menu)); + std::ostringstream out; + cli::CliSession session(app, out); + session.Feed("add 2 3"); + return out.str() == "5" ? 0 : 1; +} diff --git a/test/cmake/install-consumer.cmake b/test/cmake/install-consumer.cmake new file mode 100644 index 0000000..bbc7d30 --- /dev/null +++ b/test/cmake/install-consumer.cmake @@ -0,0 +1,26 @@ +# Run with: cmake -DTEST_BINARY_DIR= -P test/cmake/install-consumer.cmake +cmake_minimum_required(VERSION 3.8...3.27) +get_filename_component(CLI_SOURCE_DIR "${CMAKE_CURRENT_LIST_DIR}/../.." ABSOLUTE) + +function(run) + execute_process(COMMAND ${ARGV} RESULT_VARIABLE result) + if(NOT result EQUAL 0) + message(FATAL_ERROR "Command failed: ${ARGV}") + endif() +endfunction() + +foreach(mode IN ITEMS compiled header_only none) + set(root "${TEST_BINARY_DIR}/${mode}") + set(options -DCLI_UseBoostAsio=ON) + if(mode STREQUAL "header_only") + list(APPEND options -DCMAKE_DISABLE_FIND_PACKAGE_Boost=ON) + elseif(mode STREQUAL "none") + set(options -DCLI_UseBoostAsio=OFF) + endif() + run("${CMAKE_COMMAND}" "-H${CLI_SOURCE_DIR}" "-B${root}/library" + "-DCMAKE_INSTALL_PREFIX=${root}/prefix" ${options}) + run("${CMAKE_COMMAND}" --build "${root}/library" --target install --config Release) + run("${CMAKE_COMMAND}" "-H${CMAKE_CURRENT_LIST_DIR}/consumer" "-B${root}/consumer" + "-DCMAKE_PREFIX_PATH=${root}/prefix") + run("${CMAKE_COMMAND}" --build "${root}/consumer" --config Release) +endforeach()