使用Waf创建仅编译选项不同的相似构建目标的惯用方法
Waf原生支持Release/Debug变体的规范实现方式
Waf本身就原生支持多构建变体(比如Release和Debug),完全不需要自己手写复杂的Python函数来隔离版本,这是Waf的惯用做法,具体步骤如下:
1. 配置阶段启用变体
你可以在wscript的configure函数里预设要支持的变体,省去每次配置手动指定的麻烦:
def configure(conf): conf.set_variants('debug', 'release') # 其他配置逻辑,比如检查编译器、依赖库等
或者让用户在配置时手动指定要启用的变体:
waf configure --variant=debug --variant=release
2. 为不同变体设置编译选项
在build函数里,通过bld.variant判断当前构建的版本,针对性设置编译参数:
def build(bld): # 根据变体设置编译标志 if bld.variant == 'debug': bld.env.CFLAGS = ['-g', '-O0', '-DDEBUG'] bld.env.CXXFLAGS = ['-g', '-O0', '-DDEBUG'] elif bld.variant == 'release': bld.env.CFLAGS = ['-O2', '-DNDEBUG', '-march=native'] bld.env.CXXFLAGS = ['-O2', '-DNDEBUG', '-march=native'] # 添加你的构建任务,比如编译生成可执行文件 bld.program( source='src/main.c src/utils.c', target='myapp' )
3. 构建指定版本
运行构建命令时,可直接指定要构建的变体:
# 构建Debug版本 waf build --variant=debug # 构建Release版本 waf build --variant=release # 一次性构建所有预设的变体 waf build
构建产物会自动放在build/debug和build/release目录下,完全隔离,不会互相干扰。
进阶:封装变体配置逻辑
如果变体的配置比较复杂,可以把它抽成单独的函数,让代码更整洁易维护:
def setup_variant(bld): variant = bld.variant if variant == 'debug': bld.env.append_value('CFLAGS', ['-g', '-O0']) bld.env.append_value('CXXFLAGS', ['-g', '-O0']) bld.env.append_value('DEFINES', ['DEBUG']) elif variant == 'release': bld.env.append_value('CFLAGS', ['-O2', '-flto']) bld.env.append_value('CXXFLAGS', ['-O2', '-flto']) bld.env.append_value('DEFINES', ['NDEBUG']) def build(bld): setup_variant(bld) bld.program(source='src/*.c', target='myapp')
这种方式的优势很明显:Waf自动处理变体的目录隔离、增量构建,不用你手动管理输出路径和构建状态;完全符合Waf的惯用规范,后续添加更多变体(比如profile版本)也会非常方便。
内容的提问来源于stack exchange,提问作者Inkrementator
相关产品推荐
相关产品推荐

