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, конечно, не выделяет ошибки в файле, где они действительно происходят.

1 ответ

Решение

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

### 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', ''))
Другие вопросы по тегам