【发布时间】:2017-05-19 12:43:01
【问题描述】:
有没有办法将命令参数/选项传递给在cmake 生成的make 构建期间进行的makedepend 调用?
我想将-D 参数传递给makedepend,以便某些#includes 被忽略,因为它们被此构建始终为假的条件隐藏。
这是一个激励人心的最小例子。
在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" 987654345@ 被#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 自动生成的 Makefiles,但我找不到 makedepend 调用)。
【问题讨论】:
-
这篇文章似乎暗示cmake忽略
#if指令cmake.3232098.n2.nabble.com/…,但我之前知道cmake调用makedepend是不是真的? -
我不确定我是否在正确的地方寻找,但看看cmake source 似乎依赖关系是通过匹配
#include行上的正则表达式来确定的(不是通过调用到makedepend)。
标签: c++ makefile cmake dependencies