[bazel] Add support for local builds to jsfiddle,shaders,particles,skottie

Change-Id: If06ba1d9c07c5db8ccf4a7239580d18dd714c894
Bug: skia:12776
Reviewed-on: https://skia-review.googlesource.com/c/buildbot/+/494637
Reviewed-by: John Stiles <johnstiles@google.com>
Reviewed-by: Leandro Lovisolo <lovisolo@google.com>
diff --git a/.bazelrc b/.bazelrc
index 423c000..e08951a 100644
--- a/.bazelrc
+++ b/.bazelrc
@@ -139,4 +139,8 @@
 
 # Alias to build configurations below. This makes configuring things from
 # the command line easier.
-build --flag_alias=with_local_debugger=no//debugger-app/wasm_libs:use_debugger_from_container
\ No newline at end of file
+build --flag_alias=with_local_debugger=no//debugger-app/wasm_libs:use_debugger_from_container
+build --flag_alias=with_local_wasm=no//jsfiddle/wasm_libs:use_libraries_from_container
+build --flag_alias=with_local_canvaskit=no//particles/wasm_libs:use_canvaskit_from_container
+build --flag_alias=with_local_canvaskit=no//shaders/wasm_libs:use_canvaskit_from_container
+build --flag_alias=with_local_canvaskit=no//skottie/wasm_libs:use_canvaskit_from_container
diff --git a/jsfiddle/.gitignore b/jsfiddle/.gitignore
index d163863..ed4c4cb 100644
--- a/jsfiddle/.gitignore
+++ b/jsfiddle/.gitignore
@@ -1 +1,2 @@
-build/
\ No newline at end of file
+build/
+wasm_libs/local_build/
\ No newline at end of file
diff --git a/jsfiddle/Makefile b/jsfiddle/Makefile
index f64e2b2..c706e4d 100644
--- a/jsfiddle/Makefile
+++ b/jsfiddle/Makefile
@@ -38,6 +38,13 @@
 run-local-instance: build
 	../_bazel_bin/jsfiddle/go/jsfiddle/jsfiddle_/jsfiddle --local --resources_dir ../_bazel_bin/jsfiddle/pages/development
 
+.PHONY: run-with-custom
+run-with-custom:
+	echo "Using the wasm files in //jsfiddle/wasm_libs/local_build"
+	$(BAZEL) build //jsfiddle/... --with_local_wasm
+	../_bazel_bin/jsfiddle/go/jsfiddle/jsfiddle_/jsfiddle \
+        --local --resources_dir ../_bazel_bin/jsfiddle/pages/development
+
 .PHONY: build-placeholders
 build-placeholders:
 	rm -rf build
diff --git a/jsfiddle/README.md b/jsfiddle/README.md
index 9e66f9c..8b0f485 100644
--- a/jsfiddle/README.md
+++ b/jsfiddle/README.md
@@ -12,4 +12,11 @@
 `gcr.io/skia-public/skia-wasm-release:prod`. See ./wasm_libs/BUILD.bazel for more.
 
 When deploying, we look in ./build and use the files there. The files checked in to build are just
-empty placeholders. The real ones will be provided through our build pipeline.
\ No newline at end of file
+empty placeholders. The real ones will be provided through our build pipeline.
+
+To run jsfiddle locally with a custom build of CanvasKit/PathKit, copy the files to
+//jsfiddle/wasm_libs/local_build and run:
+```
+make run-with-custom
+```
+Do not check in those files you copied.
\ No newline at end of file
diff --git a/jsfiddle/wasm_libs/BUILD.bazel b/jsfiddle/wasm_libs/BUILD.bazel
index 3a995b3..4847704 100644
--- a/jsfiddle/wasm_libs/BUILD.bazel
+++ b/jsfiddle/wasm_libs/BUILD.bazel
@@ -1,4 +1,9 @@
-load("//infra-sk:index.bzl", "extract_files_from_skia_wasm_container")
+load("//infra-sk:index.bzl", "bool_flag", "extract_files_from_skia_wasm_container")
+
+bool_flag(
+    default = True,
+    flag_name = "use_libraries_from_container",
+)
 
 # This target makes the wasm binaries and js files available for tests. This is not the same
 # as ../build because we want to be able to control which binaries get used when we deploy a
@@ -7,11 +12,11 @@
     name = "fetch_canvaskit_wasm",
     testonly = True,
     outs = [
-        "canvaskit.d.ts",
-        "canvaskit.js",
-        "canvaskit.wasm",
-        "pathkit.js",
-        "pathkit.wasm",
+        "from_container/canvaskit.d.ts",
+        "from_container/canvaskit.js",
+        "from_container/canvaskit.wasm",
+        "from_container/pathkit.js",
+        "from_container/pathkit.wasm",
     ],
     container_files = [
         "/tmp/canvaskit/canvaskit.d.ts",
@@ -23,6 +28,51 @@
     visibility = ["//jsfiddle:__subpackages__"],
 )
 
+filegroup(
+    name = "canvaskit.d.ts",
+    srcs = select({
+        ":use_libraries_from_container_true": ["from_container/canvaskit.d.ts"],
+        ":use_libraries_from_container_false": ["local_build/canvaskit.d.ts"],
+    }),
+    visibility = ["//jsfiddle:__subpackages__"],
+)
+
+filegroup(
+    name = "canvaskit.js",
+    srcs = select({
+        ":use_libraries_from_container_true": ["from_container/canvaskit.js"],
+        ":use_libraries_from_container_false": ["local_build/canvaskit.js"],
+    }),
+    visibility = ["//jsfiddle:__subpackages__"],
+)
+
+filegroup(
+    name = "canvaskit.wasm",
+    srcs = select({
+        ":use_libraries_from_container_true": ["from_container/canvaskit.wasm"],
+        ":use_libraries_from_container_false": ["local_build/canvaskit.wasm"],
+    }),
+    visibility = ["//jsfiddle:__subpackages__"],
+)
+
+filegroup(
+    name = "pathkit.js",
+    srcs = select({
+        ":use_libraries_from_container_true": ["from_container/pathkit.js"],
+        ":use_libraries_from_container_false": ["local_build/pathkit.js"],
+    }),
+    visibility = ["//jsfiddle:__subpackages__"],
+)
+
+filegroup(
+    name = "pathkit.wasm",
+    srcs = select({
+        ":use_libraries_from_container_true": ["from_container/pathkit.wasm"],
+        ":use_libraries_from_container_false": ["local_build/pathkit.wasm"],
+    }),
+    visibility = ["//jsfiddle:__subpackages__"],
+)
+
 genrule(
     name = "make version file",
     outs = ["version.js"],
diff --git a/particles/.gitignore b/particles/.gitignore
index c795b05..ba31a79 100644
--- a/particles/.gitignore
+++ b/particles/.gitignore
@@ -1 +1,2 @@
-build
\ No newline at end of file
+build
+wasm_libs/local_build/
diff --git a/particles/Makefile b/particles/Makefile
index 5d18bee..4baea91 100644
--- a/particles/Makefile
+++ b/particles/Makefile
@@ -43,6 +43,13 @@
 		--resources_dir ../_bazel_bin/particles/pages/development \
 		--scrapexchange=http://localhost:9000
 
+.PHONY: run-with-custom
+run-with-custom:
+	echo "Using the wasm files in //particles/wasm_libs/local_build"
+	$(BAZEL) build //particles/... --with_local_canvaskit
+	../_bazel_bin/particles/go/particles/particles_/particles --local \
+		--resources_dir ../_bazel_bin/particles/pages/development \
+		--scrapexchange=http://localhost:9000
 
 .PHONY: build-placeholders
 build-placeholders:
@@ -50,4 +57,4 @@
 	mkdir -p build/canvaskit
 	touch build/canvaskit/canvaskit.js
 	touch build/canvaskit/canvaskit.wasm
-	touch build/version.js
\ No newline at end of file
+	touch build/version.js
diff --git a/particles/README.md b/particles/README.md
index 4dd0688..3e18b80 100644
--- a/particles/README.md
+++ b/particles/README.md
@@ -3,3 +3,9 @@
 
 A web application for demoing the Skia particle system.
 
+To run particles locally with a custom build of CanvasKit, copy the files to
+//particles/wasm_libs/local_build and run:
+```
+make run-with-custom
+```
+Do not check in those files you copied.
diff --git a/particles/wasm_libs/BUILD.bazel b/particles/wasm_libs/BUILD.bazel
index b5b31e9..ee35001 100644
--- a/particles/wasm_libs/BUILD.bazel
+++ b/particles/wasm_libs/BUILD.bazel
@@ -1,4 +1,9 @@
-load("//infra-sk:index.bzl", "extract_files_from_skia_wasm_container")
+load("//infra-sk:index.bzl", "bool_flag", "extract_files_from_skia_wasm_container")
+
+bool_flag(
+    default = True,
+    flag_name = "use_canvaskit_from_container",
+)
 
 # This target makes the canvaskit js and wasm binaries available for tests. This is not the same
 # as ../build because we want to be able to control which binaries get used when we deploy a
@@ -7,8 +12,8 @@
     name = "canvaskit_wasm",
     testonly = True,
     outs = [
-        "canvaskit.js",
-        "canvaskit.wasm",
+        "from_container/canvaskit.js",
+        "from_container/canvaskit.wasm",
     ],
     container_files = [
         "/tmp/canvaskit/canvaskit.js",
@@ -17,6 +22,24 @@
     visibility = ["//particles:__subpackages__"],
 )
 
+filegroup(
+    name = "canvaskit.js",
+    srcs = select({
+        ":use_canvaskit_from_container_true": ["from_container/canvaskit.js"],
+        ":use_canvaskit_from_container_false": ["local_build/canvaskit.js"],
+    }),
+    visibility = ["//particles:__subpackages__"],
+)
+
+filegroup(
+    name = "canvaskit.wasm",
+    srcs = select({
+        ":use_canvaskit_from_container_true": ["from_container/canvaskit.wasm"],
+        ":use_canvaskit_from_container_false": ["local_build/canvaskit.wasm"],
+    }),
+    visibility = ["//particles:__subpackages__"],
+)
+
 genrule(
     name = "make version file",
     outs = ["version.js"],
diff --git a/shaders/.gitignore b/shaders/.gitignore
index 567609b..550a6e3 100644
--- a/shaders/.gitignore
+++ b/shaders/.gitignore
@@ -1 +1,2 @@
 build/
+wsam_libs/local_build/
diff --git a/shaders/Makefile b/shaders/Makefile
index df62e83..ad138a7 100644
--- a/shaders/Makefile
+++ b/shaders/Makefile
@@ -44,6 +44,16 @@
 		--port=:8001 \
 		--prom_port=:20001
 
+.PHONY: run-with-custom
+run-with-custom:
+	echo "Using the wasm files in //shaders/wasm_libs/local_build"
+	$(BAZEL) build //shaders/... --with_local_canvaskit
+	../_bazel_bin/shaders/go/shaders/shaders_/shaders --local \
+		--resources_dir ../_bazel_bin/shaders/pages/development \
+		--scrapexchange=http://localhost:9000 \
+		--port=:8001 \
+		--prom_port=:20001
+
 .PHONY: build-placeholders
 build-placeholders:
 	rm -rf build
diff --git a/shaders/README.md b/shaders/README.md
index 4a8fc9b..8db7d2e 100644
--- a/shaders/README.md
+++ b/shaders/README.md
@@ -3,6 +3,13 @@
 This is the code for https://shaders.skia.org, a site to allow editing and
 running SkSL shaders using WASM in the browser.
 
+To run shaders locally with a custom build of CanvasKit, copy the files to
+//shaders/wasm_libs/local_build and run:
+```
+make run-with-custom
+```
+Do not check in those files you copied.
+
 ## Images
 
 Source images are stored in `gs://skia-public-shader-images` and should be make
diff --git a/shaders/wasm_libs/BUILD.bazel b/shaders/wasm_libs/BUILD.bazel
index 77a5a6c..8fd69ae 100644
--- a/shaders/wasm_libs/BUILD.bazel
+++ b/shaders/wasm_libs/BUILD.bazel
@@ -1,4 +1,9 @@
-load("//infra-sk:index.bzl", "extract_files_from_skia_wasm_container")
+load("//infra-sk:index.bzl", "bool_flag", "extract_files_from_skia_wasm_container")
+
+bool_flag(
+    default = True,
+    flag_name = "use_canvaskit_from_container",
+)
 
 # This target makes the canvaskit js and wasm binaries available for tests. This is not the same
 # as ../build because we want to be able to control which binaries get used when we deploy a
@@ -7,8 +12,8 @@
     name = "fetch_canvaskit_wasm",
     testonly = True,
     outs = [
-        "canvaskit.js",
-        "canvaskit.wasm",
+        "from_container/canvaskit.js",
+        "from_container/canvaskit.wasm",
     ],
     container_files = [
         "/tmp/canvaskit/canvaskit.js",
@@ -17,6 +22,24 @@
     visibility = ["//shaders:__subpackages__"],
 )
 
+filegroup(
+    name = "canvaskit.js",
+    srcs = select({
+        ":use_canvaskit_from_container_true": ["from_container/canvaskit.js"],
+        ":use_canvaskit_from_container_false": ["local_build/canvaskit.js"],
+    }),
+    visibility = ["//shaders:__subpackages__"],
+)
+
+filegroup(
+    name = "canvaskit.wasm",
+    srcs = select({
+        ":use_canvaskit_from_container_true": ["from_container/canvaskit.wasm"],
+        ":use_canvaskit_from_container_false": ["local_build/canvaskit.wasm"],
+    }),
+    visibility = ["//shaders:__subpackages__"],
+)
+
 genrule(
     name = "make version file",
     outs = ["version.js"],
diff --git a/skottie/.gitignore b/skottie/.gitignore
index 378eac2..ba31a79 100644
--- a/skottie/.gitignore
+++ b/skottie/.gitignore
@@ -1 +1,2 @@
 build
+wasm_libs/local_build/
diff --git a/skottie/Makefile b/skottie/Makefile
index ad1c7e0..887b93e 100644
--- a/skottie/Makefile
+++ b/skottie/Makefile
@@ -40,9 +40,16 @@
 	../_bazel_bin/skottie/go/skottie/skottie_/skottie \
 		--config ./local_config.json5
 
+.PHONY: run-with-custom
+run-with-custom:
+	echo "Using the wasm files in //skottie/wasm_libs/local_build"
+	$(BAZEL) build //skottie/... --with_local_canvaskit
+	../_bazel_bin/skottie/go/skottie/skottie_/skottie \
+		--config ./local_config.json5
+
 build-placeholders:
 	rm -rf build
 	mkdir -p build/canvaskit
 	touch build/canvaskit/canvaskit.js
 	touch build/canvaskit/canvaskit.wasm
-	touch build/version.js
\ No newline at end of file
+	touch build/version.js
diff --git a/skottie/README.md b/skottie/README.md
index f602370..a09dde0 100644
--- a/skottie/README.md
+++ b/skottie/README.md
@@ -13,4 +13,11 @@
 `gcr.io/skia-public/skia-wasm-release:prod`. See ./wasm_libs/BUILD.bazel for more.
 
 When deploying, we look in ./build and use the files there. The files checked in to build are just
-empty placeholders. The real ones will be provided through our build pipeline.
\ No newline at end of file
+empty placeholders. The real ones will be provided through our build pipeline.
+
+To run skottie locally with a custom build of CanvasKit, copy the files to
+//skottie/wasm_libs/local_build and run:
+```
+make run-with-custom
+```
+Do not check in those files you copied.
diff --git a/skottie/wasm_libs/BUILD.bazel b/skottie/wasm_libs/BUILD.bazel
index b02ddb5..191067e 100644
--- a/skottie/wasm_libs/BUILD.bazel
+++ b/skottie/wasm_libs/BUILD.bazel
@@ -1,4 +1,9 @@
-load("//infra-sk:index.bzl", "extract_files_from_skia_wasm_container")
+load("//infra-sk:index.bzl", "bool_flag", "extract_files_from_skia_wasm_container")
+
+bool_flag(
+    default = True,
+    flag_name = "use_canvaskit_from_container",
+)
 
 # This target makes the canvaskit js and wasm binaries available for tests. This is not the same
 # as ../build because we want to be able to control which binaries get used when we deploy a
@@ -7,9 +12,9 @@
     name = "fetch_canvaskit_wasm",
     testonly = True,
     outs = [
-        "canvaskit.d.ts",
-        "canvaskit.js",
-        "canvaskit.wasm",
+        "from_container/canvaskit.d.ts",
+        "from_container/canvaskit.js",
+        "from_container/canvaskit.wasm",
     ],
     container_files = [
         "/tmp/canvaskit/canvaskit.d.ts",
@@ -19,6 +24,33 @@
     visibility = ["//skottie:__subpackages__"],
 )
 
+filegroup(
+    name = "canvaskit.d.ts",
+    srcs = select({
+        ":use_canvaskit_from_container_true": ["from_container/canvaskit.d.ts"],
+        ":use_canvaskit_from_container_false": ["local_build/canvaskit.d.ts"],
+    }),
+    visibility = ["//skottie:__subpackages__"],
+)
+
+filegroup(
+    name = "canvaskit.js",
+    srcs = select({
+        ":use_canvaskit_from_container_true": ["from_container/canvaskit.js"],
+        ":use_canvaskit_from_container_false": ["local_build/canvaskit.js"],
+    }),
+    visibility = ["//skottie:__subpackages__"],
+)
+
+filegroup(
+    name = "canvaskit.wasm",
+    srcs = select({
+        ":use_canvaskit_from_container_true": ["from_container/canvaskit.wasm"],
+        ":use_canvaskit_from_container_false": ["local_build/canvaskit.wasm"],
+    }),
+    visibility = ["//skottie:__subpackages__"],
+)
+
 genrule(
     name = "make version file",
     outs = ["version.js"],