MM92x
MM92x

Reputation: 568

Waf - How to add a library to a wscript file?

I would like to add the c++ library cpp-netlib to a wscript. Then if I run dpkg -l libcppnetlib0 I obtain:

libcppnetlib0: 0.11.0-1     amd64        C++ Network Library

Running: dpkg -L libcppnetlib0, I obtain:

/.
/usr
/usr/lib
/usr/lib/x86_64-linux-gnu
/usr/lib/x86_64-linux-gnu/cppnetlib-uri.so.0.11.0
/usr/lib/x86_64-linux-gnu/cppnetlib-server-parsers.so.0.11.0
/usr/lib/x86_64-linux-gnu/cppnetlib-client-connections.so.0.11.0
/usr/share
/usr/share/lintian
/usr/share/lintian/overrides
/usr/share/lintian/overrides/libcppnetlib0
/usr/share/doc
/usr/share/doc/libcppnetlib0
/usr/share/doc/libcppnetlib0/copyright
/usr/share/doc/libcppnetlib0/changelog.Debian.gz
/usr/lib/x86_64-linux-gnu/libcppnetlib-server-parsers.so.0
/usr/lib/x86_64-linux-gnu/libcppnetlib-client-connections.so.0
/usr/lib/x86_64-linux-gnu/libcppnetlib-uri.so.0

Since I need libcppnetlib-uri, libcppnetlib-server-parsers, libcppnetlib-client-connections , in the wscript I add the following fields:

conf.check_cxx(lib='cppnetlib-uri',uselib_store='CPPNETLIBU', define_name='HAVE_CPPNETLIBU',mandatory=True)
conf.check_cxx(lib='cppnetlib-server-parsers',uselib_store='CPPNETLIBS', define_name='HAVE_CPPNETLIBS',mandatory=True)
conf.check_cxx(lib='cppnetlib-client-connections',uselib_store='CPPNETLIBC', define_name='HAVE_CPPNETLIBC',mandatory=True)

Then I added the three references (CPPNETLIBU, CPPNETLIBC, CPPNETLIBS) here:

libndn_cxx = dict(
        target="ndn-cxx",
        name="ndn-cxx",
        source=bld.path.ant_glob('src/**/*.cpp',
                                 excl=['src/security/**/*-osx.cpp',
                                       'src/**/*-sqlite3.cpp']),
        headers='src/common-pch.hpp',
        use='version BOOST CRYPTOPP OPENSSL SQLITE3 RT PTHREAD CPPNETLIBC CPPNETLIBU CPPNETLIBS',
        includes=". src",
        export_includes="src",
        install_path='${LIBDIR}')

But, when I launch ./waf configure, it fails, it does not find the libraries that I specified.

The error is:

[199/200] Linking build/examples/clientMat
examples/clientMat.cpp.2.o: In function `construct<boost::network::http::impl::normal_delegate, asio::io_service&>':
/usr/include/c++/4.9/ext/new_allocator.h:120: undefined reference to `boost::network::http::impl::normal_delegate::normal_delegate(asio::io_service&)'
/usr/lib/gcc/x86_64-linux-gnu/4.9/../../../x86_64-linux-gnu/libcppnetlib-client-connections.so: undefined reference to `boost::system::system_category()'
/usr/lib/gcc/x86_64-linux-gnu/4.9/../../../x86_64-linux-gnu/libcppnetlib-client-connections.so: undefined reference to `boost::system::generic_category()'
collect2: error: ld returned 1 exit status

I (maybe?) identified the problem in the absence of any reference in /usr/local/lib/pkgconfig. Indeed, running: ls /usr/local/lib/pkgconfig, I have some .pc files but nothing about cppnetlib. I tried to write my own without success.

If the problem is here, actually I need an help about how to write the .pc files correctly.

This question was a good starting point, but I did not success the same: waf -how to add external library to wscript_build file

Upvotes: 0

Views: 1957

Answers (1)

Moo7
Moo7

Reputation: 11

You can use bld.read_shlib() as described in https://waf.io/book/

example code (main.c):

#include <stdio.h>
#include <math.h>

int main(int argc, char* argv[]) {
    printf("cos(0.123456)=%f\n", cos(0.123456));
    return 0;
}

build script using math library:

#!/usr/bin/env python
# -*- encoding: utf-8 -*-

top = '.'
out = 'build'

VERSION = '0.0.0'
APPNAME = 'app'

def options(opt):
    opt.load('compiler_c')

def configure(conf):
    conf.load('compiler_c')
    conf.check_cc(lib='m', cflags='-Wall', uselib_store='M')
    conf.check(header_name='math.h', features='c cprogram')

def build(bld):
    bld.read_shlib('m')
    bld.program(target='app', source='main.c')

Upvotes: 1

Related Questions