diff --git a/.github/workflows/win-cygwin-mingw.yml b/.github/workflows/win-cygwin-mingw.yml index 8238bc605d..4cf0b3bda0 100644 --- a/.github/workflows/win-cygwin-mingw.yml +++ b/.github/workflows/win-cygwin-mingw.yml @@ -35,8 +35,19 @@ jobs: - uses: actions/checkout@v2 - name: Setup Cygwin uses: egor-tensin/setup-cygwin@v3 - with: - packages: cmake gcc-g++ ninja pkg-config libxcb-devel + #with: + #packages: cmake gcc-g++ ninja pkg-config libxcb-devel + + - name: Package installation workaround + run: C:\tools\cygwin\cygwinsetup.exe \ + --quiet-mode \ + --no-desktop \ + --no-startmenu \ + --root C:\tools\cygwin\ \ + --local-package-dir C:\tools\cygwin\packages \ + --site "http://mirrors.kernel.org/sourceware/cygwin/" \ + --packages cmake gcc-g++ ninja pkg-config libxcb-devel + - name: Build in Cygwin env: VSG_BUILD_PATH: ${{ github.workspace }} diff --git a/CMakeLists.txt b/CMakeLists.txt index 16af0b52d0..e37a749597 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -87,21 +87,16 @@ vsg_add_target_docs( ${VSG_SOURCE_DIR}/include/vsg ) -# only provide custom targets if not building as a submodule/FetchContent -if (${CMAKE_CURRENT_BINARY_DIR} STREQUAL ${CMAKE_SOURCE_DIR}) - - # automatically buil_all_h build target to generate the include/vsg/all.h from the headers in the include/vsg/* directories - add_custom_target(build_all_h - COMMAND ${CMAKE_COMMAND} -P ${VSG_SOURCE_DIR}/cmake/build_all_h.cmake - ) - set_target_properties(build_all_h PROPERTIES FOLDER "VulkanSceneGraph") - - vsg_add_option_maintainer( - PREFIX VulkanSceneGraph - RCLEVEL ${VSG_RELEASE_CANDIDATE} - ) +# automatically buil_all_h build target to generate the include/vsg/all.h from the headers in the include/vsg/* directories +add_custom_target(build_all_h + COMMAND ${CMAKE_COMMAND} -DVSG_SOURCE_DIR=${VSG_SOURCE_DIR} -P ${VSG_SOURCE_DIR}/cmake/build_all_h.cmake +) +set_target_properties(build_all_h PROPERTIES FOLDER "VulkanSceneGraph") -endif() +vsg_add_option_maintainer( + PREFIX VulkanSceneGraph + RCLEVEL ${VSG_RELEASE_CANDIDATE} +) # # src directory contains all the source of the vsg library diff --git a/INSTALL.md b/INSTALL.md index f024615c6b..4e92fab4a7 100644 --- a/INSTALL.md +++ b/INSTALL.md @@ -171,6 +171,57 @@ For example, a bare minimum CMakeLists.txt file to compile a single file applica set_property(TARGET myapp PROPERTY CXX_STANDARD 17) target_link_libraries(myapp vsg::vsg) +### Using VSG provided cmake macros within your own projects + +The build system provides macros that create specific cmake targets to use in their project. Examples include: Setup of common cmake variables, Formatting source code, performing static code analysis, creating API documentation, cleaning up source directories, and removing installed files. Documentation of the available macros (the public ones starting with ```vsg_```) are at https://github.com/vsg-dev/VulkanSceneGraph/blob/master/cmake/vsgMacros.cmake. + +For example, a bare minimum CMakeLists.txt file adding the mentioned cmake target would be: + + cmake_minimum_required(VERSION 3.7) + find_package(vsg REQUIRED) + + vsg_setup_dir_vars() + vsg_setup_build_vars() + + vsg_add_target_clang_format( + FILES + ${PROJECT_SOURCE_DIR}/include/*/*.h + ${PROJECT_SOURCE_DIR}/src/*/*.cpp + ) + vsg_add_target_cppcheck( + FILES + ${PROJECT_SOURCE_DIR}/include/*/*.h + ${PROJECT_SOURCE_DIR}/src/*/*.cpp + ) + vsg_add_target_clobber() + vsg_add_target_docs( + FILES + ${PROJECT_SOURCE_DIR}/include/*/*.h + ) + vsg_add_target_uninstall() + + add_executable(myapp "myapp.cpp") + set_property(TARGET myapp PROPERTY CXX_STANDARD 17) + target_link_libraries(myapp vsg::vsg) + +### Using VSG provided cmake macro to generate cmake support files + +Projects that install a library must generate some cmake-related files so that the library can be found by ```find_package()```. To simplify the generation of these files, the cmake macro ```vsg_add_cmake_support_files()``` has been added. + +In addition to calling the macro, it requires a template for creating the xxxConfig.cmake file, as given in the following example: + + src/xxx/ + CMakeLists.txt + xxxConfig.cmake.in + +In the file ``CMakeLists.txt`` the call then looks like this: + + vsg_add_cmake_support_files( + CONFIG_TEMPLATE xxxConfig.cmake.in + ) + +Hints for the structure of the template file can be found at https://cmake.org/cmake/help/latest/manual/cmake-packages.7.html#creating-a-package-configuration-file. + --- ## Detailed instructions for setting up your environment and building for Microsoft Windows diff --git a/cmake/build_all_h.cmake b/cmake/build_all_h.cmake index 6d686f8961..959b5de2a5 100644 --- a/cmake/build_all_h.cmake +++ b/cmake/build_all_h.cmake @@ -9,24 +9,24 @@ endmacro() macro(BUILD_ALL_H) - set(INCLUDE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/include) - - file(GLOB CORE_HEADERS RELATIVE ${INCLUDE_DIR} ${INCLUDE_DIR}/vsg/core/*.h ) - file(GLOB MATHS_HEADERS RELATIVE ${CMAKE_CURRENT_SOURCE_DIR}/include include/vsg/maths/*.h ) - file(GLOB NODES_HEADERS RELATIVE ${CMAKE_CURRENT_SOURCE_DIR}/include include/vsg/nodes/*.h ) - file(GLOB THREADING_HEADERS RELATIVE ${CMAKE_CURRENT_SOURCE_DIR}/include include/vsg/threading/*.h ) - file(GLOB UI_HEADERS RELATIVE ${CMAKE_CURRENT_SOURCE_DIR}/include include/vsg/ui/*.h ) - file(GLOB UTILS_HEADERS RELATIVE ${CMAKE_CURRENT_SOURCE_DIR}/include include/vsg/utils/*.h ) - file(GLOB APP_HEADERS RELATIVE ${CMAKE_CURRENT_SOURCE_DIR}/include include/vsg/app/*.h ) - file(GLOB IO_HEADERS RELATIVE ${CMAKE_CURRENT_SOURCE_DIR}/include include/vsg/io/*.h ) - file(GLOB VK_HEADERS RELATIVE ${CMAKE_CURRENT_SOURCE_DIR}/include include/vsg/vk/*.h ) - file(GLOB COMMANDS_HEADERS RELATIVE ${CMAKE_CURRENT_SOURCE_DIR}/include include/vsg/commands/*.h ) - file(GLOB STATE_HEADERS RELATIVE ${CMAKE_CURRENT_SOURCE_DIR}/include include/vsg/state/*.h ) - file(GLOB TEXT_HEADERS RELATIVE ${CMAKE_CURRENT_SOURCE_DIR}/include include/vsg/text/*.h ) - file(GLOB RAYTRACING_HEADERS RELATIVE ${CMAKE_CURRENT_SOURCE_DIR}/include include/vsg/raytracing/*.h ) - file(GLOB RTX_HEADERS RELATIVE ${CMAKE_CURRENT_SOURCE_DIR}/include include/vsg/rtx/*.h ) - - file(READ ${CMAKE_CURRENT_SOURCE_DIR}/cmake/header_license_preamble.txt ALL_H_CONTENTS) + set(INCLUDE_DIR ${VSG_SOURCE_DIR}/include) + + file(GLOB CORE_HEADERS RELATIVE ${INCLUDE_DIR} ${INCLUDE_DIR}/vsg/core/*.h RELATIVE ${CMAKE_CURRENT_SOURCE_DIR}/include ${CMAKE_CURRENT_SOURCE_DIR}/include/vsg/core/*.h ) + file(GLOB MATHS_HEADERS RELATIVE ${INCLUDE_DIR} ${INCLUDE_DIR}/vsg/maths/*.h ) + file(GLOB NODES_HEADERS RELATIVE ${INCLUDE_DIR} ${INCLUDE_DIR}/vsg/nodes/*.h ) + file(GLOB THREADING_HEADERS RELATIVE ${INCLUDE_DIR} ${INCLUDE_DIR}/vsg/threading/*.h ) + file(GLOB UI_HEADERS RELATIVE ${INCLUDE_DIR} ${INCLUDE_DIR}/vsg/ui/*.h ) + file(GLOB UTILS_HEADERS RELATIVE ${INCLUDE_DIR} ${INCLUDE_DIR}/vsg/utils/*.h ) + file(GLOB APP_HEADERS RELATIVE ${INCLUDE_DIR} ${INCLUDE_DIR}/vsg/app/*.h ) + file(GLOB IO_HEADERS RELATIVE ${INCLUDE_DIR} ${INCLUDE_DIR}/vsg/io/*.h ) + file(GLOB VK_HEADERS RELATIVE ${INCLUDE_DIR} ${INCLUDE_DIR}/vsg/vk/*.h ) + file(GLOB COMMANDS_HEADERS RELATIVE ${INCLUDE_DIR} ${INCLUDE_DIR}/vsg/commands/*.h ) + file(GLOB STATE_HEADERS RELATIVE ${INCLUDE_DIR} ${INCLUDE_DIR}/vsg/state/*.h ) + file(GLOB TEXT_HEADERS RELATIVE ${INCLUDE_DIR} ${INCLUDE_DIR}/vsg/text/*.h ) + file(GLOB RAYTRACING_HEADERS RELATIVE ${INCLUDE_DIR} ${INCLUDE_DIR}/vsg/raytracing/*.h ) + file(GLOB RTX_HEADERS RELATIVE ${INCLUDE_DIR} ${INCLUDE_DIR}/vsg/rtx/*.h ) + + file(READ ${VSG_SOURCE_DIR}/cmake/header_license_preamble.txt ALL_H_CONTENTS) APPEND_INCLUDES(ALL_H_CONTENTS CORE_HEADERS "// Core header files\n") APPEND_INCLUDES(ALL_H_CONTENTS MATHS_HEADERS "// Maths header files\n") APPEND_INCLUDES(ALL_H_CONTENTS NODES_HEADERS "// Node header files\n") @@ -42,7 +42,7 @@ macro(BUILD_ALL_H) APPEND_INCLUDES(ALL_H_CONTENTS RAYTRACING_HEADERS "// Ray tracing header files\n") APPEND_INCLUDES(ALL_H_CONTENTS RTX_HEADERS "// RTX mesh header files\n") - file(WRITE include/vsg/all.h ${ALL_H_CONTENTS}) + file(WRITE ${INCLUDE_DIR}/vsg/all.h ${ALL_H_CONTENTS}) endmacro() diff --git a/cmake/vsgMacros.cmake b/cmake/vsgMacros.cmake index 7c76560d83..cb3ba25b02 100644 --- a/cmake/vsgMacros.cmake +++ b/cmake/vsgMacros.cmake @@ -2,6 +2,8 @@ # macros provided by the vsg library # +find_package(Git QUIET) + # give hint for cmake developers if(NOT _vsg_macros_included) message(STATUS "Reading 'vsg_...' macros from ${CMAKE_CURRENT_LIST_DIR}/vsgMacros.cmake - look there for documentation") @@ -58,7 +60,7 @@ macro(vsg_setup_dir_vars) # set up local bin directory to place all binaries make_directory(${OUTPUT_BINDIR}) make_directory(${OUTPUT_LIBDIR}) - set(INSTALL_TARGETS_DEFAULT_FLAGS + set(VSG_INSTALL_TARGETS_DEFAULT_FLAGS EXPORT ${PROJECT_NAME}Targets RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} LIBRARY DESTINATION ${CMAKE_INSTALL_BINDIR} @@ -69,14 +71,17 @@ macro(vsg_setup_dir_vars) set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${OUTPUT_LIBDIR}) # set up local bin directory to place all binaries make_directory(${OUTPUT_LIBDIR}) - set(INSTALL_TARGETS_DEFAULT_FLAGS + set(VSG_INSTALL_TARGETS_DEFAULT_FLAGS EXPORT ${PROJECT_NAME}Targets RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} INCLUDES DESTINATION ${CMAKE_INSTALL_INCLUDEDIR} - ) + ) endif() + + # provide backwards compatibility to VulkanSceneGraph-1.0.0 + set(INSTALL_TARGETS_DEFAULT_FLAGS ${VSG_INSTALL_TARGETS_DEFAULT_FLAGS}) endmacro() # @@ -162,52 +167,55 @@ endmacro() # branch-test show the command to create a branch in the git repository # macro(vsg_add_option_maintainer) - set(options) - set(oneValueArgs PREFIX RCLEVEL) - set(multiValueArgs) - cmake_parse_arguments(ARGS "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}) - option(MAINTAINER "Enable maintainer build methods, such as making git branches and tags." OFF) - if(MAINTAINER) + if(Git_FOUND) + set(options) + set(oneValueArgs PREFIX RCLEVEL) + set(multiValueArgs) + cmake_parse_arguments(ARGS "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}) - # - # Provide target for tagging a release - # - set(VSG_BRANCH ${ARGS_PREFIX}-${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}) + option(MAINTAINER "Enable maintainer build methods, such as making git branches and tags." OFF) + if(MAINTAINER) - set(GITCOMMAND git -C ${CMAKE_CURRENT_SOURCE_DIR}) - set(ECHO ${CMAKE_COMMAND} -E echo) - set(REMOTE origin) + # + # Provide target for tagging a release + # + set(VSG_BRANCH ${ARGS_PREFIX}-${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}) - if(ARGS_RCLEVEL EQUAL 0) - set(RELEASE_NAME ${ARGS_PREFIX}-${PROJECT_VERSION}) - else() - set(RELEASE_NAME ${ARGS_PREFIX}-${PROJECT_VERSION}-rc${ARGS_RCLEVEL}) - endif() + set(GITCOMMAND ${GIT_EXECUTABLE} -C ${CMAKE_CURRENT_SOURCE_DIR}) + set(ECHO ${CMAKE_COMMAND} -E echo) + set(REMOTE origin) - set(RELEASE_MESSAGE "Release ${RELEASE_NAME}") - set(BRANCH_MESSAGE "Branch ${VSG_BRANCH}") + if(ARGS_RCLEVEL EQUAL 0) + set(RELEASE_NAME ${ARGS_PREFIX}-${PROJECT_VERSION}) + else() + set(RELEASE_NAME ${ARGS_PREFIX}-${PROJECT_VERSION}-rc${ARGS_RCLEVEL}) + endif() - add_custom_target(tag-test - COMMAND ${ECHO} ${GITCOMMAND} tag -a ${RELEASE_NAME} -m \"${RELEASE_MESSAGE}\" - COMMAND ${ECHO} ${GITCOMMAND} push ${REMOTE} ${RELEASE_NAME} - ) + set(RELEASE_MESSAGE "Release ${RELEASE_NAME}") + set(BRANCH_MESSAGE "Branch ${VSG_BRANCH}") - add_custom_target(tag-run - COMMAND ${GITCOMMAND} tag -a ${RELEASE_NAME} -m "${RELEASE_MESSAGE}" - COMMAND ${GITCOMMAND} push ${REMOTE} ${RELEASE_NAME} - ) + add_custom_target(tag-test + COMMAND ${ECHO} ${GITCOMMAND} tag -a ${RELEASE_NAME} -m \"${RELEASE_MESSAGE}\" + COMMAND ${ECHO} ${GITCOMMAND} push ${REMOTE} ${RELEASE_NAME} + ) - add_custom_target(branch-test - COMMAND ${ECHO} ${GITCOMMAND} branch ${VSG_BRANCH} - COMMAND ${ECHO} ${GITCOMMAND} push ${REMOTE} ${VSG_BRANCH} - ) + add_custom_target(tag-run + COMMAND ${GITCOMMAND} tag -a ${RELEASE_NAME} -m "${RELEASE_MESSAGE}" + COMMAND ${GITCOMMAND} push ${REMOTE} ${RELEASE_NAME} + ) - add_custom_target(branch-run - COMMAND ${GITCOMMAND} branch ${VSG_BRANCH} - COMMAND ${GITCOMMAND} push ${REMOTE} ${VSG_BRANCH} - ) + add_custom_target(branch-test + COMMAND ${ECHO} ${GITCOMMAND} branch ${VSG_BRANCH} + COMMAND ${ECHO} ${GITCOMMAND} push ${REMOTE} ${VSG_BRANCH} + ) + add_custom_target(branch-run + COMMAND ${GITCOMMAND} branch ${VSG_BRANCH} + COMMAND ${GITCOMMAND} push ${REMOTE} ${VSG_BRANCH} + ) + + endif() endif() endmacro() @@ -220,6 +228,13 @@ endmacro() # EXCLUDES list with file names to exclude from the list # given by the FILES argument # +# To support cmake projects with submodules, it is necessary to use +# PROJECT_SOURCE_DIR as prefix for file names. +# +# If vsg is used in a cmake project with submodules, additional targets +# named 'clang-format-${PROJECT}' are created for the corresponding +# project and added as a dependency to the parent target 'clang-format'. +# macro(vsg_add_target_clang_format) set(options) set(oneValueArgs ) @@ -250,15 +265,29 @@ endmacro() # # add 'clobber' build target to clear all the non git registered files/directories # +# If vsg is used in a cmake project with submodules and out-of-source builds, additional +# targets named 'clobber-${PROJECT}' are created for the corresponding +# project and added as a dependency to the parent target 'clobber' +# macro(vsg_add_target_clobber) - if (NOT TARGET clobber) - add_custom_target(clobber) + if(Git_FOUND) + # in source builds does not support dependencies here + # see https://github.com/vsg-dev/VulkanSceneGraph/pull/566#issuecomment-1312496507 + if (PROJECT_BINARY_DIR STREQUAL PROJECT_SOURCE_DIR) + add_custom_target(clobber + COMMAND ${GIT_EXECUTABLE} -C ${PROJECT_SOURCE_DIR} clean -d -f -x + ) + else() + if (NOT TARGET clobber) + add_custom_target(clobber) + endif() + add_custom_target(clobber-${PROJECT_NAME} + COMMAND ${GIT_EXECUTABLE} -C ${PROJECT_SOURCE_DIR} clean -d -f -x + ) + set_target_properties(clobber-${PROJECT_NAME} PROPERTIES FOLDER ${PROJECT_NAME}) + add_dependencies(clobber clobber-${PROJECT_NAME}) + endif() endif() - add_custom_target(clobber-${PROJECT_NAME} - COMMAND git -C ${PROJECT_SOURCE_DIR} clean -d -f -x - ) - set_target_properties(clobber-${PROJECT_NAME} PROPERTIES FOLDER ${PROJECT_NAME}) - add_dependencies(clobber clobber-${PROJECT_NAME}) endmacro() # @@ -273,6 +302,13 @@ endmacro() # # CPPCHECK_EXTRA_OPTIONS - add extra options to cppcheck command line # +# To support cmake projects with submodules, it is necessary to use +# PROJECT_SOURCE_DIR as prefix for file names. + +# If vsg is used in a cmake project with submodules, additional targets +# named 'cppcheck-${PROJECT}' are created for the corresponding +# project and added as a dependency to the parent target 'cppcheck'. +# macro(vsg_add_target_cppcheck) set(options) set(oneValueArgs SUPPRESSIONS_LIST) @@ -310,12 +346,19 @@ macro(vsg_add_target_cppcheck) endmacro() # -# add 'docs' build target +# add 'docs' build target to provide API documentation generated by doxygen # # available arguments: # # FILES list with file or directory names # +# To support cmake projects with submodules, it is necessary to use +# PROJECT_SOURCE_DIR as prefix for file names. +# +# If vsg is used in a cmake project with submodules, additional targets +# named 'docs-${PROJECT}' are created for the corresponding +# project and added as a dependency to the parent target 'docs'. +# macro(vsg_add_target_docs) set(options) set(oneValueArgs ) @@ -343,6 +386,10 @@ endmacro() # # add 'uninstall' build target # +# If vsg is used in a cmake project with submodules, additional targets +# named 'uninstall-${PROJECT}' are created for the corresponding +# project and added as a dependency to the parent target 'uninstall'. +# macro(vsg_add_target_uninstall) # we are running inside VulkanSceneGraph if (PROJECT_NAME STREQUAL "vsg") diff --git a/include/vsg/vk/ResourceRequirements.h b/include/vsg/vk/ResourceRequirements.h index f779124cb1..959549e112 100644 --- a/include/vsg/vk/ResourceRequirements.h +++ b/include/vsg/vk/ResourceRequirements.h @@ -106,6 +106,7 @@ namespace vsg void apply(const DepthSorted& depthSorted) override; void apply(const Bin& bin) override; void apply(const Geometry& geometry) override; + void apply(const VertexDraw& vid) override; void apply(const VertexIndexDraw& vid) override; void apply(const BindVertexBuffers& bvb) override; void apply(const BindIndexBuffer& bib) override; diff --git a/src/vsg/CMakeLists.txt b/src/vsg/CMakeLists.txt index 75d5beeb07..0c0d699dd1 100644 --- a/src/vsg/CMakeLists.txt +++ b/src/vsg/CMakeLists.txt @@ -450,7 +450,7 @@ if (NOT(${VSG_BINARY_DIR} STREQUAL ${VSG_SOURCE_DIR})) endif() # install lib -install(TARGETS vsg ${INSTALL_TARGETS_DEFAULT_FLAGS}) +install(TARGETS vsg ${VSG_INSTALL_TARGETS_DEFAULT_FLAGS}) # instal cmake config files. install( diff --git a/src/vsg/vk/ResourceRequirements.cpp b/src/vsg/vk/ResourceRequirements.cpp index 36e02628c5..c5ccb68f14 100644 --- a/src/vsg/vk/ResourceRequirements.cpp +++ b/src/vsg/vk/ResourceRequirements.cpp @@ -19,6 +19,7 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI #include #include #include +#include #include #include #include @@ -256,6 +257,11 @@ void CollectResourceRequirements::apply(const Geometry& geometry) apply(geometry.indices); } +void CollectResourceRequirements::apply(const VertexDraw& vd) +{ + for (auto& bufferInfo : vd.arrays) apply(bufferInfo); +} + void CollectResourceRequirements::apply(const VertexIndexDraw& vid) { for (auto& bufferInfo : vid.arrays) apply(bufferInfo);