skip to Main Content

I am trying to port an existing code tree to the meson build system on a centos 7 machine. Meson configure works fine, but when I try to compile, it fails. The code is proprietary, so I have created an example that illustrates the problem (accurately enough, I hope.) I am not at liberty to restructure the directory tree.

Here’s the tree:

mesonex/
    alpha/
        beta/
            alpha/
                inc/
                    funcs.h
                    numbers.h
                src/
                    numbers.cpp
                    funcs.cpp
        src/
            example.cpp
            meson.build

My meson.build:

project('example', 'cpp')

srcs=['example.cpp']

srcs+='../beta/alpha/src/funcs.cpp'

srcs+='../beta/alpha/src/funcs.cpp'

incdirs=include_directories('../beta/alpha/inc')

executable('example', srcs, include_directories: incdirs)

here is the main example.cpp file:

#include <iostream>
#include "../beta/alpha/inc/numbers.h"
#include "../beta/alpha/inc/funcs.h"

int main()
{
    std::cout << "Hello" << std::endl;
    std::cout << interestingNumber() << std::endl;
    std::cout << interestingFunc() << std::endl;
}

These are the supporting cpp files:

// funcs.cpp
#include "../inc/numbers.h"

float interestingFunc()
{
    return (interestingNumber()+1)/2;
}

// numbers.cpp

float interestingNumber()
{
    return 11.3355;
}

And these are the header files:

// funcs.h

float interestingFunc();

// numbers.h

float interestingNumber();

Please note that the duplication in directory names is intentional. Maybe this confuses meson in figuring out how to handle the #includes?

This is just one example of many different build strategies I have tried.

2

Answers


  1. I see right off the bat an issue that might just be an issue with your example, and not with your actual code: Meson considers the meson.build file with the project() call to be the "root" of the source directory structure. You cannot ask it to include files outside of the root. It would be about like cp /../foo . on a Unix-like OS. This may just be a mistake in your example, since this isn’t the real code of course.

    So, if we rewrite this as (mesonex/alpha/meson.build):

    # no project(), that would be in mesonex/meson.build)
    
    sources = files(
      'example.cpp',
      '../beta/alpha/src/funcs.cpp',
      '../beta/alpha/src/numbers.cpp',  # you have a typo in your example, funcs.cpp is listed twice.
    )
    
    executable(
      'example',
      sources,
      include_directories : include_directories('../beta/alpha/inc'),
    )
    

    Should work.

    Note, that you might want to consider using a convenience static library instead of reaching back to the code, as this is best practice, you could write something like (mesonex/alpha/beta/meson.build):

    lib_beta = static_library(
      'beta',
      ['src/funcs.cpp', 'src/numbers.cpp']
    )
    
    idep_beta = declare_dependency(
      link_with : lib_beta,
      include_directories : include_directories('.'),
    )
    

    and then in (src/meson.build):

    executable(
      'example',
      'source.cpp',
      dependencies : idep_beta
    )
    

    is all you need, as the idep_beta carries both the linkage and the include information.

    Login or Signup to reply.
  2. This is a follow on – the solution worked for my example but not for the actual code. My model must have been incomplete (in a way I haven’t determined yet.) The configuration stage works, but in the compile stage the #includes in the cpp source are flagged with a "File or directory does not exist." How does meson reconcile the specified include directories with #include statements in the source? The #include paths may be relative to the actual directory of the actual cpp source. Does this mean I have to edit all the #includes in all the sources – that would be a real negative. We work with some VERY large code bases.

    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search