Есть ли способ передать аргументы команды/опции для вызовов makedepend
, сделанных во время создания cmake
make
?Как передать аргументы в вызовы makedepend, сделанные cmake?
Я хотел бы передать -D
аргумент makedepend
так, что некоторые #include
s являются игнорируются потому, что они скрыты условными, которые всегда ложно для этой сборки.
Вот мотивирующий минимальный пример.
В A.cpp
:
#include "B.h"
int main(){}
В B.h
:
#ifndef B_H
#define B_H
void B();
#ifndef NOT_HEADER_ONLY
# include "B.cpp"
#endif
#endif
В B.cpp
:
#include "B.h"
void B(){}
В CMakeLists.txt
:
cmake_minimum_required(VERSION 2.8.6)
option(NOT_HEADER_ONLY "Off")
set(SRCFILES "A.cpp")
if(NOT_HEADER_ONLY)
add_definitions(-DNOT_HEADER_ONLY)
list(APPEND SRCFILES "B.cpp")
endif()
add_executable(A ${SRCFILES})
Если я строить с помощью:
mkdir build
cd build
cmake .. -DNOT_HEADER_ONLY=Off
make
только A.cpp
вкомпилирована (как и ожидалось), и если я touch B.cpp
тогда A.cpp
будет срабатывать для повторной компиляции (как и ожидалось).
Если вместо я использую:
cmake .. -DNOT_HEADER_ONLY=On
make
в зависимости являются слишком консервативным в том смысле, что они никогда не пропустите зависимость, но если B.cpp
прикосновении то A.cpp
запускается для повторной компиляции, несмотря на #include "B.cpp"
внутри B.h
скрыто #ifndef NOT_HEADER_ONLY
(с NOT_HEADER_ONLY
определено).
Я понимаю, что какой-то другой файл мог #undef NOT_HEADER_ONLY
, вызвав B.cpp
, чтобы стать настоящей зависимостью B.h
, но я хочу предположить, что этого никогда не произойдет. Кажется, что для этого есть опция makedepend
-D
. Действительно makedepend -DNOT_HEADER_ONLY A.cpp
выходы:
# DO NOT DELETE
A.o: B.h
Но как я могу сказать CMake использовать makedepend -DNOT_HEADER_ONLY
вместо того, чтобы просто makedepend
?
(Я даже был бы рад взломать автогенерацию cmake Makefile
, но я не могу найти makedepend
звонки).
Это сообщение, похоже, предполагает, что cmake игнорирует директивы '# if' http://cmake.3232098.n2.nabble.com/CC-dependency-scanner-td4760539.html, но ранее я понял, что cmake вызывал' makedepend 'Это неправда? –
Я не уверен, что я охочусь в нужном месте, но, глядя на источник [cmake] (https://github.com/Kitware/CMake/blob/3d3d3f94703e23d3d2cbff67537057474e3e0ff1/Source/cmDependsC.cxx), кажется, что зависимости определяются путем сопоставления регулярного выражения на строках '# include' (не через вызов' makedepend'). –