如何使用waf构建共享库?

Jam*_*ris 10 c linux shared-libraries waf

我想使用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')
Run Code Online (Sandbox Code Playgroud)

包含的行source = '*.c'不起作用.我必须指定每个.c文件而不是使用通配符吗?

我怎样才能启用调试版本(目前wscript正在使用调试版本CFLAGS,但我想让最终用户选择它).

计划将库源放在子目录中,以及在每个子目录中使用lib的程序.

ric*_*chq 6

假设您使用的是最新版本的waf(编写本文时为1.5.9),可以通过glob()构建上下文中的方法指定通配符.所以你可以写下面的内容:

bld.new_task_gen(
    features = 'cc cshlib',
    source = bld.glob('*.c'),
    target='mylib')
Run Code Online (Sandbox Code Playgroud)

如果您使用的是没有glob的旧版waf,那么find_sources_in_dirs可以使用一种方法:

lib = bld.new_task_gen(
    features = 'cc cshlib',
    target = 'mylib')
lib.find_sources_in_dirs('.')
Run Code Online (Sandbox Code Playgroud)

这种方法仍然在Waf中,但是可能会被弃用,最终可能会消失.

srcdirblddir变量是可选的,现在,所以你不需要他们-他们默认为"" 无论如何,"建立".您不应该在目标名称前加上"lib",这是以特定于平台的方式自动完成的(在Windows上没有添加lib,共享库使用.dll).调试与发布版本是一个令人惊讶的棘手问题.最初Waf包含了这个功能,但它在某些时候被丢弃,从未重新添加.这是邮件列表中的常见请求,因此将来可能会重新出现.与此同时,你可以比使用gjc的cflags模块做得更糟.只需将其添加到项目目录即可.最终的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)
Run Code Online (Sandbox Code Playgroud)

要设置调试版本,您将运行以下命令:

./waf configure -d debug
Run Code Online (Sandbox Code Playgroud)

如果您在自己的子目录中使用库,那么您应该拥有顶级wscript并使用该bld.add_subdirs()技术添加库/程序目录.每个子目录都有自己的wscript_build文件.然后,您可以使用export_incdirsuselib_local属性指定库和程序"模块"之间的正确包含目录.