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 "" )
1+ cmake_minimum_required (VERSION 3.14)
52
3+ include (ExternalProject)
4+ include (FetchContent)
5+
6+ # include("${CMAKE_CURRENT_SOURCE_DIR}/cmake/print_target.cmake")
7+
8+
9+ # Setup directories and basic paths
10+ set (FETCHCONTENT_BASE_DIR "${CMAKE_CURRENT_SOURCE_DIR} /external" )
11+ set (DAWN_DIR "${FETCHCONTENT_BASE_DIR} /dawn" CACHE INTERNAL "Dawn source directory" )
12+
13+ # For Emscripten builds (if desired)
14+ set (EM_SDK_DIR $ENV{EMSDK} CACHE INTERNAL "" )
15+ set (EMSCRIPTEN_DIR "${EM_SDK_DIR} /upstream/emscripten" CACHE INTERNAL "" )
16+
17+ # Decide where to build Dawn’s build files.
618if (EMSCRIPTEN)
7- set (EM_SDK_DIR $ENV{EMSDK} CACHE INTERNAL "" )
8- set (DAWN_BUILD_DIR "${DAWN_DIR} /build_web" CACHE INTERNAL "" )
9- set (DAWN_EMSCRIPTEN_TOOLCHAIN ${EM_SDK_DIR} /upstream/emscripten CACHE INTERNAL "" FORCE)
19+ set (DAWN_BUILD_DIR "${DAWN_DIR} /build_web" CACHE INTERNAL "web build directory" FORCE)
20+ elseif (WIN32 )
21+ set (DAWN_BUILD_DIR "${DAWN_DIR} /build_win" CACHE INTERNAL "windows build directory" FORCE)
22+ elseif (IOS)
23+ set (DAWN_BUILD_DIR "${DAWN_DIR} /build_ios" CACHE INTERNAL "ios build directory" FORCE)
24+ elseif (APPLE )
25+ set (DAWN_BUILD_DIR "${DAWN_DIR} /build_mac" CACHE INTERNAL "mac build directory" FORCE)
26+ elseif (ANDROID)
27+ set (DAWN_BUILD_DIR "${DAWN_DIR} /build_android" CACHE INTERNAL "android build directory" FORCE)
1028else ()
11- add_compile_definitions (USE_DAWN_API )
29+ set (DAWN_BUILD_DIR " ${DAWN_DIR} /build_unix" CACHE INTERNAL "linux build directory" FORCE )
1230endif ()
1331
14- # Enable find for no dawn rebuilds with flutter run
15- set (ENABLE_DAWN_FIND OFF CACHE BOOL "Enable finding Dawn" FORCE)
32+ # Add Dawn header include directories so that they are available later.
33+ include_directories (BEFORE PUBLIC
34+ "${DAWN_BUILD_DIR} /src/dawn/native/"
35+ "${DAWN_BUILD_DIR} /src/dawn/native/Debug"
36+ "${DAWN_BUILD_DIR} /src/dawn/native/Release"
37+ )
38+
39+
40+ # Optionally try to find an existing Dawn build.
41+ set (ENABLE_DAWN_FIND OFF CACHE BOOL "Attempt to find an existing Dawn build" FORCE)
1642set (DAWN_BUILD_FOUND OFF CACHE BOOL "Dawn build found" FORCE)
43+
1744if (ENABLE_DAWN_FIND)
18- # find_library, windows adds extra folder
19- if (MSVC )
20- find_library (WEBGPU_DAWN_DEBUG webgpu_dawn
21- NAMES webgpu_dawn
22- HINTS "${DAWN_BUILD_DIR} /src/dawn/native/Debug"
23- )
24- find_library (WEBGPU_DAWN_RELEASE webgpu_dawn
25- NAMES webgpu_dawn
26- HINTS "${DAWN_BUILD_DIR} /src/dawn/native/Release"
27- )
28- set (DAWN_BUILD_FOUND ON )
29- elseif (NOT EMSCRIPTEN AND NOT MSVC )
30- find_library (WEBGPU_DAWN_LIB
31- NAMES webgpu_dawn
32- PATHS "${DAWN_BUILD_DIR} /src/dawn/native"
33- REQUIRED
34- )
35- set (DAWN_BUILD_FOUND ON )
36- else ()
37- set (DAWN_BUILD_FOUND ON )
45+ message (STATUS "Attempting to find an existing Dawn build..." )
46+ if (WIN32 )
47+ find_library (WEBGPU_DAWN_DEBUG NAMES webgpu_dawn HINTS "${DAWN_BUILD_DIR} /src/dawn/native/Debug" )
48+ find_library (WEBGPU_DAWN_RELEASE NAMES webgpu_dawn HINTS "${DAWN_BUILD_DIR} /src/dawn/native/Release" )
49+
50+ if (WEBGPU_DAWN_DEBUG OR WEBGPU_DAWN_RELEASE)
51+ message (STATUS "Dawn build found on Windows. Debug: ${WEBGPU_DAWN_DEBUG} , Release: ${WEBGPU_DAWN_RELEASE} " )
52+ set (DAWN_BUILD_FOUND ON )
53+ endif ()
54+ elseif (NOT EMSCRIPTEN AND NOT WIN32 )
55+ find_library (WEBGPU_DAWN_LIB NAMES webgpu_dawn.so PATHS "${DAWN_BUILD_DIR} /src/dawn/native" )
56+
57+ if (WEBGPU_DAWN_LIB)
58+ message (STATUS "Dawn build found on Linux/Unix. Library: ${WEBGPU_DAWN_LIB} " )
59+ set (DAWN_BUILD_FOUND ON )
3860 endif ()
61+ endif ()
3962endif ()
4063
41- # Dawn options for more,
42- # see https://dawn.googlesource.com/dawn/+/refs/heads/main/CMakeLists.txt
43- set (DAWN_ALWAYS_ASSERT OFF CACHE INTERNAL "Always assert in Dawn" FORCE)
44- set (DAWN_BUILD_MONOLITHIC_LIBRARY ON CACHE INTERNAL "Build Dawn monolithically" FORCE)
45- set (DAWN_BUILD_EXAMPLES OFF CACHE INTERNAL "Build Dawn examples" FORCE)
46- set (DAWN_BUILD_SAMPLES OFF CACHE INTERNAL "Build Dawn samples" FORCE)
47- set (DAWN_BUILD_TESTS OFF CACHE INTERNAL "Build Dawn tests" FORCE)
48- set (DAWN_ENABLE_INSTALL OFF CACHE INTERNAL "Enable Dawn installation" FORCE)
49- set (DAWN_FETCH_DEPENDENCIES ON CACHE INTERNAL "Fetch Dawn dependencies" FORCE)
50- set (TINT_BUILD_TESTS OFF CACHE INTERNAL "Build Tint Tests" FORCE)
51- set (TINT_BUILD_IR_BINARY OFF CACHE INTERNAL "Build Tint IR binary" FORCE)
52- set (TINT_BUILD_CMD_TOOLS OFF CACHE INTERNAL "Build Tint command line tools" FORCE)
5364
65+ # Pre-build Dawn at configuration time if not already built.
5466if (NOT DAWN_BUILD_FOUND)
55- include (FetchContent)
56- message ("webgpu_dawn not found start building" )
57- if (EMSCRIPTEN)
58- set (EMSCRIPTEN_DIR "${EM_SDK_DIR} /upstream/emscripten" CACHE INTERNAL "" FORCE)
59- set (DAWN_EMSCRIPTEN_TOOLCHAIN ${EMSCRIPTEN_DIR} CACHE INTERNAL "" FORCE)
60- endif ()
67+ message (STATUS "Dawn build not found - pre-building Dawn." )
6168
62- FetchContent_Declare(
63- dawn
64- DOWNLOAD_DIR ${DAWN_DIR}
65- SOURCE_DIR ${DAWN_DIR}
66- SUBBUILD_DIR ${DAWN_BUILD_DIR} /tmp
67- BINARY_DIR ${DAWN_BUILD_DIR}
68- DOWNLOAD_COMMAND
69- cd ${DAWN_DIR} &&
70- git init &&
71- git fetch --depth=1 https://dawn.googlesource.com/dawn &&
72- git reset --hard FETCH_HEAD
73- )
69+ # Force Dawn build options.
70+ set (DAWN_ALWAYS_ASSERT ON CACHE INTERNAL "Always assert in Dawn" FORCE)
71+ set (DAWN_BUILD_MONOLITHIC_LIBRARY ON CACHE INTERNAL "Build Dawn monolithically" FORCE)
72+ set (DAWN_BUILD_EXAMPLES OFF CACHE INTERNAL "Build Dawn examples" FORCE)
73+ set (DAWN_BUILD_SAMPLES OFF CACHE INTERNAL "Build Dawn samples" FORCE)
74+ set (DAWN_BUILD_TESTS OFF CACHE INTERNAL "Build Dawn tests" FORCE)
75+ set (DAWN_ENABLE_INSTALL OFF CACHE INTERNAL "Enable Dawn installation" FORCE)
76+ set (DAWN_FETCH_DEPENDENCIES ON CACHE INTERNAL "Fetch Dawn dependencies" FORCE)
77+ set (TINT_BUILD_TESTS OFF CACHE INTERNAL "Build Tint Tests" FORCE)
78+ set (TINT_BUILD_IR_BINARY OFF CACHE INTERNAL "Build Tint IR binary" FORCE)
79+ set (TINT_BUILD_CMD_TOOLS OFF CACHE INTERNAL "Build Tint command line tools" FORCE)
80+ set (DAWN_EMSCRIPTEN_TOOLCHAIN ${EMSCRIPTEN_DIR} CACHE INTERNAL "Emscripten toolchain" FORCE )
7481
75- # Download the repository and add it as a subdirectory.
76- FetchContent_MakeAvailable(dawn)
82+ set (DAWN_COMMIT "66d57f910357befb441b91162f29a97f687af6d9" CACHE STRING "Dawn commit to checkout" FORCE)
83+
84+ file (MAKE_DIRECTORY ${DAWN_DIR} )
85+ # Initialize Git and set/update remote.
86+ execute_process (COMMAND git init
87+ WORKING_DIRECTORY "${DAWN_DIR} "
88+ )
89+ execute_process (
90+ COMMAND git remote add origin https://dawn.googlesource.com/dawn
91+ WORKING_DIRECTORY "${DAWN_DIR} "
92+ )
93+ # Fetch and checkout the specified commit.
94+ execute_process (
95+ COMMAND git fetch origin ${DAWN_COMMIT}
96+ WORKING_DIRECTORY "${DAWN_DIR} "
97+ )
98+ execute_process (
99+ COMMAND git checkout ${DAWN_COMMIT}
100+ WORKING_DIRECTORY "${DAWN_DIR} "
101+ )
102+ execute_process (
103+ COMMAND git reset --hard ${DAWN_COMMIT}
104+ WORKING_DIRECTORY "${DAWN_DIR} "
105+ )
106+ # Fetch the Dawn repository if not already present.
107+ FetchContent_Declare(
108+ dawn
109+ SOURCE_DIR ${DAWN_DIR}
110+ SUBBUILD_DIR ${DAWN_BUILD_DIR} /tmp
111+ BINARY_DIR ${DAWN_BUILD_DIR}
112+ )
113+ FetchContent_MakeAvailable(dawn)
77114
78- # attempt fix flutter rebuilds
79- set (CMAKE_INCLUDE_PATH "${CMAKE_INCLUDE_PATH} ;${DAWN_DIR} /src" CACHE INTERNAL "" )
115+ set (CMAKE_INCLUDE_PATH "${CMAKE_INCLUDE_PATH} ;${DAWN_DIR} /src" CACHE INTERNAL "" )
80116
81- execute_process (
82- WORKING_DIRECTORY ${DAWN_DIR}
83- COMMAND ${CMAKE_COMMAND} -S ${DAWN_DIR}
84- -B ${DAWN_BUILD_DIR}
85- )
117+ set (DAWN_BUILD_FOUND ON )
118+ endif () # End pre-build Dawn
86119
87- # Build Dawn
88- execute_process (
89- COMMAND ${CMAKE_COMMAND} --build ${DAWN_BUILD_DIR}
90- )
91-
92- # find_library, windows adds extra folder
93- if (MSVC )
94- find_library (WEBGPU_DAWN_DEBUG webgpu_dawn
95- NAMES webgpu_dawn
96- HINTS "${DAWN_BUILD_DIR} /src/dawn/native/Debug"
97- )
98- find_library (WEBGPU_DAWN_RELEASE webgpu_dawn
99- NAMES webgpu_dawn
100- HINTS "${DAWN_BUILD_DIR} /src/dawn/native/Release"
101- )
102- set (DAWN_BUILD_FOUND ON )
103- elseif (NOT EMSCRIPTEN AND NOT MSVC )
104- find_library (WEBGPU_DAWN_LIB
105- NAMES webgpu_dawn
106- PATHS "${DAWN_BUILD_DIR} /src/dawn/native"
107- REQUIRED
108- )
109- set (DAWN_BUILD_FOUND ON )
110- else ()
111- set (DAWN_BUILD_FOUND ON )
112- endif ()
120+ # Create an IMPORTED target for the Dawn library.
121+ # Adjust the expected output name/extension per platform.
122+ if (MSVC )
123+ message (STATUS "Dawn build found on Windows." )
124+ # MSVC: use separate debug and release dlls.
125+ if ((NOT WEBGPU_DAWN_DEBUG) OR (WEBGPU_DAWN_DEBUG MATCHES "NOTFOUND" ))
126+ find_library (WEBGPU_DAWN_DEBUG NAMES webgpu_dawn PATHS "${DAWN_BUILD_DIR} /src/dawn/native/Debug" )
127+ endif ()
128+ if ((NOT WEBGPU_DAWN_RELEASE) OR (WEBGPU_DAWN_RELEASE MATCHES "NOTFOUND" ))
129+ find_library (WEBGPU_DAWN_RELEASE NAMES webgpu_dawn PATHS "${DAWN_BUILD_DIR} /src/dawn/native/Release" )
113130endif ()
114131
115- if (EMSCRIPTEN)
116- add_library (webgpu_dawn INTERFACE IMPORTED )
117- target_include_directories (webgpu_dawn INTERFACE ${DAWN_BUILD_DIR} /gen/src/emdawnwebgpu/include )
118- target_include_directories (webgpu_dawn INTERFACE ${DAWN_BUILD_DIR} /gen/src/emdawnwebgpu/include /webgpu/webgpu.h)
119- target_link_libraries (webgpu_dawn INTERFACE ${DAWN_BUILD_DIR} /gen/src/emdawnwebgpu/library_webgpu_enum_tables.js)
120- target_link_libraries (webgpu_dawn INTERFACE ${DAWN_BUILD_DIR} /gen/src/emdawnwebgpu/library_webgpu_generated_struct_info.js)
121- target_link_libraries (webgpu_dawn INTERFACE ${DAWN_BUILD_DIR} /gen/src/emdawnwebgpu/library_webgpu_generated_sig_info.js)
122- target_link_libraries (webgpu_dawn INTERFACE ${DAWN_DIR} /third_party/emdawnwebgpu/library_webgpu.js)
123- else ()
132+ if (WEBGPU_DAWN_DEBUG OR WEBGPU_DAWN_RELEASE)
133+ if (NOT TARGET webgpu_dawn)
134+ add_library (webgpu_dawn INTERFACE )
135+ target_link_libraries (webgpu_dawn INTERFACE
136+ $<$<CONFIG:Debug>:${WEBGPU_DAWN_DEBUG} >
137+ $<$<CONFIG:Release>:${WEBGPU_DAWN_RELEASE} >
138+ )
139+ endif ()
124140endif ()
141+ elseif (IOS)
142+ # On iOS, it is common to build a static library.
143+ if (NOT TARGET webgpu_dawn)
144+ add_library (webgpu_dawn STATIC IMPORTED )
145+ set_target_properties (webgpu_dawn PROPERTIES
146+ IMPORTED_LOCATION "${DAWN_BUILD_DIR} /src/dawn/native/webgpu_dawn.a" )
147+ endif ()
148+ elseif (APPLE )
149+ # On macOS (non-iOS), typically a dynamic library (.dylib) is built.
150+ if (NOT TARGET webgpu_dawn)
151+ add_library (webgpu_dawn SHARED IMPORTED )
152+ set_target_properties (webgpu_dawn PROPERTIES
153+ IMPORTED_LOCATION "${DAWN_BUILD_DIR} /src/dawn/native/webgpu_dawn.dylib" )
154+ endif ()
155+ elseif (ANDROID)
156+ if (NOT TARGET webgpu_dawn)
157+ add_library (webgpu_dawn SHARED IMPORTED )
158+ set_target_properties (webgpu_dawn PROPERTIES
159+ IMPORTED_LOCATION "${DAWN_BUILD_DIR} /src/dawn/native/webgpu_dawn.so" )
160+ endif ()
161+ elseif (NOT EMSCRIPTEN) # For Linux and other Unix-like systems.
162+ if (NOT TARGET webgpu_dawn)
163+ add_library (webgpu_dawn SHARED IMPORTED )
164+ set_target_properties (webgpu_dawn PROPERTIES
165+ IMPORTED_LOCATION "${DAWN_BUILD_DIR} /src/dawn/native/webgpu_dawn.so" )
166+ endif ()
167+ endif ()
0 commit comments