From ad99cc40d238bd8c0bbda86849a49abad49a3f64 Mon Sep 17 00:00:00 2001 From: Ayano Kagurazaka Date: Fri, 9 Aug 2024 12:34:29 -0400 Subject: [PATCH 1/9] add fetchcontent section to fetch libdawn.dylib from github --- cmake/gpu.cmake | 50 ++++++++++++++++++++++++++++++++++--------------- 1 file changed, 35 insertions(+), 15 deletions(-) diff --git a/cmake/gpu.cmake b/cmake/gpu.cmake index e257cbf..b46a6f3 100644 --- a/cmake/gpu.cmake +++ b/cmake/gpu.cmake @@ -14,20 +14,23 @@ if(EXISTS ${FILEPATH_CURRENT_DIR}) elseif(EXISTS ${FILEPATH_PROJECT_ROOT}) set(TARGET_FILE_PATH ${PROJECT_ROOT}) else() - message(FATAL_ERROR "File ${FILENAME} not found in either ${CMAKE_CURRENT_SOURCE_DIR} or ${CMAKE_CURRENT_SOURCE_DIR}/../../") + message( + FATAL_ERROR + "File ${FILENAME} not found in either ${CMAKE_CURRENT_SOURCE_DIR} or ${CMAKE_CURRENT_SOURCE_DIR}/../../" + ) endif() # Define architecture and build type directories or file names if(CMAKE_SIZEOF_VOID_P EQUAL 8) - set(ARCH "x64") + set(ARCH "x64") else() - set(ARCH "x86") + set(ARCH "x86") endif() if(CMAKE_BUILD_TYPE STREQUAL "Debug") - set(BUILD_TYPE "Debug") + set(BUILD_TYPE "Debug") else() - set(BUILD_TYPE "Release") + set(BUILD_TYPE "Release") endif() add_library(webgpulib SHARED IMPORTED) @@ -38,22 +41,39 @@ add_dependencies(gpu webgpulib) target_include_directories(gpu INTERFACE ${TARGET_FILE_PATH}) # Add headers webgpu.h -target_include_directories(wgpu INTERFACE ${TARGET_FILE_PATH}/third_party/headers) +target_include_directories(wgpu + INTERFACE ${TARGET_FILE_PATH}/third_party/headers) if(WIN32) - set(DLL_PATH "${TARGET_FILE_PATH}/third_party/lib/libdawn_${ARCH}_${BUILD_TYPE}.dll") + set(DLL_PATH + "${TARGET_FILE_PATH}/third_party/lib/libdawn_${ARCH}_${BUILD_TYPE}.dll") if(EXISTS ${DLL_PATH}) - file(COPY ${DLL_PATH} DESTINATION ${CMAKE_CURRENT_BINARY_DIR}) - target_link_libraries(webgpulib INTERFACE ${DLL_PATH}) + file(COPY ${DLL_PATH} DESTINATION ${CMAKE_CURRENT_BINARY_DIR}) + target_link_libraries(webgpulib INTERFACE ${DLL_PATH}) else() - message(FATAL_ERROR "libdawn dll not found at: ${DLL_PATH}") -endif() + message(FATAL_ERROR "libdawn dll not found at: ${DLL_PATH}") + endif() else() - find_library(LIBDAWN dawn REQUIRED PATHS "${TARGET_FILE_PATH}/third_party/lib") + find_library(LIBDAWN dawn PATHS "${TARGET_FILE_PATH}/third_party/lib") if(LIBDAWN) message(STATUS "Found libdawn: ${LIBDAWN}") - # Link against libdawn + # Link against libdawn target_link_libraries(webgpulib INTERFACE ${LIBDAWN}) else() - message(FATAL_ERROR "libdawn not found") + message( + FATAL_ERROR "libdawn not found, try downloading from the release") + FetchContent_Declare( + libdawn + url https://github.com/austinvhuang/dawn-artifacts/releases/download/prerelease/libdawn.dylib + DOWNLOAD_DIR + "${TARGET_FILE_PATH}/third_party/lib") + FetchContent_MakeAvailable(libdawn) + find_library(LIBDAWN dawn PATHS "${TARGET_FILE_PATH}/third_party/lib") + if(LIBDAWN) + message(STATUS "Found libdawn: ${LIBDAWN}") + # Link against libdawn + target_link_libraries(webgpulib INTERFACE ${LIBDAWN}) + else() + message( + FATAL_ERROR "libdawn not found") endif() -endif() \ No newline at end of file +endif() From b9dca65fc5caca520ea7ecc97ebe815fc81fbca4 Mon Sep 17 00:00:00 2001 From: Ayano Kagurazaka Date: Fri, 9 Aug 2024 12:39:59 -0400 Subject: [PATCH 2/9] rephrased indentation --- cmake/gpu.cmake | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/cmake/gpu.cmake b/cmake/gpu.cmake index b46a6f3..5da214c 100644 --- a/cmake/gpu.cmake +++ b/cmake/gpu.cmake @@ -67,13 +67,13 @@ else() DOWNLOAD_DIR "${TARGET_FILE_PATH}/third_party/lib") FetchContent_MakeAvailable(libdawn) - find_library(LIBDAWN dawn PATHS "${TARGET_FILE_PATH}/third_party/lib") - if(LIBDAWN) - message(STATUS "Found libdawn: ${LIBDAWN}") - # Link against libdawn - target_link_libraries(webgpulib INTERFACE ${LIBDAWN}) - else() - message( - FATAL_ERROR "libdawn not found") - endif() + find_library(LIBDAWN dawn REQUIRED PATHS "${TARGET_FILE_PATH}/third_party/lib") + if(LIBDAWN) + message(STATUS "Found libdawn: ${LIBDAWN}") + # Link against libdawn + target_link_libraries(webgpulib INTERFACE ${LIBDAWN}) + else() + message( + FATAL_ERROR "libdawn not found") + endif() endif() From 897c307e2b8881bac74ff333ec422bac9c1169d3 Mon Sep 17 00:00:00 2001 From: Ayano Kagurazaka Date: Fri, 9 Aug 2024 12:42:41 -0400 Subject: [PATCH 3/9] fix if nesting --- cmake/gpu.cmake | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/cmake/gpu.cmake b/cmake/gpu.cmake index 5da214c..5bbc90f 100644 --- a/cmake/gpu.cmake +++ b/cmake/gpu.cmake @@ -58,6 +58,7 @@ else() message(STATUS "Found libdawn: ${LIBDAWN}") # Link against libdawn target_link_libraries(webgpulib INTERFACE ${LIBDAWN}) + # if not found, try download from release else() message( FATAL_ERROR "libdawn not found, try downloading from the release") @@ -67,13 +68,14 @@ else() DOWNLOAD_DIR "${TARGET_FILE_PATH}/third_party/lib") FetchContent_MakeAvailable(libdawn) - find_library(LIBDAWN dawn REQUIRED PATHS "${TARGET_FILE_PATH}/third_party/lib") + find_library(LIBDAWN dawn REQUIRED + PATHS "${TARGET_FILE_PATH}/third_party/lib") if(LIBDAWN) message(STATUS "Found libdawn: ${LIBDAWN}") # Link against libdawn target_link_libraries(webgpulib INTERFACE ${LIBDAWN}) else() - message( - FATAL_ERROR "libdawn not found") + message(FATAL_ERROR "libdawn not found") endif() + endif() endif() From 07b342eb0bb1d8f6c7fa1a562423f23252d8906f Mon Sep 17 00:00:00 2001 From: Ayano Kagurazaka Date: Fri, 9 Aug 2024 12:43:50 -0400 Subject: [PATCH 4/9] delete fatal error --- cmake/gpu.cmake | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/cmake/gpu.cmake b/cmake/gpu.cmake index 5bbc90f..b4ef38e 100644 --- a/cmake/gpu.cmake +++ b/cmake/gpu.cmake @@ -60,8 +60,7 @@ else() target_link_libraries(webgpulib INTERFACE ${LIBDAWN}) # if not found, try download from release else() - message( - FATAL_ERROR "libdawn not found, try downloading from the release") + message("libdawn not found, try downloading from the release") FetchContent_Declare( libdawn url https://github.com/austinvhuang/dawn-artifacts/releases/download/prerelease/libdawn.dylib From a30b0daece55460856914ec70a1c011ced02d433 Mon Sep 17 00:00:00 2001 From: Ayano Kagurazaka Date: Fri, 9 Aug 2024 12:45:22 -0400 Subject: [PATCH 5/9] typo --- cmake/gpu.cmake | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmake/gpu.cmake b/cmake/gpu.cmake index b4ef38e..2e90c86 100644 --- a/cmake/gpu.cmake +++ b/cmake/gpu.cmake @@ -63,7 +63,7 @@ else() message("libdawn not found, try downloading from the release") FetchContent_Declare( libdawn - url https://github.com/austinvhuang/dawn-artifacts/releases/download/prerelease/libdawn.dylib + URL https://github.com/austinvhuang/dawn-artifacts/releases/download/prerelease/libdawn.dylib DOWNLOAD_DIR "${TARGET_FILE_PATH}/third_party/lib") FetchContent_MakeAvailable(libdawn) From cb9239d1d458d61fc458563d0da5c26f4d2023cf Mon Sep 17 00:00:00 2001 From: Ayano Kagurazaka Date: Fri, 9 Aug 2024 13:05:48 -0400 Subject: [PATCH 6/9] No extract file --- cmake/gpu.cmake | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cmake/gpu.cmake b/cmake/gpu.cmake index 2e90c86..ad12af0 100644 --- a/cmake/gpu.cmake +++ b/cmake/gpu.cmake @@ -64,8 +64,8 @@ else() FetchContent_Declare( libdawn URL https://github.com/austinvhuang/dawn-artifacts/releases/download/prerelease/libdawn.dylib - DOWNLOAD_DIR - "${TARGET_FILE_PATH}/third_party/lib") + DOWNLOAD_NO_EXTRACT TRUE + SOURCE_DIR "${TARGET_FILE_PATH}/third_party/lib") FetchContent_MakeAvailable(libdawn) find_library(LIBDAWN dawn REQUIRED PATHS "${TARGET_FILE_PATH}/third_party/lib") From 39b40b89f85009eff531853ec8596708efecbf14 Mon Sep 17 00:00:00 2001 From: Ayano Kagurazaka Date: Fri, 9 Aug 2024 13:22:30 -0400 Subject: [PATCH 7/9] add filetype check for linux system --- cmake/gpu.cmake | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/cmake/gpu.cmake b/cmake/gpu.cmake index ad12af0..1a1d35f 100644 --- a/cmake/gpu.cmake +++ b/cmake/gpu.cmake @@ -61,9 +61,14 @@ else() # if not found, try download from release else() message("libdawn not found, try downloading from the release") + if(${CMAKE_SYSTEM_NAME} MATCHES "Darwin") + set(libdawn_ext "dylib") + elseif(UNIX) + set(libdawn_ext "so") + endif() FetchContent_Declare( libdawn - URL https://github.com/austinvhuang/dawn-artifacts/releases/download/prerelease/libdawn.dylib + URL https://github.com/austinvhuang/dawn-artifacts/releases/download/prerelease/libdawn.${libdawn_ext} DOWNLOAD_NO_EXTRACT TRUE SOURCE_DIR "${TARGET_FILE_PATH}/third_party/lib") FetchContent_MakeAvailable(libdawn) From 229fcbfd016c8e9d5350ca1d92b47454c305f19d Mon Sep 17 00:00:00 2001 From: Ayano Kagurazaka Date: Sat, 10 Aug 2024 22:39:08 -0400 Subject: [PATCH 8/9] using new way to find file from [this](https://github.com/AnswerDotAI/gpu.cpp/pull/44#discussion_r1712844767) --- .gitignore | 11 +++++++++ cmake/example.cmake | 54 +++++++++++++++++++++++++++----------------- cmake/find_gpu.cmake | 30 ++++++++++++++++++++++++ cmake/gpu.cmake | 44 +++++++++++++++++++++--------------- 4 files changed, 100 insertions(+), 39 deletions(-) create mode 100644 cmake/find_gpu.cmake diff --git a/.gitignore b/.gitignore index 029eb4e..c8599c7 100644 --- a/.gitignore +++ b/.gitignore @@ -9,3 +9,14 @@ source third_party/lib/libdawn.* third_party/lib/*.so third_party/lib/*.dylib + +# formatter files +.cmake-format.py + +# cmake generated files +compile_commands.json +out + +# clangd files +.cache + diff --git a/cmake/example.cmake b/cmake/example.cmake index 7779a30..3d7e965 100644 --- a/cmake/example.cmake +++ b/cmake/example.cmake @@ -1,4 +1,5 @@ -set(CMAKE_EXPORT_COMPILE_COMMANDS ON) # export compile_commands.json to use with LSP +set(CMAKE_EXPORT_COMPILE_COMMANDS ON) # export compile_commands.json to use with + # LSP set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) @@ -9,37 +10,47 @@ get_filename_component(PROJECT_ROOT ${PROJECT_ROOT} DIRECTORY) set(FILEPATH_CURRENT_DIR "${CMAKE_CURRENT_SOURCE_DIR}/${FILENAME}") set(FILEPATH_PROJECT_ROOT "${PROJECT_ROOT}/${FILENAME}") +# Include file finding utility script +include("${CMAKE_CURRENT_SOURCE_DIR}/cmake/find_gpu.cmake") + # Check if the file exists in the current directory -if(EXISTS ${FILEPATH_CURRENT_DIR}) - set(TARGET_FILE_PATH ${CMAKE_CURRENT_SOURCE_DIR}) -elseif(EXISTS ${FILEPATH_PROJECT_ROOT}) - set(TARGET_FILE_PATH ${PROJECT_ROOT}) -else() - message(FATAL_ERROR "File ${FILENAME} not found in either ${CMAKE_CURRENT_SOURCE_DIR} or ${CMAKE_CURRENT_SOURCE_DIR}/../../") +find_project_root(${CMAKE_CURRENT_SOURCE_DIR} ${FILEPATH_CURRENT_DIR} + ${TARGET_FILE_PATH}) +if("${TARGET_FILE_PATH}" STREQUAL "") + find_project_root(${CMAKE_CURRENT_SOURCE_DIR} ${PROJECT_ROOT} + ${TARGET_FILE_PATH}) + if("${TARGET_FILE_PATH}" STREQUAL "") + message( + FATAL_ERROR + "File ${FILENAME} not found in either ${CMAKE_CURRENT_SOURCE_DIR} or ${CMAKE_CURRENT_SOURCE_DIR}/../../" + ) + endif() endif() # Ensure the build type is set if(NOT CMAKE_BUILD_TYPE) - set(CMAKE_BUILD_TYPE Release CACHE STRING "Choose the type of build: Debug or Release" FORCE) + set(CMAKE_BUILD_TYPE + Release + CACHE STRING "Choose the type of build: Debug or Release" FORCE) endif() # Define architecture and build type directories or file names if(CMAKE_SIZEOF_VOID_P EQUAL 8) - set(ARCH "x64") + set(ARCH "x64") else() - set(ARCH "x86") + set(ARCH "x86") endif() if(CMAKE_BUILD_TYPE STREQUAL "Debug") - set(BUILD_TYPE "Debug") + set(BUILD_TYPE "Debug") else() - set(BUILD_TYPE "Release") + set(BUILD_TYPE "Release") endif() if(NOT TARGET gpu) - message(STATUS "GPU_LIB not found") - include("${TARGET_FILE_PATH}/cmake/webgpu.cmake") - include("${TARGET_FILE_PATH}/cmake/gpu.cmake") + message(STATUS "GPU_LIB not found") + include("${TARGET_FILE_PATH}/cmake/webgpu.cmake") + include("${TARGET_FILE_PATH}/cmake/gpu.cmake") endif() add_executable(${PROJECT_NAME} run.cpp) @@ -48,9 +59,10 @@ target_link_libraries(${PROJECT_NAME} PRIVATE wgpu) target_link_libraries(${PROJECT_NAME} PRIVATE webgpu) if(WIN32) -# Ensure DLL is copied if on Windows -add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD - COMMAND ${CMAKE_COMMAND} -E copy_if_different - ${DLL_PATH} - $) -endif() \ No newline at end of file + # Ensure DLL is copied if on Windows + add_custom_command( + TARGET ${PROJECT_NAME} + POST_BUILD + COMMAND ${CMAKE_COMMAND} -E copy_if_different ${DLL_PATH} + $) +endif() diff --git a/cmake/find_gpu.cmake b/cmake/find_gpu.cmake new file mode 100644 index 0000000..dccf7ee --- /dev/null +++ b/cmake/find_gpu.cmake @@ -0,0 +1,30 @@ +# file name to find +set(FILENAME "gpu.h") + +# Function to check for file existence up the directory hierarchy +function(find_project_root current_dir filename result_var) + set(found FALSE) # Flag to indicate if the file is found + set(current_check_dir "${current_dir}") # Start from the given directory + # using 1 is jsut to supress the cmane-format warning + foreach(i RANGE 0 2 1) + set(filepath "${current_check_dir}/${filename}") + + if(EXISTS "${filepath}") + set(${result_var} + "${current_check_dir}" + PARENT_SCOPE) + set(found TRUE) + break() + endif() + + # Move one level up + get_filename_component(current_check_dir "${current_check_dir}" + DIRECTORY) + endforeach() + + if(NOT found) + set(${result_var} + "" + PARENT_SCOPE) # Set to empty if not found + endif() +endfunction() diff --git a/cmake/gpu.cmake b/cmake/gpu.cmake index 1a1d35f..7bf8084 100644 --- a/cmake/gpu.cmake +++ b/cmake/gpu.cmake @@ -1,6 +1,3 @@ -# Specify the filename to search for -set(FILENAME "gpu.h") - get_filename_component(PROJECT_ROOT ${CMAKE_CURRENT_SOURCE_DIR} DIRECTORY) get_filename_component(PROJECT_ROOT ${PROJECT_ROOT} DIRECTORY) @@ -8,16 +5,21 @@ get_filename_component(PROJECT_ROOT ${PROJECT_ROOT} DIRECTORY) set(FILEPATH_CURRENT_DIR "${CMAKE_CURRENT_SOURCE_DIR}/${FILENAME}") set(FILEPATH_PROJECT_ROOT "${PROJECT_ROOT}/${FILENAME}") +# Include file finding utility script +include("${CMAKE_CURRENT_SOURCE_DIR}/cmake/find_gpu.cmake") + # Check if the file exists in the current directory -if(EXISTS ${FILEPATH_CURRENT_DIR}) - set(TARGET_FILE_PATH ${CMAKE_CURRENT_SOURCE_DIR}) -elseif(EXISTS ${FILEPATH_PROJECT_ROOT}) - set(TARGET_FILE_PATH ${PROJECT_ROOT}) -else() - message( - FATAL_ERROR - "File ${FILENAME} not found in either ${CMAKE_CURRENT_SOURCE_DIR} or ${CMAKE_CURRENT_SOURCE_DIR}/../../" - ) +find_project_root(${CMAKE_CURRENT_SOURCE_DIR} ${FILEPATH_CURRENT_DIR} + ${TARGET_FILE_PATH}) +if("${TARGET_FILE_PATH}" STREQUAL "") + find_project_root(${CMAKE_CURRENT_SOURCE_DIR} ${PROJECT_ROOT} + ${TARGET_FILE_PATH}) + if("${TARGET_FILE_PATH}" STREQUAL "") + message( + FATAL_ERROR + "File ${FILENAME} not found in either ${CMAKE_CURRENT_SOURCE_DIR} or ${CMAKE_CURRENT_SOURCE_DIR}/../../" + ) + endif() endif() # Define architecture and build type directories or file names @@ -43,6 +45,15 @@ target_include_directories(gpu INTERFACE ${TARGET_FILE_PATH}) # Add headers webgpu.h target_include_directories(wgpu INTERFACE ${TARGET_FILE_PATH}/third_party/headers) +# FetchContent_Declare( DAWN_EXT GIT_REPOSITORY +# "https://dawn.googlesource.com/dawn" GIT_TAG "main" INSTALL_DIR +# "${TARGET_FILE_PATH}/third_party/dawn" CONFIGURE_COMMAND "python3 +# tools/fetch_dawn_dependencies.py" CMAKE_ARGS "-DDAWN_ENABLE_INSTALL=ON +# -DDAWN_BUILD_MONOLITHIC_LIBRARY=ON -DCMAKE_BUILD_TYPE=Debug +# -DBUILD_SAMPLES=OFF" ) + +# FetchContent_MakeAvailable(DAWN_EXT) + if(WIN32) set(DLL_PATH "${TARGET_FILE_PATH}/third_party/lib/libdawn_${ARCH}_${BUILD_TYPE}.dll") @@ -55,11 +66,9 @@ if(WIN32) else() find_library(LIBDAWN dawn PATHS "${TARGET_FILE_PATH}/third_party/lib") if(LIBDAWN) - message(STATUS "Found libdawn: ${LIBDAWN}") - # Link against libdawn + message(STATUS "Found libdawn: ${LIBDAWN}") # Link against libdawn target_link_libraries(webgpulib INTERFACE ${LIBDAWN}) - # if not found, try download from release - else() + # if not found, try download from release else() message("libdawn not found, try downloading from the release") if(${CMAKE_SYSTEM_NAME} MATCHES "Darwin") set(libdawn_ext "dylib") @@ -75,8 +84,7 @@ else() find_library(LIBDAWN dawn REQUIRED PATHS "${TARGET_FILE_PATH}/third_party/lib") if(LIBDAWN) - message(STATUS "Found libdawn: ${LIBDAWN}") - # Link against libdawn + message(STATUS "Found libdawn: ${LIBDAWN}") # Link against libdawn target_link_libraries(webgpulib INTERFACE ${LIBDAWN}) else() message(FATAL_ERROR "libdawn not found") From 29521fb01bc430f5c8bea63a1e71e7afcbb6c8bd Mon Sep 17 00:00:00 2001 From: Ayano Kagurazaka Date: Sun, 11 Aug 2024 19:34:24 -0400 Subject: [PATCH 9/9] use External rather than FetchContent --- .gitignore | 6 ++-- CMakeLists.txt | 25 ++++++++++------ cmake/example.cmake | 8 ++--- cmake/gpu.cmake | 72 +++++++++++++++------------------------------ cmake/webgpu.cmake | 59 +++++++++++++++++++++---------------- 5 files changed, 81 insertions(+), 89 deletions(-) diff --git a/.gitignore b/.gitignore index c8599c7..8cad491 100644 --- a/.gitignore +++ b/.gitignore @@ -9,14 +9,16 @@ source third_party/lib/libdawn.* third_party/lib/*.so third_party/lib/*.dylib +third_party/local/* # formatter files .cmake-format.py -# cmake generated files -compile_commands.json +# cmake build directories out +build # clangd files .cache +compile_commands.json diff --git a/CMakeLists.txt b/CMakeLists.txt index 8629977..f857244 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -3,37 +3,44 @@ project(gpu) include("${CMAKE_CURRENT_SOURCE_DIR}/cmake/webgpu.cmake") -set(CMAKE_EXPORT_COMPILE_COMMANDS ON) # export compile_commands.json to use with LSP +set(CMAKE_EXPORT_COMPILE_COMMANDS ON) # export compile_commands.json to use with + # LSP set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) -option(USE_LOCAL_LIBS "Use local libraries instead of fetching from the internet" OFF) +option(USE_LOCAL_LIBS + "Use local libraries instead of fetching from the internet" OFF) # Ensure the build type is set if(NOT CMAKE_BUILD_TYPE) - set(CMAKE_BUILD_TYPE Release CACHE STRING "Choose the type of build: Debug or Release" FORCE) + set(CMAKE_BUILD_TYPE + Release + CACHE STRING "Choose the type of build: Debug or Release" FORCE) endif() option(FASTBUILD "Option to enable fast builds" OFF) if(FASTBUILD) - set(CMAKE_BUILD_TYPE None) # Avoid default flags of predefined build types - set(CMAKE_CXX_FLAGS "-O0") + set(CMAKE_BUILD_TYPE None) # Avoid default flags of predefined build types + set(CMAKE_CXX_FLAGS "-O0") endif() option(DEBUG "Option to enable debug flags" OFF) if(DEBUG) - set(CMAKE_BUILD_TYPE Debug) - set(CMAKE_CXX_FLAGS "-O0 -g") + set(CMAKE_BUILD_TYPE Debug) + set(CMAKE_CXX_FLAGS "-O0 -g") endif() if(WIN64) - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DWEBGPU_BACKEND_DAWN") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DWEBGPU_BACKEND_DAWN") endif() include("${CMAKE_CURRENT_SOURCE_DIR}/cmake/gpu.cmake") message(STATUS "CMAKE_CURRENT_SOURCE_DIR: ${CMAKE_CURRENT_SOURCE_DIR}") -message(STATUS "Include directories for wgpu: ${CMAKE_CURRENT_SOURCE_DIR}/third_party/headers") +message( + STATUS + "Include directories for wgpu: ${CMAKE_CURRENT_SOURCE_DIR}/third_party/headers" +) add_library(gpud SHARED gpu.h) set_target_properties(gpud PROPERTIES LINKER_LANGUAGE CXX) diff --git a/cmake/example.cmake b/cmake/example.cmake index 3d7e965..eba8e7c 100644 --- a/cmake/example.cmake +++ b/cmake/example.cmake @@ -14,11 +14,11 @@ set(FILEPATH_PROJECT_ROOT "${PROJECT_ROOT}/${FILENAME}") include("${CMAKE_CURRENT_SOURCE_DIR}/cmake/find_gpu.cmake") # Check if the file exists in the current directory -find_project_root(${CMAKE_CURRENT_SOURCE_DIR} ${FILEPATH_CURRENT_DIR} - ${TARGET_FILE_PATH}) +find_project_root(${CMAKE_CURRENT_SOURCE_DIR} ${FILENAME} + TARGET_FILE_PATH) if("${TARGET_FILE_PATH}" STREQUAL "") - find_project_root(${CMAKE_CURRENT_SOURCE_DIR} ${PROJECT_ROOT} - ${TARGET_FILE_PATH}) + find_project_root(${FILEPATH_CURRENT_DIR} ${FILENAME} + TARGET_FILE_PATH) if("${TARGET_FILE_PATH}" STREQUAL "") message( FATAL_ERROR diff --git a/cmake/gpu.cmake b/cmake/gpu.cmake index 7bf8084..08db244 100644 --- a/cmake/gpu.cmake +++ b/cmake/gpu.cmake @@ -9,11 +9,9 @@ set(FILEPATH_PROJECT_ROOT "${PROJECT_ROOT}/${FILENAME}") include("${CMAKE_CURRENT_SOURCE_DIR}/cmake/find_gpu.cmake") # Check if the file exists in the current directory -find_project_root(${CMAKE_CURRENT_SOURCE_DIR} ${FILEPATH_CURRENT_DIR} - ${TARGET_FILE_PATH}) +find_project_root(${CMAKE_CURRENT_SOURCE_DIR} ${FILENAME} TARGET_FILE_PATH) if("${TARGET_FILE_PATH}" STREQUAL "") - find_project_root(${CMAKE_CURRENT_SOURCE_DIR} ${PROJECT_ROOT} - ${TARGET_FILE_PATH}) + find_project_root(${FILEPATH_CURRENT_DIR} ${FILENAME} TARGET_FILE_PATH) if("${TARGET_FILE_PATH}" STREQUAL "") message( FATAL_ERROR @@ -45,49 +43,27 @@ target_include_directories(gpu INTERFACE ${TARGET_FILE_PATH}) # Add headers webgpu.h target_include_directories(wgpu INTERFACE ${TARGET_FILE_PATH}/third_party/headers) -# FetchContent_Declare( DAWN_EXT GIT_REPOSITORY -# "https://dawn.googlesource.com/dawn" GIT_TAG "main" INSTALL_DIR -# "${TARGET_FILE_PATH}/third_party/dawn" CONFIGURE_COMMAND "python3 -# tools/fetch_dawn_dependencies.py" CMAKE_ARGS "-DDAWN_ENABLE_INSTALL=ON -# -DDAWN_BUILD_MONOLITHIC_LIBRARY=ON -DCMAKE_BUILD_TYPE=Debug -# -DBUILD_SAMPLES=OFF" ) +include(ExternalProject) -# FetchContent_MakeAvailable(DAWN_EXT) +set(DAWN_EXT_PREFIX "${TARGET_FILE_PATH}/third_party/local/dawn") -if(WIN32) - set(DLL_PATH - "${TARGET_FILE_PATH}/third_party/lib/libdawn_${ARCH}_${BUILD_TYPE}.dll") - if(EXISTS ${DLL_PATH}) - file(COPY ${DLL_PATH} DESTINATION ${CMAKE_CURRENT_BINARY_DIR}) - target_link_libraries(webgpulib INTERFACE ${DLL_PATH}) - else() - message(FATAL_ERROR "libdawn dll not found at: ${DLL_PATH}") - endif() -else() - find_library(LIBDAWN dawn PATHS "${TARGET_FILE_PATH}/third_party/lib") - if(LIBDAWN) - message(STATUS "Found libdawn: ${LIBDAWN}") # Link against libdawn - target_link_libraries(webgpulib INTERFACE ${LIBDAWN}) - # if not found, try download from release else() - message("libdawn not found, try downloading from the release") - if(${CMAKE_SYSTEM_NAME} MATCHES "Darwin") - set(libdawn_ext "dylib") - elseif(UNIX) - set(libdawn_ext "so") - endif() - FetchContent_Declare( - libdawn - URL https://github.com/austinvhuang/dawn-artifacts/releases/download/prerelease/libdawn.${libdawn_ext} - DOWNLOAD_NO_EXTRACT TRUE - SOURCE_DIR "${TARGET_FILE_PATH}/third_party/lib") - FetchContent_MakeAvailable(libdawn) - find_library(LIBDAWN dawn REQUIRED - PATHS "${TARGET_FILE_PATH}/third_party/lib") - if(LIBDAWN) - message(STATUS "Found libdawn: ${LIBDAWN}") # Link against libdawn - target_link_libraries(webgpulib INTERFACE ${LIBDAWN}) - else() - message(FATAL_ERROR "libdawn not found") - endif() - endif() -endif() +ExternalProject_Add( + dawn_project + PREFIX ${DAWN_EXT_PREFIX} + GIT_REPOSITORY "https://dawn.googlesource.com/dawn" + GIT_TAG "main" + SOURCE_DIR "${DAWN_EXT_PREFIX}/source" + BINARY_DIR "${DAWN_EXT_PREFIX}/build" + INSTALL_DIR "${DAWN_EXT_PREFIX}/install" + GIT_SUBMODULES "" + # setting cmake args doesn't work and I don't know why + CONFIGURE_COMMAND + ${CMAKE_COMMAND} -S ${DAWN_EXT_PREFIX}/source -B + ${DAWN_EXT_PREFIX}/build -DDAWN_FETCH_DEPENDENCIES=ON + -DDAWN_ENABLE_INSTALL=ON -DDAWN_BUILD_MONOLITHIC_LIBRARY=ON + -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE} -G ${CMAKE_GENERATOR} + INSTALL_COMMAND ${CMAKE_COMMAND} --install . --prefix + ${DAWN_EXT_PREFIX}/install + LOG_INSTALL ON) +find_library(LIBDAWN dawn PATHS "${DAWN_EXT_PREFIX}/install/lib") +target_link_libraries(webgpulib INTERFACE ${LIBDAWN}) diff --git a/cmake/webgpu.cmake b/cmake/webgpu.cmake index 5a66cfc..3cefa4c 100644 --- a/cmake/webgpu.cmake +++ b/cmake/webgpu.cmake @@ -8,47 +8,54 @@ get_filename_component(PROJECT_ROOT ${PROJECT_ROOT} DIRECTORY) set(FILEPATH_CURRENT_DIR "${CMAKE_CURRENT_SOURCE_DIR}/${FILENAME}") set(FILEPATH_PROJECT_ROOT "${PROJECT_ROOT}/${FILENAME}") +# Include file finding utility script +include("${CMAKE_CURRENT_SOURCE_DIR}/cmake/find_gpu.cmake") + # Check if the file exists in the current directory -if(EXISTS ${FILEPATH_CURRENT_DIR}) - set(TARGET_FILE_PATH ${CMAKE_CURRENT_SOURCE_DIR}) -elseif(EXISTS ${FILEPATH_PROJECT_ROOT}) - set(TARGET_FILE_PATH ${PROJECT_ROOT}) -else() - message(FATAL_ERROR "File ${FILENAME} not found in either ${CMAKE_CURRENT_SOURCE_DIR} or ${CMAKE_CURRENT_SOURCE_DIR}/../../") +find_project_root(${CMAKE_CURRENT_SOURCE_DIR} ${FILENAME} TARGET_FILE_PATH) +if("${TARGET_FILE_PATH}" STREQUAL "") + find_project_root(${FILEPATH_CURRENT_DIR} ${FILENAME} TARGET_FILE_PATH) + if("${TARGET_FILE_PATH}" STREQUAL "") + message( + FATAL_ERROR + "File ${FILENAME} not found in either ${CMAKE_CURRENT_SOURCE_DIR} or ${CMAKE_CURRENT_SOURCE_DIR}/../../" + ) + endif() endif() include(FetchContent) set(FETCHCONTENT_BASE_DIR "${TARGET_FILE_PATH}/third_party/fetchcontent") -set(WEBGPU_DIST_LOCAL_PATH "${TARGET_FILE_PATH}/third_party/local/WebGPU-distribution") +set(WEBGPU_DIST_LOCAL_PATH + "${TARGET_FILE_PATH}/third_party/local/WebGPU-distribution") if(USE_LOCAL_LIBS) - set(WEBGPU_DIST_GIT_REPO ${WEBGPU_DIST_LOCAL_PATH}) - message(STATUS "Using local WebGPU distribution: ${WEBGPU_DIST_LOCAL_PATH}") + set(WEBGPU_DIST_GIT_REPO ${WEBGPU_DIST_LOCAL_PATH}) + message(STATUS "Using local WebGPU distribution: ${WEBGPU_DIST_LOCAL_PATH}") else() - set(WEBGPU_DIST_GIT_REPO "https://github.com/eliemichel/WebGPU-distribution") + set(WEBGPU_DIST_GIT_REPO + "https://github.com/eliemichel/WebGPU-distribution") endif() option(WEBGPU_TAG "WebGPU distribution tag to use") -if (NOT WEBGPU_TAG) - set(WEBGPU_TAG "dawn") +if(NOT WEBGPU_TAG) + set(WEBGPU_TAG "dawn") endif() message(STATUS "Using WebGPU distribution tag: ${WEBGPU_TAG}") -if (WEBGPU_TAG STREQUAL "dawn") - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DWEBGPU_BACKEND_DAWN") - # use specific commit - # set(WEBGPU_TAG "1025b977e1927b6d0327e67352f90feb4bcf8274") - # set(WEBGPU_TAG "acf972b7b909f52e183bdae3971b93bb13d4a29e") - # add_compile_options(-UABSL_INTERNAL_AT_LEAST_CXX20) - # set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -UABSL_INTERNAL_AT_LEAST_CXX20") - message(STATUS "Using Dawn backend") +if(WEBGPU_TAG STREQUAL "dawn") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DWEBGPU_BACKEND_DAWN") + # use specific commit set(WEBGPU_TAG + # "1025b977e1927b6d0327e67352f90feb4bcf8274") set(WEBGPU_TAG + # "acf972b7b909f52e183bdae3971b93bb13d4a29e") + # add_compile_options(-UABSL_INTERNAL_AT_LEAST_CXX20) set(CMAKE_CXX_FLAGS + # "${CMAKE_CXX_FLAGS} -UABSL_INTERNAL_AT_LEAST_CXX20") + message(STATUS "Using Dawn backend") endif() FetchContent_Declare( - webgpu - GIT_REPOSITORY ${WEBGPU_DIST_GIT_REPO} - GIT_TAG ${WEBGPU_TAG} - GIT_SHALLOW TRUE -) -FetchContent_MakeAvailable(webgpu) \ No newline at end of file + webgpu + GIT_REPOSITORY ${WEBGPU_DIST_GIT_REPO} + GIT_TAG ${WEBGPU_TAG} + GIT_SHALLOW TRUE) +FetchContent_MakeAvailable(webgpu)