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