cmake_minimum_required(VERSION 3.22)
project(webgpu)
set(CMAKE_CXX_STANDARD 20)

# Compile commands for dev
set(CMAKE_EXPORT_COMPILE_COMMANDS ON CACHE INTERNAL "")
if(CMAKE_EXPORT_COMPILE_COMMANDS)
  set(CMAKE_C_STANDARD_INCLUDE_DIRECTORIES
    ${CMAKE_C_IMPLICIT_INCLUDE_DIRECTORIES})
endif()

# Binaries
add_executable( ${PROJECT_NAME} )
target_include_directories(${PROJECT_NAME} PUBLIC 
  $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include/>
  $<INSTALL_INTERFACE:include/>
)
file(GLOB_RECURSE SOURCE_FILES
    ${CMAKE_SOURCE_DIR}/src/*.cpp)
target_sources(${PROJECT_NAME} PRIVATE ${SOURCE_FILES})

# Error on memory address issues in debug mode
if(CMAKE_BUILD_TYPE MATCHES "Debug")
  set(CMAKE_C_FLAGS
    "${CMAKE_C_FLAGS} -Werror -fsanitize=undefined -fsanitize=address"
  )
  target_link_options(${PROJECT_NAME}
    BEFORE PUBLIC -fsanitize=undefined PUBLIC -fsanitize=address
  )
endif()

# Dawn library set up
# If we're in debug mode fast linking is the priority over easy distribution.
if(CMAKE_BUILD_TYPE MATCHES "Debug") 
  set(DAWN_BUILD_MONOLITHIC_LIBRARY "SHARED")
endif()
set(DAWN_FETCH_DEPENDENCIES ON)
add_subdirectory("extern/dawn" EXCLUDE_FROM_ALL)


# Linking
if(EMSCRIPTEN)
  set_target_properties(app PROPERTIES SUFFIX ".html")
  target_link_libraries(app PRIVATE emdawnwebgpu_cpp webgpu_glfw)
  target_link_options(app PRIVATE "-sASYNCIFY=1" "-sUSE_GLFW=3")
else()
  target_link_libraries(${PROJECT_NAME} PRIVATE webgpu_dawn webgpu_glfw glfw)
endif()
