cmake_minimum_required(VERSION 4.0) project(wgpu-wasm LANGUAGES C CXX) set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED TRUE) add_custom_target(${CMAKE_PROJECT_NAME}_html COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_SOURCE_DIR}/assets/index.html ${CMAKE_CURRENT_BINARY_DIR}/index.html DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/assets/index.html) add_executable(${CMAKE_PROJECT_NAME} src/main.cpp) add_dependencies(${CMAKE_PROJECT_NAME} ${CMAKE_PROJECT_NAME}_html) target_compile_options(${CMAKE_PROJECT_NAME} PRIVATE $<$:/W4 /WX> $<$>:-Wall -Wextra -Wpedantic -Werror>) target_compile_options(${CMAKE_PROJECT_NAME} PRIVATE --use-port=emdawnwebgpu) target_link_options(${CMAKE_PROJECT_NAME} PRIVATE --use-port=emdawnwebgpu) function(compile_and_package_shader SHADER_NAME TARGET) add_custom_command(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/shaders/${SHADER_NAME}.wgsl COMMAND ${CMAKE_COMMAND} -E make_directory ${CMAKE_CURRENT_BINARY_DIR}/shaders COMMAND slangc -target wgsl -matrix-layout-column-major ${CMAKE_CURRENT_SOURCE_DIR}/assets/shaders/${SHADER_NAME}.slang -o ${CMAKE_CURRENT_BINARY_DIR}/shaders/${SHADER_NAME}.wgsl DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/assets/shaders/${SHADER_NAME}.slang) add_custom_target(${TARGET}_shader_${SHADER_NAME} DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/shaders/${SHADER_NAME}.wgsl) #TODO: Add deptfile generation via slang for recompilation when embedded files change add_dependencies(${TARGET} ${TARGET}_shader_${SHADER_NAME}) target_link_options(${TARGET} PRIVATE --embed-file ${CMAKE_CURRENT_BINARY_DIR}/shaders/${SHADER_NAME}.wgsl@/shaders/${SHADER_NAME}.wgsl) endfunction() compile_and_package_shader(shaders ${CMAKE_PROJECT_NAME})