Fix linker errors for android webgpu library
- The android build failed because `webgpu_dawn` was changed into a shared
library in https://dawn-review.googlesource.com/c/dawn/+/194920. As a
result, `bundle_libraries` failed to enumerate it's objects and
dependencies correctly.
- In order to avoid having two bundled libraries for android, the `webgpu_dawn`
library is no longer built in favor of the `webgpu_c_bundled` library which
gets built in tools/android/webgpu/src/main/cpp/CMakeLists.txt.
- This CL adapts the logic for the android library in light of recent
updates to the CMake code.
- The intermediate `native_dawn` library is removed and it's sources
along with `webgpu_dawn_native_proc.cpp` are directly sent to the
`webgpu_c_bundled` library.
- Finally, `webgpu_c_bundled` links with `dawn_public_config` in order
to inherit the public include directories for `dawn/webgpu.h`.
- Since `webgpu_dawn` is no longer built for android, this CL changes
the custom copy command to depend upon `dawncpp_headers` which
generates the `dawn/webgpu.h` header.
Change-Id: I5440f37fac26c977b3ee09cce14b8ecfbad0e14d
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/196394
Reviewed-by: dan sinclair <dsinclair@chromium.org>
Commit-Queue: Jaswant Panchumarti <jaswant.panchumarti@kitware.com>
Reviewed-by: Jim Blackler <jimblackler@google.com>
Reviewed-by: Alex Benton <bentonian@google.com>
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 53e997d..f99e0f9 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -53,11 +53,11 @@
include(DawnSetIfNotDefined)
-set(DAWN_BUILD_GEN_DIR "${Dawn_BINARY_DIR}/gen")
-set(DAWN_GENERATOR_DIR "${Dawn_SOURCE_DIR}/generator")
-set(DAWN_SRC_DIR "${Dawn_SOURCE_DIR}/src")
-set(DAWN_INCLUDE_DIR "${Dawn_SOURCE_DIR}/include")
-set(DAWN_TEMPLATE_DIR "${DAWN_GENERATOR_DIR}/templates")
+set(DAWN_BUILD_GEN_DIR "${Dawn_BINARY_DIR}/gen" CACHE PATH "Directory that contains generated source files")
+set(DAWN_GENERATOR_DIR "${Dawn_SOURCE_DIR}/generator" CACHE PATH "Directory that contains scripts to generate sources and headers")
+set(DAWN_SRC_DIR "${Dawn_SOURCE_DIR}/src" CACHE PATH "Directory that contains source files for dawn")
+set(DAWN_INCLUDE_DIR "${Dawn_SOURCE_DIR}/include" CACHE PATH "Directory that contains public headers for dawn")
+set(DAWN_TEMPLATE_DIR "${DAWN_GENERATOR_DIR}/templates" CACHE PATH "Directory that contains templates for generators")
function (install_if_enabled target)
if(NOT DAWN_ENABLE_INSTALL)
diff --git a/src/dawn/native/CMakeLists.txt b/src/dawn/native/CMakeLists.txt
index 32b3509..6e36756 100644
--- a/src/dawn/native/CMakeLists.txt
+++ b/src/dawn/native/CMakeLists.txt
@@ -819,26 +819,28 @@
# "{{.*}}_dawn" when you rename it.
###############################################################################
-DawnJSONGenerator(
- TARGET "webgpu_dawn_native_proc"
- PRINT_NAME "Dawn native WebGPU procs"
- OUTPUT_SOURCES WEBGPU_DAWN_NATIVE_PROC_GEN_SOURCES
-)
+if (NOT CMAKE_SYSTEM_NAME STREQUAL "Android")
+ DawnJSONGenerator(
+ TARGET "webgpu_dawn_native_proc"
+ PRINT_NAME "Dawn native WebGPU procs"
+ OUTPUT_SOURCES WEBGPU_DAWN_NATIVE_PROC_GEN_SOURCES
+ )
-include(BundleLibraries)
-bundle_libraries(webgpu_dawn dawn_native)
-add_library(dawn::webgpu ALIAS webgpu_dawn)
-target_sources(webgpu_dawn
- PRIVATE
- ${WEBGPU_DAWN_NATIVE_PROC_GEN_SOURCES}
-)
-target_link_libraries(webgpu_dawn
- PRIVATE
- dawn_internal_config
- ${conditional_private_platform_depends}
-)
-target_compile_definitions(webgpu_dawn PRIVATE "WGPU_IMPLEMENTATION")
-target_compile_definitions(webgpu_dawn PUBLIC "WGPU_SHARED_LIBRARY")
+ include(BundleLibraries)
+ bundle_libraries(webgpu_dawn dawn_native)
+ add_library(dawn::webgpu ALIAS webgpu_dawn)
+ target_sources(webgpu_dawn
+ PRIVATE
+ ${WEBGPU_DAWN_NATIVE_PROC_GEN_SOURCES}
+ )
+ target_link_libraries(webgpu_dawn
+ PRIVATE
+ dawn_internal_config
+ ${conditional_private_platform_depends}
+ )
+ target_compile_definitions(webgpu_dawn PRIVATE "WGPU_IMPLEMENTATION")
+ target_compile_definitions(webgpu_dawn PUBLIC "WGPU_SHARED_LIBRARY")
+endif ()
# Linking with dxcompiler after bundling so that the bundling process
# doesn't see the dxcompiler and end up with unresolved linker errors.
diff --git a/tools/android/webgpu/src/main/cpp/CMakeLists.txt b/tools/android/webgpu/src/main/cpp/CMakeLists.txt
index a58b3b3..44033e0 100644
--- a/tools/android/webgpu/src/main/cpp/CMakeLists.txt
+++ b/tools/android/webgpu/src/main/cpp/CMakeLists.txt
@@ -41,19 +41,27 @@
set(C_BINDINGS_PATH ../../../../../../out/Debug/gen/cpp)
-add_library(native_dawn ${C_BINDINGS_PATH}/methods.cpp ${C_BINDINGS_PATH}/structures.cpp Util.cpp ${CMAKE_SOURCE_DIR}/gen/include/dawn/webgpu.h)
-
-target_link_libraries(native_dawn webgpu_dawn)
+find_package(Python3 REQUIRED)
+DawnJSONGenerator(
+ TARGET "webgpu_dawn_native_proc"
+ PRINT_NAME "Dawn native WebGPU procs"
+ OUTPUT_SOURCES WEBGPU_DAWN_NATIVE_PROC_GEN_SOURCES)
list(INSERT CMAKE_MODULE_PATH 0 "${Dawn_SOURCE_DIR}/src/cmake")
include(BundleLibraries)
-bundle_libraries(webgpu_c_bundled native_dawn)
+bundle_libraries(webgpu_c_bundled dawn_native)
+target_sources(webgpu_c_bundled PRIVATE
+ Util.cpp
+ ${WEBGPU_DAWN_NATIVE_PROC_GEN_SOURCES}
+ ${C_BINDINGS_PATH}/methods.cpp
+ ${C_BINDINGS_PATH}/structures.cpp
+ ${CMAKE_SOURCE_DIR}/gen/include/dawn/webgpu.h)
find_library(log-lib log)
-target_link_libraries(webgpu_c_bundled ${log-lib} android)
+target_link_libraries(webgpu_c_bundled ${log-lib} android dawn_public_config)
-add_custom_command(DEPENDS webgpu_dawn POST_BUILD
+add_custom_command(DEPENDS dawncpp_headers POST_BUILD
OUTPUT ${CMAKE_SOURCE_DIR}/gen/include/dawn/webgpu.h
COMMAND rm -r "${CMAKE_SOURCE_DIR}/gen" || echo
COMMAND ${CMAKE_COMMAND} -E copy