【问题标题】:Scons doesn't calculate correct 'ParseDepends' or 'Ignore' as I specifiedScons 没有按照我的说明计算正确的“ParseDepends”或“Ignore”
【发布时间】:2016-10-04 15:32:16
【问题描述】:

我想告诉scons,当我更改了一个头文件时,不要重新编译我的源文件(这只是我的测试!) 我有 hello.c 文件:

#ifdef FOO
#include"~/headers/n.h"
#endif
#include<stdio.h>
int main(){
  printf("hello\n");
  return 2;
}

我的 SConstruct 文件是:

obj=Object('hello.c')
SideEffect('hello.d',obj)
ParseDepends('hello.d')
Program('hello',obj)

你看,我没有定义任何“FOO”,所以 hello.c 文件根本不使用我的 .h 文件。 我还希望 ParseDepends 能够读取 C 预处理器命令以忽略我的 #include "n.h",因为没有定义 "FOO"。

但是当运行scons,然后修改n.h文件,再次运行scons会触发hello.c的rebuild

然后我尝试使用以下“忽略”语句:

hello_obj=Object('hello.c')
hello=Program(hello_obj)
Ignore(hello_obj,'n.h')

我得到了相同的测试结果:n.h 内部的变化不会被 scons 忽略! 为什么?

【问题讨论】:

  • 你为什么要测试这个?你想达到什么目的?

标签: c++ linux parsing dependencies scons


【解决方案1】:

使用Ignore()。引用its documentation

有时即使依赖文件发生更改,也不重新构建程序是有意义的。在这种情况下,你会专门告诉 SCons 忽略依赖项

就您而言,这是一个完整的 SConstruct(我将您的 C 程序更改为 #include "headers/n.h"):

obj=Object('hello.c')
Ignore(obj, 'headers/n.h')
Program('hello',obj)

这是一个证明它有效的 shell 会话:

$ scons -Q -c
Removed hello.o
Removed hello
$ scons -Q 
gcc -o hello.o -c hello.c
gcc -o hello hello.o
$ echo hello >> headers/n.h 
$ scons -Q 
scons: `.' is up to date.

【讨论】:

    猜你喜欢
    • 2023-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-15
    • 1970-01-01
    • 1970-01-01
    • 2021-12-29
    • 1970-01-01
    相关资源
    最近更新 更多