2017-01-05 3 views
1

Есть ли способ передать аргументы команды/опции для вызовов makedepend, сделанных во время создания cmakemake?Как передать аргументы в вызовы 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_ONLYNOT_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 звонки).

+0

Это сообщение, похоже, предполагает, что cmake игнорирует директивы '# if' http://cmake.3232098.n2.nabble.com/CC-dependency-scanner-td4760539.html, но ранее я понял, что cmake вызывал' makedepend 'Это неправда? –

+0

Я не уверен, что я охочусь в нужном месте, но, глядя на источник [cmake] (https://github.com/Kitware/CMake/blob/3d3d3f94703e23d3d2cbff67537057474e3e0ff1/Source/cmDependsC.cxx), кажется, что зависимости определяются путем сопоставления регулярного выражения на строках '# include' (не через вызов' makedepend'). –

ответ

0

Вот довольно экстремальный хак, который будет работать в этом случае, но может быть трудно обобщить или может иметь скрытые эффекты.

Вместо выдачи:

make 

Издание:

mkdir -p CMakeFiles/A.dir/hole 
makedepend -DNOT_HEADER_ONLY -pCMakeFiles/A.dir/hole/ -o .cpp.o -f - ../A.cpp ../B.cpp -w0 > CMakeFiles/A.dir/depend.make 
make -f CMakeFiles/A.dir/build.make CMakeFiles/A.dir/build 

Это создает фиктивную папку (так ../ будет иметь смысл), а затем вызывает makedepend непосредственно вместо того, чтобы позволить cmake определить зависимости, а затем вызывает фактическая команда сборки make.