Команда Scons PreAction напечатана, но, очевидно, не выполнена - PullRequest
0 голосов
/ 02 октября 2019

Я строю большой проект с помощью 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

Ответы [ 2 ]

1 голос
/ 08 октября 2019

Похоже, вам нужно вернуться к стандартному SPAWN для этой Программы ().

Добавьте это в начало этого SConscript

from SCons.Platform.win32 import spawn

Затем замените логику, которую вы используете. выше:

dbg_exe     = own_env.Program('../' + target_path, components, SPAWN=spawn)
own_env.AddPreAction(dbg_exe, 'echo \'$SOURCES\' > objects_file.txt')

Это предполагает, что вы используете только win32. Если это не так, вам нужно условно добавить SPAWN в вашу Программу () выше, только когда вы используете win32.

0 голосов
/ 08 октября 2019

Наконец я нашел обходной путь для запуска нативной функции Python для создания необходимого мне файла. К сожалению, я не могу позволить себе больше времени для решения этой проблемы, я не нашел реальной причины и решения, но ясно, что это связано не с обычным выполнением SCONS, а с трюком, выполненным в SPAWN.

scons_common. GenerateObjectsFile ('../' + objects_file, компоненты)

...