1

我有一些这样的代码需要跨平台:

int __attribute__((noinline)) fn() { return 0; }

我想用 Waf 写一个 config.h 包含

#define ATTRIBUTE(attr) __attribute__((attr))

如果编译器支持这个扩展,并且

#define ATTRIBUTE(attr)

否则,我可以像这样重写函数:

int ATTRIBUTE(noinline) fn() { return 0; }

查看配置文档,我没有看到明显的方法来做到这一点。HAS_ATTRIBUTES如果使用此功能的代码片段无法编译,我能做的最好的事情就是定义一些宏。

waf 是否支持以这种方式配置项目,还是我必须手动编写第二个配置头?

(我正在专门寻找一个 waf 答案。如果我可以使用其他东西,我会的。)

4

1 回答 1

0

这是我解决它的方法。

在我的脚本中:

attribute_noinline_prg = '''
    int __attribute__((noinline)) fn() { return 0; }
    int main()
    {
        return fn();
    }
    '''
conf.check_cxx(fragment=attribute_noinline_prg,
               msg='Checking for __attribute__(noinline)',
               define_name='HAVE_ATTRIBUTE_NOINLINE',
               mandatory=False)

然后在手动创建的配置头中:

#ifdef HAVE_ATTRIBUTE_NOINLINE
#define ATTRIBUTE_NOINLINE __attribute__((noinline))
#else
#define ATTRIBUTE_NOINLINE
#endif

我本来希望避免像这样手动创建标题,但它可以完成工作。

于 2019-12-06T12:39:03.503 回答