我想使用waf构建一个共享库,因为它看起来比GNU autotools更容易,更简洁。
到目前为止,我实际上有几个问题与我开始写的wscript有关:
VERSION='0.0.1'
APPNAME='libmylib'
srcdir = '.'
blddir = 'build'
def set_options(opt):
opt.tool_options('compiler_cc')
pass
def configure(conf):
conf.check_tool('compiler_cc')
conf.env.append_value('CCFLAGS', '-std=gnu99 -Wall -pedantic -ggdb')
def build(bld):
bld.new_task_gen(
features = 'cc cshlib',
source = '*.c',
target='libmylib')
包含source = '*.c'
的行不起作用。我必须指定每个.c文件而不是使用通配符吗?
如何启用调试版本(目前wscript正在使用调试版本CFLAGS,但我想让最终用户选择此版本。)
计划将库源放在子目录中,以及在各自子目录中使用lib的程序。
答案 0 :(得分:5)
假设您使用的是最新版本的waf(编写本文时为1.5.9),可以通过构建上下文中的glob()
方法指定通配符。所以你可以写下面的内容:
bld.new_task_gen(
features = 'cc cshlib',
source = bld.glob('*.c'),
target='mylib')
如果您使用的是没有glob的旧版waf,那么您可以使用方法find_sources_in_dirs
:
lib = bld.new_task_gen(
features = 'cc cshlib',
target = 'mylib')
lib.find_sources_in_dirs('.')
这种方法仍然在Waf中,但是可能会被弃用,最终可能会消失。
srcdir
和blddir
变量现在是可选的,因此您不需要它们 - 它们默认为“。”无论如何,“建立”。您不应该在目标名称前加上“lib”,这是以特定于平台的方式自动完成的(在Windows上没有添加lib,共享库使用.dll)。调试与发布版本是一个令人惊讶的棘手问题。最初Waf包含了这个功能,但它在某些时候被丢弃,从未重新添加。这是邮件列表中的常见请求,因此将来可能会重新出现。与此同时,你可能比使用gjc's cflags module更糟糕。只需将其添加到项目目录即可。最终的wscript将是:
VERSION='0.0.1'
APPNAME='mylib'
def set_options(opt):
opt.tool_options('compiler_cc')
opt.tool_options('cflags', tooldir='.')
def configure(conf):
conf.check_tool('compiler_cc')
conf.check_tool('cflags', tooldir='.')
def build(bld):
bld.new_task_gen(
features = 'cc cshlib',
source = bld.glob('*.c'),
target=APPNAME)
要设置调试版本,您将运行以下命令:
./waf configure -d debug
如果您在自己的子目录中使用库,那么您应该使用顶级wscript并使用bld.add_subdirs()
技术添加库/程序目录。每个子目录都有自己的wscript_build文件。然后,您可以使用export_incdirs
和uselib_local
属性指定库和程序“模块”之间的正确包含目录。
答案 1 :(得分:1)
def options(ctx):
ctx.load('compiler_c')
def configure(ctx):
ctx.load('compiler_c')
def build(ctx):
ctx.shlib(source = ctx.path.ant_glob('src/*.c'),
target = 'name')
请注意,waf会自动添加lib
前缀,因此您不会写target
= 'libname'
。在Windows上,您还必须将defs
关键字参数添加到shlib
函数调用中。
我个人建议不要使用涉及wscript_build
文件的递归构建脚本。并非它不起作用(如recursive makefiles),将所有逻辑保存在一个中等大小的构建脚本中要简单得多。