Что ж, в этом случае с 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