Избегайте повторяющегося кода CMake с несколькими целями - PullRequest
0 голосов
/ 20 декабря 2018

В проектах CMake с несколькими целями я часто повторяю код снова и снова.См. Этот пример:

cmake_minimum_required(VERSION 3.12)
project(rapid_benchmark)

set(CMAKE_CXX_STANDARD 17)

add_executable(benchmark main.cpp)
add_executable(benchmark_parallel main.cpp) # enable parallel processing
add_executable(benchmark_openmp main.cpp) # enable openmp
add_executable(benchmark_static main.cpp) # enable static optimizations
# ... more targets

# Adding basic dependecies
find_package(abc)
if(abc_FOUND)
    target_link_libraries(benchmark abc::abc)
    target_link_libraries(benchmark_parallel abc::abc)
    target_link_libraries(benchmark_openmp abc::abc)
    # ... all other targets ...
    # The same for the includes etc.

find_package(xyz)
if(xyz_FOUND)
    target_link_libraries(benchmark xyz::xyz)
    # ... all other targets ...

Это раздражает и подвержено ошибкам, особенно при добавлении новых целей.

Как можно избежать повторяющегося кода с несколькими целями в проекте CMake?Например, есть ли способ поместить цели в своего рода список и вызвать target_link_libraries в этом списке?

Ответы [ 3 ]

0 голосов
/ 20 декабря 2018

То же, что сказал Бернхард, но в CMake:)

macro(add_benchmark)
  set(singleValue NAME)
  set(multipleValues SOURCES)
  cmake_parse_arguments(local "" "${singleValue}" "${multipleValues}" ${ARGN})

  set (libraries)
  if (abc_FOUND)
    set (libraries ${libraries} abc::abc)
  endif()
  if (xyz_FOUND)
    set (libraries ${libraries} xyz::xyz)
  endif()

  add_executable(${local_NAME} ${local_SOURCES})
  target_link_libraries(${local_NAME} ${libraries})
endmacro()

Тогда вы можете просто вызвать его как любую другую команду CMake:

add_benchmark(
  NAME benchmark
  SOURCES main.cpp
)

add_benchmark(
  NAME benchmark_other
  SOURCES main.cpp other.cpp
)
0 голосов
/ 20 декабря 2018

Примерно так ... https://cmake.org/cmake/help/latest/command/foreach.html

set(targets a b c d e)
foreach(loop_var IN targets)
    add_executable($loop_var main.cpp)
endforeach(loop_var)

В сочетании с макросом, который делает много вещей, он будет управляемым.

Дополнительные сведения: Циклысписок строк

0 голосов
/ 20 декабря 2018

Я хотел бы создать макрос , который можно вызывать для каждого приложения, который выполняет как компиляцию, так и связывание

Возможно, вы обнаружите, что хотите использовать CMake-синтаксический анализ-аргументы

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...