10

我想使用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,但我想让最终用户可以选择)。

计划库源位于子目录中,使用该库的程序各自位于其自己的子目录中。

4

2 回答 2

6

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

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)。Debug vs Release build 是一个非常棘手的问题。最初 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)

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

./waf configure -d debug

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

于 2009-10-21T07:58:24.040 回答
3

多年来,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文件的递归构建脚本。并不是说它不起作用(如递归 makefiles),将所有逻辑保存在一个中等大小的构建脚本中要简单得多。

于 2018-01-12T15:35:19.577 回答