有没有办法将命令参数/选项传递给 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/