Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 在cmake生成期间修改源文件_Bash_Makefile_Cmake - Fatal编程技术网

Bash 在cmake生成期间修改源文件

Bash 在cmake生成期间修改源文件,bash,makefile,cmake,Bash,Makefile,Cmake,在编译过程中,我需要修改一些项目的源代码。如果我在预处理和编译之间修改它们会更好,但我知道这很难实现(提出的解决方案对我来说不是最优的),所以我可以通过预处理步骤来解决 由于要修改源文件,我需要创建它们的副本,修改该副本,然后在此副本上运行构建。我目前的解决办法是: 在调用cmake之前,我将大多数项目根目录内容复制到一个单独的目录中。这是必需的,因为在构建过程中有许多脚本调用,所以我需要保持大部分项目层次结构不变。由于有许多文件,其中许多文件不会被修改,我首先将所有文件作为符号链接复制(cp-

在编译过程中,我需要修改一些项目的源代码。如果我在预处理和编译之间修改它们会更好,但我知道这很难实现(提出的解决方案对我来说不是最优的),所以我可以通过预处理步骤来解决

由于要修改源文件,我需要创建它们的副本,修改该副本,然后在此副本上运行构建。我目前的解决办法是:

在调用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_子目录(src/)
src/CMakeLists.txt
add\u可执行文件(myexefile1.cfile2.c)

我需要为每个源文件执行
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
(prebuild
add_custom_command
),该调用会对相关文件本身进行全局搜索,然后对其进行处理。

您不应该这样做。尝试不同的方法,但这违反了CMake的基本原则。您应该将源代码与构建(源代码外构建)分开。将配置后的文件复制到源目录会导致问题。@usr1234567您指的是哪个部分?为依赖于实际源文件的每个硬拷贝源文件添加自定义命令,并在修改后重新复制?这是您的全部想法。不要修改源目录,将其复制到构建目录。我不明白问题的重点。您需要让CMake了解实际的源,以及中间源如何依赖于它们。是的,最简单的方法之一是使用
add_custom_命令
<我想没关系,但事实上。。。丑陋,需要大量的cmake添加。-什么是丑陋?为每个源文件写入
add\u custom\u命令
?您可以将其包装到宏中,然后对每个源重复此宏。您可以手动输入源列表,也可以使用
文件(GLOB)
进行输入。那么,实际的问题是什么呢?@Tsyvarev我称之为丑陋,因为它需要对文件进行技术处理,这是cmake应该为您做的事情。后预处理器的修改很容易通过make完成,所以我确信可以通过cmake正确地完成,而不会直接干扰文件。