On 02/01/21 14:25, Peter Maydell wrote:
Question to Paolo -- it seems pretty fragile to have to explicitly
list "these source files need these extra CFLAGS" in half a dozen
meson.build files, because it's pretty non-obvious that adding
eg '#include "block/nbd.h"' to a .c file means that you also
need to update the meson.build file to say "and now it needs these
extra CFLAGS". Isn't there some way we can just have the CFLAGS
added more globally so that if we use gnutls.h directly or
indirectly from more .c files in future it Just Works ?

If the build failed for the common Linux case then it would be
at least more obvious that you needed to update the meson.build
files. I think it's better to avoid "you need to do this special
thing that you'll only notice you're missing if you happen to test
on a somewhat obscure host configuration" where we can.

(We don't want to link helper binaries etc against gnutls if
they don't need it, but that's LDFLAGS, not CFLAGS.)

The gnutls dependency will already propagate from

if 'CONFIG_GNUTLS' in config_host
  crypto_ss.add(gnutls)
endif

to

libcrypto = static_library('crypto', crypto_ss.sources() + genh,
                          dependencies: [crypto_ss.dependencies()], ...)
crypto = declare_dependency(link_whole: libcrypto,
                            dependencies: [authz, qom])

That is, Meson does know that everything that needs crypto needs gnutls (see get_dependencies in mesonbuild/build.py if you're curious).

I think the issue is that dependencies are listed too late---in the declare_dependency rather than the static_library. Take io/ for example:

libio = static_library('io', io_ss.sources() + genh,
                       dependencies: [io_ss.dependencies()],
                       link_with: libqemuutil,
                       name_suffix: 'fa',
                       build_by_default: false)
io = declare_dependency(link_whole: libio, dependencies: [crypto, qom])

Listing "crypto" in io's declare_dependency is enough to propagate the gnutls LDFLAGS down to the executables, but it does not add the CFLAGS to io/ files itself. So for the io/ files we aren't telling meson that they need crypto (and thus in turn gnutls on the include path).

The fix should be pretty simple and localized to the "Library dependencies" section of meson.build. For the two libraries above, the fixed version would look like:

crypto_ss.add(authz, qom)
libcrypto = ... # same as above
crypto = declare_dependency(link_whole: libcrypto)

io_ss.add(crypto, qom)
...
libio = ... # same as above
io = declare_dependency(link_whole: libio)

(Roman, feel free to plunder the above if you want to turn it into a commit message, and if it's correct of course).

Thanks,

Paolo


Reply via email to