SConstruct 101——从 Makefile 开始

问题描述

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

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

还假设我们对认的 Decider('MD5') 很满意。一源一目标的翻译是什么:

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 serverIRC channel 或用户邮件列表直接联系社区