如何将参数传递给cmake进行的makedependent调用

How can I pass arguments to the makedepend calls made by cmake?

本文关键字:makedependent 调用 cmake 参数传递      更新时间:2023-10-16

是否有方法将命令参数/选项传递给在cmake生成的make生成期间进行的makedepend调用?

我想将一个-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被直接编译(如预期),如果Itouch B.cpp,则A.cpp将被触发进行重新编译(如预计)。

如果,我使用:

cmake .. -DNOT_HEADER_ONLY=On
make

相关性过于保守,因为它们永远不会错过相关性,但如果触摸B.cpp,则触发A.cpp进行重新编译,尽管B.h内的#include "B.cpp"#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调用)。

这里有一个非常极端的破解方法,在这种情况下可以工作,但可能很难推广,或者可能有隐藏的效果。

代替发行:

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命令。