如何将参数传递给cmake发出的makedepend调用?

时间:2017-01-05 04:02:08

标签: c++ makefile cmake dependencies

有没有办法将命令参数/选项传递给makedepend生成cmake版本期间进行的make调用?

我想将-D参数传递给makedepend,以便某些#include 被忽略,因为它们被隐藏了此构建始终为false的条件。

这是一个激励人心的例子。

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内隐藏{1}} {自定义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来电。

1 个答案:

答案 0 :(得分: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命令直接