diff --git a/CMakeLists.txt b/CMakeLists.txt
index 6efb1a5..0174dd9 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -32,6 +32,11 @@ if(NOT CMAKE_CXX_COMPILER_ID MATCHES "Clang" AND NOT WAYWALLEN_ALLOW_NONCLANG)
         "or pass -DWAYWALLEN_ALLOW_NONCLANG=ON to bypass this check.")
 endif()
 
+option(BUILD_WESCENE "Build the wescene (Wallpaper Engine *scene*) renderer" ON)
+option(BUILD_WEWEB   "Build the weweb (Wallpaper Engine *web*) renderer"     ON)
+option(OWE_WAYWALLEN_PLUGIN_BUNDLE_LAYOUT
+    "Install waywallen plugin files as a plugin-root bundle for CPack"
+    OFF)
 
 find_package(PkgConfig REQUIRED)
 find_package(Threads REQUIRED)
@@ -45,12 +50,6 @@ endif()
 include_directories(SYSTEM third_party)
 add_subdirectory(third_party)
 
-option(BUILD_WESCENE "Build the wescene (Wallpaper Engine *scene*) renderer" ON)
-option(BUILD_WEWEB   "Build the weweb (Wallpaper Engine *web*) renderer"     ON)
-option(OWE_WAYWALLEN_PLUGIN_BUNDLE_LAYOUT
-    "Install waywallen plugin files as a plugin-root bundle for CPack"
-    OFF)
-
 if(BUILD_WEWEB)
     include(${CMAKE_SOURCE_DIR}/cmake/CEF.cmake)
 endif()
diff --git a/src/Scene/CMakeLists.txt b/src/Scene/CMakeLists.txt
index 915eff3..d44f788 100644
--- a/src/Scene/CMakeLists.txt
+++ b/src/Scene/CMakeLists.txt
@@ -66,12 +66,13 @@ set_property(TARGET owe-base PROPERTY CXX_SCAN_FOR_MODULES ON)
 # ---------------------------------------------------------------------------
 # owe-script (QuickJS-NG runtime for the WE scenescript surface)
 # ---------------------------------------------------------------------------
+pkg_check_modules(quickjs-ng REQUIRED IMPORTED_TARGET quickjs-ng)
 add_library(owe-script STATIC Script/Script.cpp)
 target_sources(owe-script
   PUBLIC FILE_SET cxx_modules TYPE CXX_MODULES FILES Script/Script.cppm)
 target_link_libraries(owe-script
   PUBLIC  owe-base
-  PRIVATE qjs)
+  PRIVATE PkgConfig::quickjs-ng)
 target_include_directories(owe-script
   PUBLIC  .. . Utils/include
   PRIVATE Utils Utils/include/Utils Script)
diff --git a/src/Vulkan/Shader.cpp b/src/Vulkan/Shader.cpp
index 17a7069..ab1f9e6 100644
--- a/src/Vulkan/Shader.cpp
+++ b/src/Vulkan/Shader.cpp
@@ -5,7 +5,7 @@ module;
 
 #include <glslang/Public/ShaderLang.h>
 #include <glslang/Public/ResourceLimits.h>
-#include <SPIRV/GlslangToSpv.h>
+#include <glslang/SPIRV/GlslangToSpv.h>
 
 #include "Utils/Sha.hpp"
 module wescene.shader_compile;
diff --git a/third_party/CMakeLists.txt b/third_party/CMakeLists.txt
index b80147e..eab5c62 100644
--- a/third_party/CMakeLists.txt
+++ b/third_party/CMakeLists.txt
@@ -44,12 +44,16 @@ set(BUILD_EXTERNAL          OFF CACHE INTERNAL "")
 set(GLSLANG_TESTS           OFF CACHE INTERNAL "")
 set(BUILD_TESTING           OFF CACHE INTERNAL "")
 
-fetchdeps(${CMAKE_SOURCE_DIR}/deps.json)
+fetchdeps(${CMAKE_SOURCE_DIR}/deps.json NAMES spirv_reflect rstd wavsen)
 
-# Post-fetch setup for eigen (header-only, source_subdir=cmake-noop).
-add_library(eigen INTERFACE)
-add_library(Eigen3::Eigen ALIAS eigen)
-target_include_directories(eigen SYSTEM INTERFACE ${eigen_SOURCE_DIR})
+find_package(Eigen3 REQUIRED GLOBAL)
+find_package(glslang REQUIRED GLOBAL)
+find_package(nlohmann_json REQUIRED GLOBAL)
+find_package(argparse REQUIRED GLOBAL)
+
+if(BUILD_WEWEB)
+    fetchdeps(${CMAKE_SOURCE_DIR}/deps.json NAMES cef)
+endif()
 
 # Audio output is handled by wavsen::audio (pulse/pipewire-backed,
 # selectable via WAVSEN_AUDIO_BACKEND in the wavsen subtree).
