【问题标题】:How can I pass arguments to the makedepend calls made by cmake?如何将参数传递给 cmake 的 makedepend 调用?
【发布时间】: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.cppA.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


【解决方案1】:

这是一个非常极端的 hack,可以在这种情况下工作,但可能难以概括或可能有隐藏的影响。

而不是发布:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多