diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index d1faeb04e098b8e864644bf4948ce8f4321980f2..d7f4c7705b3ac87af1e333041f9a1438fa9f296a 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -235,6 +235,7 @@ target_compile_definitions(SRB2SDL2 PRIVATE -DHAVE_DISCORDRPC -DUSE_STUN)
 target_sources(SRB2SDL2 PRIVATE discord.c stun.c)
 
 target_link_libraries(SRB2SDL2 PRIVATE tcbrindle::span)
+target_link_libraries(SRB2SDL2 PRIVATE glm)
 target_link_libraries(SRB2SDL2 PRIVATE stb_rect_pack)
 target_link_libraries(SRB2SDL2 PRIVATE stb_vorbis)
 target_link_libraries(SRB2SDL2 PRIVATE xmp-lite::xmp-lite)
diff --git a/thirdparty/CMakeLists.txt b/thirdparty/CMakeLists.txt
index 5fc7bf5d60c87c7719eaffb9fac168ac0ee04479..6cfd454756a1ef391bc8141ad89996a6eeafc16c 100644
--- a/thirdparty/CMakeLists.txt
+++ b/thirdparty/CMakeLists.txt
@@ -17,6 +17,7 @@ if(NOT "${SRB2_CONFIG_SYSTEM_LIBRARIES}")
 	include("cpm-libgme.cmake")
 endif()
 
+include("cpm-glm.cmake")
 include("cpm-rapidjson.cmake")
 include("cpm-discordrpc.cmake")
 include("cpm-xmp-lite.cmake")
diff --git a/thirdparty/cpm-glm.cmake b/thirdparty/cpm-glm.cmake
new file mode 100644
index 0000000000000000000000000000000000000000..a69e2faa592d73497c2978b34138424ff7321782
--- /dev/null
+++ b/thirdparty/cpm-glm.cmake
@@ -0,0 +1,13 @@
+CPMAddPackage(
+	NAME glm
+	VERSION 0.9.9.8
+	URL "https://github.com/g-truc/glm/releases/download/0.9.9.8/glm-0.9.9.8.zip"
+	EXCLUDE_FROM_ALL ON
+	DOWNLOAD_ONLY ON
+)
+
+if(glm_ADDED)
+	add_library(glm INTERFACE)
+	add_library(glm::glm ALIAS glm)
+	target_include_directories(glm INTERFACE "${glm_SOURCE_DIR}")
+endif()