Создайте несколько целей с помощью SCONS - PullRequest
0 голосов
/ 16 октября 2018

Я строю модульный проект с помощью SCONS.Мне бы хотелось, чтобы несколько программных продуктов были скомпилированы как совокупность нескольких подкомпонентов SW:

Например: * Sconstruct:

Sconscript("SW_PRODUCT_1.Sconscript")
Sconscript("SW_PRODUCT_2.Sconscript")

* с SW_PRODUCT_1.Sconscript:

Sconscript("COMPONENT_A.Sconscript")  
Sconscript("COMPONENT_B.Sconscript")
Sconscript("COMPONENT_C.Sconscript")

* И с SW_PRODUCT_2.Sconscript:

Sconscript("COMPONENT_A.Sconscript")
Sconscript("COMPONENT_B.Sconscript")

т.е. я бы хотел, чтобы Builder компилировал один раз каждый компонент как библиотеку, а затем каждый SW_PRODUCT брал список компонентов, которые он хочет построить.Исполняемый файл.

Но у меня возникла следующая проблема: инструмент SCONS возвращает следующую ошибку:

"scons: *** Для одной и той же цели заданы две среды с разными действиями"

Это правда, так как согласно сценарию компоненты A и B вызываются дважды с одинаковыми именами целей, но я надеюсь, что SCONS справится с тем фактом, что несколько целей могут совместно использовать библиотеки.Я ожидал, что SCONS поймет во втором вызове COMPONENTS_A и B, что цель «обновлена», но она не работает таким образом.
Хотя у меня есть обходной путь, компилирующий две разные библиотеки (разные имена) для каждойПРОДУКТ, но это не то, что я хочу, поскольку библиотеки абсолютно одинаковы, и я не хочу тратить время на компиляцию, чтобы собрать ровно N раз.Я хотел бы просто создать один и тот же пул библиотек, а затем выбирать такие библиотеки по требованию для каждого продукта.Есть ли простой способ справиться с этой архитектурой с помощью Scons?

1 Ответ

0 голосов
/ 16 октября 2018

Просто поместите все (!) Необходимые библиотеки (= компоненты) и продукты в один и тот же файл SConstruct верхнего уровня.Вы можете использовать SConscript вызовы, чтобы включить определения сборки из ваших разных подпапок, но не пропустите ни одного из них.Попытайтесь представить, что вы хотите собрать все одновременно.Не пытайтесь настроить зависимости сборки (или порядок сборки), указав SConscript s для «компонентов» в ваших файлах сборки или нет.

Это важно, потому что это гарантирует, что SCons может видеть полное дерево исходников со всеми исходниками, библиотеками и программами, которые вам могут понадобиться.Затем он сможет самостоятельно определить зависимости сборки.

На следующем шаге просто определите комбинированные цели для ваших продуктов с помощью команды Alias, то есть:

env = Environment()
program_a = env.Program('maina', Glob('*.cpp'), LIBS=['compx','compy'])
env.Alias('producta', program_a)

(см. также главу 25 «Цели псевдонимов» в Руководстве пользователя ).Теперь вы можете позвонить

scons producta

и SCons выяснит, какие компоненты обновлены или нуждаются в перестройке.Если затем указать несколько целей

scons producta productb productk

, необходимые библиотеки будут созданы только один раз и автоматически распределены между продуктами.

В нашей SCons Wiki: Recipes youМожно также найти еще несколько примеров и настроек, чтобы дать вам представление о том, как другие люди настраивают свои проекты.

...