Compare commits

...

33 Commits

Author SHA1 Message Date
Max Kellermann
b5bd294e5c release v0.23.16 2024-12-03 12:56:57 +01:00
Max Kellermann
ac60bd47f0 thread/WindowsFuture: add missing include for std::error_category 2024-12-03 12:54:12 +01:00
Max Kellermann
b7248f0333 filter/ffmpeg: fill AVFrame::pts
Some libavfilter plugins don't produce any output if `pts` is never
set, e.g. the `lowpass` plugin.

Closes https://github.com/MusicPlayerDaemon/MPD/issues/2114
2024-12-03 12:52:15 +01:00
Marius Feraru
8a5b5378e6 db/update/Walk:FindAncestorLoop: uint64_t inode & device
Previously, inode numbers were truncated to 32 bits, which could lead
to problems on XFS where inodes are 64 bit; this could lead to bogus
"recursive directory found" errors during database update.

[mk: added commit description and NEWS line]

Closes https://github.com/MusicPlayerDaemon/MPD/issues/2000
2024-12-03 12:49:02 +01:00
Michael Cho
4a49f75799 meson.build: support building with ICU 76
ICU 76 decided to reduce overlinking[^1] thus `icu-i18n` will no longer
add `icu-uc` when linking to shared libraries. This results in failure:
```
src/lib/icu/libicu.a.p/Converter.cxx.o: undefined reference to symbol 'ucnv_fromUnicode_76'
```

[^1]: 199bc82702

Closes https://github.com/MusicPlayerDaemon/MPD/issues/2151
2024-12-03 12:47:55 +01:00
Max Kellermann
9d2666f293 subprojects: update sqlite3 to 3.47.1-1 2024-12-03 12:46:33 +01:00
Max Kellermann
e63fcc5982 python/build/libs: update libnfs to 5.0.3 2024-12-03 12:45:05 +01:00
Max Kellermann
4c37c17f2e python/build/libs.py: update WildMidi to 0.4.6 2024-12-03 12:44:33 +01:00
Max Kellermann
722820a375 python/build/libs: update zlib to 1.3.1 2024-12-03 12:44:14 +01:00
Max Kellermann
688023eb9e python/build/libs.py: update libopenmpt to 0.7.9 2024-12-03 12:43:34 +01:00
Max Kellermann
5771aeaddd subprojects: update fmt to 11.0.2-1 2024-12-03 12:42:02 +01:00
Rudi Heitbaum
a42da90042 lib/fmt: support build with libfmt-11.0.0
Upstream libfmt commit fmtlib/fmt@d707292
now requires the format function to be const.

Adjust the function prototype so it is const and can compile.

Signed-off-by: Rudi Heitbaum <rudi@heitbaum.com>

Closes https://github.com/MusicPlayerDaemon/MPD/issues/2141
2024-12-03 12:42:02 +01:00
Max Kellermann
d7d32ed6fc meson.build: suppress -Wnan-infinity-disabled (clang 18) due to libfmt 2024-12-03 12:40:21 +01:00
Max Kellermann
4715acf27e Log: add missing include for std::back_inserter()
Closes https://github.com/MusicPlayerDaemon/MPD/issues/2071
2024-12-03 12:38:00 +01:00
Max Kellermann
8780db5ee8 increment version number to 0.23.16 2024-12-03 12:34:01 +01:00
Max Kellermann
b8bfc98618 release v0.23.15 2023-12-20 16:21:57 +01:00
Max Kellermann
6e6f72a521 win32/HResult: convert assert() to runtime check to work around -Walloc-size-larger-than 2023-12-20 16:15:58 +01:00
Max Kellermann
a654c5d643 Revert "android: Fix MPD shutdown from settings UI"
This reverts commit 94b5b9f370.  It was
not necessary for branch v0.23.x because there, Break() is
thread-safe; this was only changed later by commit
a3b32819b1
2023-12-20 16:15:58 +01:00
Max Kellermann
c5d6aa169f lib/curl/patches: refresh no_CMAKE_C_IMPLICIT_LINK_LIBRARIES.patch for 7.85.0 2023-12-20 13:43:20 +01:00
Max Kellermann
c1c67286d3 python/build/libs.py: update CURL to 8.5.0 2023-12-20 13:28:54 +01:00
borine
2fb34697c7 input/plugins/Alsa: catch all exceptions
snd_pcm_poll_descriptors_revents() may return any error code; the
ALSA docs do not constrain the permitted values. A 'hw' device
will only ever return an error if the pfd array passed in is
invalid (-EINVAL), but other I/O plugins may return arbitary
errors. For example a network-based device may return -EPIPE etc.
The resulting exception thrown by
AlsaNonBlockPcm::DispatchSockets() must be caught to prevent the
mpd process from being aborted.
2023-12-20 13:27:25 +01:00
Colin Edwards
94b5b9f370 android: Fix MPD shutdown from settings UI 2023-12-20 13:27:16 +01:00
Max Kellermann
a9467513e1 doc/developer.rst: add missing return type to code style sample 2023-12-20 13:26:48 +01:00
borine
17d944f6ce input/plugins/Alsa: limit ALSA buffer time to 2 seconds maximum
Some ALSA capture devices can have very large buffers, holding 10
seconds or more audio. Using the maximum buffer size with such
devices leads to unacceptably large, and unnecessary, latency.
Also, some ALSA drivers (e.g. HDA Intel PCH) report an invalid
maximum period size, and the period size that mpd calculates from
the maximum buffer size results in "Invalid argument" error when
applying the hw_params. Note that the "default" capture device on
many cards includes the "dsnoop" plugin which imposes a buffer
size of 16384 frames, so that "alsa://" works OK but
"alsa://plughw" or "alsa://hw" both fail.

Limit the maximum buffer time for ALSA input devices to a more useable
2 seconds, thereby avoiding both the above problems.
2023-12-20 13:26:24 +01:00
Max Kellermann
0f82f18652 python/build/libs.py: update CURL to 8.4.0 2023-12-20 13:25:08 +01:00
Max Kellermann
3db3e577f1 python/build/libs.py: update OpenSSL to 3.1.4 2023-12-20 13:25:04 +01:00
Max Kellermann
37ee821947 python/build/libs.py: update FFmpeg to 6.1 2023-12-20 13:25:00 +01:00
Max Kellermann
916ab9a7e6 python/build/libs.py: update openmpt to 0.7.3 2023-12-20 13:24:57 +01:00
Max Kellermann
1802cf9fd1 python/build/cmake.py: add CMAKE_FIND_ROOT_PATH on Windows
Works around CURL build failure because cmake insists on using
/usr/include/zlib.h.
2023-12-20 13:24:53 +01:00
Max Kellermann
1bf7d30623 subprojects: update fmt to 10.1.1-1 2023-12-20 13:24:14 +01:00
naglis
b2d89253a6 doc/protocol.rst: mention song id lifetime 2023-12-20 13:23:03 +01:00
skidoo23
50c1e3738a decoder/ffmpeg: Fix build error with ffmpeg 6.1
Closes https://github.com/MusicPlayerDaemon/MPD/issues/1898
2023-11-21 20:36:37 +01:00
Max Kellermann
7a939746ae increment version number to 0.23.15 2023-11-21 20:32:45 +01:00
23 changed files with 132 additions and 78 deletions

14
NEWS

@@ -1,3 +1,17 @@
ver 0.23.16 (2024/12/03)
* database
- fix integer overflows with 64-bit inode numbers
* filter
- ffmpeg: fix for filters producing no output
* support libfmt 11
* support ICU 76
ver 0.23.15 (2023/12/20)
* decoder
- ffmpeg: fix build failure with FFmpeg 6.1
* output
- alsa: limit buffer time to 2 seconds
ver 0.23.14 (2023/10/08)
* decoder
- flac: fix scanning files with non-ASCII names on Windows

@@ -2,8 +2,8 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="org.musicpd"
android:installLocation="auto"
android:versionCode="72"
android:versionName="0.23.14">
android:versionCode="74"
android:versionName="0.23.16">
<uses-sdk android:minSdkVersion="24" android:targetSdkVersion="30"/>

@@ -20,6 +20,7 @@ Some example code:
.. code-block:: c
int
Foo(const char *abc, int xyz)
{
if (abc == nullptr) {

@@ -691,7 +691,8 @@ Song ids on the other hand are stable: an id is assigned to a song
when it is added, and will stay the same, no matter how much it is
moved around. Adding the same song twice will assign different ids to
them, and a deleted-and-readded song will have a new id. This way, a
client can always be sure the correct song is being used.
client can always be sure the correct song is being used. Song ids are not
preserved across :program:`MPD` restarts.
Many commands come in two flavors, one for each address type.
Whenever possible, ids should be used.

@@ -1,7 +1,7 @@
project(
'mpd',
['c', 'cpp'],
version: '0.23.14',
version: '0.23.16',
meson_version: '>= 0.56.0',
default_options: [
'c_std=c11',
@@ -76,6 +76,9 @@ test_common_flags = [
# suppress bogus GCC12 warnings in libfmt headers
'-Wno-stringop-overflow',
# libfmt causes this warning due to -ffast-math
'-Wno-nan-infinity-disabled',
]
test_global_cxxflags = test_global_common_flags + [

@@ -53,6 +53,14 @@ set(CMAKE_CXX_FLAGS_INIT "{toolchain.cxxflags} {toolchain.cppflags}")
set(CMAKE_FIND_ROOT_PATH "{toolchain.install_prefix};{sysroot}")
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
""")
elif cmake_system_name == 'Windows':
# search libraries and headers only in the sysroot, not on
# the build host
f.write(f"""
set(CMAKE_FIND_ROOT_PATH "{toolchain.install_prefix}")
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
""")
def configure(toolchain: AnyToolchain, src: str, build: str, args: list[str]=[], env: Optional[Mapping[str, str]]=None) -> None:

@@ -57,9 +57,9 @@ flac = AutotoolsProject(
)
zlib = ZlibProject(
('http://zlib.net/zlib-1.3.tar.xz',
'https://github.com/madler/zlib/releases/download/v1.3/zlib-1.3.tar.xz'),
'8a9ba2898e1d0d774eca6ba5b4627a11e5588ba85c8851336eb38de4683050a7',
('http://zlib.net/zlib-1.3.1.tar.xz',
'https://github.com/madler/zlib/releases/download/v1.3.1/zlib-1.3.1.tar.xz'),
'38ef96b8dfe510d42707d9c781877914792541133e1870841463bfa73f883e32',
'lib/libz.a',
)
@@ -116,8 +116,8 @@ libmodplug = AutotoolsProject(
)
libopenmpt = AutotoolsProject(
'https://lib.openmpt.org/files/libopenmpt/src/libopenmpt-0.6.6+release.autotools.tar.gz',
'6ddb9e26a430620944891796fefb1bbb38bd9148f6cfc558810c0d3f269876c7',
'https://lib.openmpt.org/files/libopenmpt/src/libopenmpt-0.7.9+release.autotools.tar.gz',
'0386e918d75d797e79d5b14edd0847165d8b359e9811ef57652c0a356a2dfcf4',
'lib/libopenmpt.a',
[
'--disable-shared', '--enable-static',
@@ -129,12 +129,12 @@ libopenmpt = AutotoolsProject(
'--without-portaudio', '--without-portaudiocpp', '--without-sndfile',
'--without-flac',
],
base='libopenmpt-0.6.6+release.autotools',
base='libopenmpt-0.7.9+release.autotools',
)
wildmidi = CmakeProject(
'https://github.com/Mindwerks/wildmidi/releases/download/wildmidi-0.4.5/wildmidi-0.4.5.tar.gz',
'd5e7bef00a7aa47534a53d43b1265f8d3d27f6a28e7f563c1cdf02ff4fa35b99',
'https://github.com/Mindwerks/wildmidi/releases/download/wildmidi-0.4.6/wildmidi-0.4.6.tar.gz',
'24ca992639ce76efa3737029fceb3672385d56e2ac0a15d50b40cc12d26e60de',
'lib/libWildMidi.a',
[
'-DBUILD_SHARED_LIBS=OFF',
@@ -156,8 +156,8 @@ gme = CmakeProject(
)
ffmpeg = FfmpegProject(
'http://ffmpeg.org/releases/ffmpeg-6.0.tar.xz',
'57be87c22d9b49c112b6d24bc67d42508660e6b718b3db89c44e47e289137082',
'http://ffmpeg.org/releases/ffmpeg-6.1.tar.xz',
'488c76e57dd9b3bee901f71d5c95eaf1db4a5a31fe46a28654e837144207c270',
'lib/libavcodec.a',
[
'--disable-shared', '--enable-static',
@@ -464,6 +464,8 @@ ffmpeg = FfmpegProject(
'--disable-decoder=pam',
'--disable-decoder=pbm',
'--disable-decoder=pcx',
'--disable-decoder=pdv',
'--disable-decoder=pfm',
'--disable-decoder=pgm',
'--disable-decoder=pgmyuv',
'--disable-decoder=pgssub',
@@ -600,16 +602,16 @@ ffmpeg = FfmpegProject(
)
openssl = OpenSSLProject(
('https://www.openssl.org/source/openssl-3.1.3.tar.gz',
'https://artfiles.org/openssl.org/source/openssl-3.1.3.tar.gz'),
'f0316a2ebd89e7f2352976445458689f80302093788c466692fb2a188b2eacf6',
('https://www.openssl.org/source/openssl-3.1.4.tar.gz',
'https://artfiles.org/openssl.org/source/openssl-3.1.4.tar.gz'),
'840af5366ab9b522bde525826be3ef0fb0af81c6a9ebd84caa600fea1731eee3',
'include/openssl/ossl_typ.h',
)
curl = CmakeProject(
('https://curl.se/download/curl-8.2.1.tar.xz',
'https://github.com/curl/curl/releases/download/curl-8_2_1/curl-8.2.1.tar.xz'),
'dd322f6bd0a20e6cebdfd388f69e98c3d183bed792cf4713c8a7ef498cba4894',
('https://curl.se/download/curl-8.5.0.tar.xz',
'https://github.com/curl/curl/releases/download/curl-8_5_0/curl-8.5.0.tar.xz'),
'42ab8db9e20d8290a3b633e7fbb3cec15db34df65fd1015ef8ac1e4723750eeb',
'lib/libcurl.a',
[
'-DBUILD_CURL_EXE=OFF',
@@ -642,8 +644,8 @@ curl = CmakeProject(
)
libnfs = AutotoolsProject(
'https://github.com/sahlberg/libnfs/archive/libnfs-5.0.2.tar.gz',
'637e56643b19da9fba98f06847788c4dad308b723156a64748041035dcdf9bd3',
'https://github.com/sahlberg/libnfs/archive/libnfs-5.0.3.tar.gz',
'd945cb4f4c8f82ee1f3640893a168810f794a28e1010bb007ec5add345e9df3e',
'lib/libnfs.a',
[
'--disable-shared', '--enable-static',
@@ -654,7 +656,7 @@ libnfs = AutotoolsProject(
'--disable-utils', '--disable-examples',
],
base='libnfs-libnfs-5.0.2',
base='libnfs-libnfs-5.0.3',
autoreconf=True,
)

@@ -23,6 +23,8 @@
#include <fmt/format.h>
#include <iterator> // for std::back_inserter()
static constexpr Domain exception_domain("exception");
void

@@ -153,7 +153,7 @@ update_directory_stat(Storage &storage, Directory &directory) noexcept
*/
static int
FindAncestorLoop(Storage &storage, Directory *parent,
unsigned inode, unsigned device) noexcept
uint64_t inode, uint64_t device) noexcept
{
#ifndef _WIN32
if (device == 0 && inode == 0)

@@ -26,6 +26,9 @@
extern "C" {
#include <libavutil/mem.h>
#if LIBAVUTIL_VERSION_INT >= AV_VERSION_INT(58, 29, 100)
#include <libavutil/error.h>
#endif
}
AvioStream::~AvioStream()

@@ -66,6 +66,9 @@ FfmpegFilter::FilterPCM(ConstBuffer<void> src)
#endif
frame->nb_samples = src.size / in_audio_frame_size;
frame->pts = pts;
pts += frame->nb_samples;
frame.GetBuffer();
memcpy(frame.GetData(0), src.data, src.size);

@@ -17,14 +17,15 @@
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
#ifndef MPD_FFMPEG_FILTER__HXX
#define MPD_FFMPEG_FILTER__HXX
#pragma once
#include "filter/Filter.hxx"
#include "lib/ffmpeg/Buffer.hxx"
#include "lib/ffmpeg/Filter.hxx"
#include "lib/ffmpeg/Frame.hxx"
#include <cstdint>
/**
* A #Filter implementation using FFmpeg's libavfilter.
*/
@@ -46,6 +47,11 @@ class FfmpegFilter final : public Filter {
const size_t in_audio_frame_size;
const size_t out_audio_frame_size;
/**
* Presentation timestamp. A counter for `AVFrame::pts`.
*/
int_least64_t pts = 0;
public:
/**
* @param _graph a checked and configured AVFilterGraph
@@ -63,5 +69,3 @@ public:
/* virtual methods from class Filter */
ConstBuffer<void> FilterPCM(ConstBuffer<void> src) override;
};
#endif

@@ -234,7 +234,7 @@ AlsaInputStream::PrepareSockets() noexcept
void
AlsaInputStream::DispatchSockets() noexcept
{
try {
non_block.DispatchSockets(*this, capture_handle);
const std::scoped_lock<Mutex> protect(mutex);
@@ -253,16 +253,17 @@ AlsaInputStream::DispatchSockets() noexcept
if (n_frames == -EAGAIN)
return;
if (Recover(n_frames) < 0) {
postponed_exception = std::make_exception_ptr(std::runtime_error("PCM error - stream aborted"));
InvokeOnAvailable();
return;
}
if (Recover(n_frames) < 0)
throw std::runtime_error("PCM error - stream aborted");
}
size_t nbytes = n_frames * frame_size;
CommitWriteBuffer(nbytes);
}
catch (...) {
postponed_exception = std::current_exception();
InvokeOnAvailable();
}
inline int
AlsaInputStream::Recover(int err)
@@ -369,9 +370,14 @@ AlsaInputStream::ConfigureCapture(AudioFormat audio_format)
period_size_min, period_size_max,
period_time_min, period_time_max);
/* choose the maximum possible buffer_size ... */
snd_pcm_hw_params_set_buffer_size(capture_handle, hw_params,
buffer_size_max);
/* choose the maximum buffer_time up to limit of 2 seconds ... */
unsigned buffer_time = buffer_time_max;
if (buffer_time > 2000000U)
buffer_time = 2000000U;
int direction = -1;
if ((err = snd_pcm_hw_params_set_buffer_time_near(capture_handle,
hw_params, &buffer_time, &direction)) < 0)
throw Alsa::MakeError(err, "Cannot set buffer time");
/* ... and calculate the period_size to have four periods in
one buffer; this way, we get woken up often enough to avoid
@@ -379,7 +385,7 @@ AlsaInputStream::ConfigureCapture(AudioFormat audio_format)
snd_pcm_uframes_t buffer_size;
if (snd_pcm_hw_params_get_buffer_size(hw_params, &buffer_size) == 0) {
snd_pcm_uframes_t period_size = buffer_size / 4;
int direction = -1;
direction = -1;
if ((err = snd_pcm_hw_params_set_period_size_near(capture_handle,
hw_params, &period_size, &direction)) < 0)
throw Alsa::MakeError(err, "Cannot set period size");

@@ -1,13 +1,13 @@
Index: curl-7.84.0/CMakeLists.txt
Index: curl-7.85.0/CMakeLists.txt
===================================================================
--- curl-7.84.0.orig/CMakeLists.txt
+++ curl-7.84.0/CMakeLists.txt
@@ -1536,7 +1536,7 @@ set(includedir "\${prefix}/
set(LDFLAGS "${CMAKE_SHARED_LINKER_FLAGS}")
set(LIBCURL_LIBS "")
set(libdir "${CMAKE_INSTALL_PREFIX}/lib")
-foreach(_lib ${CMAKE_C_IMPLICIT_LINK_LIBRARIES} ${CURL_LIBS})
+foreach(_lib ${CURL_LIBS})
if(TARGET "${_lib}")
set(_libname "${_lib}")
get_target_property(_imported "${_libname}" IMPORTED)
--- curl-7.85.0.orig/CMakeLists.txt
+++ curl-7.85.0/CMakeLists.txt
@@ -1655,7 +1655,7 @@
set(LDFLAGS "${CMAKE_SHARED_LINKER_FLAGS}")
set(LIBCURL_LIBS "")
set(libdir "${CMAKE_INSTALL_PREFIX}/lib")
- foreach(_lib ${CMAKE_C_IMPLICIT_LINK_LIBRARIES} ${CURL_LIBS})
+ foreach(_lib ${CURL_LIBS})
if(TARGET "${_lib}")
set(_libname "${_lib}")
get_target_property(_imported "${_libname}" IMPORTED)

@@ -29,7 +29,7 @@ template<>
struct fmt::formatter<AVSampleFormat> : formatter<string_view>
{
template<typename FormatContext>
auto format(const AVSampleFormat format, FormatContext &ctx) {
auto format(const AVSampleFormat format, FormatContext &ctx) const {
const char *name = av_get_sample_fmt_name(format);
if (name == nullptr)
name = "?";

@@ -39,7 +39,7 @@ template<>
struct fmt::formatter<SampleFormat> : formatter<string_view>
{
template<typename FormatContext>
auto format(const SampleFormat format, FormatContext &ctx) {
auto format(const SampleFormat format, FormatContext &ctx) const {
return formatter<string_view>::format(sample_format_to_string(format),
ctx);
}
@@ -49,7 +49,7 @@ template<>
struct fmt::formatter<AudioFormat> : formatter<string_view>
{
template<typename FormatContext>
auto format(const AudioFormat &af, FormatContext &ctx) {
auto format(const AudioFormat &af, FormatContext &ctx) const {
return formatter<string_view>::format(ToString(af).c_str(),
ctx);
}

@@ -38,7 +38,7 @@ template<>
struct fmt::formatter<std::exception_ptr> : formatter<string_view>
{
template<typename FormatContext>
auto format(std::exception_ptr e, FormatContext &ctx) {
auto format(std::exception_ptr e, FormatContext &ctx) const {
return formatter<string_view>::format(GetFullMessage(e), ctx);
}
};

@@ -29,7 +29,7 @@ template<>
struct fmt::formatter<Path> : formatter<string_view>
{
template<typename FormatContext>
auto format(Path path, FormatContext &ctx) {
auto format(Path path, FormatContext &ctx) const {
return formatter<string_view>::format(path.ToUTF8(), ctx);
}
};

@@ -1,5 +1,7 @@
icu_dep = dependency('icu-i18n', version: '>= 50', required: get_option('icu'))
conf.set('HAVE_ICU', icu_dep.found())
icu_i18n_dep = dependency('icu-i18n', version: '>= 50', required: get_option('icu'))
icu_uc_dep = dependency('icu-uc', version: '>= 50', required: get_option('icu'))
have_icu = icu_i18n_dep.found() and icu_uc_dep.found()
conf.set('HAVE_ICU', have_icu)
icu_sources = [
'CaseFold.cxx',
@@ -13,7 +15,7 @@ if is_windows
endif
iconv_dep = []
if icu_dep.found()
if have_icu
icu_sources += [
'Util.cxx',
'Init.cxx',
@@ -44,7 +46,8 @@ icu = static_library(
icu_sources,
include_directories: inc,
dependencies: [
icu_dep,
icu_i18n_dep,
icu_uc_dep,
iconv_dep,
fmt_dep,
],

@@ -24,6 +24,7 @@
#include "WindowsCond.hxx"
#include <memory>
#include <system_error> // for std::error_category
#include <variant>
enum class WinFutureErrc : int {

@@ -100,9 +100,11 @@ FormatHResultError(HRESULT result, const char *fmt, ...) noexcept
va_start(args1, fmt);
va_copy(args2, args1);
const int size = vsnprintf(nullptr, 0, fmt, args1);
int size = vsnprintf(nullptr, 0, fmt, args1);
va_end(args1);
assert(size >= 0);
if (size < 0)
size = 0;
auto buffer = std::make_unique<char[]>(size + 1);
vsprintf(buffer.get(), fmt, args2);

@@ -1,12 +1,13 @@
[wrap-file]
directory = fmt-9.1.0
source_url = https://github.com/fmtlib/fmt/archive/9.1.0.tar.gz
source_filename = fmt-9.1.0.tar.gz
source_hash = 5dea48d1fcddc3ec571ce2058e13910a0d4a6bab4cc09a809d8b1dd1c88ae6f2
patch_filename = fmt_9.1.0-1_patch.zip
patch_url = https://wrapdb.mesonbuild.com/v2/fmt_9.1.0-1/get_patch
patch_hash = 4557b9ba87b3eb63694ed9b21d1a2117d4a97ca56b91085b10288e9a5294adf8
wrapdb_version = 9.1.0-1
directory = fmt-11.0.2
source_url = https://github.com/fmtlib/fmt/archive/11.0.2.tar.gz
source_filename = fmt-11.0.2.tar.gz
source_hash = 6cb1e6d37bdcb756dbbe59be438790db409cdb4868c66e888d5df9f13f7c027f
patch_filename = fmt_11.0.2-1_patch.zip
patch_url = https://wrapdb.mesonbuild.com/v2/fmt_11.0.2-1/get_patch
patch_hash = 90c9e3b8e8f29713d40ca949f6f93ad115d78d7fb921064112bc6179e6427c5e
source_fallback_url = https://github.com/mesonbuild/wrapdb/releases/download/fmt_11.0.2-1/fmt-11.0.2.tar.gz
wrapdb_version = 11.0.2-1
[provide]
fmt = fmt_dep

@@ -1,13 +1,13 @@
[wrap-file]
directory = sqlite-amalgamation-3410200
source_url = https://www.sqlite.org/2023/sqlite-amalgamation-3410200.zip
source_filename = sqlite-amalgamation-3410200.zip
source_hash = 01df06a84803c1ab4d62c64e995b151b2dbcf5dbc93bbc5eee213cb18225d987
patch_filename = sqlite3_3.41.2-2_patch.zip
patch_url = https://wrapdb.mesonbuild.com/v2/sqlite3_3.41.2-2/get_patch
patch_hash = 246681dfb731a14bfa61bcde651d5581a7e1c7d14851bfb57a941fac540a6810
source_fallback_url = https://github.com/mesonbuild/wrapdb/releases/download/sqlite3_3.41.2-2/sqlite-amalgamation-3410200.zip
wrapdb_version = 3.41.2-2
directory = sqlite-amalgamation-3470100
source_url = https://www.sqlite.org/2024/sqlite-amalgamation-3470100.zip
source_filename = sqlite-amalgamation-3470100.zip
source_hash = 9da21e6b14ef6a943cdc30f973df259fb390bb4483f77e7f171b9b6e977e5458
patch_filename = sqlite3_3.47.1-1_patch.zip
patch_url = https://wrapdb.mesonbuild.com/v2/sqlite3_3.47.1-1/get_patch
patch_hash = 7a298e69c663abfccd2d3632c6897b4f90627d36fd7fa137240c1d97c9a86466
source_fallback_url = https://github.com/mesonbuild/wrapdb/releases/download/sqlite3_3.47.1-1/sqlite-amalgamation-3470100.zip
wrapdb_version = 3.47.1-1
[provide]
sqlite3 = sqlite3_dep