diff --git a/src/libcamera/base/meson.build b/src/libcamera/base/meson.build
index a742dfdfe..94843eb95 100644
--- a/src/libcamera/base/meson.build
+++ b/src/libcamera/base/meson.build
@@ -24,10 +24,12 @@ libcamera_base_internal_sources = files([
     'thread.cpp',
     'timer.cpp',
     'utils.cpp',
+    'yaml_parser.cpp',
 ])
 
 libdw = dependency('libdw', required : false)
 libunwind = dependency('libunwind', required : false)
+libyaml = dependency('yaml-0.1', required : false)
 
 if cc.has_header_symbol('execinfo.h', 'backtrace')
     config_h.set('HAVE_BACKTRACE', 1)
@@ -41,11 +43,23 @@ if libunwind.found()
     config_h.set('HAVE_UNWIND', 1)
 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
+
 libcamera_base_deps = [
     libatomic,
     libdw,
     libthreads,
     libunwind,
+    libyaml,
 ]
 
 # Internal components must use the libcamera_base_private dependency to enable
diff --git a/src/libcamera/yaml_parser.cpp b/src/libcamera/base/yaml_parser.cpp
similarity index 98%
rename from src/libcamera/yaml_parser.cpp
rename to src/libcamera/base/yaml_parser.cpp
index a5e424615..13111faaa 100644
--- a/src/libcamera/yaml_parser.cpp
+++ b/src/libcamera/base/yaml_parser.cpp
@@ -149,13 +149,12 @@ YamlObject::Getter<bool>::get(const YamlObject &obj) const
 
 template<typename T>
 struct YamlObject::Getter<T, std::enable_if_t<
-	std::is_same_v<int8_t, T> ||
-	std::is_same_v<uint8_t, T> ||
-	std::is_same_v<int16_t, T> ||
-	std::is_same_v<uint16_t, T> ||
-	std::is_same_v<int32_t, T> ||
-	std::is_same_v<uint32_t, T>>>
-{
+				     std::is_same_v<int8_t, T> ||
+				     std::is_same_v<uint8_t, T> ||
+				     std::is_same_v<int16_t, T> ||
+				     std::is_same_v<uint16_t, T> ||
+				     std::is_same_v<int32_t, T> ||
+				     std::is_same_v<uint32_t, T>>> {
 	std::optional<T> get(const YamlObject &obj) const
 	{
 		if (obj.type_ != Type::Value)
diff --git a/src/libcamera/meson.build b/src/libcamera/meson.build
index 202db1efe..24fcfcf57 100644
--- a/src/libcamera/meson.build
+++ b/src/libcamera/meson.build
@@ -55,7 +55,6 @@ libcamera_internal_sources = files([
     'v4l2_subdevice.cpp',
     'v4l2_videodevice.cpp',
     'vector.cpp',
-    'yaml_parser.cpp',
 ])
 
 includes = [
@@ -83,7 +82,6 @@ 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)
 
 # Use one of gnutls or libcrypto (provided by OpenSSL), trying gnutls first.
 libcrypto = dependency('gnutls', required : false)
@@ -119,17 +117,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 = {
@@ -190,7 +177,6 @@ libcamera_deps += [
     libdl,
     liblttng,
     libudev,
-    libyaml,
 ]
 
 # We add '/' to the build_rpath as a 'safe' path to act as a boolean flag.
