Jump to page: 1 2
Thread overview
How to create meson.build with external libs?
Jan 15
9il
January 12
Ok, I am trying to meson and is struggling with meson.build file. I looked up the examples page: https://github.com/mesonbuild/meson/tree/master/test%20cases/d which has a lot of examples but not the one that shows you how to build your project with some external dependency :)

Let's say we have a simple dir "myproj" with "meson.build" in it and some source files like "app.d" and "helper_functions.d".

~/myproj
   app.d
   helper_functions.d
   meson.build

"helper_functions.d" uses let's say lubeck library which according to https://forum.dlang.org/thread/nghoprwkihazjikyhshz@forum.dlang.org is supported by meson.

Here is my meson.build:
-----------------------
project('demo', 'd',
  version : '0.1',
  default_options : ['warning_level=3']
  )

lubeck = dependency('lubeck', version: '>=1.1.7')
ed = executable('mir_quickstart', 'app.d', dependencies: lubeck, install : true)


However, when I try to build it I get the following error:
-----
$ meson build
The Meson build system
Version: 0.52.1
Source dir: /home/user/dev/github/demo
Build dir: /home/user/dev/github/demo/build
Build type: native build
Project name: demo
Project version: 0.1
D compiler for the host machine: ldc2 (llvm 1.18.0 "LDC - the LLVM D compiler (1.18.0):")
D linker for the host machine: GNU ld.gold 2.33.1
Host machine cpu family: x86_64
Host machine cpu: x86_64
Found pkg-config: /usr/bin/pkg-config (1.6.3)
Found CMake: /usr/bin/cmake (3.16.2)
Run-time dependency lubeck found: NO (tried pkgconfig and cmake)

meson.build:8:0: ERROR: Dependency "lubeck" not found, tried pkgconfig and cmake

A full log can be found at /home/user/dev/github/demo/build/meson-l
-----

What do I need to do in order to build the project with "lubeck" dependency in meson?
January 12
On Sunday, 12 January 2020 at 22:00:33 UTC, p.shkadzko wrote:
> What do I need to do in order to build the project with "lubeck" dependency in meson?

In difference to dub, meson will _not_ auto-download required software for you. You have to ways to go forward with this:

1 (IMHO the better way, especially if you ever want a distro to package your thing):

Install lubeck ala `git clone https://github.com/kaleidicassociates/lubeck && cd lubeck && meson build && ninja -C build install`. This will install lubeck to your system (by default into `/usr/local`, you can set a different by passing `--prefix` to meson). This will generate a so called pkg-config (`.pc`) file: https://github.com/kaleidicassociates/lubeck/blob/master/meson.build#L49 which meson will discover.

2 (The probably easier way in the short term):

Install lubeck via meson, then discover the dependency like specified here: https://mesonbuild.com/Dependencies.html#dependency-method
January 12
On Sunday, 12 January 2020 at 22:12:14 UTC, Rasmus Thomsen wrote:
> On Sunday, 12 January 2020 at 22:00:33 UTC, p.shkadzko wrote:
>> What do I need to do in order to build the project with "lubeck" dependency in meson?
>
> In difference to dub, meson will _not_ auto-download required software for you. You have to ways to go forward with this:
>
> 1 (IMHO the better way, especially if you ever want a distro to package your thing):
>
> Install lubeck ala `git clone https://github.com/kaleidicassociates/lubeck && cd lubeck && meson build && ninja -C build install`. This will install lubeck to your system (by default into `/usr/local`, you can set a different by passing `--prefix` to meson). This will generate a so called pkg-config (`.pc`) file: https://github.com/kaleidicassociates/lubeck/blob/master/meson.build#L49 which meson will discover.
>
> 2 (The probably easier way in the short term):
>
> Install lubeck via meson, then discover the dependency like specified here: https://mesonbuild.com/Dependencies.html#dependency-method

Why do you think 1 is the better way? I feel like it is a lot of manual work for just one dependency. Also, it is not a good idea to pollute your /usr/local with non-distro packages.

January 12
On Sunday, 12 January 2020 at 22:12:14 UTC, Rasmus Thomsen wrote:
> On Sunday, 12 January 2020 at 22:00:33 UTC, p.shkadzko wrote:
>> [...]
>
> In difference to dub, meson will _not_ auto-download required software for you. You have to ways to go forward with this:
>
> [...]

Thanks! I shall try it out.
January 12
On Sunday, 12 January 2020 at 22:20:16 UTC, p.shkadzko wrote:
> Why do you think 1 is the better way?

Well, I suppose I might be a bit biased being a distro packager, but not using dub ensures your package builds properly with what your distro uses (e.g. pkg-config). It _is_ more effort up front though, yes. Also, I feel like using a more standardized way of packaging via meson with pkg-config is better (and as a distro packager I would refrain from packaging something which uses a dub dependency instead of a (shared) pkg-config one).

> I feel like it is a lot of manual work for just one dependency. Also, it is not a good idea to pollute your /usr/local with non-distro packages.

Well, the only purpose of /usr/local is for you to put your non-distro stuff there, /usr is the package manager's territory :)
January 13
On Sunday, 12 January 2020 at 22:12:14 UTC, Rasmus Thomsen wrote:
> On Sunday, 12 January 2020 at 22:00:33 UTC, p.shkadzko wrote:
>> [...]
>
> In difference to dub, meson will _not_ auto-download required software for you. You have to ways to go forward with this:
>
> [...]

I followed the 1 step, namely git cloned the lubeck and installed it with meson into /usr/local however, I still get the same error. Could I miss anything?
January 13
On Monday, 13 January 2020 at 17:14:29 UTC, p.shkadzko wrote:
> On Sunday, 12 January 2020 at 22:12:14 UTC, Rasmus Thomsen wrote:
>> On Sunday, 12 January 2020 at 22:00:33 UTC, p.shkadzko wrote:
>>> [...]
>>
>> In difference to dub, meson will _not_ auto-download required software for you. You have to ways to go forward with this:
>>
>> [...]
>
> I followed the 1 step, namely git cloned the lubeck and installed it with meson into /usr/local however, I still get the same error. Could I miss anything?

I had to set PKG_CONFIG_PATH to "/usr/local/lib/pkgconfig". For some reason Manjaro distro doesn't have it set by default. After setting the pkgconfig path, lubeck is getting found and everything works.
January 13
On Monday, 13 January 2020 at 19:56:35 UTC, p.shkadzko wrote:
> On Monday, 13 January 2020 at 17:14:29 UTC, p.shkadzko wrote:
>> On Sunday, 12 January 2020 at 22:12:14 UTC, Rasmus Thomsen wrote:
>>> On Sunday, 12 January 2020 at 22:00:33 UTC, p.shkadzko wrote:
>>>> [...]
>>>
>>> In difference to dub, meson will _not_ auto-download required software for you. You have to ways to go forward with this:
>>>
>>> [...]
>>
>> I followed the 1 step, namely git cloned the lubeck and installed it with meson into /usr/local however, I still get the same error. Could I miss anything?
>
> I had to set PKG_CONFIG_PATH to "/usr/local/lib/pkgconfig". For some reason Manjaro distro doesn't have it set by default. After setting the pkgconfig path, lubeck is getting found and everything works.

After I ran "meson build" I got the following output:
-----------------------
The Meson build system
Version: 0.52.1
Source dir: /home/tastyminerals/dev/test_proj
Build dir: /home/tastyminerals/dev/test_proj/build
Build type: native build
Project name: mir_quickstart
Project version: 0.1
D compiler for the host machine: ldc2 (llvm 1.18.0 "LDC - the LLVM D compiler (1.18.0):")
D linker for the host machine: GNU ld.gold 2.33.1
Host machine cpu family: x86_64
Host machine cpu: x86_64
Found pkg-config: /usr/bin/pkg-config (1.6.3)
Run-time dependency mir-algorithm found: YES 3.4.0
Run-time dependency lubeck found: YES 1.0.0
Build targets in project: 1
Found ninja-1.9.0 at /usr/bin/ninja

I then cd to build/ dir and run "ninja"
------------------------
[2/2] Linking target test_proj.tart@exe/app.d.o'.

But when I try to run compiled app.d file as demo_run, I get:
------------------------
./demo_run: error while loading shared libraries: libmir-algorithm.so: cannot open shared object file: No such file or directory

I thought that if meson builds and finds the external libs successfully and ninja links everything, all should be fine. I don't understand. Why the compiled file cannot find the external library?
January 13
On Monday, 13 January 2020 at 20:53:43 UTC, p.shkadzko wrote:
> On Monday, 13 January 2020 at 19:56:35 UTC, p.shkadzko wrote:
>> On Monday, 13 January 2020 at 17:14:29 UTC, p.shkadzko wrote:
>>> [...]
>>
>> I had to set PKG_CONFIG_PATH to "/usr/local/lib/pkgconfig". For some reason Manjaro distro doesn't have it set by default. After setting the pkgconfig path, lubeck is getting found and everything works.
>
> After I ran "meson build" I got the following output:
> -----------------------
> The Meson build system
> Version: 0.52.1
> Source dir: /home/tastyminerals/dev/test_proj
> Build dir: /home/tastyminerals/dev/test_proj/build
> Build type: native build
> Project name: mir_quickstart
> Project version: 0.1
> D compiler for the host machine: ldc2 (llvm 1.18.0 "LDC - the LLVM D compiler (1.18.0):")
> D linker for the host machine: GNU ld.gold 2.33.1
> Host machine cpu family: x86_64
> Host machine cpu: x86_64
> Found pkg-config: /usr/bin/pkg-config (1.6.3)
> Run-time dependency mir-algorithm found: YES 3.4.0
> Run-time dependency lubeck found: YES 1.0.0
> Build targets in project: 1
> Found ninja-1.9.0 at /usr/bin/ninja
>
> I then cd to build/ dir and run "ninja"
> ------------------------
> [2/2] Linking target test_proj.tart@exe/app.d.o'.
>
> But when I try to run compiled app.d file as demo_run, I get:
> ------------------------
> ./demo_run: error while loading shared libraries: libmir-algorithm.so: cannot open shared object file: No such file or directory
>
> I thought that if meson builds and finds the external libs successfully and ninja links everything, all should be fine. I don't understand. Why the compiled file cannot find the external library?

$LD_LIBRARY_PATH was not set to "/usr/local/lib" where libmir-algorithm.so is located. I had to set it explicitly and recompile the project but then I get another error message:

./demo_proj: error while loading shared libraries: subprojects/mir-algorithm/libmir-algorithm.so.3.4.0: cannot open shared object file: No such file or directory


(ಠ_ಠ)
January 14
On Monday, 13 January 2020 at 21:15:51 UTC, p.shkadzko wrote:
> On Monday, 13 January 2020 at 20:53:43 UTC, p.shkadzko wrote:
>> On Monday, 13 January 2020 at 19:56:35 UTC, p.shkadzko wrote:
>>> On Monday, 13 January 2020 at 17:14:29 UTC, p.shkadzko wrote:
>>>> [...]
>>>
>>> I had to set PKG_CONFIG_PATH to "/usr/local/lib/pkgconfig". For some reason Manjaro distro doesn't have it set by default. After setting the pkgconfig path, lubeck is getting found and everything works.
>>
>> After I ran "meson build" I got the following output:
>> -----------------------
>> The Meson build system
>> Version: 0.52.1
>> Source dir: /home/tastyminerals/dev/test_proj
>> Build dir: /home/tastyminerals/dev/test_proj/build
>> Build type: native build
>> Project name: demo_proj
>> Project version: 0.1
>> D compiler for the host machine: ldc2 (llvm 1.18.0 "LDC - the LLVM D compiler (1.18.0):")
>> D linker for the host machine: GNU ld.gold 2.33.1
>> Host machine cpu family: x86_64
>> Host machine cpu: x86_64
>> Found pkg-config: /usr/bin/pkg-config (1.6.3)
>> Run-time dependency mir-algorithm found: YES 3.4.0
>> Run-time dependency lubeck found: YES 1.0.0
>> Build targets in project: 1
>> Found ninja-1.9.0 at /usr/bin/ninja
>>
>> I then cd to build/ dir and run "ninja"
>> ------------------------
>> [2/2] Linking target test_proj.tart@exe/app.d.o'.
>>
>> But when I try to run compiled app.d file as demo_run, I get:
>> ------------------------
>> ./demo_run: error while loading shared libraries: libmir-algorithm.so: cannot open shared object file: No such file or directory
>>
>> I thought that if meson builds and finds the external libs successfully and ninja links everything, all should be fine. I don't understand. Why the compiled file cannot find the external library?
>
> $LD_LIBRARY_PATH was not set to "/usr/local/lib" where libmir-algorithm.so is located. I had to set it explicitly and recompile the project but then I get another error message:
>
> ./demo_proj: error while loading shared libraries: subprojects/mir-algorithm/libmir-algorithm.so.3.4.0: cannot open shared object file: No such file or directory
>
>
> (ಠ_ಠ)

My test app.d didn't have any imports for mir.ndslice and lubeck. After I imported them, ninja threw the following error.
-----------
[1/2] Compiling D object 'demo_proj@exe/app.d.o'.
FAILED: demo_proj@exe/app.d.o
ldc2 -I=demo_proj@exe -I=. -I=.. -I/usr/local/include/d/lubeck -I/usr/local/include/d/mir-algorithm -I/usr/local/include/d/mir-core -I/usr/local/include/d/mir-blas -I/usr/local/include/d/mir-lapack -I/usr/local/include/d/mir-random -enable-color -wi -dw -g -d-debug -of='demo_proj@exe/app.d.o' -c ../app.d
/usr/local/include/d/lubeck/lubeck.d(8): Error: module cblas is in file 'cblas.d' which cannot be read
import path[0] = demo_proj@exe
import path[1] = .
import path[2] = ..
import path[3] = /usr/local/include/d/lubeck
import path[4] = /usr/local/include/d/mir-algorithm
import path[5] = /usr/local/include/d/mir-core
import path[6] = /usr/local/include/d/mir-blas
import path[7] = /usr/local/include/d/mir-lapack
import path[8] = /usr/local/include/d/mir-random
import path[9] = /usr/include/dlang/ldc
ninja: build stopped: subcommand failed.

cblas.d is located in /usr/local/include/d/cblas/cblas/cblas.d
I added /usr/local/include/d/cblas/cblas to $PATH but that didn't help :(
« First   ‹ Prev
1 2