在waf中指定其他编译器

时间:2018-12-18 12:48:30

标签: python waf

我想在waf中配置几个构建配置(意味着不同的C编译器)。我设法那样做,但是对我来说似乎有点臭。

当前如何操作:我创建了不同的环境,并在加载下一个编译器之前重置c_compiler列表,最后将其重置为所有编译器。

def configure(cnf):
   _os = Utils.unversioned_sys_platform()

   restore_c_compilers = c_compiler[_os]

   # load gcc
   c_compiler[_os] = ['gcc']
   conf.setenv('gcc')
   conf.load('compiler_c')

   # load clang
   conf.setenv('clang')
   c_compiler[_os] = ['clang']
   conf.load('compiler_c')

   c_compiler[_os] = restore_c_compilers  # reset compiler list

有没有一种更好的方法?

SO(How to use multiple compilers with waf (Python))上有这个问题,但没有合适的答案。

1 个答案:

答案 0 :(得分:1)

在这种情况下,使用waf的方法是“变体”(参见waf书第7.2.2节)。由于gcc通常是默认编译器,因此我为每个其他编译器创建了一个变体,以及一组相应的命令和环境。实践中:

def options(opt):
    opt.load('compiler_c')

def configure(conf):

    # here we are in default variant/env
    # we load the default compiler, probably gcc

    conf.load('compiler_c')

    # config for clang variant

    conf.setenv('clang')
    conf.env.CC = ['clang']
    conf.load('compiler_c')

    # config for icc variant

    conf.setenv('icc')
    conf.env.CC = ['icc']
    conf.load('compiler_c')

    # back to default config

    conf.setenv('')

def build(bld):

    bld.program(source = 'main.c', target = 'myexe')

# this create variants commands and build directories

from waflib.Build import BuildContext, \
    CleanContext, InstallContext, UninstallContext

for variant in ['clang', 'icc']:
    for context in [BuildContext, CleanContext, InstallContext, UninstallContext]:
        name = context.__name__.replace('Context','').lower()
        class tmp(context):
            cmd = name + '_' + variant
            variant = variant

获得的内容:额外的命令build_iccbuild_clangclean_iccclean_clang,...每个变体的目录,即build/icc和{ {1}},当然还有您的exe是使用相应的编译器构建的。

要测试:

build/clang

您将获得:

waf build -v        # use gcc, or the default compiler
waf build_icc -v    # use icc
waf build_clang -v  # use clang

请注意,默认变体位于根构建目录中。其缓存文件为build/ ├── c4che │   ├── build.config.py │   ├── _cache.py │   ├── clang_cache.py │   └── icc_cache.py ├── clang │   ├── main.c.1.o │   └── myexe ├── icc │   ├── main.c.1.o │   └── myexe ├── config.log ├── main.c.1.o └── myexe 。每个变体都有一个目录和一个名为ater的缓存。