1+ # Setup directories
2+ set (FETCHCONTENT_BASE_DIR "${PROJECT_ROOT} /third_party" )
3+ set (DAWN_DIR "${FETCHCONTENT_BASE_DIR} /dawn" CACHE INTERNAL "" )
4+ set (DAWN_BUILD_DIR "${DAWN_DIR} /build" CACHE INTERNAL "" )
5+
6+ if (EMSCRIPTEN)
7+ set (EM_SDK_DIR $ENV{EMSDK} CACHE INTERNAL "" )
8+ set (DAWN_BUILD_DIR "${DAWN_DIR} /build_web" CACHE INTERNAL "" )
9+ endif ()
10+
11+ function (find_dawn_library)
12+ if (MSVC )
13+ find_library (WEBGPU_DAWN_DEBUG webgpu_dawn
14+ NAMES webgpu_dawn
15+ HINTS "${DAWN_BUILD_DIR} /src/dawn/native/Debug"
16+ )
17+ find_library (WEBGPU_DAWN_RELEASE webgpu_dawn
18+ NAMES webgpu_dawn
19+ HINTS "${DAWN_BUILD_DIR} /src/dawn/native/Release"
20+ )
21+ elseif (NOT EMSCRIPTEN AND NOT MSVC )
22+ find_library (WEBGPU_DAWN_LIB
23+ NAMES webgpu_dawn
24+ PATHS "${DAWN_BUILD_DIR} /src/dawn/native"
25+ REQUIRED
26+ )
27+ endif ()
28+
29+ # Set result variables in parent scope
30+ set (DAWN_BUILD_FOUND ON PARENT_SCOPE)
31+ if (MSVC )
32+ set (WEBGPU_DAWN_DEBUG ${WEBGPU_DAWN_DEBUG} PARENT_SCOPE)
33+ set (WEBGPU_DAWN_RELEASE ${WEBGPU_DAWN_RELEASE} PARENT_SCOPE)
34+ else ()
35+ set (WEBGPU_DAWN_LIB ${WEBGPU_DAWN_LIB} PARENT_SCOPE)
36+ endif ()
37+ endfunction ()
38+
39+ # Enable find for no dawn rebuilds with flutter run
40+ set (ENABLE_DAWN_FIND OFF CACHE BOOL "Enable finding Dawn" FORCE)
41+ set (DAWN_BUILD_FOUND OFF CACHE BOOL "Dawn build found" FORCE)
42+ if (ENABLE_DAWN_FIND)
43+ # find_library, windows adds extra folder
44+ if (MSVC )
45+ find_library (WEBGPU_DAWN_DEBUG webgpu_dawn
46+ NAMES webgpu_dawn
47+ HINTS "${DAWN_BUILD_DIR} /src/dawn/native/Debug"
48+ )
49+ find_library (WEBGPU_DAWN_RELEASE webgpu_dawn
50+ NAMES webgpu_dawn
51+ HINTS "${DAWN_BUILD_DIR} /src/dawn/native/Release"
52+ )
53+ set (DAWN_BUILD_FOUND ON )
54+ elseif (NOT EMSCRIPTEN AND NOT MSVC )
55+ find_library (WEBGPU_DAWN_LIB
56+ NAMES webgpu_dawn
57+ PATHS "${DAWN_BUILD_DIR} /src/dawn/native"
58+ REQUIRED
59+ )
60+ set (DAWN_BUILD_FOUND ON )
61+ else ()
62+ set (DAWN_BUILD_FOUND ON )
63+ endif ()
64+ endif ()
65+
66+ # Dawn options for more,
67+ # see https://dawn.googlesource.com/dawn/+/refs/heads/main/CMakeLists.txt
68+ set (DAWN_ALWAYS_ASSERT OFF CACHE INTERNAL "Always assert in Dawn" FORCE)
69+ set (DAWN_BUILD_MONOLITHIC_LIBRARY ON CACHE INTERNAL "Build Dawn monolithically" FORCE)
70+ set (DAWN_BUILD_EXAMPLES OFF CACHE INTERNAL "Build Dawn examples" FORCE)
71+ set (DAWN_BUILD_SAMPLES OFF CACHE INTERNAL "Build Dawn samples" FORCE)
72+ set (DAWN_BUILD_TESTS OFF CACHE INTERNAL "Build Dawn tests" FORCE)
73+ set (DAWN_ENABLE_INSTALL OFF CACHE INTERNAL "Enable Dawn installation" FORCE)
74+ set (DAWN_FETCH_DEPENDENCIES ON CACHE INTERNAL "Fetch Dawn dependencies" FORCE)
75+ set (TINT_BUILD_TESTS OFF CACHE INTERNAL "Build Tint Tests" FORCE)
76+ set (TINT_BUILD_IR_BINARY OFF CACHE INTERNAL "Build Tint IR binary" FORCE)
77+ set (TINT_BUILD_CMD_TOOLS OFF CACHE INTERNAL "Build Tint command line tools" FORCE)
78+
79+ if (NOT DAWN_BUILD_FOUND)
80+ include (FetchContent)
81+ message ("webgpu_dawn not found start building" )
82+ if (EMSCRIPTEN)
83+ set (EMSCRIPTEN_DIR "${EM_SDK_DIR} /upstream/emscripten" CACHE INTERNAL "" FORCE)
84+ set (DAWN_EMSCRIPTEN_TOOLCHAIN ${EMSCRIPTEN_DIR} CACHE INTERNAL "" FORCE)
85+ endif ()
86+
87+ FetchContent_Declare(
88+ dawn
89+ DOWNLOAD_DIR ${DAWN_DIR}
90+ SOURCE_DIR ${DAWN_DIR}
91+ SUBBUILD_DIR ${DAWN_BUILD_DIR} /tmp
92+ BINARY_DIR ${DAWN_BUILD_DIR}
93+ DOWNLOAD_COMMAND
94+ cd ${DAWN_DIR} &&
95+ git init &&
96+ git fetch --depth=1 https://dawn.googlesource.com/dawn &&
97+ git reset --hard FETCH_HEAD
98+ )
99+
100+ # Download the repository and add it as a subdirectory.
101+ FetchContent_MakeAvailable(dawn)
102+
103+ # attempt fix flutter rebuilds
104+ set (CMAKE_INCLUDE_PATH "${CMAKE_INCLUDE_PATH} ;${DAWN_DIR} /src" CACHE INTERNAL "" )
105+
106+ execute_process (
107+ WORKING_DIRECTORY ${DAWN_DIR}
108+ COMMAND ${CMAKE_COMMAND} -S ${DAWN_DIR}
109+ -B ${DAWN_BUILD_DIR}
110+ )
111+
112+ # Build Dawn
113+ execute_process (
114+ COMMAND ${CMAKE_COMMAND} --build ${DAWN_BUILD_DIR}
115+ )
116+
117+ # find_library, windows adds extra folder
118+ if (MSVC )
119+ find_library (WEBGPU_DAWN_DEBUG webgpu_dawn
120+ NAMES webgpu_dawn
121+ HINTS "${DAWN_BUILD_DIR} /src/dawn/native/Debug"
122+ )
123+ find_library (WEBGPU_DAWN_RELEASE webgpu_dawn
124+ NAMES webgpu_dawn
125+ HINTS "${DAWN_BUILD_DIR} /src/dawn/native/Release"
126+ )
127+ set (DAWN_BUILD_FOUND ON )
128+ elseif (NOT EMSCRIPTEN AND NOT MSVC )
129+ find_library (WEBGPU_DAWN_LIB
130+ NAMES webgpu_dawn
131+ PATHS "${DAWN_BUILD_DIR} /src/dawn/native"
132+ REQUIRED
133+ )
134+ set (DAWN_BUILD_FOUND ON )
135+ else ()
136+ set (DAWN_BUILD_FOUND ON )
137+ endif ()
138+ endif ()
139+
140+ if (EMSCRIPTEN)
141+ add_library (webgpu_dawn INTERFACE IMPORTED )
142+ target_include_directories (webgpu_dawn INTERFACE ${DAWN_BUILD_DIR} /gen/src/emdawnwebgpu/include )
143+ target_include_directories (webgpu_dawn INTERFACE ${DAWN_BUILD_DIR} /gen/src/emdawnwebgpu/include /webgpu/webgpu.h)
144+ target_link_libraries (webgpu_dawn INTERFACE ${DAWN_BUILD_DIR} /gen/src/emdawnwebgpu/library_webgpu_enum_tables.js)
145+ target_link_libraries (webgpu_dawn INTERFACE ${DAWN_BUILD_DIR} /gen/src/emdawnwebgpu/library_webgpu_generated_struct_info.js)
146+ target_link_libraries (webgpu_dawn INTERFACE ${DAWN_BUILD_DIR} /gen/src/emdawnwebgpu/library_webgpu_generated_sig_info.js)
147+ target_link_libraries (webgpu_dawn INTERFACE ${DAWN_DIR} /third_party/emdawnwebgpu/library_webgpu.js)
148+ else ()
149+ endif ()
0 commit comments