【问题标题】:Why some python statements in Sconstruct are not executed?为什么Sconstruct中有一些python语句没有执行?
【发布时间】:2020-10-27 01:24:28
【问题描述】:

一个文件夹中有多个c语言文件。我不想每次都编译所有的 c 文件。我写了一个结构。我想使用一些选项来控制编译哪个文件。

import os
import sys
input = sys.argv
env = Environment(CC = 'gcc')
env.Program('testC','cExample.c')

以上代码可以正常执行。但是下面的代码显示了 scons:当我使用 scons cExample.c 时,没有什么可以为 cExample.c 做的。未生成 testC 文件。我测试发现确实进入了if语句

import os
import sys
env = Environment(CC = 'gcc')
# env.Program('testC','cExample.c')
if 'cExample.c' in sys.argv:    
    print('here')
    env.Program('testC','cExample.c')

它仍然显示

scons: Nothing to be done for `cExample.c'.
scons: done building targets.

很抱歉没有解释清楚。此代码编写在 Sconstruct 文件中。它的功能类似于 MakeFile 文件。语句 env.Program('testC','cExample.c') 就是将 cExample.c 编译成 testC 可执行文件。如果我把 env.Program('testC','cExample.c') 放在 if 外面(如注释的第四行),cExample.c 可以正常编译,如果在 if 里面(如现在所示),cExample .c 未成功编译。

【问题讨论】:

  • 与问题无关:不要使用input作为变量,它是一个内置函数的名称。
  • 那我应该如何获取scons设置的选项。例如,scons cExample.c。如何在 Sconstruct 中获取 cExamplec.c。我只知道 sys.argv[1]。
  • 只需给变量一个不同的名称。或者根本不使用变量:if 'cExample.c' in sys.argv:
  • 就像我说的,这与您遇到的问题无关,这只是编写 Python 脚本的一般要点:不要使用内置函数的名称作为变量名。
  • 修改后问题依然存在。如问题中所写

标签: python scons


【解决方案1】:

如果你输入:

scons cExample.c

假设该文件没有生成,只是坐在磁盘上,当然 SCons 会说

scons: Nothing to be done for `cExample.c'.

从 cExample.c 构建的文件将是 cExample.o(或 .obj 或为对象设置的其他后缀)。

所以:

scons cExample.o

将指示 SCons 仅构建该文件。

使用 SConstruct 为

env = Environment(CC = 'gcc')
my_obj = env.Object('cExample.c')
env.Alias('myobject',my_obj)
env.Program('testC',my_obj)

然后你可以运行

scons myobject

那只会编译你的 .c -> .o

【讨论】:

  • 感谢您的回答。但这似乎不起作用。它仍然显示 scons: Nothing to be done for `cExample.c'。我想直接编译链接成可执行文件
  • @cyj - 我猜你错过了我上面的全部解释。任何构建系统都不会对已经存在且不是动态构建的文件执行任何操作。您要么想要构建目标文件,要么构建可执行文件,在这种情况下,您应该在命令行上指定 THAT 目标。
  • 让我们添加一点解释:一个裸露的scons 告诉它构建默认目标。您定义的目标在您的一个构建器调用中 - Program,所以是 testC。当您给 scons 一个非选项参数时,这就是要构建的目标。因此,在第二次调用中,您要求它构建已经存在的cExample.c。要将其传递以用于其他目的,您需要将其包装起来,使其看起来不像目标。参见例如scons.org/doc/4.0.1/HTML/scons-man.html#sconscript_variables
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-24
  • 1970-01-01
  • 2019-11-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多