【问题标题】:Scons: build header file with Object builderScons:使用对象生成器构建头文件
【发布时间】:2014-01-29 16:16:20
【问题描述】:

我的问题的简短版本

我想使用 Scons 编译一个 .hpp 文件,为此我使用以下目标:

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 它应该像对待 .cpp 文件一样对待 .hpp 文件吗?

我为什么要这个

我将 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 当然不会突出显示文件中实际发生的错误。

【问题讨论】:

    标签: c++ emacs scons flymake


    【解决方案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', ''))
    

    【讨论】:

    • 效果很好,谢谢。是否有包含此类信息的文档?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-12
    • 1970-01-01
    • 1970-01-01
    • 2014-05-06
    相关资源
    最近更新 更多