Переменная CMake игнорируется при первой сборке (CUDA_NVCC_FLAGS) - PullRequest
1 голос
/ 04 мая 2019

В моем CMakeLists.txt я загружаю переменную окружения как таковую:

cmake_minimum_required(VERSION 2.6)

set(CUDA_NVCC_FLAGS "${CUDA_NVCC_FLAGS} $ENV{CUDA_NVCC_FLAGS} -lineinfo --default-stream per-thread --disable-warnings")

message("CUDA_NVCC_FLAGS = ${CUDA_NVCC_FLAGS}")

Однако при первой попытке сборки после очистки (rm -r build) он просто игнорирует переменную CUDA_NVCC_FLAGS, что приводит к сбою сборки:

cmake -D CMAKE_CXX_FLAGS="-g -O3 -fmax-errors=1" ../../

make -j8

Выход консоли:

CUDA_NVCC_FLAGS =  -gencode arch=compute_61,code=sm_61 -lineinfo --default-stream per-thread --disable-warnings
...
/home/mad/workspace/automy-system/vision/src/DeBayerFilter.cu(132): warning: integer conversion resulted in truncation
/home/mad/workspace/automy-system/vision/src/HeightMapFilter.cu(115): error: identifier "__ldg" is undefined

Сборка не удалась, потому что мой код CUDA требует определенных вычислительных возможностей, которые включены CUDA_NVCC_FLAGS.

Со второй попытки и там после все работает просто отлично.

cmake version 3.5.1

1 Ответ

1 голос
/ 04 мая 2019

Как и любая другая переменная CMAKE_<LANG>_FLAGS, переменная CUDA_NVCC_FLAGS устанавливается при вызове project(CUDA) при обнаружении компилятора.Поэтому добавление к этой переменной должно выполняться после вызова project:

project(MyProject CUDA)
set(CUDA_NVCC_FLAGS "${CUDA_NVCC_FLAGS} $ENV{CUDA_NVCC_FLAGS} -lineinfo --default-stream per-thread --disable-warnings")

Если CUDA обнаруживается с find_package(CUDA) (в старых версиях CMake, которые изначально не поддерживают CUDA), затем добавление флагов должно следовать после find_package(CUDA), который устанавливает переменную CUDA_NVCC_FLAGS:

find_package(CUDA REQUIRED)
set(CUDA_NVCC_FLAGS "${CUDA_NVCC_FLAGS} $ENV{CUDA_NVCC_FLAGS} -lineinfo --default-stream per-thread --disable-warnings")

Причина, по которой обратный порядок работает, но только в не первой конфигурации, заключается вэта переменная CUDA_NVCC_FLAGS на самом деле кэшируется : первый вызов project() устанавливает значение переменной и сохраняет его в кеше.Дальнейшие project() вызовы обнаруживают, что компилятор уже проверен, и не переустанавливают переменную.

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