diff --git a/cmake/assign_source_group.cmake b/cmake/assign_source_group.cmake
new file mode 100644
index 0000000000000000000000000000000000000000..648f93ebd32efe33f2d366e4a08c4ec2d0598f26
--- /dev/null
+++ b/cmake/assign_source_group.cmake
@@ -0,0 +1,17 @@
+# Assigns the given files to source groups identical to their location.
+function(assign_source_group)
+  foreach(_SOURCE IN ITEMS ${ARGN})
+    if (IS_ABSOLUTE "${_SOURCE}")
+      file(RELATIVE_PATH _SOURCE_REL "${CMAKE_CURRENT_SOURCE_DIR}" "${_SOURCE}")
+    else()
+      set(_SOURCE_REL "${_SOURCE}")
+    endif()
+    get_filename_component(_SOURCE_PATH "${_SOURCE_REL}" PATH)
+    if(WIN32)
+      string(REPLACE "/" "\\" _SOURCE_PATH_MSVC "${_SOURCE_PATH}")
+      source_group("${_SOURCE_PATH_MSVC}" FILES "${_SOURCE}")
+    else()
+      source_group("${_SOURCE_PATH}" FILES "${_SOURCE}")
+    endif()
+  endforeach()
+endfunction(assign_source_group)
\ No newline at end of file