Ну, в данном случае путь с 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
.Каждый вариант имеет каталог и кэш с именем ater.