Я не могу заставить локальные пути включения работать в системе сборки Meson.
Это включение C ++ работает правильно:
#include </cygdrive/c/Users/user/project/Third-Party/eigen/Eigen/Dense>
Этот не:
#include "Third-Party/eigen/Eigen/Dense"
фатальная ошибка: Eigen / Dense: нет такого файла или каталога
В файле сборки Meson я безуспешно пытался добавить путь Эйгена:
# '.' will refer to current build directory
include_dirs = include_directories('include', '.', '../project/Third-Party/eigen')
Это древовидная структура проекта:
project
meson.build
src
meson.build
example.h
example.cpp
Third-Party
eigen (headers only lib)
Eigen
Примечание: с CMake у меня нет этой проблемы.
Для управления зависимостями, мезон позволяет вам вручную объявить include_directories()
в ваших файлах сборки. Однако есть еще один способ обработки зависимостей: использование dependency()
команда.
dependency()
это гораздо лучший способ обработки зависимостей, потому что мезон создаст его при необходимости (если зависимость является разделяемой или статической библиотекой) и безопасно позволяет использовать включает в себя. Это означает, что вам не нужно знать, где физически находятся включения для зависимости, или заботиться об их путях. Единственным недостатком является то, что этот вид зависимости нуждается в своем собственном meson.build
файл.
dependency()
команда:Чтобы на самом деле использовать его, вы должны написать файл обертки для зависимости. Или, если вам повезет, в Wrap DB — управляемая сообществом база данных для файлов переноса мезонов. Wrap file — это некая конфигурация, которая объявляет, где вы можете получить зависимость и в какой форме. Wrap file может оборачиваться вокруг zip-архивов и git-репозиториев.
Для вашей зависимости есть файл переноса в Wrap DB: собственный. Все, что вам нужно сделать, это загрузить его и поместить в subprojects
каталог рядом с вашим meson.build
, Например:
$ cd project
$ mkdir subprojects
$ wget "https://wrapdb.mesonbuild.com/v1/projects/eigen/3.3.4/1/get_wrap" \
-O subprojects/eigen.wrap
Сейчас не каждый проект строится с мезонами. Для тех, кто этого не делает, оберните файл также укажите пластырь. Патч используется только для копирования соответствующих meson.build
файл в каталог зависимостей (а также любые другие файлы, которые понадобятся для построения этой конкретной зависимости с помощью meson). Файл Eigen Wrap содержит патч.
Чтобы узнать, какая какая-то конкретная зависимость объявлять сама как зависимость (используя declare_dependency()
команда), вам нужно исследовать meson.build
файл в каталоге источника зависимостей (хотя часто это просто имя зависимости плюс _dep, например «Eigen_dep»). Для меня, собственный каталог был subprojects/eigen-eigen-5a0156e40feb
, Итак, вы ищете declare_dependency()
команда:
$ grep declare_dependency subprojects/eigen-eigen-5a0156e40feb/meson.build
eigen_dep = declare_dependency(
Как видите, eigen объявляет зависимость как eigen_dep
, Если вы хотите знать, что именно так объявлен, просто прокрутите вниз зависимость meson.build
файл.
Теперь, чтобы использовать это eigen_dep
в вашем проекте создайте объект зависимости с dependency()
команда. Вот пример проекта, который я использовал для компиляции «Простая первая программа» из Эйген: Начало работы:
project('example', 'cpp')
eigen_dependency = dependency('eigen', fallback: ['eigen', 'eigen_dep'])
executable('example', 'example.cpp', dependencies: eigen_dependency)
Обратите внимание на аргументы для dependency()
команда. Первая — это общесистемная зависимость, которую ищет мезон. Если нет собственный для разработки, установленной в вашей системе, то мезон использует отступать: первый элемент в резерве — это базовое имя файла переноса, второй элемент — это имя объявленной зависимости.
Тогда используйте eigen_dependency
переменная во всем, что вы строите, передавая его зависимости аргумент.
include_directories()
команда:Если вы хотите просто включить некоторые файлы из внешнего каталога (например, из своего каталога «Сторонний»), используя include_directories()
команда, этот каталог должен быть относительно meson.build
файл, где вы используете его.
Чтобы использовать заявленные вручную, необходимо позвонить include_directories()
команда для получения объекта include_directories. Передать этот объект include_directories
аргумент в том, что вы строите.
Учитывая ваш пример, я предполагаю, что корень meson.build
файл является файлом сборки проекта. Тогда в этом корне meson.build
Например, вы можете написать:
# File: project/meson.build
project('example', 'cpp')
eigen_includes = include_directories('Third-Parties/eigen')
executable('example', 'example.cpp', include_directories: eigen_includes)
Но если вы хотите получить собственные включает в себя от src/meson.build
тогда вам нужно поменять include_directories
чтобы:
# File: project/src/meson.build
eigen_includes = include_directories('../Third-Parties/eigen')
...
Других решений пока нет …