diff --git a/CMakeLists.txt b/CMakeLists.txt index cfe411c374e3d794ce3c1ee9cea162aed86e7cc0..b4e8d93cc2a179152174defe5db1445560019751 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,9 +1,11 @@ cmake_minimum_required(VERSION 3.16) project(vkcv) +# settings c++ standard for the framework set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) +# checking build type and setting up a variable if (CMAKE_BUILD_TYPE) string(TOLOWER "${CMAKE_BUILD_TYPE}" _vkcv_build_type) set(vkcv_build_${_vkcv_build_type} 1) @@ -11,15 +13,19 @@ endif() message("-- Language: [ C++ " ${CMAKE_CXX_STANDARD} " ]") +# setting up different paths set(vkcv_config ${PROJECT_SOURCE_DIR}/config) set(vkcv_config_ext ${vkcv_config}/ext) set(vkcv_lib lib) set(vkcv_source ${PROJECT_SOURCE_DIR}/src) +set(vkcv_include ${PROJECT_SOURCE_DIR}/include) +# initializes compiler flags with defaults set(vkcv_flags ${CMAKE_CXX_FLAGS}) +# enabling warnings in the debug build if (vkcv_build_debug) if (CMAKE_CXX_COMPILER_ID STREQUAL "Clang") set(vkcv_flags ${vkcv_flags} " -Weverything") @@ -30,19 +36,21 @@ if (vkcv_build_debug) endif() endif() +# add source files for compilation include(${vkcv_config}/Sources.cmake) + +# configure everything to use the required dependencies include(${vkcv_config}/Libraries.cmake) +# set the compiler flags for the framework set(CMAKE_CXX_FLAGS ${vkcv_flags}) message("-- Flags: [ ${CMAKE_CXX_FLAGS} ]") +# set the compile definitions aka preprocessor variables add_compile_definitions(${vkcv_definitions}) -if (vkcv_directories) - include_directories(${vkcv_directories}) -endif() - +# create VkCV framework as static library using all source files add_library(vkcv STATIC ${vkcv_sources}) if(MSVC) @@ -53,9 +61,17 @@ if(MSVC) source_group(TREE ${CMAKE_CURRENT_SOURCE_DIR} FILES ${vkcv_sources}) endif() +# add include directories from dependencies as system includes target_include_directories(vkcv SYSTEM BEFORE PRIVATE ${vkcv_includes}) + +# add the own include directory for public headers +target_include_directories(vkcv AFTER PUBLIC ${vkcv_include}) + +# link the framework using all required libraries target_link_libraries(vkcv ${vkcv_libraries}) +# add sub-projects/examples as targets add_subdirectory(projects) +# add doxygen as target if installed include(${vkcv_config}/ext/Doxygen.cmake) diff --git a/config/Libraries.cmake b/config/Libraries.cmake index 3b4c75ead3998641e3868ade305f281b3ce1bd93..ef199df6ed4d59acb87d6b0d6b4d2261081c82d4 100644 --- a/config/Libraries.cmake +++ b/config/Libraries.cmake @@ -1,5 +1,5 @@ -set(vkcv_config_lib ${vkcv_config}/lib) +set(vkcv_config_lib ${vkcv_config}/lib) set(vkcv_lib_path ${PROJECT_SOURCE_DIR}/${vkcv_lib}) if(NOT WIN32) @@ -10,21 +10,27 @@ if(NOT WIN32) list(APPEND vkcv_flags -fopenmp) endif() +# some formatted printing set(vkcv_config_msg " - Library: ") +# load dependencies via separate cmake file include(${vkcv_config_lib}/GLFW.cmake) # glfw-x11 / glfw-wayland # libglfw3-dev include(${vkcv_config_lib}/Vulkan.cmake) # vulkan-intel / vulkan-radeon / nvidia # libvulkan-dev +# cleanup of compiler flags if (vkcv_flags) list(REMOVE_DUPLICATES vkcv_flags) endif() +# cleanup of include directories from dependencies if (vkcv_includes) list(REMOVE_DUPLICATES vkcv_includes) endif () +# fix dependencies for different Linux distros (looking at you Ubuntu) include(${vkcv_config_ext}/CheckLibraries.cmake) +# cleanup of compiler definitions aka preprocessor variables if (vkcv_definitions) list(REMOVE_DUPLICATES vkcv_definitions) endif () diff --git a/config/Sources.cmake b/config/Sources.cmake index 9a9f55747194ab9972254d5bf57ac11735607b06..7c1f5990789951163eccb96a7ab32eacc6e05ca8 100644 --- a/config/Sources.cmake +++ b/config/Sources.cmake @@ -1,8 +1,9 @@ +# adding all source files and header files of the framework: set(vkcv_sources - ${vkcv_source}/vkcv/Context.hpp + ${vkcv_include}/vkcv/Context.hpp ${vkcv_source}/vkcv/Context.cpp - ${vkcv_source}/vkcv/Window.hpp + ${vkcv_include}/vkcv/Window.hpp ${vkcv_source}/vkcv/Window.cpp ${vkcv_source}/vkcv/CoreManager.hpp ${vkcv_source}/vkcv/CoreManager.cpp diff --git a/config/ext/CheckLibraries.cmake b/config/ext/CheckLibraries.cmake index 97950d1123f126cc555f376b86c90ed1acb2628e..3da1c06ebb529895bef1d8198c1a063173982394 100644 --- a/config/ext/CheckLibraries.cmake +++ b/config/ext/CheckLibraries.cmake @@ -1,6 +1,8 @@ +# cleanup of dependency libraries list(REMOVE_DUPLICATES vkcv_libraries) +# fixing paths of libraries to work on most Linux distros foreach (a_lib IN LISTS vkcv_libraries) if (NOT EXISTS "${a_lib}") string(REGEX MATCH ^/usr/lib/x86_64-linux-gnu/.*$ vkcv_usr_lib_u_match ${a_lib}) diff --git a/src/vkcv/Context.hpp b/include/vkcv/Context.hpp similarity index 100% rename from src/vkcv/Context.hpp rename to include/vkcv/Context.hpp diff --git a/src/vkcv/Window.hpp b/include/vkcv/Window.hpp similarity index 100% rename from src/vkcv/Window.hpp rename to include/vkcv/Window.hpp diff --git a/projects/CMakeLists.txt b/projects/CMakeLists.txt index 27305956cac6670331096364a6658a90efcc831b..f7687bca4ba7cb05835c8afda1396ad319a035c7 100644 --- a/projects/CMakeLists.txt +++ b/projects/CMakeLists.txt @@ -1,2 +1,3 @@ +# Add new projects/examples here: add_subdirectory(first_triangle) diff --git a/projects/first_triangle/CMakeLists.txt b/projects/first_triangle/CMakeLists.txt index c5a9046881dbab737b357b8a3cd875a9c6b284ae..40e016a71cd3e20690f3ace9ec0260aa37449a0c 100644 --- a/projects/first_triangle/CMakeLists.txt +++ b/projects/first_triangle/CMakeLists.txt @@ -1,10 +1,15 @@ cmake_minimum_required(VERSION 3.16) project(first_triangle) +# setting c++ standard for the project set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) +# adding source files to the project add_executable(first_triangle src/main.cpp) -target_include_directories(first_triangle SYSTEM BEFORE PRIVATE ${vkcv_source} ${vkcv_includes}) +# including headers of dependencies and the VkCV framework +target_include_directories(first_triangle SYSTEM BEFORE PRIVATE ${vkcv_include} ${vkcv_includes}) + +# linking with libraries from all dependencies and the VkCV framework target_link_libraries(first_triangle vkcv ${vkcv_libraries}) diff --git a/src/vkcv/Context.cpp b/src/vkcv/Context.cpp index 3d5dfca627a064a49a57a015b23c4c7d919a2f07..4500a135fc5c9d247e58a323b8d6f26972a0480e 100644 --- a/src/vkcv/Context.cpp +++ b/src/vkcv/Context.cpp @@ -4,7 +4,7 @@ * @brief Context class to handle instance, physical-device and device */ -#include "Context.hpp" +#include "vkcv/Context.hpp" #include "CoreManager.hpp" namespace vkcv { diff --git a/src/vkcv/Window.cpp b/src/vkcv/Window.cpp index 7d8b86e08f25fe7741db1cfa777f00054aa8cee0..e0e0fb16ec78d65dbd58b1a362c6bf72f1cca1e4 100644 --- a/src/vkcv/Window.cpp +++ b/src/vkcv/Window.cpp @@ -4,7 +4,7 @@ * @brief Window class to handle a basic rendering surface and input */ -#include "Window.hpp" +#include "vkcv/Window.hpp" #include "CoreManager.hpp" namespace vkcv {