CMake: как выбрать, какие каталоги будут передаваться для каждого исходного файла - PullRequest
0 голосов
/ 26 августа 2018

У меня есть проект со многими исходными файлами и заголовочными файлами.Я мог бы добавить каждый отдельный каталог, содержащий заголовочный файл, в каталоги включения CMake, чтобы они передавались через опцию -I для компиляции каждого исходного файла.

include_directories(I/will/need/tons/of/these);

Есть ли какой-нибудь путь через CMake, который я могу передатьтолько соответствующие каталоги включения для компиляции каждого исходного файла?

Например, если бы я сам писал это в командной строке, я бы использовал такой скрипт:

g++ -I $(./get_include_dirs.sh foo.cpp) -o foo.o foo.cpp

где $ (./ get_include_dirs.sh foo.cpp) - это сценарий, который расширяется только до включаемых каталогов foo.cpp

Можно ли это сделать на CMake?Я не знаю, как сказать cmake использовать этот скрипт для каждого файла

Ответы [ 2 ]

0 голосов
/ 26 августа 2018

Обычно вы должны устанавливать каталоги включений не глобально, а на целевом уровне:

set(my-target-sources
  source1.cpp
  ...
  sourceN.cpp
)
add_library(my-target
  ${my-target-sources}
)
target_include_directories(my-target
  [PUBLIC|PRIVATE|INTERFACE]
    directory-relevant-to-my-target
)

Таким образом, компилятор будет искать заголовочные файлы в каталоге релевантном для моей цели при компиляции my-цель.Я думаю, что нет никакой причины для установки каталогов включения на гранулярность исходного файла.

Для выполнения сценария из CMake вы можете использовать execute_process и собрать свой список каталогов в параметре OUTPUT_VARIABLE, но я бы не стал предлагать это, поскольку при этом вы потеряете внутреннюю переносимость CMake.

0 голосов
/ 26 августа 2018

Вы можете использовать SET вызов, как показано ниже;

set(HEADERS h1.h h2.h h3.h) 
set(CPP_SOURCE myfunc.cpp)


add_executable(prog ${HEADERS} ${SOURCE_FILES} )

PS: Лучше пересмотреть иерархию файлов, потому что, как правило, вы должны использовать только include_directories вызов.

...