Skip to content
Draft
Changes from all 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
58 changes: 36 additions & 22 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,8 @@ if(EMSCRIPTEN)
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -sASYNCIFY=2 -sUSE_GLFW=3")
endif()

set(CMAKE_POSITION_INDEPENDENT_CODE ON)

function(wgvk_bundle_libraries output_target)
function(get_dependencies input_target)
get_target_property(alias ${input_target} ALIASED_TARGET)
Expand Down Expand Up @@ -54,16 +56,16 @@ endfunction()

# Lock in static for now
if(EMSCRIPTEN)
set(WGVK_CORE_SRC_LIST "src/dummy.c")
set(WGVK_CORE_SRC_LIST "${CMAKE_CURRENT_SOURCE_DIR}/src/dummy.c")
else()
set(WGVK_CORE_SRC_LIST "src/wgvk.c")
set(WGVK_CORE_SRC_LIST "${CMAKE_CURRENT_SOURCE_DIR}/src/wgvk.c")
endif()
if(SANITIZE)
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fsanitize=${SANITIZE}")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=${SANITIZE}")
endif()
if(WGVK_USE_VMA)
list(APPEND WGVK_CORE_SRC_LIST "src/vma_impl.cpp")
list(APPEND WGVK_CORE_SRC_LIST "${CMAKE_CURRENT_SOURCE_DIR}/src/vma_impl.cpp")
endif()
set(CMAKE_C_FLAGS_RELWITHDEBINFO "-DNDEBUG -g3 -O3")
set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "-DNDEBUG -g3 -O3")
Expand All @@ -73,12 +75,15 @@ set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "-DNDEBUG -g3 -O3")
set(WGVK_PRIMARY_TARGET_NAME "")

if(WGVK_BUILD_WGSL_SUPPORT)
set(WGVK_PRIMARY_TARGET_NAME "wgvk_core")
set(WGVK_PRIMARY_TARGET_NAME "wgvk")

add_library(${WGVK_PRIMARY_TARGET_NAME} STATIC ${WGVK_CORE_SRC_LIST})
add_library(${WGVK_PRIMARY_TARGET_NAME} ${WGVK_CORE_SRC_LIST})
# Add all properties as PUBLIC. This means they are used to build wgvk_core itself,
# and they are part of its public interface to be inherited by consumers.
target_compile_definitions(${WGVK_PRIMARY_TARGET_NAME} PUBLIC RG_STATIC=1 SUPPORT_WGSL=1 WGVK_DISABLE_ASSERT=1)
target_compile_definitions(${WGVK_PRIMARY_TARGET_NAME} PUBLIC SUPPORT_WGSL=1 WGVK_DISABLE_ASSERT=1)
if(NOT BUILD_SHARED_LIBS)
target_compile_definitions(${WGVK_PRIMARY_TARGET_NAME} PUBLIC RG_STATIC=1)
endif()
if(NOT EMSCRIPTEN)
target_include_directories(${WGVK_PRIMARY_TARGET_NAME} PUBLIC include)
endif()
Expand All @@ -105,34 +110,28 @@ if(WGVK_BUILD_WGSL_SUPPORT)
DOWNLOAD_EXTRACT_TIMESTAMP True
)
FetchContent_MakeAvailable(dawn)
add_library(tint_c_api STATIC "src/tint_c_api.cpp")
add_library(tint_c_api STATIC "${CMAKE_CURRENT_SOURCE_DIR}/src/tint_c_api.cpp")
target_include_directories(tint_c_api PUBLIC "${CMAKE_CURRENT_LIST_DIR}/include")
target_include_directories(tint_c_api PRIVATE "${dawn_SOURCE_DIR}")
target_link_libraries(tint_c_api PUBLIC tint_lang_wgsl_reader tint_lang_spirv_writer tint_lang_wgsl_inspector)
target_compile_features(tint_c_api PRIVATE cxx_std_20)
if(NOT MSVC)
target_compile_options(tint_c_api PRIVATE "-fno-rtti")
endif()
target_compile_definitions(${WGVK_PRIMARY_TARGET_NAME} PUBLIC SUPPORT_WGSL=1)

# Bundle wgvk_core and its dependencies into the final `wgvk` library.
wgvk_bundle_libraries(wgvk ${WGVK_PRIMARY_TARGET_NAME} tint_lang_wgsl_reader tint_lang_spirv_writer tint_lang_wgsl_inspector tint_c_api)

# ---- FIX: PROPAGATE USAGE REQUIREMENTS ----
# The `wgvk` library is made of object files, so it doesn't inherit CMake
# properties from `wgvk_core` automatically.
# We use `target_link_libraries` with `INTERFACE` to manually propagate all
# PUBLIC/INTERFACE properties (includes, definitions, etc.) from `wgvk_core`
# to `wgvk`. This makes them available to anything that links against `wgvk`.
target_link_libraries(wgvk INTERFACE ${WGVK_PRIMARY_TARGET_NAME})

target_link_libraries(${WGVK_PRIMARY_TARGET_NAME} PRIVATE tint_c_api)
else()
set(WGVK_PRIMARY_TARGET_NAME "wgvk")

add_library(${WGVK_PRIMARY_TARGET_NAME} STATIC ${WGVK_CORE_SRC_LIST})
add_library(${WGVK_PRIMARY_TARGET_NAME} ${WGVK_CORE_SRC_LIST})
# When not bundling, `wgvk` is the primary target. We use PUBLIC so that
# any consumers (like the examples) inherit these properties correctly.
target_compile_definitions(${WGVK_PRIMARY_TARGET_NAME} PUBLIC RG_STATIC=1 WGVK_DISABLE_ASSERT=1)
target_compile_definitions(${WGVK_PRIMARY_TARGET_NAME} PUBLIC WGVK_DISABLE_ASSERT=1)
target_include_directories(${WGVK_PRIMARY_TARGET_NAME} PUBLIC include)

if(NOT BUILD_SHARED_LIBS)
target_compile_definitions(${WGVK_PRIMARY_TARGET_NAME} PUBLIC RG_STATIC=1)
endif()
endif()

# Now, we apply all remaining properties to the primary target using the variable.
Expand Down Expand Up @@ -169,6 +168,21 @@ if(ANDROID)
target_compile_definitions(${WGVK_PRIMARY_TARGET_NAME} PUBLIC SUPPORT_ANDROID_SURFACE=1)
endif()

target_sources(${WGVK_PRIMARY_TARGET_NAME}
PUBLIC
FILE_SET
HEADERS
BASE_DIRS ${CMAKE_CURRENT_SOURCE_DIR}/include
FILES
${CMAKE_CURRENT_SOURCE_DIR}/include/webgpu/webgpu.h
${CMAKE_CURRENT_SOURCE_DIR}/include/wgvk.h
)
install(
TARGETS ${WGVK_PRIMARY_TARGET_NAME}
EXPORT wgvk-targets
FILE_SET HEADERS
DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
)

if(WGVK_BUILD_EXAMPLES)
if(NOT EMSCRIPTEN)
Expand All @@ -188,7 +202,7 @@ if(WGVK_BUILD_EXAMPLES)
# Examples always link against the final `wgvk` target. Thanks to the fix above,
# they will now correctly inherit all necessary compile definitions.
target_link_libraries(glfw_surface PUBLIC wgvk glfw)
target_link_libraries(basic_wgsl_shader PUBLIC wgvk glfw)
target_link_libraries(basic_wgsl_shader PUBLIC wgvk glfw m)
target_link_libraries(raytracing PUBLIC wgvk glfw)
target_link_libraries(basic_compute PUBLIC wgvk)
target_link_libraries(rgfw_surface PUBLIC wgvk)
Expand Down