SCONS запустить цель - PullRequest
       3

SCONS запустить цель

10 голосов
/ 07 января 2012

Я искал и смотрю, и я не могу найти ответ на свой вопрос. Я только сегодня начал изучать скьонов, и это выглядит потрясающе! Я впадаю в небольшое замешательство.

Для простоты разработки мне часто нравится, когда мой make-файл создает мою цель, а затем запускает ее, чтобы я мог проверить изменение одним нажатием клавиши. Это очень просто в файле make:

run: $(exe)
    chmod a+x $(exe)
    $(exe)

Я понял, что могу сделать это с помощью подпроцесса следующим образом:

import subprocess import os.path

env = Environment();
result = env.Program(target = "FOO", source = "BAR");
location = os.path.abspath(result[0].name)
subprocess.call([location])

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

Ответы [ 3 ]

9 голосов
/ 17 января 2012

То, что вы делаете в файле scons, является типичной ошибкой новичка в scons.Вы предполагаете, что пишете сценарий для построения вашего проекта.

Scons не работает так.Файлы scons - это скрипт, который добавляет target в проект.Это делается с помощью Python, и различные объекты позволяют вам создавать и манипулировать целями, пока сценарий не будет выполнен. Сначала начнется сборка проекта.

Что вы делаете в своем коде, так это описывает Среду для использования, Программу для созданияи после этого вы вызываете подпроцесс, который запускает какую-то программу.После этого начнется сборка проекта - неудивительно, что старый исполняемый файл запущен, новый еще не начал собираться.

Что вам нужно сделать, так это использовать собственный компоновщик для выполнения программы.

env = Environment() #construct your environment
files = "test.cpp" #env.Glob or list some files

#now we create some targets
program = env.Program("test",files) #create the target *program*
execution = env.Command(None,None,"./test") #create the execution target (No input & output

Depends(execution,program) #tell scons that execution depends on program
#there might be a way to get SCons to figure out this dependency itself

#now the script is completed, so the targets are built

Здесь зависимости ясны, программа должна быть собрана до выполнения, и она будет

6 голосов
/ 14 декабря 2012

Возможно, я немного опоздал к вам, но у меня есть это решение с использованием Alias. Используя следующую команду, она соберет и запустит программу:

$ scons run
# Define the different target output
program = env.Program('build/output', Glob('build/test/*.cpp'))

env.Default(program)
env.Alias('run', program, program[0].abspath)

обратите внимание, что мы используем abspath, поэтому он может быть кроссплатформенным win / linux (для linux вам нужно добавить «./» перед именем программы, если ваш PATH установлен неправильно.

1 голос
/ 07 января 2012

Хорошо, я немного нервничаю, чтобы ответить на свой вопрос, но я нашел более или менее приемлемое решение.

Я только что создал простую цепочку. Я создал Makefile с чем-то вроде этого:

run:
   scons -s
   ./name_of_executable

Это вызывает scons в беззвучном режиме и автоматически запускает вашу программу. Это решение не только для scons, но оно работает. Мне все еще было бы интересно узнать, есть ли у кого-нибудь другой ответ. Спасибо! Мерфи

...