Meson 0.54

Новые фичи

Emscripten (emcc) now supports threads

В дополнение к правильной настройке аргументов компиляции и компоновщика был добавлен новый встроенный в meson для управления параметром PTHREAD_POOL_SIZE, -D_thread_count, который может быть установлен в любое целое значение, большее 0. Если он установлен в 0, то параметр PTHREAD_POOL_SIZE не будет передан.

Introduce dataonly for the pkgconfig module

Это позволяет пользователям отключить запись встроенных переменных в файл pkg-config, поскольку они могут фактически не потребоваться.

Одна из причин этого - наличие независимых от архитектуры файлов pkg-config в проектах, которые

имеют зависимые от архитектуры выходные данные.

pkgg.generate(
name : 'libhello_nolib',
description : 'A minimalistic pkgconfig file.',
version : libver,
dataonly: true
)

Consistently report file locations relative to cwd

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

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

dependency() consistency

Когда dependency найдена первый раз используя dependency('foo', ...), возвращаемое значение кешируется. Любой последующий вызов будет возвращать то же самое значение до тех пор, пока запрошенная версия совпадает, в противном случае возвращается not-found dependency. Это означает, что если системная зависимость будет найдена первой, то она больше не будет возвращаться к subproject в последующем вызове и скорее вернет not-found, если системная версия не совпадает.

Аналогично, если первый вызов возвращает резервную зависимость подпроекта, он также вернет зависимость подпроекта в последующем вызове, даже если резервная зависимость не предусмотрена.

For example, if the system has foo version 1.0:

# d2 is set to foo_dep and not the system dependency, even without fallback argument.
d1 = dependency('foo', version : '>=2.0', required : false,
fallback : ['foo', 'foo_dep'])
d2 = dependency('foo', version : '>=1.0', required : false)
# d2 is not-found because the first call returned the system dependency, but its version is too old for 2nd call.
d1 = dependency('foo', version : '>=1.0', required : false)
d2 = dependency('foo', version : '>=2.0', required : false,
fallback : ['foo', 'foo_dep'])

Override dependency()

Теперь можно переопределить результат dependence (), чтобы указать на любой объект зависимости, который вы хотите. Переопределение является глобальным и применяется к каждому подпроекту c момента переопределения.

Например, этот подпроект предоставляет 2 библиотеки с версией 2.0:

project(..., version : '2.0')
libfoo = library('foo', ...)
foo_dep = declare_dependency(link_with : libfoo)
meson.override_dependency('foo', foo_dep)
libbar = library('bar', ...)
bar_dep = declare_dependency(link_with : libbar)
meson.override_dependency('bar', bar_dep)

Предположим, что в системе установлены foo и bar 1.0, и мастер-проект делает это:

foo_dep = dependency('foo', version : '>=2.0', fallback : ['foo', 'foo_dep'])
bar_dep = dependency('bar')

Это использовалось для смешивания зависимостей system 1.0 version и subproject 2.0, но благодаря переопределению bar_dep теперь устанавливлена на версию подпроекта.

Еще один кейс, который может быть полезен, - это заставить подпроект использовать определенную зависимость. Если подпроект делает зависимость('foo'), но основной проект хочет обеспечить свою собственную реализацию foo, он может, например, вызвать meson.override_dependency('foo', declare_dependency(...)) перед конфигурацией подпроекта.

Simplified dependency() fallback

В этом кейсе подпроект foo вызывает meson.override_dependency('foo-2.0', foo_dep), родительский проект может опустить имя переменной зависимости в fallback keyword: dependency('foo-2.0', fallback : 'foo'). (Тк кк оно уже указано в override_dependency)

Backend agnostic compile command

Новая meson compileкоманда была добавлена ​​для поддержки независимости от бэкенда компиляции. Она принимает два аргумента -jи -l, которые используются по возможности ( -lничего не делает с msbuild). Значение -jили -l< 1 позволяет бэкэнду решить, сколько потоков использовать. Для msbuild это означает -m, что для ninja является отсутствием аргументов.

meson builddir --backend vs
meson compile -C builddir -j0 # this is the same as `msbuild builddir/my.sln -m`
meson builddir
meson compile -C builddir -j3 # this is the same as `ninja -C builddir -j3`

Еще meson compile предоставляет --clean switch для очистки проекта. Полный список аргументов всегда документируется с помощью meson compile --help

Native (build machine) compilers not always required

add_languages() gained a native: keyword, indicating if a native or cross compiler is to be used.

For the benefit of existing simple build definitions which don't contain any native: true targets, without breaking backwards compatibility for build definitions which assume that the native compiler is available after add_languages(), if the native: keyword is absent the languages may be used for either the build or host machine, but are never required for the build machine.

This changes the behaviour of the following meson fragment (when cross-compiling but a native compiler is not available) from reporting an error at add_language to reporting an error at executable.

add_language('c')
executable('main', 'main.c', native: true)

Summary improvements

Новый list_sepключевое слово аргумент было добавлено в summary(). Если значение определено и является списком, элементы будут разделены предоставленной строкой, а не каждый на новой строке.

The automatic subprojects section now also print the number of warnings encountered during that subproject configuration, or the error message if the configuration failed.

Add a system type dependency for zlib

Это позволяет обнаруживать zlib в macOS и FreeBSD без использования pkg-config или cmake, которые не являются частью базовой установки в этих ОС (но при этом zlib присутствует).

Побочным эффектом этого изменения является то, что dependency('zlib')также работает с cmake вместо того, чтобы требовать dependency('ZLIB').

Added 'name' method

Build target объекты (возвращаемые executable(), library(), ...) теперь есть имеют метод name ().

New option --quiet to meson install

Теперь вы можете запустить, meson install --quietи Meson не будет подробно печатать каждый файл, когда он устанавливается. Как и прежде, полный журнал всегда доступен внутри builddir в meson-logs/install-log.txt.

Когда эта опция пропущена, в установочных скриптах будет установлена ​​переменная окружения MESON_INSTALL_QUIET.

Многочисленные ускорения были также сделаны для этапа установки, особенно в Windows, где он теперь на 300% - 1200% быстрее, чем раньше, в зависимости от вашей рабочей нагрузки.

Property support emscripten's wasm-ld

До 0.54.0 мы рассматривали emscripten как компилятор и компоновщик, что не совсем так. У него есть компоновщик, называемый wasm-ld (имя мезона - ld.wasm). Это специальная версия clang's lld. Теперь это будет обнаружено правильно.

Skip sanity tests when cross compiling

Для определенных сред кросс-компиляции невозможно скомпилировать приложение проверки работоспособности. Теперь это можно отключить, добавив следующую запись в propertiesраздел кросс-файла :

skip_sanity_check = true

Support for overiding the linker with ldc and gdc

LDC (компилятор D llvm) и GDC (компилятор D Gnu) теперь поддерживают переменную компоновщика D_LD (или d_ld в кросс-файле) и могут выбирать разные компоновщики.

GDC поддерживает все те же значения, что и GCC, LDC поддерживает ld.bfd, ld.gold, ld.lld, ld64, link и lld-link.

Native file properties

Начиная с версии Meson 0.54.0, --native-file nativefile.iniможет содержать:

  • binaries

  • paths

  • properties

которые определены и используются так же, как в кросс-файлах. propertiesявляются новыми для Meson 0.54.0 и читаются как:

x = meson.get_external_property('foobar', 'foo')

где foobar- имя свойства, а необязательное foo- запасное строковое значение.

Для кросс-скомпилированных проектов get_external_property()читает кросс-файл, пока не определено native: true.

Changed the signal used to terminate a test process (group)

Тестовый процесс (группа) теперь завершается через SIGTERM вместо SIGKILL, что позволяет обрабатывать сигнал. Однако теперь пользовательский обработчик сигналов (если таковой имеется) несет ответственность за правильное завершение любого процесса, порожденного процессами тестирования верхнего уровня.

Dynamic Linker environment variables actually match docs

В документах всегда указывалось, что переменная окружения Dynamic Linker должна быть ${COMPILER_VAR}_LD, но это касается только половины переменных. Другая половина отличается. В 0.54.0 переменные совпадают. Старые переменные все еще поддерживаются, но устарели и выдают предупреждение об устаревании.

Added 'pkg_config_libdir' property

Позволяет определить список папок, используемых pkg-config для кросс-сборки, и избежать использования системных каталогов.

More new sample Meson templates for (Java, Cuda, and more)

Мезон теперь поставляется с предопределенными шаблонами проектов для Java, Cuda, Objective-C++и C#мы обеспечены соответствующих значений для соответствующих языков, как для Имеющихся библиотек и исполняемый файл.

Ninja version requirement bumped to 1.7

Meson теперь использует функцию неявных выходов Ninja для некоторых типов целей, которые имеют несколько выходов, которые могут не отображаться в командной строке. Для этой функции требуется ниндзя 1.7+.

Обратите внимание, что последняя версия Ninja, доступная в Ubuntu 16.04 (самая старая Ubuntu LTS на момент написания статьи) - 1.7.1. Если ваш дистрибутив не поставляется с достаточно новым Ninja, вы можете загрузить последнюю версию со страницы GitHub Ninja: https://github.com/ninja-build/ninja/releases

Added -C argument to meson init command

Мезон инициализации предполагает, что он запускается внутри корневого каталога проекта. Если это не так, теперь вы можете использовать -Cдля указания фактического исходного каталога проекта.

More than one argument to message() and warning()

Аргументы переданы message()и warning()будут напечатаны через пробел.

Added has_tools method to qt module

Он должен использоваться для компиляции необязательного кода Qt:

qt5 = import('qt5')
if qt5.has_tools(required: get_option('qt_feature'))
moc_files = qt5.preprocess(...)
...
endif

The MSI installer is only available in 64 bit version

Microsoft прекратила поддержку Windows 7, поэтому официально поддерживаются только 64-битные ОС Windows. Таким образом, в будущем будет предоставлен только 64-битный установщик MSI. Люди, которым нужна 32-битная версия, могут создавать свои собственные с помощью msi/createmsi.pyскрипта в исходном хранилище Meson.

Uninstalled pkg-config files

Примечание : функциональность этого модуля регулируется правилами Meson по смешиванию систем сборки .

pkgconfigМодуль теперь генерирует неустановленные компьютерные файлы. Для любого сгенерированного foo.pcфайла в foo-uninstalled.pc помещается дополнительный файл <builddir>/meson-uninstalled. Их можно использовать для создания приложений на основе библиотек, созданных meson, без их установки, указывая PKG_CONFIG_PATH на этот каталог. Это экспериментальная функция, предоставляемая с максимальным усилием ("on a best-effort basis"), она может работать не во всех случаях использования.

CMake find_package COMPONENTS support

Теперь можно передавать компоненты в бэкэнд зависимостей CMake через новый componentskwarg в dependencyфункции.

Added Microchip XC16 C compiler support

Убедитесь, что исполняемые файлы компилятора настроены правильно по вашему пути. Компилятор доступен на веб-сайте Microchip бесплатно.

Added Texas Instruments C2000 C/C++ compiler support

Убедитесь, что исполняемые файлы компилятора настроены правильно по вашему пути. Компилятор доступен на сайте Texas Instruments бесплатно.

Unity file block size is configurable

Традиционно файлы Unity, которые автоматически генерирует Meson, содержат все исходные файлы, принадлежащие одной цели. Это наиболее эффективный параметр для полных сборок, но он замедляет добавочные сборки. В этом выпуске добавлена ​​новая опция, unity_sizeкоторая указывает, сколько исходных файлов следует поместить в каждый файл Unity.

Значение по умолчанию для размера блока равно 4. Это означает, что если у вас есть цель с восемью исходными файлами, Meson создаст два файла единиц, каждый из которых включает четыре исходных файла. Старое поведение можно воспроизвести, установив unity_sizeбольшое значение, например 10000.