Scons: создать заголовочный файл с помощью Object builder

Краткая версия моего вопроса

Я хочу скомпилировать файл .hpp, используя Scons, и для этого я использую следующую цель:

env.Object('file.o', 'file.hpp')

Запуск Scons с этой целью дает мне следующую ошибку:

Don't know how to build from a source file with suffix `.hpp'.  Expected a suffix in this list: [...]

Могу ли я как-то сказать Scons, что он должен обращаться с файлом .hpp так же, как с файлом .cpp?

Зачем мне это

Я использую Emacs вместе с Flymake (http://flymake.sourceforge.net/), который в основном вызывает конкретную цель make в фоновом режиме, анализирует выходные данные и выделяет ошибки и предупреждения в редакторе. Тем не менее, я хочу использовать Scons как систему сборки, а не make. Чтобы использовать flymake, у меня есть Makefile, содержащий одну цель, которая просто вызывает Scons:

SCONS_TARGETS = $(CHK_SOURCES:=.syntax_target)

check-syntax:
LANG=en scons mode=syntax $(SCONS_TARGETS)

И в файле SContruct у меня есть что-то вроде следующего, действительно выполняющего проверку синтаксиса:

### checking syntax (for flymake)
if (mode == 'syntax'):
env.Append(CCFLAGS = ['-fsyntax-only'])
for target in COMMAND_LINE_TARGETS:
env.Object(target,
target.replace('.syntax_target', ''))

Это хорошо работает для моих исходных файлов (.cpp), но не для файлов заголовков (.hpp), для которых я получаю ошибку, упомянутую выше.

Я уже придумал очевидное «решение», чтобы просто скопировать файл заголовка, который необходимо проверить, в файл с суффиксом .cpp и выполнить проверку синтаксиса для этого файла. Этот подход имеет проблему, заключающуюся в том, что компилятор выводит ошибки для нового файла, и, следовательно, flymake, конечно, не выделяет ошибки в файле, где они действительно происходят.

0

Решение

Обновите свой раздел о мухе, как указано ниже:

### checking syntax (for flymake)
if (mode == 'syntax'):
import SCons.Tool
static_obj, shared_obj = SCons.Tool.createObjBuilders(env)

static_obj.add_action('.hpp', SCons.Defaults.CXXAction)
shared_obj.add_action('.hpp', SCons.Defaults.ShCXXAction)
static_obj.add_emitter('.hpp', SCons.Defaults.StaticObjectEmitter)
shared_obj.add_emitter('.hpp', SCons.Defaults.SharedObjectEmitter)

env.Append(CCFLAGS = ['-fsyntax-only'])
for target in COMMAND_LINE_TARGETS:
env.Object(target,
target.replace('.syntax_target', ''))
2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]