У меня есть цели проекта (двоичные файлы и библиотеки), указанные в файлах json.
Я могу создать среду для указанной цели без каких-либо проблем. Сейчас я пытаюсь поддерживать конкретный каталог сборки.
Мои знания о scons все еще очень просты, но кажется, что правильный способ сделать это — использовать SConscript вместе с VariantDir. Но у меня уже есть цели, указанные в json, и создание файла SConscript для каждой цели было бы излишним (плюс затраты на обслуживание).
Поэтому мой вопрос: возможно ли динамически создавать объект SConscript во время выполнения?
Заранее спасибо.
VariantDir не работает с файлом SConscturct (возможно, я ошибаюсь, но я не нашел способа сделать это).
Просто создайте файл SConscript с вариантом dir и делайте то, что вам нужно.
#SConsruct
env = CreateEnvironment()
SConscript('SConscript', variant_dir = 'mybuilddir', exports = 'env', duplicate = 0)
# Do all work in SConscript
Import('env')
env.Program(...)
env.SharedLibrary(...)
...
Также вы можете разделить ваш процесс на 2 состояния.
Состояние 1 — сгенерированные файлы SConscript.
State 2 — запустить сгенерированные файлы SConscript.
if 'generate' in COMMAND_LINE_TARGETS:
# your code to generated SConscript from json
Exit(0)
sconscriptFiles = getSconscriptFiles() # some code to get your sconscript, by mask for example
if len(sconscriptFiles) < 1:
print "You need to generate files at first: scons generate"Exit(1)
for file in sconscriptFiles :
SConscript(file, variant_dir = 'build' + file, duplicate = 0)
Вы можете указать каталог сборки с помощью VariantDir () функция, или как часть вызова SConscript (). Все разные варианты обсуждаются Вот. Учитывая, что вы не хотите использовать несколько файлов SConstruct, вам просто нужно использовать функцию VariantDir (), как описано более подробно Вот.
Вот простой пример:
env = Environment ()
# It may be as simple as setting src_dir='.', but set accordingly
# duplicate=0 tells SCons NOT to copy source files to variantDir, set accordingly
# VariantDir() can be called multiple times so as to change dirs per builder call
VariantDir(variant_dir = 'pathToBuildDir', src_dir = 'pathToSource', duplicate=0)
# Now call the builders here
До сих пор не ясно, почему вы хотите смешать JSON с SCons. Если у вас нет веских причин для этого, я бы посоветовал хранить все это в SCons, то есть в Python.
РЕДАКТИРОВАТЬ: Я только что понял, что вы спрашивали о создании объекта SConscript, а не файла.
Я просмотрел API-интерфейсы программирования SCons и не нашел ничего, что позволило бы вам создать объект SConscript. На самом деле, я не думаю, что концепция объекта SConscript существует, поскольку он просто обрабатывает вызовы функции SConscript () как файлы, которые нужно открывать и обрабатывать, и они почти рассматриваются как расширение SConstruct.
Итак, подведем итог: вам придется либо создавать вспомогательные файлы SConscript, либо работать с вызовами VariantDir (). В зависимости от структуры каталогов вашего проекта может не потребоваться создание файлов SConscript. Вы можете просто сделать все из корневого SConstruct. Файлы SConscript не нужны, они просто помогают лучше организовать сценарии сборки.