2011-11-24 3 views
5

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

По умолчанию конфигурация SCons не имеет явного шага, на котором генерируются файлы сборки (.s).

Чтобы обойти это, я создал свой собственный Builder, который испускает файлы сборки.

code_generator = Builder(action = '$CC -$LOTS_OF_FLAGS -S $SOURCE -o $TARGET', suffix = '.s') 
env.Append(BUILDERS = {'CodeGenerator':code_generator}) 

Затем я использую этот Builder на моих исходных файлов и передать полученный NodeList к Program.

for file in Glob('*.c'): 
    sources += env.CodeGenerator(file) 

env.Program('say_hello', sources) 

Это хорошо работает, когда я не изменяю никаких переменных. Я получаю исполняемый файл, используя gcc.

Однако, когда я пытаюсь заменить соответствующие переменные, так что SCons использует пользовательскую инструментальную цепочку (используя env.Replace(CC='clang')...), создается только один файл сборки. Мой заказ Builder не вызывается на любой другой файл и SCons пытается связать только с одним файлом объекта (который, очевидно, не получится)

  1. Как я могу сделать SCons запустить построитель всех файлов и включают в себя те объектные файлы для связывания ?
  2. Есть ли лучший способ выполнить то, что я пытаюсь сделать? ? Я только начинаю работать со SCons.

ответ

3

Есть большое количество именованных аргументов для Builder класса, которые изложены на SCons man page, которые не упоминаются в руководстве. Это один из слабых мест в документации для SCons, и он был на некоторое время.

В этом случае, я полагаю, вы ищете аргумент single_source ключевых слов, которые:

Указывает, что этот строитель ожидает ровно один исходный файл для каждого вызова. Предоставление нескольких файлов-источников без файлов-мишеней приводит к тому, что неявно вызывает строитель несколько раз (один раз для каждого источника ).

Рассматривая источник для Builder, single_source необходимо оценить True (или эквивалент). Таким образом, ваш код можно переписать с одной очень незначительной модификацией.

env = Environment() 
code_generator = Builder(action = '$CC $CCFLAGS -S $SOURCE -o $TARGET', 
         single_source = 1, 
         suffix = '.s') 
env.Replace(CC= 'clang') 
env.Append(BUILDERS = {'CodeGenerator' : code_generator}) 
sources = env.CodeGenerator(file) 
env.Program('say_hello', sources) 

Что для каталога с файлами: foo.c и bar.c производит вывод:

scons: Reading SConscript files ... 
scons: done reading SConscript files. 
scons: Building targets ... 
clang -S bar.c -o bar.s 
as -o bar.o bar.s 
clang -S foo.c -o foo.s 
as -o foo.o foo.s 
clang -o say_hello bar.o foo.o 
scons: done building targets. 
+0

Даже после предлагаемого исправления, я продолжаю обращенную тот же вопрос. Но спасибо за замечание о дополнительной документации на странице руководства. Вы были правы, я имел в виду только руководство пользователя. Будут исследовать дальше и отчитываться, если я удастся. – Buzzy

+0

Какую версию вы используете? –

+0

Установлен с использованием Homebrew на Mac: script: v2.1.0.r5357 engine: v2.1.0.r5357 – Buzzy