我想使用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的程序则放在各自的子目录中。
发布于 2009-10-21 15:58:24
假设您使用的是waf的最新版本(在撰写本文时为1.5.9),可以通过构建上下文中的glob()方法指定通配符。因此,您可以编写以下代码:
bld.new_task_gen(
features = 'cc cshlib',
source = bld.glob('*.c'),
target='mylib')如果您使用的是没有glob的旧版本网站管家,那么有一个方法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属性在库和程序“模块”之间指定正确的包含目录。
发布于 2018-01-12 23:35:20
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')注意,网站管家会自动添加lib前缀,这样你就不用写target = 'libname'了。在Windows上,您还必须向shlib函数调用添加defs关键字参数。
就我个人而言,我建议不要使用涉及wscript_build文件的递归构建脚本。并不是说它不能工作(像recursive makefiles一样),只是在一个中等大小的构建脚本中保存所有逻辑要简单得多。
https://stackoverflow.com/questions/1595450
复制相似问题