From adf0e29582068418765d7a4d7e2fa2875a0121cf Mon Sep 17 00:00:00 2001 From: Mizux Seiha Date: Wed, 17 Jan 2024 11:16:47 +0100 Subject: [PATCH] cmake: rework add_cxx_example * Add mandatory FILE_NAME option * Add COMPONENT_NAME option --- cmake/cpp.cmake | 52 ++++++++++++++++++++++++--------- examples/contrib/CMakeLists.txt | 2 +- examples/cpp/CMakeLists.txt | 4 +-- 3 files changed, 42 insertions(+), 16 deletions(-) diff --git a/cmake/cpp.cmake b/cmake/cpp.cmake index 0de02f651b..0707c4e3eb 100644 --- a/cmake/cpp.cmake +++ b/cmake/cpp.cmake @@ -617,16 +617,40 @@ endfunction() # add_cxx_example() # CMake function to generate and build C++ example. # Parameters: -# the C++ filename +# FILE_NAME: the C++ filename +# COMPONENT_NAME: name of the examples/ subdir where the test is located +# note: automatically determined if located in examples// # e.g.: -# add_cxx_example(foo.cc) -function(add_cxx_example FILE_NAME) - message(STATUS "Configuring example ${FILE_NAME}: ...") - get_filename_component(EXAMPLE_NAME ${FILE_NAME} NAME_WE) - get_filename_component(COMPONENT_DIR ${FILE_NAME} DIRECTORY) - get_filename_component(COMPONENT_NAME ${COMPONENT_DIR} NAME) +# add_cxx_example( +# FILE_NAME +# ${PROJECT_SOURCE_DIR}/example/foo/bar.cc +# COMPONENT_NAME +# foo +# ) +function(add_cxx_example) + set(options "") + set(oneValueArgs FILE_NAME COMPONENT_NAME) + set(multiValueArgs "") + cmake_parse_arguments(EXAMPLE + "${options}" + "${oneValueArgs}" + "${multiValueArgs}" + ${ARGN} + ) + if(NOT EXAMPLE_FILE_NAME) + message(FATAL_ERROR "no FILE_NAME provided") + endif() + get_filename_component(EXAMPLE_NAME ${EXAMPLE_FILE_NAME} NAME_WE) - add_executable(${EXAMPLE_NAME} ${FILE_NAME}) + message(STATUS "Configuring example ${EXAMPLE_FILE_NAME} ...") + + if(NOT EXAMPLE_COMPONENT_NAME) + # sample is located in examples// + get_filename_component(EXAMPLE_DIR ${EXAMPLE_FILE_NAME} DIRECTORY) + get_filename_component(EXAMPLE_COMPONENT_NAME ${EXAMPLE_DIR} NAME) + endif() + + add_executable(${EXAMPLE_NAME} ${EXAMPLE_FILE_NAME}) target_include_directories(${EXAMPLE_NAME} PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) target_compile_features(${EXAMPLE_NAME} PRIVATE cxx_std_17) target_link_libraries(${EXAMPLE_NAME} PRIVATE ${PROJECT_NAMESPACE}::ortools) @@ -637,15 +661,17 @@ function(add_cxx_example FILE_NAME) "@loader_path/../${CMAKE_INSTALL_LIBDIR};@loader_path") elseif(UNIX) cmake_path(RELATIVE_PATH CMAKE_INSTALL_FULL_LIBDIR - BASE_DIRECTORY ${CMAKE_INSTALL_FULL_BINDIR} - OUTPUT_VARIABLE libdir_relative_path) + BASE_DIRECTORY ${CMAKE_INSTALL_FULL_BINDIR} + OUTPUT_VARIABLE libdir_relative_path) set_target_properties(${EXAMPLE_NAME} PROPERTIES - INSTALL_RPATH "$ORIGIN/${libdir_relative_path}") + INSTALL_RPATH "$ORIGIN/${libdir_relative_path}") endif() install(TARGETS ${EXAMPLE_NAME}) if(BUILD_TESTING) - add_test(NAME cxx_${COMPONENT_NAME}_${EXAMPLE_NAME} COMMAND ${EXAMPLE_NAME}) + add_test( + NAME cxx_${EXAMPLE_COMPONENT_NAME}_${EXAMPLE_NAME} + COMMAND ${EXAMPLE_NAME}) endif() - message(STATUS "Configuring example ${FILE_NAME}: ...DONE") + message(STATUS "Configuring example ${EXAMPLE_FILE_NAME} ...DONE") endfunction() diff --git a/examples/contrib/CMakeLists.txt b/examples/contrib/CMakeLists.txt index a914448b7e..302c3f245f 100644 --- a/examples/contrib/CMakeLists.txt +++ b/examples/contrib/CMakeLists.txt @@ -18,7 +18,7 @@ endif() if(BUILD_CXX_EXAMPLES) file(GLOB CXX_SRCS "*.cc") foreach(FILE_NAME IN LISTS CXX_SRCS) - add_cxx_example(${FILE_NAME}) + add_cxx_example(FILE_NAME ${FILE_NAME}) endforeach() endif() diff --git a/examples/cpp/CMakeLists.txt b/examples/cpp/CMakeLists.txt index c305e87fbf..08320df97c 100644 --- a/examples/cpp/CMakeLists.txt +++ b/examples/cpp/CMakeLists.txt @@ -59,6 +59,6 @@ list(FILTER CXX_SRCS EXCLUDE REGEX ".*/pdlp_solve.cc") list(FILTER CXX_SRCS EXCLUDE REGEX ".*/strawberry_fields_with_column_generation.cc") # Too long list(FILTER CXX_SRCS EXCLUDE REGEX ".*/vector_bin_packing_solver.cc") list(FILTER CXX_SRCS EXCLUDE REGEX ".*/weighted_tardiness_sat.cc") -foreach(SAMPLE IN LISTS CXX_SRCS) - add_cxx_example(${SAMPLE}) +foreach(EXAMPLE IN LISTS CXX_SRCS) + add_cxx_example(FILE_NAME ${EXAMPLE}) endforeach()