diff --git a/meson_options.txt b/meson_options.txt
index b17b6de6f182..6464df837cc3 100644
--- a/meson_options.txt
+++ b/meson_options.txt
@@ -12,6 +12,11 @@ option('gstreamer',
         value : 'auto',
         description : 'Compile libcamera GStreamer plugin')
 
+option('pipelines',
+        type : 'array',
+        choices : ['ipu3', 'rkisp1', 'uvcvideo', 'vimc'],
+        description : 'Select which pipeline handlers to include')
+
 option('test',
         type : 'boolean',
         description: 'Compile and include the tests')
diff --git a/src/ipa/meson.build b/src/ipa/meson.build
index 9aaf92494d37..73278a60a99f 100644
--- a/src/ipa/meson.build
+++ b/src/ipa/meson.build
@@ -9,5 +9,11 @@ config_h.set('IPA_MODULE_DIR',
              '"' + join_paths(get_option('prefix'), ipa_install_dir) + '"')
 
 subdir('libipa')
-subdir('rkisp1')
-subdir('vimc')
+
+ipas = ['rkisp1', 'vimc']
+
+foreach pipeline : get_option('pipelines')
+    if ipas.contains(pipeline)
+        subdir(pipeline)
+    endif
+endforeach
diff --git a/src/libcamera/pipeline/meson.build b/src/libcamera/pipeline/meson.build
index c1a6ab0484f0..190ca5a8db92 100644
--- a/src/libcamera/pipeline/meson.build
+++ b/src/libcamera/pipeline/meson.build
@@ -1,4 +1,3 @@
-subdir('ipu3')
-subdir('rkisp1')
-subdir('uvcvideo')
-subdir('vimc')
+foreach pipeline : get_option('pipelines')
+    subdir(pipeline)
+endforeach
