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

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

Для простоты разработки мне часто нравится, чтобы мой файл 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 не будет ждать, пока ваша программа будет завершена, прежде чем она запустит вызов подпроцесса, поэтому вы закончите запуск старого исполняемого файла или имеете ошибку, если он построит после чистого.

Ответ 1

Возможно, я немного опоздал для вас, но у меня есть это решение, используя 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 установлен неправильно.

Ответ 2

Что вы делаете в своем файле scons - типичная ошибка начинающих в scons. Предположим, что вы пишете script для создания своего проекта.

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

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

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

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

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

Ответ 3

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

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

run:
   scons -s
   ./name_of_executable

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