如何在waf构建系统中安装一个不同名称的库?

3 投票
2 回答
1789 浏览
提问于 2025-04-17 06:37

我想用waf来构建一个库,但我希望安装时用一个不同于目标名称的名字。看起来你可以这样做:

bld.shlib(..., install_path='${PREFIX}/lib')

但是我需要能够做到类似这样的事情:

bld.shlib(..., install_as='${PREFIX}/lib/xyz')

另外,bld.install_as()也不行,因为它似乎不接受任务作为目标,我也搞不清楚怎么把任务变成一个代表目标的节点,所以下面的代码也不行:

tgt = bld.shlib(...)
bld.install_as('foo', tgt)

或者,我需要能够禁用自动加在库名字前面的“lib”前缀,但只针对这个库,而不是在构建时对所有库都这样,比如像这样:

bld.shlib(..., libprefix='', install_path="${PREFIX}/lib/")

我知道你也可以设置shlib_PATTERN,但这似乎会影响当前环境下的所有库。我们的构建过程比较复杂,使用了很多不同的环境来同时构建调试版和发布版,所以仅仅复制当前环境并改变标志也不行,因为它复制的是默认环境,而不是目标最终会在其下构建的环境(因为我们在构建时会为每个环境复制目标)。

有什么想法吗?谢谢!

2 个回答

1
waf configure build install --target=NameOfTarget --prefix=/home/Brian 

你可以使用两个关键字参数:“name”和“target”。“target”是你要创建的文件的名字,而“name”是在使用“--target”这个参数时的目标名字。听起来有点混乱,不过这里有个例子:

bld(features=['cxx','cxxshlib'],
    source=src,
    includes=inc,
    target='OutputName',
    name='NameOfTarget',
    use=libs,
    install_path='${PREFIX}/lib/MyLibs
    )

这个例子会创建一个共享库“libOutputName.so”,并把它安装到 /home/Brian/lib/MyLib 这个地方。

7

你可以这样做:

hello_lib = bld.shlib(
       includes='/usr/include/python',
       source='a.cpp',
       target='hello',
       uselib='BOOST_PYTHON',
       vnum='0.0.1')
hello_lib.env.cxxshlib_PATTERN = '%s.so'

这段代码只会改变一个任务的命名方式。

撰写回答