c++ - 如何将参数传递给 cmake 进行的 makedepend 调用?

标签 c++ makefile cmake dependencies

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

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

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

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 尽管 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 调用)。

最佳答案

这里有一个非常极端的 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 命令。

关于c++ - 如何将参数传递给 cmake 进行的 makedepend 调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41477132/

相关文章:

ruby - verbose rakefile - 将所有执行的命令行打印到标准输出

安卓 NDK : Aborting stop?

regex - CMake 文件命令为正则表达式规则提供 "Invalid escape sequence\."

opencv - 无法在CMake中配置和构建OpenCV

c++ - 在Visual Studio中创建Linux控制台应用程序时遇到问题

c++ - 如何找出lambda的自动类型参数中的哪些方法?

c++ - 从同一目录读取图像?

cmake - 如何将 CLion 自定义 CMake 可执行文件设置为随 Homebrew 安装的版本?

c++ - 如何放弃或取消 std::thread

c++ - 有没有什么办法可以告诉 clang 在没有其他优化的情况下生成 TBAA 元数据?