Укажите разные компиляторы в waf

Я хочу иметь несколько конфигураций сборки (имеется в виду разные компиляторы C), настроенные в waf. Мне удалось сделать это таким образом, но это выглядит немного вонючим для меня.

Как я это делаю в настоящее время: я делаю разные envs и сбрасываю список 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 есть этот вопрос (Как использовать несколько компиляторов с waf (Python )), но без подходящего ответа.


person user69453    schedule 18.12.2018    source источник


Ответы (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_icc, build_clang, clean_icc, clean_clang, ... Каталог для каждого варианта, а именно build/icc и build/clang и, конечно же, ваш exe-файл с соответствующим компилятором.

Тестировать:

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

Обратите внимание, что вариант по умолчанию находится в корневом каталоге сборки. Его кэш-файл c4che/_cache.py. Каждый вариант имеет каталог и кеш, названный по его имени.

person neuro    schedule 20.12.2018
comment
Таким образом, я нашел то же решение :) Спасибо. - person user69453; 20.12.2018