我需要在编译期间修改项目的一些来源。如果我在预处理和编译之间修改它们会更好,但我知道它更难实现(提议的解决方案here对我来说不是最佳的)所以我可以解决预处理步骤。< / p>
由于要修改源文件,我需要创建它们的副本,修改该副本然后在此副本上运行构建。我目前的解决方案是:
在cmake调用之前,我将大部分项目根目录'复制到一个单独的目录中。这是必需的,因为在构建期间有许多脚本调用,因此我需要保持大部分项目层次结构不变。由于有许多文件,其中许多文件不会被修改,我首先将所有文件复制为符号链接(cp -sR
),然后硬拷贝所有.c
和.h
文件。然后我只是cd
到该目录并像往常一样调用cmake
和make
。
这里的问题是,由于cmake不知道它正在处理实际源的副本,因此生成的Makefile
不会检查实际源是否已更新。因此,每当我修改单个源文件时,我都需要完全重建(完整项目树复制和cmake调用)。
这可以通过为每个依赖于实际源文件的硬拷贝源文件添加自定义命令来解决,并在修改后重新复制它。我想这没关系,但它确实......丑陋,需要大量的cmake添加。我不认为我想做的事情是如此具有异国情调,所以我相信有一个更好的选择可以对我的cmake做一些改变。我还想听听关于后预处理器步骤调用的想法。
编辑:简化示例案例。
这是项目树:
CMakeLists.txt
src/
CMakeLists.txt
file1.c
file1.c
python/
script.py
根CMakeLists.txt
是add_subdirectory(src/)
。 src/CMakeLists.txt
为add_executable(myexe file1.c file2.c)
。
我需要为每个源文件执行python python/script.py
,因此应该在src/file1.c
和src/file2.c
上调用它。
我目前的解决方案是构建脚本,如下所示:
rm -r build_dir
mkdir build_dir
cp -rt build_dir CMakeLists.txt src/ python/
cd build_dir
cmake .
make # ...
加上python/script.py
(预建add_custom_command
)的调用,它会覆盖相关文件本身,然后处理它们。