Обработка параметров сборки Meson с несколькими типами сборки - PullRequest
0 голосов
/ 22 ноября 2018

Прочитав страницы сайта Meson (которые, как правило, высокого качества), Я все еще не уверен относительно предполагаемой наилучшей практики для обработки различных вариантов для различных типов сборок.

Итак, чтобы указатьотладочная сборка:

meson [srcdir] --buildtype=debug

Или указать сборку выпуска:

meson [srcdir] --buildtype=release

Однако, если я хочу добавить b_sanitize=address (или другой произвольный сложный набор аргументов) только дляотладочные сборки и b_ndebug=true только для релизных сборок, я бы сделал:

meson [srcdir] --buildtype=debug -Db_sanitize=address ...
meson [srcdir] --buildtype=release -Db_ndebug=true ...

Тем не менее, добавить кучу настраиваемых аргументов в командную строку - это боль, и мне кажется, что лучшепоместите это в файл meson.build.Итак, я знаю, что могу установить некоторые встроенные параметры таким образом:

project('myproject', ['cpp'],
        default_options : ['cpp_std=c++14',
                           'b_ndebug=true'])

Но они установлены безоговорочно.

Таким образом, условие будет выглядеть примерно так:

if get_option('buildtype').startswith('release')
    add_project_arguments('-DNDEBUG', language : ['cpp'])
endif

Это один из способов сделать это, однако, может показаться, что способ b_ndebug=true предпочтительнее add_project_arguments('-DNDEBUG'), потому что он переносимый.

Какими будут варианты сборки в портативном стилеусловно установлен в скрипте Meson?

Кроме того, b_sanitize=address устанавливается без проверки того, поддерживает ли его компилятор.Я бы предпочел, чтобы он сначала проверил, поддерживается ли он (например, может отсутствовать библиотека):

if meson.get_compiler('cpp').has_link_argument('-fsanitize=address')
    add_project_arguments('-fsanitize=address', language : ['cpp'])
    add_project_link_arguments('-fsanitize=address', language : ['cpp'])
endif

Возможно ли иметь встроенные опции сборки в портативном стиле(например, b_sanitize) есть проверка, если они поддерживаются?

Ответы [ 2 ]

0 голосов
/ 09 февраля 2019

Я все еще не уверен относительно предполагаемой лучшей практики для обработки различных опций для разных типов сборки

Предполагаемая лучшая практика заключается в использовании meson configure для установки / изменения "типа сборки"варианты, как вам это нужно.Вам не нужно делать это «сразу и навсегда».Но, конечно, у вас может быть несколько различных деревьев сборки (скажем, «отладка» и «выпуск»), чтобы ускорить процесс.

Как условно установить параметры сборки в портативном стилев сценарии Meson?

Говоря о b_ndebug, вы можете использовать специальное значение: ['b_ndebug=if-release'], которое делает именно то, что вы хотите.Кроме того, вы должны принять во внимание, что некоторые аргументы командной строки в стиле GNU в meson всегда переносимы из-за внутренних замен, специфичных для компилятора.Если я правильно помню, они включают в себя: -D, -I, -L и -l.

Однако, как правило, изменяются параметры "buildtype" внутри скрипта (за исключением default_options, которыйпредназначены для перезаписи meson setup/configure), не рекомендуется, и meson намеренно не имеет функции set_option().

Возможно ли иметь встроенные параметры сборки в переносном стиле (например,как b_sanitize) проверить, если они поддерживаются?

AFAIK, нет, кроме has_argument(), который вы использовали выше.Однако, если какой-либо параметр сборки, такой как b_sanitize, не поддерживается базовым компилятором, он будет автоматически установлен на void, поэтому его использование не должно нарушать ничего.

0 голосов
/ 11 января 2019

Проект не обязательно должен быть первой строкой, поэтому вы можете проверить тип сборки и сгенерировать список параметров сборки для вашего проекта.что-то вроде (не проверено):

if get_option('buildtype').startswith('release')
    myopts = [ 'b_ndebug=true' ]
endif

project('myproj', ['cpp'], default_options : myopts)
...