微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

SConstruct 101——从 Makefile 开始

如何解决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 或用户邮件列表直接联系社区

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。