Does anybody understand waf's linking libraries?

Hal Murray hmurray at
Wed Sep 4 01:14:42 UTC 2019

Context is issue #615

The system is NetBSD 7.2, old but still supported.

It has a newer OpenSSL installed in /usr/pkg/
/usr/include/openssl/opensslv.h:# define OPENSSL_VERSION_NUMBER  0x1000115fL
/usr/pkg/include/openssl/opensslv.h:# define OPENSSL_VERSION_NUMBER  
The old version doesn't support ALPN.

The symptom is that build is finding the new includes but linking with the old 

linking ntpd:
ntpd/nts_server.c.1.o: In function `nts_server_init':
/home/murray/ntpsec/raw/bob2/main/../../ntpd/nts_server.c:107: undefined 
reference to `SSL_CTX_set_alpn_select_cb'
(and several others)

wscript contains:
    elif ctx.env.DEST_OS == "netbsd":
        ctx.env.PLATFORM_INCLUDES = ["/usr/pkg/include"]
        ctx.env.PLATFORM_LIBPATH = ["/usr/lib", "/usr/pkg/lib"]

from ./waf build -v
[79/98] Linking bob2/main/ntpd/ntpd
17:51:03 runner ['/usr/bin/gcc', '-pie', 'ntpd/ntp_config.c.5.o', 
'ntpd/ntp_io.c.5.o', 'ntpd/ntp_loopfilter.c.5.o', 'ntpd/ntp_packetstamp.c.5.o',
 'ntpd/ntp_peer.c.5.o', 'ntpd/ntp_proto.c.5.o', 'ntpd/ntp_sandbox.c.5.o', 
'ntpd/ntp_scanner.c.5.o', 'ntpd/ntp_signd.c.5.o', 'ntpd/ntp_timer.c.5.o', 
'ntpd/ntp_dns.c.5.o', 'ntpd/ntpd.c.5.o', 'bob2/host/ntpd/',
 'ntpd/ntp_control.c.1.o', 'ntpd/ntp_filegen.c.1.o', 'ntpd/ntp_leapsec.c.1.o', 
'ntpd/ntp_monitor.c.1.o', 'ntpd/ntp_recvbuff.c.1.o', 
'ntpd/ntp_restrict.c.1.o', 'ntpd/ntp_util.c.1.o', 'ntpd/nts.c.1.o', 
'ntpd/nts_server.c.1.o', 'ntpd/nts_client.c.1.o', 'ntpd/nts_cookie.c.1.o', 
'ntpd/nts_extens.c.1.o', 'ntpd/ntp_refclock.c.3.o', 'ntpd/ntp_wrapdate.c.3.o', 
'ntpd/refclock_conf.c.3.o', 'ntpd/refclock_nmea.c.4.o', '-o', 
'/home/murray/ntpsec/raw/bob2/main/ntpd/ntpd', '-Wl,-Bstatic', '-Llibaes_siv', 
'-Llibntp', '-laes_siv', '-lntp', '-Wl,-Bdynamic', '-lcrypto', '-lssl', '-lm', 
'-lrt', '-lpthread', '-ldns_sd', '-Wl,-z,now', '-Wl,-z,relro']

There is no -L/usr/pkg/lib in there.

If I comment out the INCLUDES line is wscript ntpd builds.  ldd shows it using 
the old
        -lcrypto.8 => /usr/lib/

But now is broken:
  File "/home/murray/ntpsec/raw/wafhelpers/", line 11, in <module>
    import ntp.util
  File "/home/murray/ntpsec/raw/bob2/main/tests/pylib/ntp/", line 16, 
in <module>
    import ntp.ntpc
ImportError: Shared object "" not found

        -lpython2.7.1.0 => /usr/lib/
        -lutil.7 => /usr/lib/
        -lgcc_s.1 => /usr/lib/
        -lc.12 => /usr/lib/
        -lm.0 => /usr/lib/
        -lpthread.1 => /usr/lib/
        -lrt.1 => /usr/lib/
        -lcrypto.1.0.0 => not found

This time, it does have -L/usr/pkg/lib

[61/98] Linking bob2/main/pylib/
18:02:23 runner ['/usr/bin/gcc', '-shared', '-pthread', '-pthread', 
'-Wl,--export-dynamic', 'libntp/pymodule.c.2.o', 'libntp/assert.c.2.o', 
'libntp/clockwork.c.2.o', 'libntp/emalloc.c.2.o', 'libntp/hextolfp.c.2.o', 
'libntp/lib_strbuf.c.2.o', 'libntp/msyslog.c.2.o', 
'libntp/ntp_calendar.c.2.o', 'libntp/ntp_random.c.2.o', 
'libntp/prettydate.c.2.o', 'libntp/statestr.c.2.o', 'libntp/systime.c.2.o', 
'libntp/timespecops.c.2.o', '-o', '/home/murray/ntpsec/raw/bob2/main/pylib/ntpc
.so', '-Wl,-Bstatic', '-Wl,-Bdynamic', '-L/usr/pkg/lib', '-lpython2.7', 
'-lutil', '-lm', '-lpython2.7', '-lutil', '-lm', '-lm', '-lrt', '-lcrypto', 
'-Wl,-z,now', '-Wl,-z,relro']

If I change the LIBPATH line to:
        ctx.env.PLATFORM_LIBPATH = ["/usr/lib"]
and rebuild, I get the same error.

The -L/usr/pkg/lib is still in the load command.

Anybody know where it is coming from?  I can't find the string /usr/pkg/lib 
anyplace else in our code.  I assume waf is doing some magic.

I'll be happy with either old or new version.

These are my opinions.  I hate spam.

More information about the devel mailing list