Реальные иерархические сборки с помощью SCons?

Итак, я прочитал здесь вопросы о иерархических построениях, например: Создание иерархической сборки со сканами

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

Желаемая компоновка:

project_root/  (new project that builds bar app using the libfoo built from source)

    libfoo_subrepo/  (standalone project repo from bitbucket)
        src/
            SConscript
            libfoo.c
            libfoo.h
        test/
            SConscript
            test_foo.c
        SConstruct

    barapp_subrepo/  (standalone project repo from bitbucket that uses libfoo)
        src/
            SConscript
            bar.c
            bar.h
        test/
            SConscript
            test_bar.c
        SConstruct

    test/
        SConscript
        test_bar_with_foo.c
    SConstruct

Итак, у меня есть два отдельных репозитория, как с помощью scons. Первая, libfoo, может быть клонирована автономно и построена с использованием scons. При запуске scons в корневом каталоге libfoo он создает статическую библиотеку libfoo в src/и создает исполняемый файл unit test в тесте /, который ссылается на статическую библиотеку в src/.

Второе репо имеет приложение для бара, которое зависит от libfoo. Он также может быть клонирован автономно, и если libfoo установлен в системе сборки, его можно создать с помощью scons.

Что я хочу сделать, настроено новое репо (project_root), в котором оба репозитория libfoo и bar app устанавливаются как subrepos с использованием mercurial. Поэтому, когда вы клонируете это новое репо, оно автоматически отключает приложение bar и его зависимость libfoo. Затем я хочу иметь возможность запускать scons в корне этого нового репо и выполнить его в libfoo_subrepo/root для создания libfoo и его модульных тестов. Затем я хочу, чтобы он запускал scons в barapp_subrepo/root для создания бара и сообщал, что он ссылается на статическую библиотеку libfoo в libfoo_subrepo/src/. Наконец, я хочу, чтобы он создавал несколько новых модульных тестов в тестах /, которые используют как статическую библиотеку libfoo, так и исходные файлы из приложения bar для приложения тестовой панели и libfoo при объединении.

Насколько я могу судить по чтению документации по scons, мне нужно создать пользовательский Builder для "subrepo", который будет запускать scons в суб-оболочке. Затем я мог бы добавить libfoo.subrepo и barapp.subrepo в каталог project_root/, а некоторые - как установить его так, чтобы когда строитель отправился выполнять команду для сборки libfoo.subrepo, он переводит исходное имя в путь, в котором он запускает scons в.

building 'libfoo.subrepo' translates into executing 'cd libfoo_subrepo; scons'

Мне кажется, что у scons не могут рекурсивно строить автономные проекты scons. Все, что я читал, предполагает, что у вас есть возможность создавать файлы SConscript во вложенных папках, а затем файл корневого SConstruct зависит от файлов SConscript. Скажите, что есть способ сделать то, что я хочу, с помощью scons. Я не хочу возвращаться, чтобы сделать.

Спасибо.

Ответ 1

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

Чтобы сделать то, что вы объясните, вам действительно понадобится 3 файла Seperate SConsctruct, чтобы иметь возможность делать 3 отдельных сборки. Я также добавлю 3 файла SConscript и сделаю все из них следующим образом:

Изменить: В этом примере лучше создать среду() в сценариях SConstruct

project_root/SConstruct

# This SConstruct orchestrates building 3 subdirs

import os

subdirs = ['libfoo_subrepo', 'barapp_subrepo', 'test']
env = Environment()

for subdir in subdirs:
    SConscript(os.path.join(subdir, 'SConscript'), exports = ['env'])

libfoo_subrepo/SConstruct

# This SConstruct does nothing more than load the SConscript in this dir
# The Environment() is created in the SConstruct script
# This dir can be built standalone by executing scons here, or together
# by executing scons in the parent directory
env = Environment()
SConscript('SConscript', exports = ['env'])

libfoo_subrepo/SConscript

# This SConstruct orchestrates building 2 subdirs
import os

Import('env')
subdirs = ['src', 'test']

for subdir in subdirs:
    SConscript(os.path.join(subdir, 'SConscript'), exports = ['env'])

barapp_subrepo/SConstruct

# This SConstruct does nothing more than load the SConscript in this dir
# The Environment() is created in the SConstruct script
# This dir can be build standalone by executing scons here, or together
# by executing scons in the parent directory
env = Environment()
SConscript('SConscript', exports = ['env'])

barapp_subrepo/SConscript

# This SConstruct orchestrates building 2 subdirs
import os

Import('env')
subdirs = ['src', 'test']

for subdir in subdirs:
    SConscript(os.path.join(subdir, 'SConscript'), exports = ['env'])

Я надеюсь, что комментарии в каждом файле объясняют его цель.

Надеюсь, что это поможет.

Ответ 2

SConscript(dirs=['src', 'doc'])