Я строю большой проект с помощью SCONS, по причинам, не связанным с этой темой (большая история), мне нужно передать параметры объектных файлов в последней команде связывания внутри файла. Например:
gcc -o program.elf @ objects_file.txt -T linker_file.ld
Эта команда работает, поскольку я тестировал ее вручную. Но теперь мне нужно запустить его, встроенный в файлы сборки проекта. Мой первый подход / идея заключалась в том, чтобы собрать все параметры в файл следующим образом:
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?
Может быть полезная информация:
ОС Windows10
Terminal 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