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