Я нахожусь на Visual Studio 2017, Windows 10, CMake 3.16.
У меня есть ситуация, когда у меня есть проект, который состоит из файлов cuda .cu
, которые ссылаются на исходную библиотеку на основе c ++ через CMake. Для этой вышестоящей библиотеки цель состоит из макроса WINDOWS_DISABLE_ALL_WARNING=__pragma(warning(push,0))
, который сохраняется в ее цели cmake через INTERFACE_COMPILE_DEFINITIONS
. Основная проблема в том, что nv cc не может разобрать это из-за запятой, мне на самом деле нужно изменить его на WINDOWS_DISABLE_ALL_WARNING=__pragma(warning(push\,0))
для его компиляции, в противном случае появится следующее сообщение об ошибке
nvcc fatal : A single input file is required for a non-link phase when an outputfile is specified
но я не смог найти правильный способ сделать это в cmake. Ниже приведены минимальные примеры моих неудачных попыток
cmake_minimum_required(VERSION 3.16)
project(sample)
add_library(aaatarget aaa.cpp)
target_compile_definitions(aaatarget PUBLIC MYMACRO="aaa")
add_executable(bbbtarget bbb.cpp)
target_link_libraries(bbbtarget aaatarget)
# this works but it will mess up other targets that links to aaatarget that actually wants
# MYMACRO to be it's original aaa
set_target_properties(aaatarget PROPERTIES INTERFACE_COMPILE_DEFINITIONS MYMACRO="bbb")
# ideally I want to just change bbbtarget to make it work but none of the below works
set_target_properties(bbbtarget PROPERTIES INTERFACE_COMPILE_DEFINITIONS MYMACRO="bbb")
set_target_properties(bbbtarget PROPERTIES INTERFACE_COMPILE_OPTIONS MYMACRO="bbb")
set_target_properties(bbbtarget PROPERTIES COMPILE_DEFINITIONS MYMACRO="bbb")
set_target_properties(bbbtarget PROPERTIES COMPILE_OPTIONS MYMACRO="bbb")
# this has the potential to solve it for my specific use case but unfortunately COMPILE_LANGUAGE
# doesn't work on visual studio... otherwise, I could request the upstream vendor to make this change
target_compile_definitions(aaatarget PUBLIC "$<$<COMPILE_LANGUAGE:CXX>:MYMACRO=\"aaa\"")
Может кто-нибудь сказать мне, как связать с целью в CMake, но частично изменить некоторые свойства локально? Лучшее решение - NVIDIA fix nv cc, поэтому он может правильно анализировать запятую, как cl, но было бы неплохо обойти это сейчас, прежде чем это произойдет.