From 86d28defc8b01b7387526adb1b4e95c55a68f02f Mon Sep 17 00:00:00 2001
From: Tobias Frisch <tfrisch@uni-koblenz.de>
Date: Tue, 7 Dec 2021 13:46:39 +0100
Subject: [PATCH] Added cmake options to include framework in external projects

Signed-off-by: Tobias Frisch <tfrisch@uni-koblenz.de>
---
 CMakeLists.txt                         | 80 +++++++++++++++++++++-----
 config/ext/Doxygen.cmake               |  2 +-
 modules/CMakeLists.txt                 | 12 ++++
 modules/asset_loader/CMakeLists.txt    | 10 +++-
 modules/camera/CMakeLists.txt          | 10 +++-
 modules/gui/CMakeLists.txt             | 10 +++-
 modules/material/CMakeLists.txt        | 10 +++-
 modules/meshlet/CMakeLists.txt         | 10 +++-
 modules/scene/CMakeLists.txt           | 10 +++-
 modules/shader_compiler/CMakeLists.txt | 10 +++-
 modules/testing/CMakeLists.txt         |  9 ++-
 modules/upscaling/CMakeLists.txt       | 10 +++-
 12 files changed, 159 insertions(+), 24 deletions(-)

diff --git a/CMakeLists.txt b/CMakeLists.txt
index 1af81b59..7f1fdceb 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -1,6 +1,28 @@
 cmake_minimum_required(VERSION 3.16)
 project(vkcv)
 
+# cmake options
+option(BUILD_MODULES "Enables building VkCV as shared libraries" ON)
+option(BUILD_PROJECTS "Enables building the VkCV projects" ON)
+option(BUILD_DOXYGEN_DOCS "Enables building the VkCV doxygen documentation" OFF)
+option(BUILD_SHARED "Enables building VkCV as shared libraries" OFF)
+
+if (BUILD_PROJECTS)
+	set(BUILD_MODULES ${BUILD_PROJECTS})
+endif()
+
+message(STATUS "Options:")
+message(" - BUILD_MODULES: ${BUILD_MODULES}")
+message(" - BUILD_PROJECTS: ${BUILD_PROJECTS}")
+message(" - BUILD_DOXYGEN_DOCS: ${BUILD_DOXYGEN_DOCS}")
+message(" - BUILD_SHARED: ${BUILD_SHARED}")
+
+if (BUILD_SHARED)
+	set(vkcv_build_attribute SHARED)
+else()
+	set(vkcv_build_attribute STATIC)
+endif()
+
 # settings c++ standard for the framework
 set(CMAKE_CXX_STANDARD 20)
 set(CMAKE_CXX_STANDARD_REQUIRED ON)
@@ -11,8 +33,8 @@ if (CMAKE_BUILD_TYPE)
 	set(vkcv_build_${_vkcv_build_type} 1)
 endif()
 
-message("-- Language: [ C++ " ${CMAKE_CXX_STANDARD} " ]")
-message("-- Compiler: [ " ${CMAKE_CXX_COMPILER_ID} " " ${CMAKE_CXX_COMPILER_VERSION} " ]")
+message(STATUS "Language: [ C++ " ${CMAKE_CXX_STANDARD} " ]")
+message(STATUS "Compiler: [ " ${CMAKE_CXX_COMPILER_ID} " " ${CMAKE_CXX_COMPILER_VERSION} " ]")
 
 if ((CMAKE_CXX_COMPILER_ID STREQUAL "GNU") AND (CMAKE_CXX_COMPILER_VERSION VERSION_LESS "9.0.0"))
 	message(FATAL_ERROR "Upgrade your compiler! GCC 9.0+ is required!")
@@ -55,20 +77,30 @@ list(APPEND vkcv_definitions VULKAN_DEBUG_LABELS)
 # set the compile definitions aka preprocessor variables
 add_compile_definitions(${vkcv_definitions})
 
-# add modules as targets
-add_subdirectory(modules)
+# check if the framework is used from a parent scope
+get_directory_property(vkcv_parent_scope PARENT_DIRECTORY)
+
+if (BUILD_MODULES)
+	message(STATUS "Modules: ON")
+	
+	# add modules as targets
+	add_subdirectory(modules)
+else()
+	message(STATUS "Modules: OFF")
+endif()
 
 # add source files for compilation
 include(${vkcv_config}/Sources.cmake)
 
-message("-- Libraries: [ ${vkcv_libraries} ]")
-message("-- Flags: [ ${vkcv_flags} ]")
+message(STATUS "Framework:")
+message(" - Libraries: [ ${vkcv_libraries} ]")
+message(" - Flags: [ ${vkcv_flags} ]")
 
 # set the compiler flags for the framework
 set(CMAKE_CXX_FLAGS ${vkcv_flags})
 
-# create VkCV framework as static library using all source files
-add_library(vkcv STATIC ${vkcv_sources})
+# create VkCV framework as library using all source files
+add_library(vkcv ${vkcv_build_attribute} ${vkcv_sources})
 
 if(MSVC)
   #enable multicore compilation on visual studio
@@ -80,20 +112,40 @@ endif()
 
 # add include directories from dependencies as system includes
 target_include_directories(vkcv SYSTEM BEFORE PRIVATE ${vkcv_includes})
-message(STATUS ${vkcv_includes})
 
 # add the own include directory for public headers
 target_include_directories(vkcv BEFORE PUBLIC ${vkcv_include})
-message(STATUS ${vkcv_include})
 
 # link the framework using all required libraries
 target_link_libraries(vkcv ${vkcv_libraries})
-message(STATUS ${vkcv_libraries})
 
-# add sub-projects/examples as targets
-add_subdirectory(projects)
+if (BUILD_PROJECTS)
+	message(STATUS "Projects: ON")
+	
+	# add sub-projects/examples as targets
+	add_subdirectory(projects)
+else()
+	message(STATUS "Projects: OFF")
+endif()
 
-if (NOT WIN32)
+if (BUILD_DOXYGEN_DOCS)
+	message(STATUS "Doxygen: ON")
+	
 	# add doxygen as target if installed
 	include(${vkcv_config}/ext/Doxygen.cmake)
+else()
+	message(STATUS "Doxygen: OFF")
+endif()
+
+if (vkcv_parent_scope)
+	list(APPEND vkcv_includes ${vkcv_include})
+	list(APPEND vkcv_libraries vkcv)
+	
+	if (BUILD_MODULES)
+		list(APPEND vkcv_includes ${vkcv_modules_includes})
+		list(APPEND vkcv_libraries ${vkcv_modules_libraries})
+	endif()
+	
+	set(vkcv_includes ${vkcv_includes} PARENT_SCOPE)
+	set(vkcv_libraries ${vkcv_libraries} PARENT_SCOPE)
 endif()
\ No newline at end of file
diff --git a/config/ext/Doxygen.cmake b/config/ext/Doxygen.cmake
index b711ac4b..c5f6d7f8 100644
--- a/config/ext/Doxygen.cmake
+++ b/config/ext/Doxygen.cmake
@@ -1,6 +1,6 @@
 
 # check if Doxygen is installed
-find_package(Doxygen)
+find_package(Doxygen QUIET)
 
 if (DOXYGEN_FOUND)
 	# note the option ALL which allows to build the docs together with the application
diff --git a/modules/CMakeLists.txt b/modules/CMakeLists.txt
index 4b576e71..4d89c52a 100644
--- a/modules/CMakeLists.txt
+++ b/modules/CMakeLists.txt
@@ -1,4 +1,7 @@
 
+set(vkcv_modules_includes)
+set(vkcv_modules_libraries)
+
 # Add new modules here:
 add_subdirectory(asset_loader)
 add_subdirectory(camera)
@@ -9,3 +12,12 @@ add_subdirectory(scene)
 add_subdirectory(shader_compiler)
 add_subdirectory(testing)
 add_subdirectory(upscaling)
+
+message(STATUS "Modules:")
+message(" - Includes: [ ${vkcv_modules_includes} ]")
+message(" - Libraries: [ ${vkcv_modules_libraries} ]")
+
+if (vkcv_parent_scope)
+	set(vkcv_modules_includes ${vkcv_modules_includes} PARENT_SCOPE)
+	set(vkcv_modules_libraries ${vkcv_modules_libraries} PARENT_SCOPE)
+endif()
diff --git a/modules/asset_loader/CMakeLists.txt b/modules/asset_loader/CMakeLists.txt
index 151ae350..0ef40da7 100644
--- a/modules/asset_loader/CMakeLists.txt
+++ b/modules/asset_loader/CMakeLists.txt
@@ -15,7 +15,7 @@ set(vkcv_asset_loader_sources
 )
 
 # adding source files to the module
-add_library(vkcv_asset_loader STATIC ${vkcv_asset_loader_sources})
+add_library(vkcv_asset_loader ${vkcv_build_attribute} ${vkcv_asset_loader_sources})
 
 # Setup some path variables to load libraries
 set(vkcv_asset_loader_lib lib)
@@ -40,3 +40,11 @@ target_include_directories(vkcv_asset_loader SYSTEM BEFORE PRIVATE ${vkcv_asset_
 target_include_directories(vkcv_asset_loader BEFORE PUBLIC ${vkcv_asset_loader_include})
 
 target_compile_definitions(vkcv_asset_loader PUBLIC ${vkcv_asset_loader_definitions})
+
+if (vkcv_parent_scope)
+	list(APPEND vkcv_modules_includes ${vkcv_asset_loader_include})
+	list(APPEND vkcv_modules_libraries vkcv_asset_loader)
+	
+	set(vkcv_modules_includes ${vkcv_modules_includes} PARENT_SCOPE)
+	set(vkcv_modules_libraries ${vkcv_modules_libraries} PARENT_SCOPE)
+endif()
diff --git a/modules/camera/CMakeLists.txt b/modules/camera/CMakeLists.txt
index 55d29aab..b76e2fd1 100644
--- a/modules/camera/CMakeLists.txt
+++ b/modules/camera/CMakeLists.txt
@@ -21,7 +21,7 @@ set(vkcv_camera_sources
 )
 
 # adding source files to the project
-add_library(vkcv_camera STATIC ${vkcv_camera_sources})
+add_library(vkcv_camera ${vkcv_build_attribute} ${vkcv_camera_sources})
 
 # Setup some path variables to load libraries
 set(vkcv_camera_lib lib)
@@ -37,3 +37,11 @@ target_include_directories(vkcv_camera SYSTEM BEFORE PRIVATE ${vkcv_camera_inclu
 target_include_directories(vkcv_camera BEFORE PUBLIC ${vkcv_camera_include} ${vkcv_camera_includes})
 
 target_compile_definitions(vkcv_camera PUBLIC ${vkcv_camera_definitions})
+
+if (vkcv_parent_scope)
+	list(APPEND vkcv_modules_includes ${vkcv_camera_include})
+	list(APPEND vkcv_modules_libraries vkcv_camera)
+	
+	set(vkcv_modules_includes ${vkcv_modules_includes} PARENT_SCOPE)
+	set(vkcv_modules_libraries ${vkcv_modules_libraries} PARENT_SCOPE)
+endif()
diff --git a/modules/gui/CMakeLists.txt b/modules/gui/CMakeLists.txt
index 87724ff9..34d80c93 100644
--- a/modules/gui/CMakeLists.txt
+++ b/modules/gui/CMakeLists.txt
@@ -22,7 +22,7 @@ set(vkcv_gui_lib_path ${PROJECT_SOURCE_DIR}/${vkcv_gui_lib})
 include(config/ImGui.cmake)
 
 # adding source files to the module
-add_library(vkcv_gui STATIC ${vkcv_gui_sources} ${vkcv_imgui_sources})
+add_library(vkcv_gui ${vkcv_build_attribute} ${vkcv_gui_sources} ${vkcv_imgui_sources})
 
 # link the required libraries to the module
 target_link_libraries(vkcv_gui ${vkcv_gui_libraries} vkcv ${vkcv_libraries})
@@ -34,3 +34,11 @@ target_include_directories(vkcv_gui SYSTEM BEFORE PRIVATE ${vkcv_gui_includes} $
 target_include_directories(vkcv_gui BEFORE PUBLIC ${vkcv_gui_include} ${vkcv_imgui_includes})
 
 target_compile_definitions(vkcv_gui PUBLIC ${vkcv_gui_defines})
+
+if (vkcv_parent_scope)
+	list(APPEND vkcv_modules_includes ${vkcv_gui_include})
+	list(APPEND vkcv_modules_libraries vkcv_gui)
+	
+	set(vkcv_modules_includes ${vkcv_modules_includes} PARENT_SCOPE)
+	set(vkcv_modules_libraries ${vkcv_modules_libraries} PARENT_SCOPE)
+endif()
diff --git a/modules/material/CMakeLists.txt b/modules/material/CMakeLists.txt
index bbcb7c5a..ee3b36e8 100644
--- a/modules/material/CMakeLists.txt
+++ b/modules/material/CMakeLists.txt
@@ -15,7 +15,7 @@ set(vkcv_material_sources
 )
 
 # adding source files to the module
-add_library(vkcv_material STATIC ${vkcv_material_sources})
+add_library(vkcv_material ${vkcv_build_attribute} ${vkcv_material_sources})
 
 # link the required libraries to the module
 target_link_libraries(vkcv_material vkcv ${vkcv_libraries})
@@ -25,3 +25,11 @@ target_include_directories(vkcv_material SYSTEM BEFORE PRIVATE ${vkcv_include} $
 
 # add the own include directory for public headers
 target_include_directories(vkcv_material BEFORE PUBLIC ${vkcv_material_include})
+
+if (vkcv_parent_scope)
+	list(APPEND vkcv_modules_includes ${vkcv_material_include})
+	list(APPEND vkcv_modules_libraries vkcv_material)
+	
+	set(vkcv_modules_includes ${vkcv_modules_includes} PARENT_SCOPE)
+	set(vkcv_modules_libraries ${vkcv_modules_libraries} PARENT_SCOPE)
+endif()
diff --git a/modules/meshlet/CMakeLists.txt b/modules/meshlet/CMakeLists.txt
index 05fdba47..a3b232e5 100644
--- a/modules/meshlet/CMakeLists.txt
+++ b/modules/meshlet/CMakeLists.txt
@@ -20,7 +20,7 @@ set(vkcv_meshlet_sources
 		${vkcv_meshlet_source}/vkcv/meshlet/Forsyth.cpp)
 
 # adding source files to the module
-add_library(vkcv_meshlet STATIC ${vkcv_meshlet_sources})
+add_library(vkcv_meshlet ${vkcv_build_attribute} ${vkcv_meshlet_sources})
 
 
 # link the required libraries to the module
@@ -34,3 +34,11 @@ target_include_directories(vkcv_meshlet BEFORE PUBLIC ${vkcv_meshlet_include})
 
 # linking with libraries from all dependencies and the VkCV framework
 target_link_libraries(vkcv_meshlet vkcv vkcv_asset_loader vkcv_camera)
+
+if (vkcv_parent_scope)
+	list(APPEND vkcv_modules_includes ${vkcv_meshlet_include})
+	list(APPEND vkcv_modules_libraries vkcv_meshlet)
+	
+	set(vkcv_modules_includes ${vkcv_modules_includes} PARENT_SCOPE)
+	set(vkcv_modules_libraries ${vkcv_modules_libraries} PARENT_SCOPE)
+endif()
diff --git a/modules/scene/CMakeLists.txt b/modules/scene/CMakeLists.txt
index 2d81fde8..08a7e590 100644
--- a/modules/scene/CMakeLists.txt
+++ b/modules/scene/CMakeLists.txt
@@ -30,7 +30,7 @@ set(vkcv_scene_sources
 )
 
 # adding source files to the module
-add_library(vkcv_scene STATIC ${vkcv_scene_sources})
+add_library(vkcv_scene ${vkcv_build_attribute} ${vkcv_scene_sources})
 
 # link the required libraries to the module
 target_link_libraries(vkcv_scene vkcv)
@@ -43,3 +43,11 @@ target_include_directories(vkcv_scene BEFORE PUBLIC ${vkcv_scene_include})
 
 # linking with libraries from all dependencies and the VkCV framework
 target_link_libraries(vkcv_scene vkcv vkcv_asset_loader vkcv_material vkcv_camera)
+
+if (vkcv_parent_scope)
+	list(APPEND vkcv_modules_includes ${vkcv_scene_include})
+	list(APPEND vkcv_modules_libraries vkcv_scene)
+	
+	set(vkcv_modules_includes ${vkcv_modules_includes} PARENT_SCOPE)
+	set(vkcv_modules_libraries ${vkcv_modules_libraries} PARENT_SCOPE)
+endif()
diff --git a/modules/shader_compiler/CMakeLists.txt b/modules/shader_compiler/CMakeLists.txt
index a9181ccd..63182aaf 100644
--- a/modules/shader_compiler/CMakeLists.txt
+++ b/modules/shader_compiler/CMakeLists.txt
@@ -18,7 +18,7 @@ set(vkcv_shader_compiler_sources
 )
 
 # adding source files to the module
-add_library(vkcv_shader_compiler STATIC ${vkcv_shader_compiler_sources})
+add_library(vkcv_shader_compiler ${vkcv_build_attribute} ${vkcv_shader_compiler_sources})
 
 # Setup some path variables to load libraries
 set(vkcv_shader_compiler_lib lib)
@@ -35,3 +35,11 @@ target_include_directories(vkcv_shader_compiler SYSTEM BEFORE PRIVATE ${vkcv_sha
 
 # add the own include directory for public headers
 target_include_directories(vkcv_shader_compiler BEFORE PUBLIC ${vkcv_shader_compiler_include})
+
+if (vkcv_parent_scope)
+	list(APPEND vkcv_modules_includes ${vkcv_shader_compiler_include})
+	list(APPEND vkcv_modules_libraries vkcv_shader_compiler)
+	
+	set(vkcv_modules_includes ${vkcv_modules_includes} PARENT_SCOPE)
+	set(vkcv_modules_libraries ${vkcv_modules_libraries} PARENT_SCOPE)
+endif()
diff --git a/modules/testing/CMakeLists.txt b/modules/testing/CMakeLists.txt
index 26814f3a..60f5a827 100644
--- a/modules/testing/CMakeLists.txt
+++ b/modules/testing/CMakeLists.txt
@@ -14,8 +14,15 @@ set(vkcv_testing_sources
 )
 
 # adding source files to the project
-add_library(vkcv_testing STATIC ${vkcv_testing_sources})
+add_library(vkcv_testing ${vkcv_build_attribute} ${vkcv_testing_sources})
 
 # add the own include directory for public headers
 target_include_directories(vkcv_testing BEFORE PUBLIC ${vkcv_testing_include})
 
+if (vkcv_parent_scope)
+	list(APPEND vkcv_modules_includes ${vkcv_testing_include})
+	list(APPEND vkcv_modules_libraries vkcv_testing)
+	
+	set(vkcv_modules_includes ${vkcv_modules_includes} PARENT_SCOPE)
+	set(vkcv_modules_libraries ${vkcv_modules_libraries} PARENT_SCOPE)
+endif()
diff --git a/modules/upscaling/CMakeLists.txt b/modules/upscaling/CMakeLists.txt
index dcab9629..dec39257 100644
--- a/modules/upscaling/CMakeLists.txt
+++ b/modules/upscaling/CMakeLists.txt
@@ -27,7 +27,7 @@ set(vkcv_upscaling_lib_path ${PROJECT_SOURCE_DIR}/${vkcv_upscaling_lib})
 include(config/FidelityFX_FSR.cmake)
 
 # adding source files to the project
-add_library(vkcv_upscaling STATIC ${vkcv_upscaling_sources})
+add_library(vkcv_upscaling ${vkcv_build_attribute} ${vkcv_upscaling_sources})
 
 # link the required libraries to the module
 target_link_libraries(vkcv_upscaling ${vkcv_upscaling_libraries} vkcv vkcv_shader_compiler)
@@ -37,3 +37,11 @@ target_include_directories(vkcv_upscaling SYSTEM BEFORE PRIVATE ${vkcv_upscaling
 
 # add the own include directory for public headers
 target_include_directories(vkcv_upscaling BEFORE PUBLIC ${vkcv_upscaling_include})
+
+if (vkcv_parent_scope)
+	list(APPEND vkcv_modules_includes ${vkcv_upscaling_include})
+	list(APPEND vkcv_modules_libraries vkcv_upscaling)
+	
+	set(vkcv_modules_includes ${vkcv_modules_includes} PARENT_SCOPE)
+	set(vkcv_modules_libraries ${vkcv_modules_libraries} PARENT_SCOPE)
+endif()
-- 
GitLab