我正在用SCONS构建一个大型项目,出于这个主题(大故事)的原因,我需要在文件内的最终链接命令中传递目标文件选项。例如:
gcc -o program.elf @ objects_file.txt -T linker_file.ld
此命令有效,因为我已经手动对其进行了测试。但是现在我需要将其嵌入Project构建文件中运行。我的第一个方法/想法是通过以下方式将所有选项收集到文件中:
dbg_exe = own_env.Program('../' + target_path, components)
own_env.AddPreAction(dbg_exe, 'echo \'$SOURCES\' > objects_file.txt')
注意:$ sources包含我需要的所有目标文件。正如我期望的那样,该命令似乎已执行,我在终端中看到了该命令,但由于某种原因,由于未在任何地方找到objects_file.txt,所以该命令尚未执行。
很好奇,如果我将打印的行复制并粘贴到同一终端中,命令执行成功,那么我认为构造的语法是正确的。
我也尝试了较短的测试代码:
own_env.AddPreAction(dbg_exe, 'ls -l > salida_ls.txt')
...还有另一个惊喜,这次我在控制台中收到语法错误:
scons: done reading SConscript files.
scons: Building targets ...
ls -l > salida_ls.txt
ls: cannot access '>': No such file or directory
ls: cannot access 'salida_ls.txt': No such file or directory
简单的'ls -l'效果很好。
任何想法为何这种bash命令无法按预期工作? >
重定向符号是否影响SCONS?一些也许有用的信息:
OS Windows10
终端mingw32
SCons v2.3.1
经过搜索,我发现这与SPAWN构造变量的重新定义有关:
def w32api_spawn(sh, escape, cmd, args, e_env):
print "CMD value"
print sh
print escape
print cmd
print args
print e_env
print " ********************************** "
if cmd == "SHELL":
return SCons.Platform.win32.spawn(sh,escape,args[1], args[1:],e_env)
cmdline = cmd + ' ' + string.join(args[1:], ' ')
startupinfo = subprocess.STARTUPINFO()
startupinfo.dwFlags |= _subprocess.STARTF_USESHOWWINDOW
proc = subprocess.Popen(
cmdline,
stdin=subprocess.PIPE,
stdout=subprocess.PIPE,
stderr=subprocess.STDOUT,
startupinfo=startupinfo,
shell = False,
env = None
)
data, err = proc.communicate()
print data
rv = proc.wait()
if rv:
print "====="
print err
print "====="
return rv
我正在用SCONS构建一个大型项目,出于这个主题(大故事)的原因,我需要在文件内的最终链接命令中传递目标文件选项。例如:gcc -o program.elf @ ...
看起来您需要交换回该Program()的默认SPAWN。