Meson subproject's nested dependency is not included

67 Views Asked by At

I am trying to build chatserver executable, which depends on libnetwork. libnetwork depends on the header library, libthread.

When I build chatserver with ninja -C buildDir command, there is no inclusion for libthread, which in turn results compile failure for libnetwork.

❯ ninja -C buildDir
ninja: Entering directory `buildDir'
[1/2] Compiling C++ object chatserver.p/src_App.cpp.o
FAILED: chatserver.p/src_App.cpp.o 
c++ -Ichatserver.p -I. -I.. -I../subprojects/libnetwork/include -I/usr/include -fdiagnostics-color=always -D_FILE_OFFSET_BITS=64 -Wall -Winvalid-pch -Wextra -Wpedantic -std=c++20 -O0 -g -DBOOST_ALL_NO_LIB -DPROJECT_NAME=chatserver -DPROJECT_VERSION=0.0.1 -MD -MQ chatserver.p/src_App.cpp.o -MF chatserver.p/src_App.cpp.o.d -o chatserver.p/src_App.cpp.o -c ../src/App.cpp

...

../subprojects/libnetwork/include/mynamespace/network/Session.hpp:9:10: fatal error: mynamespace/thread/Queue.hpp: No such file or directory
    9 | #include <mynamespace/thread/Queue.hpp>
      |          ^~~~~~~~~~~~~~~~~~~~~~~~~~~~
compilation terminated.
ninja: build stopped: subcommand failed

libthread/meson.build

project(
    'libthread',
    'cpp',
    version : '0.0.1',
    default_options : ['cpp_std=c++20', 'warning_level=3']
)

project_headers = [
    'include/mynamespace/thread/Queue.hpp',
]

build_args = [
]

### Target ###
inc = include_directories('include')

project_target = shared_library(
    meson.project_name(),
    [],
    install : true,
    cpp_args : build_args,
    gnu_symbol_visibility : 'hidden',
    include_directories : inc,
    dependencies : [],
)

### Project ###
project_dep = declare_dependency(
    include_directories : inc,
)
set_variable(meson.project_name() + '_dep', project_dep)

libnetwork/meson.build

project(
    'libnetwork',
    'cpp',
    version : '0.0.1',
    default_options : ['cpp_std=c++20', 'warning_level=3']
)

project_headers = 
    'include/mynamespace/network/Session.hpp',
]

project_sources = [
    'src/Session.cpp',
]

build_args = [
]

### Target ###
project_dependencies = [
    dependency('boost'),
    dependency('libthread', fallback: ['libthread', 'libthread_dep']),
]

inc = include_directories('include')

build_args += [
    '-DPROJECT_NAME=' + meson.project_name(),
    '-DPROJECT_VERSION=' + meson.project_version(),
]

project_target = library(
    meson.project_name(),
    project_sources,
    install : true,
    cpp_args : build_args,
    gnu_symbol_visibility : 'hidden',
    include_directories : inc,
    dependencies : project_dependencies,
)

### Project ###
project_dep = declare_dependency(
    include_directories : inc,
    link_with : project_target,
)
set_variable(meson.project_name() + '_dep', project_dep)

libnetwork/subprojects/libthread.wrap

[wrap-git]
url = <My url to libthread git>.git
revision = main
depth = 1

chatserver/meson.build

project(
    'chatserver',
    'cpp',
    version : '0.0.1',
    default_options : ['cpp_std=c++20', 'warning_level=3']
)

project_sources = [
    'src/App.cpp',
]

project_dependencies = [
    dependency('boost'),
    dependency('libnetwork', fallback : ['libnetwork', 'libnetwork_dep']),
]

build_args = [
]

# Target
build_args += [
    '-DPROJECT_NAME=' + meson.project_name(),
    '-DPROJECT_VERSION=' + meson.project_version(),
]

project_target = executable(
    meson.project_name(),
    project_sources,
    dependencies : project_dependencies,
    install : true,
    cpp_args : build_args,
)

chatserver/subprojects/libnetwork.wrap

[wrap-git]
url = <My url to libthread git>.git
revision = main
depth = 1

How can I set libthread as a public dependency for libnetwork so that chatserver can also include libthread?

1

There are 1 best solutions below

0
Sanu7D0 On

It was a simple mistake.

To set the dependency as public, as like PUBLIC link in CMake, they should be passed to dependencies of declare_dependecy.

Here is my modified code of libnetwork/meson.build

libthread_dep = dependency('libthread', fallback: ['libthread', 'libthread_dep'])

...

project_dep = declare_dependency(
    dependencies: [libthread_dep], # Depend as public
    include_directories : inc,
    link_with : project_target,
)