Как запустить только что скомпилированную программу в SConscript - PullRequest
0 голосов
/ 15 марта 2019

У меня есть несколько сложный скрипт сборки SCons, который в какой-то момент выполняет следующие два шага:

# 1: builds unit tests (googletest, shell executable)
compile_tests = some_environment.Program(executable_path, test_sources)

# 2: runs unit tests (call earlier compiled program)
run_tests = other_environment.Command(
    source = executable_path,
    action = executable_path + ' --gtest_output=xml:' + test_results_path,
    target = test_results_path
)

Depends(run_tests, compile_tests)

Это нормально работает, если я запускаю scons с этим скриптом сборки самостоятельно.

Если я, однако, вызову его через environment.SConscript() из другого SConstruct файла на один уровень выше, то шаг 1 корректирует путь к местоположению проекта, а шаг 2 - нет. Смотрите этот вывод:

scons: Building targets ...
g++ -o Nuclex.Game.Native/obj/gcc-7-amd64-release/NuclexGameNativeTests -z defs -Bsymbolic Nuclex.Game.Native/obj/gcc-7-amd64-release/Tests/Timing/ClockTests.o -LNuclex.Game.Native/obj/gcc-7-amd64-release -LReferences/googletest/gcc-7-amd64-release -lNuclexGameNativeStatic -lgoogletest -lgoogletest_main -lpthread
obj/gcc-7-amd64-release/NuclexGameNativeTests --gtest_output=xml:bin/gcc-7-amd64-release/gtest-results.xml
sh: obj/gcc-7-amd64-release/NuclexGameNativeTests: No such file or directory

Строка 2 встраивает исполняемый файл в Nuclex.Game.Native/obj/gcc-7-amd64-release/, а строка 3 пытается вызвать его в obj/gcc-7-amd64-release/, забывая каталог проекта.

Должен ли я использовать другой способ вызова исполняемого файла моего модульного теста? Или я могу запросить среду SCons для ее базового пути?


Обновление: случай воспроизведения, поместите https://pastebin.com/W08yZuF9 как SConstruct в корневой каталог, создайте подкаталог somelib и поместите https://pastebin.com/eiP63Yxh как SConstruct в нем, также создайте main.cpp со знаком " Hello World "или другая фиктивная программа.

1 Ответ

1 голос
/ 16 марта 2019

Действие SCons (параметр action в Команде) будет использовать переменные SCons для правильной замены источников и целей, автоматически принимая во внимание каталоги VariantDirs и SConscript. Вы можете найти больше информации об этих исходных и целевых заменах здесь: https://scons.org/doc/HTML/scons-man.html#variable_substitution

Есть раздел, который объясняет использование этого в отношении SConscript и VariantDirs:

SConscript ('src / SConscript', variable_dir = 'sub / dir')
$ SOURCE => sub / dir / file.x
$ {SOURCE.srcpath} => src / file.x
$ {SOURCE.srcdir} => src

Так что в вашем примере я думаю, что вы хотите заменить executable_path на $SOURCE в строке действия:

# 2: runs unit tests (call earlier compiled program)
run_tests = other_environment.Command(
    source = executable_path,
    action = '$SOURCE --gtest_output=xml:$TARGET',
    target = test_results_path
)
...