Реальные иерархические сборки с SCons? - PullRequest
11 голосов
/ 31 марта 2012

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

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

Желаемый макет:

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 / и создает исполняемый файл модульного теста в test /, который связывается со статической библиотекой в ​​src /.

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

Что я хочу сделать, так это создать новое хранилище (project_root), в котором есть как libfoo, так иБар-репозитории приложений, заданные в качестве подпунктов с использованием Mercurial.Поэтому, когда вы клонируете этот новый репозиторий, он автоматически отключает приложение-бар и его зависимость, libfoo.Затем я хочу иметь возможность запускать scons в корне этого нового репозитория и иметь возможность запускать scons в libfoo_subrepo / root для сборки libfoo и его модульных тестов.Затем я хочу, чтобы он запускал scons в barapp_subrepo / root, чтобы построить панель, и велел ей связываться со статической библиотекой libfoo в libfoo_subrepo / src /.Наконец, я хочу, чтобы он создал несколько новых модульных тестов в тестах, которые используют статическую библиотеку libfoo и исходные файлы из приложения bar для тестирования приложения 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.Пожалуйста, скажите мне, что есть способ делать то, что я хочу с помощью сыновей.Я не хочу возвращаться, чтобы сделать.

Спасибо.

Ответы [ 2 ]

9 голосов
/ 31 марта 2012

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

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

Edit: В этом примере лучше создать Environment () в скриптах 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'])

подпакет/ 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'])

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

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

0 голосов
/ 28 марта 2014
SConscript(dirs=['src', 'doc'])
...