SConstruct 101——从 Makefile 继续

SConstruct 101—moving on from Makefiles

make, scons 有大量的预定义变量和规则。 (在包含 env = Environment(); print(env.Dump())SConstruct 上尝试 scons | wc 以查看集合的扩展程度。)

但是假设我们不是在追求预设的魔法,而是想做一些更原始的事情——模拟从(bash,等)命令行启动一些指令?

还假设我们对默认 Decider('MD5') 非常满意。 one-souce-one-target的翻译是什么:

out/turquoise.xyz: out/chartreuse.xyz
    chartreuse_to_turquoise $< $@

两源一标:

out/purple.xyz: out/lilac.xyz out/salmon.xyz
    gen_purple $< $@

和属于:

run_this:
    python prog.py

我们将通过输入 make run_this?

按需 运行

这些基本构造的 SConstruct 是什么样子的?

您正在寻找的所有答案都在用户指南(和联机帮助页)中

首先,假设您不想扫描输入文件以添加输入文件中指定的包含文件,您可以使用Commmand() (在这里查看信息:https://scons.org/doc/production/HTML/scons-user.html#chap-builders-commands

那么你需要一个别名来指定一个非文件命令行目标 (看这里:https://scons.org/doc/production/HTML/scons-user.html#chap-alias

将这两个放在一起产生

env=Environment()
# one source, one target
env.Command('out/turquoise.xyz', 'out/chartreuse.xyz', 'chartreuse_to_turquoise $SOURCE $TARGET')
# Two source, one target
env.Command('out/purple.xyz',['out/lilac.xyz','out/salmon.xyz'], 'gen_purple $SOURCES $TARGET')

# And your .phony make target which is actually not great for reproducibility and determining when it should be rerun, because you do not specify any sources or targets
env.Alias('run_this','python prog.py')

注意:SCons 不会传播您的 shell 环境变量。因此,如果您依赖(例如)PATH 中的非系统路径,则需要在 env['ENV']['PATH'] 中明确指定。有关详细信息,请阅读用户指南、联机帮助页和常见问题解答。

您可以通过我们的 discord server, IRC channel 或用户邮件列表

直接访问社区