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


person Thomas    schedule 29.01.2014    source источник


Ответы (1)


Обновите свой раздел flymake следующим образом:

### 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', ''))
person Ray    schedule 29.01.2014
comment
Отлично работает, спасибо. Есть ли документация, содержащая такую ​​информацию? - person Thomas; 29.01.2014