From 980940986504f368888f70f6500840d361d8aa8a Mon Sep 17 00:00:00 2001
From: Tobias Frisch <tfrisch@uni-koblenz.de>
Date: Fri, 17 Sep 2021 16:14:39 +0200
Subject: [PATCH] [#107] Automatically initialize git lfs and update submodules
 via CMake

Signed-off-by: Tobias Frisch <tfrisch@uni-koblenz.de>
---
 CMakeLists.txt                                |  2 +-
 config/Libraries.cmake                        |  6 ++
 config/ext/Git.cmake                          | 74 +++++++++++++++++++
 config/lib/GLFW.cmake                         |  6 +-
 config/lib/SPIRV_Cross.cmake                  |  6 +-
 config/lib/VulkanMemoryAllocator.cmake        |  6 +-
 modules/asset_loader/config/FX_GLTF.cmake     |  6 +-
 .../asset_loader/config/NLOHMANN_JSON.cmake   |  6 +-
 modules/asset_loader/config/STB.cmake         |  6 +-
 modules/camera/config/GLM.cmake               |  6 +-
 modules/gui/config/ImGui.cmake                |  6 +-
 modules/shader_compiler/config/GLSLANG.cmake  |  6 +-
 modules/upscaling/config/FidelityFX_FSR.cmake |  6 +-
 13 files changed, 111 insertions(+), 31 deletions(-)
 create mode 100644 config/ext/Git.cmake

diff --git a/CMakeLists.txt b/CMakeLists.txt
index 2a0858b9..f8707389 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -88,5 +88,5 @@ add_subdirectory(projects)
 
 if (NOT WIN32)
 	# add doxygen as target if installed
-	include(${vkcv_config}/ext/Doxygen.cmake)
+	include(${vkcv_config_ext}/Doxygen.cmake)
 endif()
\ No newline at end of file
diff --git a/config/Libraries.cmake b/config/Libraries.cmake
index 512669ce..9ad756c0 100644
--- a/config/Libraries.cmake
+++ b/config/Libraries.cmake
@@ -16,6 +16,12 @@ if(NOT WIN32)
 	list(APPEND vkcv_flags -fopenmp)
 endif()
 
+# add custom functions to use git automatically
+include(${vkcv_config_ext}/Git.cmake)
+
+init_git_lfs()
+init_git_submodules()
+
 list(APPEND vkcv_definitions _USE_MATH_DEFINES)
 
 # some formatted printing
diff --git a/config/ext/Git.cmake b/config/ext/Git.cmake
new file mode 100644
index 00000000..01df5176
--- /dev/null
+++ b/config/ext/Git.cmake
@@ -0,0 +1,74 @@
+
+function(init_git_lfs)
+    find_program(git_program "git")
+
+    if (EXISTS ${git_program})
+        add_custom_target(
+                init_git_lfs
+                WORKING_DIRECTORY "${PROJECT_SOURCE_DIR}"
+        )
+
+        add_custom_command(
+                TARGET init_git_lfs
+                PRE_BUILD
+                WORKING_DIRECTORY "${PROJECT_SOURCE_DIR}"
+                COMMAND git lfs install
+                COMMENT "Initializing Git LFS"
+        )
+    endif()
+endfunction()
+
+function(init_git_submodules)
+    find_program(git_program "git")
+
+    if (EXISTS ${git_program})
+        add_custom_target(
+                init_git_submodules
+                WORKING_DIRECTORY "${PROJECT_SOURCE_DIR}"
+        )
+
+        add_custom_command(
+                TARGET init_git_submodules
+                PRE_BUILD
+                WORKING_DIRECTORY "${PROJECT_SOURCE_DIR}"
+                COMMAND git submodule init
+                COMMENT "Initializing Git Submodules"
+        )
+    endif()
+endfunction()
+
+function(use_git_submodule submodule_path submodule_status)
+    if (EXISTS "${submodule_path}")
+        set(${submodule_status} TRUE PARENT_SCOPE)
+        return()
+    endif()
+
+    get_filename_component(submodule_directory ${submodule_path} DIRECTORY)
+    get_filename_component(submodule_name ${submodule_path} NAME)
+
+    find_program(git_program "git")
+
+    if (EXISTS ${git_program})
+        add_custom_target(
+                "git_submodule_${submodule_name}"
+                WORKING_DIRECTORY "${submodule_directory}"
+        )
+
+        add_custom_command(
+                TARGET "git_submodule_${submodule_name}"
+                PRE_BUILD
+                WORKING_DIRECTORY "${submodule_directory}"
+                COMMAND git submodule update
+                COMMENT "Updating Git Submodules"
+        )
+
+        if (EXISTS "${submodule_path}")
+            set(${submodule_status} TRUE PARENT_SCOPE)
+            return()
+        endif()
+    endif()
+
+    message(WARNING "${submodule_name} is required..! Update the submodules!")
+
+    set(${submodule_status} FALSE PARENT_SCOPE)
+endfunction()
diff --git a/config/lib/GLFW.cmake b/config/lib/GLFW.cmake
index 9668694d..977eabc8 100644
--- a/config/lib/GLFW.cmake
+++ b/config/lib/GLFW.cmake
@@ -6,14 +6,14 @@ if (glfw3_FOUND)
 
     message(${vkcv_config_msg} " GLFW    -   " ${glfw3_VERSION})
 else()
-    if (EXISTS "${vkcv_lib_path}/glfw")
+    use_git_submodule("${vkcv_lib_path}/glfw" glfw_status)
+
+    if (${glfw_status})
         add_subdirectory(${vkcv_lib}/glfw)
 
         list(APPEND vkcv_libraries glfw)
         list(APPEND vkcv_includes ${vkcv_lib_path}/glfw/include)
 
         message(${vkcv_config_msg} " GLFW    -   " ${glfw3_VERSION})
-    else()
-        message(WARNING "GLFW is required..! Update the submodules!")
     endif ()
 endif ()
diff --git a/config/lib/SPIRV_Cross.cmake b/config/lib/SPIRV_Cross.cmake
index 00ae4552..ce4b2e43 100644
--- a/config/lib/SPIRV_Cross.cmake
+++ b/config/lib/SPIRV_Cross.cmake
@@ -5,7 +5,9 @@ if (spirv-cross_FOUND)
 
     message(${vkcv_config_msg} " SPIRV Cross    - " ${SPIRV_CROSS_VERSION})
 else()
-    if (EXISTS "${vkcv_lib_path}/SPIRV-Cross")
+    use_git_submodule("${vkcv_lib_path}/SPIRV-Cross" spirv_cross_status)
+
+    if (${spirv_cross_status})
         set(SPIRV_CROSS_EXCEPTIONS_TO_ASSERTIONS OFF CACHE INTERNAL "")
         set(SPIRV_CROSS_SHARED OFF CACHE INTERNAL "")
         set(SPIRV_CROSS_STATIC ON CACHE INTERNAL "")
@@ -28,7 +30,5 @@ else()
         list(APPEND vkcv_includes ${vkcv_lib_path}/SPIV-Cross/include)
 
         message(${vkcv_config_msg} " SPIRV Cross    - " ${SPIRV_CROSS_VERSION})
-    else()
-        message(WARNING "SPIRV-Cross is required..! Update the submodules!")
     endif ()
 endif ()
\ No newline at end of file
diff --git a/config/lib/VulkanMemoryAllocator.cmake b/config/lib/VulkanMemoryAllocator.cmake
index 5f670ff0..2a11f936 100644
--- a/config/lib/VulkanMemoryAllocator.cmake
+++ b/config/lib/VulkanMemoryAllocator.cmake
@@ -1,5 +1,7 @@
 
-if (EXISTS "${vkcv_lib_path}/VulkanMemoryAllocator-Hpp")
+use_git_submodule("${vkcv_lib_path}/VulkanMemoryAllocator-Hpp" vma_hpp_status)
+
+if (${vma_hpp_status})
 	set(VMA_HPP_PATH "${vkcv_lib_path}/VulkanMemoryAllocator-Hpp" CACHE INTERNAL "")
 	
 	set(VMA_RECORDING_ENABLED OFF CACHE INTERNAL "")
@@ -17,6 +19,4 @@ if (EXISTS "${vkcv_lib_path}/VulkanMemoryAllocator-Hpp")
 	list(APPEND vkcv_includes ${vkcv_lib_path}/VulkanMemoryAllocator-Hpp)
 	
 	message(${vkcv_config_msg} " VMA     - ")
-else()
-	message(WARNING "VulkanMemoryAllocator is required..! Update the submodules!")
 endif ()
diff --git a/modules/asset_loader/config/FX_GLTF.cmake b/modules/asset_loader/config/FX_GLTF.cmake
index 37cd1624..4164c278 100644
--- a/modules/asset_loader/config/FX_GLTF.cmake
+++ b/modules/asset_loader/config/FX_GLTF.cmake
@@ -1,5 +1,7 @@
 
-if (EXISTS "${vkcv_asset_loader_lib_path}/fx-gltf")
+use_git_submodule("${vkcv_asset_loader_lib_path}/fx-gltf" fx_gltf_status)
+
+if (${fx_gltf_status})
 	set(FX_GLTF_INSTALL OFF CACHE INTERNAL "")
 	set(FX_GLTF_USE_INSTALLED_DEPS OFF CACHE INTERNAL "")
 	set(BUILD_TESTING OFF CACHE INTERNAL "")
@@ -7,6 +9,4 @@ if (EXISTS "${vkcv_asset_loader_lib_path}/fx-gltf")
 	add_subdirectory(${vkcv_asset_loader_lib}/fx-gltf)
 	
 	list(APPEND vkcv_asset_loader_libraries fx-gltf)
-else()
-	message(WARNING "FX-GLTF is required..! Update the submodules!")
 endif ()
diff --git a/modules/asset_loader/config/NLOHMANN_JSON.cmake b/modules/asset_loader/config/NLOHMANN_JSON.cmake
index 018f6a19..4bd7f447 100644
--- a/modules/asset_loader/config/NLOHMANN_JSON.cmake
+++ b/modules/asset_loader/config/NLOHMANN_JSON.cmake
@@ -1,10 +1,10 @@
 
-if (EXISTS "${vkcv_asset_loader_lib_path}/json")
+use_git_submodule("${vkcv_asset_loader_lib_path}/json" json_status)
+
+if (${json_status})
 	set(JSON_BuildTests OFF CACHE INTERNAL "")
 	
 	add_subdirectory(${vkcv_asset_loader_lib}/json)
 	
 	list(APPEND vkcv_asset_loader_libraries nlohmann_json::nlohmann_json)
-else()
-	message(WARNING "NLOHMANN_JSON is required..! Update the submodules!")
 endif ()
diff --git a/modules/asset_loader/config/STB.cmake b/modules/asset_loader/config/STB.cmake
index 1287d0a9..61b7cc92 100644
--- a/modules/asset_loader/config/STB.cmake
+++ b/modules/asset_loader/config/STB.cmake
@@ -1,10 +1,10 @@
 
-if (EXISTS "${vkcv_asset_loader_lib_path}/stb")
+use_git_submodule("${vkcv_asset_loader_lib_path}/stb" stb_status)
+
+if (${stb_status})
 	list(APPEND vkcv_asset_loader_includes ${vkcv_asset_loader_lib}/stb)
 	
 	list(APPEND vkcv_asset_loader_definitions STB_IMAGE_IMPLEMENTATION)
 	list(APPEND vkcv_asset_loader_definitions STBI_ONLY_JPEG)
 	list(APPEND vkcv_asset_loader_definitions STBI_ONLY_PNG)
-else()
-	message(WARNING "STB is required..! Update the submodules!")
 endif ()
diff --git a/modules/camera/config/GLM.cmake b/modules/camera/config/GLM.cmake
index f256ccad..53960241 100644
--- a/modules/camera/config/GLM.cmake
+++ b/modules/camera/config/GLM.cmake
@@ -5,13 +5,13 @@ if (glm_FOUND)
     list(APPEND vkcv_camera_includes ${GLM_INCLUDE_DIRS})
     list(APPEND vkcv_camera_libraries glm)
 else()
-    if (EXISTS "${vkcv_camera_lib_path}/glm")
+    use_git_submodule("${vkcv_camera_lib_path}/glm" glm_status)
+
+    if (${glm_status})
         add_subdirectory(${vkcv_camera_lib}/glm)
 
         list(APPEND vkcv_camera_includes ${vkcv_camera_lib_path}/glm)
         list(APPEND vkcv_camera_libraries glm)
-    else()
-        message(WARNING "GLM is required..! Update the submodules!")
     endif ()
 endif ()
 
diff --git a/modules/gui/config/ImGui.cmake b/modules/gui/config/ImGui.cmake
index 90cdafde..624ea770 100644
--- a/modules/gui/config/ImGui.cmake
+++ b/modules/gui/config/ImGui.cmake
@@ -1,5 +1,7 @@
 
-if (EXISTS "${vkcv_gui_lib_path}/imgui")
+use_git_submodule("${vkcv_gui_lib_path}/imgui" imgui_status)
+
+if (${imgui_status})
 	list(APPEND vkcv_imgui_sources ${vkcv_gui_lib_path}/imgui/backends/imgui_impl_glfw.cpp)
 	list(APPEND vkcv_imgui_sources ${vkcv_gui_lib_path}/imgui/backends/imgui_impl_glfw.h)
 	list(APPEND vkcv_imgui_sources ${vkcv_gui_lib_path}/imgui/backends/imgui_impl_vulkan.cpp)
@@ -22,6 +24,4 @@ if (EXISTS "${vkcv_gui_lib_path}/imgui")
 	list(APPEND vkcv_gui_include ${vkcv_gui_lib})
 	
 	list(APPEND vkcv_gui_defines IMGUI_DISABLE_WIN32_FUNCTIONS=1)
-else()
-	message(WARNING "IMGUI is required..! Update the submodules!")
 endif ()
diff --git a/modules/shader_compiler/config/GLSLANG.cmake b/modules/shader_compiler/config/GLSLANG.cmake
index 50b9fd46..98bd4549 100644
--- a/modules/shader_compiler/config/GLSLANG.cmake
+++ b/modules/shader_compiler/config/GLSLANG.cmake
@@ -1,5 +1,7 @@
 
-if (EXISTS "${vkcv_shader_compiler_lib_path}/glslang")
+use_git_submodule("${vkcv_shader_compiler_lib_path}/glslang" glslang_status)
+
+if (${glslang_status})
 	set(SKIP_GLSLANG_INSTALL ON CACHE INTERNAL "")
 	set(ENABLE_SPVREMAPPER OFF CACHE INTERNAL "")
 	set(ENABLE_GLSLANG_BINARIES OFF CACHE INTERNAL "")
@@ -23,6 +25,4 @@ if (EXISTS "${vkcv_shader_compiler_lib_path}/glslang")
 	
 	list(APPEND vkcv_shader_compiler_libraries glslang SPIRV)
 	list(APPEND vkcv_shader_compiler_includes ${vkcv_shader_compiler_lib})
-else()
-	message(WARNING "GLSLANG is required..! Update the submodules!")
 endif ()
diff --git a/modules/upscaling/config/FidelityFX_FSR.cmake b/modules/upscaling/config/FidelityFX_FSR.cmake
index cc52b418..780f1d44 100644
--- a/modules/upscaling/config/FidelityFX_FSR.cmake
+++ b/modules/upscaling/config/FidelityFX_FSR.cmake
@@ -1,5 +1,7 @@
 
-if (EXISTS "${vkcv_upscaling_lib_path}/FidelityFX-FSR")
+use_git_submodule("${vkcv_upscaling_lib_path}/FidelityFX-FSR" ffx_fsr_status)
+
+if (${ffx_fsr_status})
 	include_shader(${vkcv_upscaling_lib_path}/FidelityFX-FSR/ffx-fsr/ffx_a.h ${vkcv_upscaling_include} ${vkcv_upscaling_source})
 	include_shader(${vkcv_upscaling_lib_path}/FidelityFX-FSR/ffx-fsr/ffx_fsr1.h ${vkcv_upscaling_include} ${vkcv_upscaling_source})
 	include_shader(${vkcv_upscaling_lib_path}/FidelityFX-FSR/sample/src/VK/FSR_Pass.glsl ${vkcv_upscaling_include} ${vkcv_upscaling_source})
@@ -13,6 +15,4 @@ if (EXISTS "${vkcv_upscaling_lib_path}/FidelityFX-FSR")
 	list(APPEND vkcv_upscaling_sources ${vkcv_upscaling_include}/ffx_a.h.hxx)
 	list(APPEND vkcv_upscaling_sources ${vkcv_upscaling_include}/ffx_fsr1.h.hxx)
 	list(APPEND vkcv_upscaling_sources ${vkcv_upscaling_include}/FSR_Pass.glsl.hxx)
-else()
-	message(WARNING "FidelityFX-FSR is required..! Update the submodules!")
 endif ()
-- 
GitLab