diff --git a/src/libcamera/meson.build b/src/libcamera/meson.build
index 28a3b0f36..9f782e729 100644
--- a/src/libcamera/meson.build
+++ b/src/libcamera/meson.build
@@ -84,7 +84,9 @@ if not cc.has_function('dlopen')
     libdl = cc.find_library('dl')
 endif
 libudev = dependency('libudev', required : get_option('udev'))
-libyaml = dependency('yaml-0.1', required : false)
+libyaml = dependency('yaml-0.1', default_options : [
+    'werror=false',
+])
 
 # Use one of gnutls or libcrypto (provided by OpenSSL), trying gnutls first.
 libcrypto = dependency('gnutls', required : false)
@@ -120,17 +122,6 @@ if libudev.found()
     ])
 endif
 
-# Fallback to a subproject if libyaml isn't found, as it's not packaged in AOSP.
-if not libyaml.found()
-    cmake = import('cmake')
-
-    libyaml_vars = cmake.subproject_options()
-    libyaml_vars.add_cmake_defines({'CMAKE_POSITION_INDEPENDENT_CODE': 'ON'})
-    libyaml_vars.append_compile_args('c', '-Wno-unused-value')
-    libyaml_wrap = cmake.subproject('libyaml', options : libyaml_vars)
-    libyaml = libyaml_wrap.dependency('yaml')
-endif
-
 control_sources = []
 
 controls_mode_files = {
diff --git a/subprojects/libyaml.wrap b/subprojects/libyaml.wrap
index 392416c61..85d9af44e 100644
--- a/subprojects/libyaml.wrap
+++ b/subprojects/libyaml.wrap
@@ -1,7 +1,11 @@
-# SPDX-License-Identifier: CC0-1.0
+[wrap-file]
+directory = yaml-0.2.5
+source_url = https://pyyaml.org/download/libyaml/yaml-0.2.5.tar.gz
+source_filename = yaml-0.2.5.tar.gz
+source_hash = c642ae9b75fee120b2d96c712538bd2cf283228d2337df2cf2988e3c02678ef4
+patch_filename = libyaml_0.2.5-1_patch.zip
+patch_url = https://wrapdb.mesonbuild.com/v2/libyaml_0.2.5-1/get_patch
+patch_hash = bf2e9b922be00b6b00c5fce29d9fb8dc83f0431c77239f3b73e8b254d3f3f5b5
 
-[wrap-git]
-directory = libyaml
-url = https://github.com/yaml/libyaml
-# tags/0.2.5
-revision = 2c891fc7a770e8ba2fec34fc6b545c672beb37e6
+[provide]
+yaml-0.1 = yaml_dep
