2013-05-04 3 views
1

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

code/SConstruct 
code/src/SConscript 
code/src/main.c 
code/src/foo.c 
code/src/bar.c 
code/src/tests/SConscript 
code/src/tests/test_foo.c 
code/src/tests/test_bar.c 

тест _ * C должна быть связан с С-файлами, которые реализуют функции, которые они проверяют, поэтому test_foo.c должен быть связан с foo.c, например. Таким образом, src/SConscript должен вернуть несколько целей обратно в src/tests/SConscript, чтобы он мог создавать двоичные файлы (по 1 для каждого теста). Мой вопрос в том, что лучший способ выполнить это с помощью функции Return()? Я хочу, чтобы порядок возвращаемых файлов не имел значения, поэтому кортеж не будет работать. Моя мысль заключалась в том, чтобы построить словарь с ключами, являющимися именами файлов. Я хотел проверить, что не было лучшего способа сделать это; возможно, я могу структурировать файлы по-разному, чтобы упростить сборку?

Спасибо заранее,

ответ

1

Вместо проходных целей вокруг, вы могли бы рассмотреть вопрос о создании 2 библиотеки: libfoo и libbar. Затем просто связывайте эти библиотеки при компиляции двоичных файлов test_foo и test_bar, ссылаясь на них из variant_dir. Попытка проехать вокруг таких целей, как правило, становится сложной и трудно поддерживать.

В случае, если вам интересно, что такое SCons variant_dir, его способ размещения вывода сборки (двоичные файлы, библиотеки, объекты и т. Д.) В каталоге, отличном от исходного кода. Используйте аргумент variant_dir при вызове функции SConscript(), как описано here.

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

env.Program(target='test_foo', ['test_foo.c', '#src/foo.c']) 
+0

У меня похожая ситуация, но моя структура реж пологий: просто 'SRC /' и 'SRC/тест '. Проблема в том, что я хочу, чтобы '# src/foo.c' был создан в альтернативном каталоге, но он создается в' src/'. Мой SC-скрипт верхнего уровня вызывает «SConscript (« test/SConscript », variant_dir = 'build', exports = 'env', duplicate = 0)'. test/SConscript вызывает 'env.Program (target = 'test_foo', ['test_foo.c', '# src/foo.c'])'. Когда я строю, я получаю 'src/build/test_foo',' src/build/test_foo.o', которые являются правильными. Но я получаю 'src/foo.o' вместо' src/build/foo.o'. Что я делаю не так? – cklin

+0

@cklin, Похоже, что «foo.c» строится правильно для src, но снова создается для «test_foo». Попытайтесь ссылаться на 'foo.o' при создании 'test_foo', например: env.Program (target = 'test_foo', ['test_foo.c', '# src/build/foo.o']) – Brady

Смежные вопросы