如何使用waf构建共享库?

时间:2009-10-20 15:25:15

标签: 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')

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

如何启用调试版本(目前wscript正在使用调试版本CFLAGS,但我想让最终用户选择此版本。)

计划将库源放在子目录中,以及在各自子目录中使用lib的程序。

2 个答案:

答案 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中,但是可能会被弃用,最终可能会消失。

srcdirblddir变量现在是可选的,因此您不需要它们 - 它们默认为“。”无论如何,“建立”。您不应该在目标名称前加上“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_incdirsuselib_local属性指定库和程序“模块”之间的正确包含目录。

答案 1 :(得分:1)

多年来,waf已经发生了很大的变化,所以问题中的代码和答案都不再适用于当前的waf。现在你只写:

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),将所有逻辑保存在一个中等大小的构建脚本中要简单得多。

相关问题