Skip to content

Build & pipeline updates, examples PCH remake, code clean-up #888

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 9 commits into from
Jun 21, 2025
Merged
Show file tree
Hide file tree
Changes from 7 commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
23 changes: 19 additions & 4 deletions .github/workflows/build-nabla.yml
Original file line number Diff line number Diff line change
Expand Up @@ -129,16 +129,31 @@ jobs:
--preset ci-build-dynamic-${{ matrix.vendor }} `
-t run-compiler-explorer --config ${{ matrix.config }}

- name: Container – Install NSC
- name: Container – Build Examples
id: build-examples
continue-on-error: true
run: |
docker exec orphan `
${{ env.entry }} ${{ env.cmd }} -Command cmake --build `
--preset ci-build-dynamic-${{ matrix.vendor }} `
-t examples_tests\all --config ${{ matrix.config }} `
-- -k 0

- name: Container – Install Nabla
run: |
docker exec orphan `
${{ env.entry }} ${{ env.cmd }} -Command cmake --install `
${{ env.binary }} --config ${{ matrix.config }} `
--component Runtimes --prefix ${{ env.install }}
--prefix ${{ env.install }}

- name: Container – Install Examples
id: install-examples
continue-on-error: true
run: |
docker exec orphan `
${{ env.entry }} ${{ env.cmd }} -Command cmake --install `
${{ env.binary }} --config ${{ matrix.config }} `
--component Executables --prefix ${{ env.install }}
${{ env.binary }}\examples_tests --config ${{ matrix.config }} `
--prefix ${{ env.install }}

- name: Container – Save NSC Image
run: |
Expand Down
2 changes: 2 additions & 0 deletions 3rdparty/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -520,6 +520,8 @@ nbl_adjust_definitions()
add_custom_target(3rdparty)
add_dependencies(3rdparty ${NBL_3RDPARTY_TARGETS})

NBL_ADJUST_FOLDERS(3rdaprty)

nbl_install_dir("${CMAKE_CURRENT_SOURCE_DIR}/parallel-hashmap/parallel_hashmap")

# parent scope exports, must be at the end of the file
Expand Down
2 changes: 1 addition & 1 deletion CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -271,7 +271,7 @@ add_subdirectory(src/nbl)
add_subdirectory("${NBL_PYTHON_MODULE_ROOT_PATH}" tests) # Python Framework
if(NBL_BUILD_EXAMPLES)
file(LOCK "${CMAKE_CURRENT_SOURCE_DIR}/examples_tests" DIRECTORY GUARD PROCESS RESULT_VARIABLE NBL_LOCK TIMEOUT 60)
add_subdirectory(examples_tests)
add_subdirectory(examples_tests EXCLUDE_FROM_ALL)
file(LOCK "${CMAKE_CURRENT_SOURCE_DIR}/examples_tests" DIRECTORY RELEASE RESULT_VARIABLE NBL_LOCK)
endif()
add_subdirectory(tools)
Expand Down
189 changes: 40 additions & 149 deletions cmake/common.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -16,134 +16,50 @@ include_guard(GLOBAL)

include(ProcessorCount)

function(nbl_handle_dll_definitions _TARGET_ _SCOPE_)
if(NOT TARGET Nabla)
message(FATAL_ERROR "Internal error, Nabla target must be defined!")
endif()

if(NOT TARGET ${_TARGET_})
message(FATAL_ERROR "Internal error, requsted \"${_TARGET_}\" is not defined!")
endif()

if(NBL_COMPILER_DYNAMIC_RUNTIME)
set(_NABLA_OUTPUT_DIR_ "${NBL_ROOT_PATH_BINARY}/src/nbl/$<CONFIG>/devshgraphicsprogramming.nabla")

target_compile_definitions(${_TARGET_} ${_SCOPE_}
_NABLA_DLL_NAME_="$<PATH:REMOVE_EXTENSION,$<TARGET_FILE_NAME:Nabla>>";_NABLA_OUTPUT_DIR_="${_NABLA_OUTPUT_DIR_}"
)
endif()

target_compile_definitions(${_TARGET_} ${_SCOPE_}
_DXC_DLL_="${DXC_DLL}"
)
endfunction()

function(nbl_handle_runtime_lib_properties _TARGET_)
if(NOT TARGET ${_TARGET_})
message(FATAL_ERROR "Internal error, requsted \"${_TARGET_}\" is not defined!")
endif()

set_target_properties(${_TARGET_} PROPERTIES MSVC_RUNTIME_LIBRARY "MultiThreaded$<$<CONFIG:Debug>:Debug>$<$<BOOL:${NBL_COMPILER_DYNAMIC_RUNTIME}>:DLL>")
endfunction()

# Macro creating project for an executable
# Project and target get its name from directory when this macro gets executed (truncating number in the beginning of the name and making all lower case)
# Created because of common cmake code for examples and tools
macro(nbl_create_executable_project _EXTRA_SOURCES _EXTRA_OPTIONS _EXTRA_INCLUDES _EXTRA_LIBS)
get_filename_component(_NBL_PROJECT_DIRECTORY_ "${CMAKE_CURRENT_SOURCE_DIR}" ABSOLUTE)
include("scripts/nbl/projectTargetName") # sets EXECUTABLE_NAME

if(MSVC)
set_property(DIRECTORY PROPERTY VS_STARTUP_PROJECT ${EXECUTABLE_NAME})
endif()
get_filename_component(EXECUTABLE_NAME ${_NBL_PROJECT_DIRECTORY_} NAME)
string(REGEX REPLACE "^[0-9]+\." "" EXECUTABLE_NAME ${EXECUTABLE_NAME})
string(TOLOWER ${EXECUTABLE_NAME} EXECUTABLE_NAME)
string(MAKE_C_IDENTIFIER ${EXECUTABLE_NAME} EXECUTABLE_NAME)

project(${EXECUTABLE_NAME})
set_directory_properties(PROPERTIES VS_STARTUP_PROJECT ${EXECUTABLE_NAME})

set(NBL_EXECUTABLE_SOURCES
main.cpp
${_EXTRA_SOURCES}
)

if(ANDROID)
add_library(${EXECUTABLE_NAME} SHARED main.cpp ${_EXTRA_SOURCES})
add_library(${EXECUTABLE_NAME} SHARED ${NBL_EXECUTABLE_SOURCES})
else()
set(NBL_EXECUTABLE_SOURCES
main.cpp
${_EXTRA_SOURCES}
)

add_executable(${EXECUTABLE_NAME} ${NBL_EXECUTABLE_SOURCES})
nbl_handle_runtime_lib_properties(${EXECUTABLE_NAME})
endif()

nbl_handle_dll_definitions(${EXECUTABLE_NAME} PUBLIC)

target_compile_definitions(${EXECUTABLE_NAME} PUBLIC _NBL_APP_NAME_="${EXECUTABLE_NAME}")

if("${EXECUTABLE_NAME}" STREQUAL commonpch)
add_dependencies(${EXECUTABLE_NAME} Nabla)
else()
# TODO: let arek figure out how to redo the PCH
#[===[
string(FIND "${_NBL_PROJECT_DIRECTORY_}" "${NBL_ROOT_PATH}/examples_tests" _NBL_FOUND_)

if(NOT "${_NBL_FOUND_}" STREQUAL "-1") # the call was made for a target defined in examples_tests, request common api PCH
if(NOT TARGET ${NBL_EXECUTABLE_COMMON_API_TARGET})
message(FATAL_ERROR "Internal error, NBL_EXECUTABLE_COMMON_API_TARGET target must be defined to create an example target!")
endif()

add_dependencies(${EXECUTABLE_NAME} ${NBL_EXECUTABLE_COMMON_API_TARGET})
target_link_libraries(${EXECUTABLE_NAME} PUBLIC ${NBL_EXECUTABLE_COMMON_API_TARGET})
target_precompile_headers("${EXECUTABLE_NAME}" REUSE_FROM "${NBL_EXECUTABLE_COMMON_API_TARGET}")
endif()
]===]
endif()

target_include_directories(${EXECUTABLE_NAME}
PUBLIC "${NBL_ROOT_PATH}/examples_tests/common"
PUBLIC "${NBL_ROOT_PATH_BINARY}/include"
PUBLIC ../../include # in macro.. relative to what? TODO: correct
PRIVATE ${_EXTRA_INCLUDES}
)
target_link_libraries(${EXECUTABLE_NAME} PUBLIC Nabla ${_EXTRA_LIBS})

add_compile_options(${_EXTRA_OPTIONS})

if(NBL_SANITIZE_ADDRESS)
if(MSVC)
target_compile_options(${EXECUTABLE_NAME} PUBLIC /fsanitize=address)
else()
target_compile_options(${EXECUTABLE_NAME} PUBLIC -fsanitize=address)
endif()
endif()

if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU")
# add_compile_options("-msse4.2 -mfpmath=sse") ????
add_compile_options(
"$<$<CONFIG:DEBUG>:-fstack-protector-all>"
)

set(COMMON_LINKER_OPTIONS "-msse4.2 -mfpmath=sse -fuse-ld=gold")
set(CMAKE_EXE_LINKER_FLAGS_RELEASE "${COMMON_LINKER_OPTIONS}")
set(CMAKE_EXE_LINKER_FLAGS_DEBUG "${COMMON_LINKER_OPTIONS} -fstack-protector-strong")
if (NBL_GCC_SANITIZE_ADDRESS)
set(CMAKE_EXE_LINKER_FLAGS_DEBUG "${CMAKE_EXE_LINKER_FLAGS_DEBUG} -fsanitize=address")
endif()
if (NBL_GCC_SANITIZE_THREAD)
set(CMAKE_EXE_LINKER_FLAGS_DEBUG "${CMAKE_EXE_LINKER_FLAGS_DEBUG} -fsanitize=thread")
endif()
if (CMAKE_CXX_COMPILER_VERSION VERSION_GREATER 6.1)
add_compile_options(-Wno-error=ignored-attributes)
endif()
endif()

nbl_adjust_flags(TARGET ${EXECUTABLE_NAME} MAP_RELEASE Release MAP_RELWITHDEBINFO RelWithDebInfo MAP_DEBUG Debug)
nbl_adjust_definitions() # macro defined in root CMakeLists
add_definitions(-D_NBL_PCH_IGNORE_PRIVATE_HEADERS)
nbl_adjust_definitions()

set_target_properties(${EXECUTABLE_NAME} PROPERTIES DEBUG_POSTFIX _d)
set_target_properties(${EXECUTABLE_NAME} PROPERTIES RELWITHDEBINFO_POSTFIX _rwdi)
set_target_properties(${EXECUTABLE_NAME}
PROPERTIES
add_compile_options(${_EXTRA_OPTIONS})
add_definitions(-D_NBL_PCH_IGNORE_PRIVATE_HEADERS) # TODO: wipe when we finally make Nabla PCH work as its supposed to
set_target_properties(${EXECUTABLE_NAME} PROPERTIES
DEBUG_POSTFIX _d
RELWITHDEBINFO_POSTFIX _rwdi
RUNTIME_OUTPUT_DIRECTORY_DEBUG "${PROJECT_SOURCE_DIR}/bin"
RUNTIME_OUTPUT_DIRECTORY_RELWITHDEBINFO "${PROJECT_SOURCE_DIR}/bin"
RUNTIME_OUTPUT_DIRECTORY_RELEASE "${PROJECT_SOURCE_DIR}/bin"
VS_DEBUGGER_WORKING_DIRECTORY "${PROJECT_SOURCE_DIR}/bin" # for visual studio
VS_DEBUGGER_WORKING_DIRECTORY "${PROJECT_SOURCE_DIR}/bin"
)
if(MSVC)
# nothing special
Expand Down Expand Up @@ -251,66 +167,28 @@ macro(nbl_create_executable_project _EXTRA_SOURCES _EXTRA_OPTIONS _EXTRA_INCLUDE
nbl_project_process_test_module()
endmacro()

# TODO this macro needs more love
macro(nbl_create_ext_library_project EXT_NAME LIB_HEADERS LIB_SOURCES LIB_INCLUDES LIB_OPTIONS DEF_OPTIONS)
set(LIB_NAME "NblExt${EXT_NAME}")
project(${LIB_NAME})

add_library(${LIB_NAME} ${LIB_SOURCES})

target_include_directories(${LIB_NAME}
PUBLIC $<TARGET_PROPERTY:Nabla,INCLUDE_DIRECTORIES>
PRIVATE ${LIB_INCLUDES}
)

if(NBL_EMBED_BUILTIN_RESOURCES)
get_target_property(_BUILTIN_RESOURCES_INCLUDE_SEARCH_DIRECTORY_ nblBuiltinResourceData BUILTIN_RESOURCES_INCLUDE_SEARCH_DIRECTORY)

target_include_directories(${LIB_NAME}
PUBLIC ${_BUILTIN_RESOURCES_INCLUDE_SEARCH_DIRECTORY_}
)
endif()

add_dependencies(${LIB_NAME} Nabla)
target_link_libraries(${LIB_NAME} PUBLIC Nabla)
target_compile_options(${LIB_NAME} PUBLIC ${LIB_OPTIONS})
target_compile_definitions(${LIB_NAME} PUBLIC ${DEF_OPTIONS})

nbl_handle_dll_definitions(${LIB_NAME} PUBLIC)
nbl_handle_runtime_lib_properties(${LIB_NAME})

if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU")
add_compile_options(
"$<$<CONFIG:DEBUG>:-fstack-protector-all>"
)

set(COMMON_LINKER_OPTIONS "-msse4.2 -mfpmath=sse -fuse-ld=gold")
set(CMAKE_EXE_LINKER_FLAGS_RELEASE "${COMMON_LINKER_OPTIONS}")
set(CMAKE_EXE_LINKER_FLAGS_DEBUG "${COMMON_LINKER_OPTIONS} -fstack-protector-strong -fsanitize=address")
endif()
target_include_directories(${LIB_NAME} PRIVATE ${LIB_INCLUDES})

nbl_adjust_flags(TARGET ${LIB_NAME} MAP_RELEASE Release MAP_RELWITHDEBINFO RelWithDebInfo MAP_DEBUG Debug)
nbl_adjust_definitions() # macro defined in root CMakeLists
nbl_adjust_definitions()

set_target_properties(${LIB_NAME} PROPERTIES DEBUG_POSTFIX "")
set_target_properties(${LIB_NAME} PROPERTIES RELWITHDEBINFO_POSTFIX _rwdb)
set_target_properties(${LIB_NAME}
PROPERTIES
RUNTIME_OUTPUT_DIRECTORY "${PROJECT_SOURCE_DIR}/bin"
target_compile_options(${LIB_NAME} PUBLIC ${LIB_OPTIONS})
target_compile_definitions(${LIB_NAME} PUBLIC ${DEF_OPTIONS})
set_target_properties(${LIB_NAME} PROPERTIES
DEBUG_POSTFIX _d
RELWITHDEBINFO_POSTFIX _rwdi
)
if(MSVC)
set_target_properties(${LIB_NAME}
PROPERTIES
RUNTIME_OUTPUT_DIRECTORY_DEBUG "${PROJECT_SOURCE_DIR}/bin"
RUNTIME_OUTPUT_DIRECTORY_RELEASE "${PROJECT_SOURCE_DIR}/bin"
RUNTIME_OUTPUT_DIRECTORY_RELWITHDEBINFO "${PROJECT_SOURCE_DIR}/bin"
VS_DEBUGGER_WORKING_DIRECTORY "${PROJECT_SOURCE_DIR}/bin" # seems like has no effect
)
endif()

if(LIB_HEADERS)
nbl_install_file_spec(${LIB_HEADERS} "nbl/ext/${EXT_NAME}")
endif()
endif()

nbl_install_lib_spec(${LIB_NAME} "nbl/ext/${EXT_NAME}")

Expand Down Expand Up @@ -1337,4 +1215,17 @@ macro(NBL_DOCKER)
RESULT_VARIABLE DOCKER_EXIT_CODE
OUTPUT_VARIABLE DOCKER_OUTPUT_VAR
)
endmacro()
endmacro()

function(NBL_ADJUST_FOLDERS NS)
NBL_GET_ALL_TARGETS(TARGETS)
foreach(T IN LISTS TARGETS)
get_target_property(NBL_FOLDER ${T} FOLDER)

if(NBL_FOLDER)
set_target_properties(${T} PROPERTIES FOLDER "nabla/${NS}/${NBL_FOLDER}")
else()
set_target_properties(${T} PROPERTIES FOLDER "nabla/${NS}")
endif()
endforeach()
endfunction()
3 changes: 2 additions & 1 deletion include/nbl/application_templates/MonoDeviceApplication.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,8 @@ class MonoDeviceApplication : public virtual MonoSystemMonoLoggerApplication
using namespace nbl::core;
using namespace nbl::video;
// TODO: specify version of the app
m_api = CVulkanConnection::create(smart_refctd_ptr(m_system),0,_NBL_APP_NAME_,smart_refctd_ptr(base_t::m_logger),getAPIFeaturesToEnable());
// TODO: take APP NAME from executable metadata, DO NOT use defines in order to allow this to be part of examples PCH
m_api = CVulkanConnection::create(smart_refctd_ptr(m_system),0,"Nabla Example", smart_refctd_ptr(base_t::m_logger), getAPIFeaturesToEnable());
if (!m_api)
return logFail("Failed to crate an IAPIConnection!");

Expand Down
44 changes: 25 additions & 19 deletions src/nbl/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -349,21 +349,18 @@ if(NBL_CPACK_NO_BUILD_DIRECTORY_MODULES)
target_compile_definitions(Nabla PUBLIC NBL_CPACK_NO_BUILD_DIRECTORY_MODULES)
endif()

if(NBL_COMPILER_DYNAMIC_RUNTIME)
set_property(TARGET Nabla PROPERTY MSVC_RUNTIME_LIBRARY "MultiThreaded$<$<CONFIG:Debug>:Debug>DLL")
else()
set_property(TARGET Nabla PROPERTY MSVC_RUNTIME_LIBRARY "MultiThreaded$<$<CONFIG:Debug>:Debug>")
endif()

target_compile_definitions(Nabla PRIVATE __NBL_BUILDING_NABLA__)

target_link_options(Nabla INTERFACE # proxy to downstream targets
$<$<CXX_COMPILER_FRONTEND_VARIANT:MSVC>:
$<$<BOOL:${NBL_COMPILER_DYNAMIC_RUNTIME}>:/DELAYLOAD:$<TARGET_FILE_NAME:Nabla>>
/DELAYLOAD:dxcompiler.dll
>
target_compile_definitions(Nabla
PUBLIC _DXC_DLL_="${DXC_DLL}"
PRIVATE __NBL_BUILDING_NABLA__
)

if(CMAKE_CXX_COMPILER_FRONTEND_VARIANT MATCHES MSVC)
target_link_options(Nabla
INTERFACE /DELAYLOAD:$<TARGET_FILE_NAME:Nabla>
PRIVATE /DELAYLOAD:dxcompiler.dll
)
endif()

if (ANDROID)
add_library(android_native_app_glue STATIC
${ANDROID_NDK_ROOT_PATH}/sources/android/native_app_glue/android_native_app_glue.c
Expand All @@ -378,9 +375,12 @@ if (ANDROID)
)
endif()

set(NBL_ASSEMBLY_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/$<CONFIG>/devshgraphicsprogramming.nabla")
if(NOT NBL_STATIC_BUILD)
set(NBL_ASSEMBLY_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/$<CONFIG>/devshgraphicsprogramming.nabla" CACHE INTERNAL "" FORCE)
set_target_properties(Nabla PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${NBL_ASSEMBLY_DIRECTORY})
target_compile_definitions(Nabla PUBLIC
_NABLA_DLL_NAME_="$<PATH:REMOVE_EXTENSION,$<TARGET_FILE_NAME:Nabla>>";_NABLA_OUTPUT_DIR_="${NBL_ASSEMBLY_DIRECTORY}"
)
endif()

## Set up 3rdparty deps
Expand Down Expand Up @@ -590,10 +590,10 @@ endif()

# Include dirs for self
target_include_directories(Nabla PUBLIC
${CMAKE_CURRENT_BINARY_DIR}/include
${NBL_ROOT_PATH}/include
"${CMAKE_CURRENT_BINARY_DIR}/include"
"${NBL_ROOT_PATH}/include"
${COMMON_INCLUDE_DIRS}
${THIRD_PARTY_SOURCE_DIR}
"${THIRD_PARTY_SOURCE_DIR}"
#those also goes as PUBLIC because of examples
"$<$<CONFIG:DEBUG>:${NABLA_CONF_DIR_DEBUG}>"
"$<$<CONFIG:RELEASE>:${NABLA_CONF_DIR_RELEASE}>"
Expand Down Expand Up @@ -697,9 +697,13 @@ if (MSVC)
target_compile_options(Nabla PUBLIC /bigobj)
endif()

#precompiled headers
if(NBL_PCH)
target_precompile_headers(Nabla PUBLIC "${CMAKE_CURRENT_SOURCE_DIR}/pch.h")
target_precompile_headers(Nabla
# private as nothing from source directory should ever leak to downstream targets!
# NOTE: currently our whole public and private interface is broken
# and private headers leak to public includes
PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/pch.h"
)
endif()

# extensions
Expand Down Expand Up @@ -773,3 +777,5 @@ else()
endif()

nbl_install_program_spec("${DXC_DLL}" "nbl/3rdparty/dxc")

NBL_ADJUST_FOLDERS(src)
Loading
Loading