问题描述
在实现自定义 SCons 工具链时,我遇到过需要调用 shell 作为 Phony 目标并且已经提供初始输入的情况,因此我可以继续为已经调用的命令提供输入。>
基本上,我想要的是声明具有所需行为的 Phony 目标:
# ...
def invoke_shell(target,source,env):
initial_input = '...'
# Some steps to interactive command with already provided initial_input
shell = env.Command(Alias('some-shell'),[],invoke_shell)
env.AlwaysBuild(shell)
我尝试的是编写以下 SConstruct 文件来覆盖没有初始输入的情况:
# ...
def invoke_yosys(target,env):
return 'yosys'
yosys_shell = env.Command(Alias('yosys-shell'),invoke_yosys)
env.AlwaysBuild(yosys_shell)
所以当我调用 scons -Q yosys-shell
时,我应该得到 Yosys shell,但在一般情况下,它可以是任何交互式命令。我期望的是 shell 是交互式调用的,即我可以输入命令,Yosys shell 将在提供输入的同时交互式执行命令。但它不起作用。它立即退出,就像 stdin
映射到 /dev/null
一样。
解决方法
您不想使用 Command(),因为它被推迟到树遍历之前,您希望它在构建的其余部分之前立即运行,对吗?
您希望在命令行上检测目标,然后使用 Execute() 或 os.system() 触发命令..
有关获取命令行目标的信息,请参阅 here。