Подтвердить что ты не робот

Как аргументы CMake можно перенаправить в ExternalProject

У меня (в основном) успешно настроен ExternalProject_Add для googletest. Тем не менее, я заметил, что такие вещи, как мой выбор компилятора С++, тип сборки и т.д., Автоматически не перенаправляются в ExternalProject.

Я могу легко добавить любой заданный флаг, добавив его в CMAKE_ARGS в вызове ExternalProject_Add следующим образом:

CMAKE_ARGS -DBUILD_SHARED_LIBS:BOOL=${BUILD_SHARED_LIBS}

Однако для этого требуется, чтобы я перечислял все возможные аргументы, которые должны быть перенаправлены на googleests вызов CMake, и этот список довольно огромен. Мне также нужно будет создать тот же список для каждого другого внешнего приложения, которое я хотел. Это кажется хрупким и подверженным ошибкам.

Есть ли способ сказать CMake "переслать" конфигурацию, предоставленную пользователем? Другими словами, если я вызывал CMake как:

cmake <path-to-project> -DCMAKE_C_COMPILER=/usr/bin/clang -DSOME_RANDOM_FLAG=stuff

Затем я хотел бы, чтобы мой вызов ExternalProject_Add обеспечил тот же выбор и значение компилятора для SOME_RANDOM_FLAG, без необходимости явно перечислять эти имена. Я не уверен, что просто передача CMake ARGV будет работать, так как говорит

CC=/usr/bin/clang cmake <path-to-project>

идеально подойдет.

Любые мысли о том, как это сделать?

4b9b3361

Ответ 1

Спустя долгие часы, пытаясь понять это, наконец, он получил ответ (Дон Хинтон) в списке рассылки CMake. Решение Fraser очень близко, но все равно может передавать некоторые конкретные аргументы проекта, которые могут вызвать непредсказуемое поведение.

Следующее работает правильно. Надеюсь, это спасет людей некоторое время, пытаясь понять это:

cmake_minimum_required(VERSION 3.1)

# MUST be done before call to 'project'
get_cmake_property(vars CACHE_VARIABLES)
foreach(var ${vars})
  get_property(currentHelpString CACHE "${var}" PROPERTY HELPSTRING)
    if("${currentHelpString}" MATCHES "No help, variable specified on the command line." OR "${currentHelpString}" STREQUAL "")
        # message("${var} = [${${var}}]  --  ${currentHelpString}") # uncomment to see the variables being processed
        list(APPEND CL_ARGS "-D${var}=${${var}}")
    endif()
endforeach()

project(SuperBuild)

include(ExternalProject)

ExternalProject_Add(ext_proj
  ...

  CMAKE_ARGS ${CL_ARGS}
)

Ссылка на список рассылки: https://cmake.org/pipermail/cmake/2018-January/067002.html

Ответ 2

Я не знаю надежного способа добиться этого, и я уверен, что нет стандартного "пути CMake", но мой ответ на аналогичный вопрос о захвате аргументов командной строки CMake может помочь вам?