Используя waf 1.7.9 с добавлением extras / boost.py, я обнаружил, что вам нужно получить библиотеки во время настройки, что затрудняет создание целей с различными наборами библиотек. Например, у меня есть две программы, одна из которых нуждается только в заголовочных файлах boost (программа «a»), а другая использует некоторые библиотеки (программа «b»). Вот мое решение, но мой вопрос: есть ли лучший / предпочтительный способ сделать это?
#! /usr/bin/env python
# encoding: utf-8
def options(opt):
opt.load('compiler_cxx boost')
def configure(conf):
conf.load('compiler_cxx boost')
conf.check_boost()
conf.env.DEFINES_BOOST = ['NDEBUG']
conf.env.LIB_BOOST_FILESYSTEM = conf.boost_get_libs('filesystem system')[-1]
conf.env.LIB_BOOST_PROGRAM_OPTIONS = conf.boost_get_libs('program_options')[-1]
def build(bld):
# program 'a' requires header-only part of boost
bld.program(
target = 'a',
source = 'a.cpp',
use = ['BOOST'] )
# program 'b' requires link to some boost libraries
bld.program(
target = 'b',
source = 'b.cpp',
use = ['BOOST', 'BOOST_FILESYSTEM', 'BOOST_PROGRAM_OPTIONS'] )
Я не знаю, есть ли предпочтительный способ, но есть способ, который я считаю, чтобы иметь меньше магии. По сути, не используйте дополнительный импульс. Вы можете точно указать, какие библиотеки вы хотите включить без него.
#!/usr/bin/env python
# encoding: utf-8
def options(opt):
opt.load('compiler_cxx')
def configure(conf):
conf.load('compiler_cxx')
# NOTE: The uselib_store keyword argument is not necessary here, it is just added
# So that it is clear what name is required to use it during building.
conf.check(compiler='cxx',lib='boost_filesystem',uselib_store='BOOST_FILESYSTEM')
conf.check(compiler='cxx',lib='boost_program_options',uselib_store='BOOST_PROGRAM_OPTIONS')
# NOTE: I don't know what DEFINES_BOOST is used for
# conf.env.DEFINES_BOOST = ['NDEBUG']
# This will give you a command line define
conf.define('NDEBUG,'',quote=False)
def build(bld):
# NOTE: Specifying include directories is dependent on your platform. I think Waf
# takes care of this for you, but I'm putting it here for effect.
inc = ['/usr/include']
# program 'a' requires header-only part of boost
bld.program(
target = 'a',
source = 'a.cpp',
use = []
includes = inc )
# program 'b' requires link to some boost libraries
bld.program(
target = 'b',
source = 'b.cpp',
use = ['BOOST_FILESYSTEM', 'BOOST_PROGRAM_OPTIONS'],
includes = inc)
Других решений пока нет …