waf中指定不同的编译器
Specify different compilers in 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)) 上有这个问题,但没有合适的答案。
嗯,在这种情况下使用 waf 的方法是 "variants"(参见 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
。每个变体都有一个目录和一个以其名称命名的缓存。
我想在 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)) 上有这个问题,但没有合适的答案。
嗯,在这种情况下使用 waf 的方法是 "variants"(参见 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
。每个变体都有一个目录和一个以其名称命名的缓存。