2013-08-16 3 views
1

В настоящее время я пытаюсь создать систему сборки вокруг Scons, которая будет использовать драйвер Boost Wave в качестве пользовательского препроцессора кода на C++. После предварительной обработки код компилируется с помощью MSVC. В настоящий момент я запускаю волну для каждого исходного файла, увиденного Scons, из файла Sconscript. Это работает, но имеет проблему - это довольно медленно, потому что он не использует кеш компиляции Scons.Scons - использование пользовательского препроцессора с кэшем scons

Как бы вы порекомендовали интегрировать пользовательский шаг предварительной обработки в систему сборки SCons таким образом, чтобы использовался кеш компиляции? Очевидно, что мне также нужно правильное сканирование зависимостей #include, параллельная компиляция и т. Д. Я не очень опытен с SCons, поэтому я ищу, чтобы кто-то указал мне в правильном направлении.

Моего текущее два направления исследований:

  • найти какой-нибудь способ для вызова пут/извлечения функции кэша вручную, но это рискованно - Я не хочу засорять кэш с недействительными записями.
  • Создание настраиваемого инструмента/псевдобуйдера/что-то, что позволило бы мне выполнить две команды. Или попробуйте сделать у нас использование scons-инструментов. Это кажется сложным.
  • Ответ Тома Таннера, который, кажется, страдает от зависимостей #include, которые не были обнаружены правильно.

ответ

3

Для использования кэш-памяти вы должны иметь цель. scons кэширует цель на основе файлов и команды сборки.

Даже без строителя вы можете написать себе командный процессор примерно так.

out_cc = env.Command('file.wave.cpp', 'file.cpp', 'wave command < $SOURCE > $TARGET') 
env.Program('myprog', ['this.cc', 'that.cc', out_cc]) 

Это будет использовать кеш.

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

Редактировать: Обновлено, чтобы включить решение liosan для создания файлов .cpp для волн и создания файлов .cpp и, следовательно, получения зависимых зависимостей. Отчаянный для репутации я ...

+0

Выглядит многообещающе, я изучаю его. Но как SCons узнает, что он должен скомпилировать предварительно обработанный файл? – Liosan

+0

, потому что вы сказали это - см. Фрагмент кода. –

+0

Ум, может быть, я не читаю его правильно, но после того, как я применил ваш фрагмент в нашей системе сборки, я получил сообщение об ошибке «Я не знаю, что делать с файлом X.wave, wave '"... – Liosan