diff --git a/gn/toolchain/BUILD.gn b/gn/toolchain/BUILD.gn
index 4517710946..f49d3b9b39 100644
--- a/gn/toolchain/BUILD.gn
+++ b/gn/toolchain/BUILD.gn
@@ -67,7 +67,7 @@ toolchain("msvc") {
   if (target_cpu == "x86") {
     # Toolchain asset includes a script that configures for x86 building.
     # We don't support x86 builds with local MSVC installations.
-    env_setup = "$shell $win_sdk/bin/SetEnv.cmd /x86 && "
+    # env_setup = "$shell $win_sdk/bin/SetEnv.cmd /x86 && "
   } else if (target_cpu == "arm64") {
     # ARM64 compiler is incomplete - it relies on DLLs located in the host toolchain directory.
     env_setup = "$shell set \"PATH=%PATH%;$win_vc\\Tools\\MSVC\\$win_toolchain_version\\bin\\HostX64\\x64\" && "
@@ -201,7 +201,7 @@ toolchain("msvc") {
 
   tool("copy") {
     cp_py = rebase_path("../cp.py")
-    command = "python \"$cp_py\" {{source}} {{output}}"
+    command = "$shell python \"$cp_py\" {{source}} {{output}}"
     description = "copy {{source}} {{output}}"
   }
 }
@@ -341,13 +341,13 @@ template("gcc_like_toolchain") {
 
     tool("copy") {
       cp_py = rebase_path("../cp.py")
-      command = "python \"$cp_py\" {{source}} {{output}}"
+      command = "$shell python \"$cp_py\" {{source}} {{output}}"
       description = "copy {{source}} {{output}}"
     }
 
     tool("copy_bundle_data") {
       cp_py = rebase_path("../cp.py")
-      command = "python \"$cp_py\" {{source}} {{output}}"
+      command = "$shell python \"$cp_py\" {{source}} {{output}}"
       description = "copy_bundle_data {{source}} {{output}}"
     }
 
diff --git a/include/core/SkM44.h b/include/core/SkM44.h
index 63b3ac140b..d32921d96e 100644
--- a/include/core/SkM44.h
+++ b/include/core/SkM44.h
@@ -405,7 +405,7 @@ private:
     friend class SkMatrixPriv;
 };
 
-SkM44 Sk3LookAt(const SkV3& eye, const SkV3& center, const SkV3& up);
-SkM44 Sk3Perspective(float near, float far, float angle);
+SK_API SkM44 Sk3LookAt(const SkV3& eye, const SkV3& center, const SkV3& up);
+SK_API SkM44 Sk3Perspective(float near, float far, float angle);
 
 #endif
diff --git a/include/core/SkString.h b/include/core/SkString.h
index 6f1d972da2..5bee2dc218 100644
--- a/include/core/SkString.h
+++ b/include/core/SkString.h
@@ -270,7 +270,7 @@ private:
 };
 
 /// Creates a new string and writes into it using a printf()-style format.
-SkString SkStringPrintf(const char* format, ...) SK_PRINTF_LIKE(1, 2);
+SK_API SkString SkStringPrintf(const char* format, ...) SK_PRINTF_LIKE(1, 2);
 /// This makes it easier to write a caller as a VAR_ARGS function where the format string is
 /// optional.
 static inline SkString SkStringPrintf() { return SkString(); }
diff --git a/include/private/SkThreadID.h b/include/private/SkThreadID.h
index 06b9be7317..2764370405 100644
--- a/include/private/SkThreadID.h
+++ b/include/private/SkThreadID.h
@@ -12,7 +12,7 @@
 
 typedef int64_t SkThreadID;
 
-SkThreadID SkGetThreadID();
+SK_API SkThreadID SkGetThreadID();
 
 const SkThreadID kIllegalThreadID = 0;
 
diff --git a/include/utils/SkCustomTypeface.h b/include/utils/SkCustomTypeface.h
index 61f32afed5..ffe3ad8d34 100644
--- a/include/utils/SkCustomTypeface.h
+++ b/include/utils/SkCustomTypeface.h
@@ -19,7 +19,7 @@
 
 class SkStream;
 
-class SkCustomTypefaceBuilder {
+class SK_API SkCustomTypefaceBuilder {
 public:
     SkCustomTypefaceBuilder();
 
diff --git a/modules/skottie/include/Skottie.h b/modules/skottie/include/Skottie.h
index c519068b43..ecb2debf8e 100644
--- a/modules/skottie/include/Skottie.h
+++ b/modules/skottie/include/Skottie.h
@@ -43,7 +43,7 @@ using ResourceProvider = skresources::ResourceProvider;
 /**
  * A Logger subclass can be used to receive Animation::Builder parsing errors and warnings.
  */
-class SK_API Logger : public SkRefCnt {
+class Logger : public SkRefCnt {
 public:
     enum class Level {
         kWarning,
@@ -56,13 +56,13 @@ public:
 /**
  * Interface for receiving AE composition markers at Animation build time.
  */
-class SK_API MarkerObserver : public SkRefCnt {
+class MarkerObserver : public SkRefCnt {
 public:
     // t0,t1 are in the Animation::seek() domain.
     virtual void onMarker(const char name[], float t0, float t1) = 0;
 };
 
-class SK_API Animation : public SkNVRefCnt<Animation> {
+class Animation : public SkNVRefCnt<Animation> {
 public:
     class Builder final {
     public:
diff --git a/modules/skottie/include/SkottieProperty.h b/modules/skottie/include/SkottieProperty.h
index 2355984b86..fbc08544f9 100644
--- a/modules/skottie/include/SkottieProperty.h
+++ b/modules/skottie/include/SkottieProperty.h
@@ -70,7 +70,7 @@ namespace internal { class AnimationBuilder; }
  * and the internal scene-graph representation.
  */
 template <typename ValueT, typename NodeT>
-class SK_API PropertyHandle final {
+class PropertyHandle final {
 public:
     explicit PropertyHandle(sk_sp<NodeT> node) : fNode(std::move(node)) {}
     ~PropertyHandle();
@@ -106,7 +106,7 @@ using TransformPropertyHandle = PropertyHandle<TransformPropertyValue,
  * various properties of layer and shape nodes.  The |node_name| argument corresponds to the
  * name ("nm") node property.
  */
-class SK_API PropertyObserver : public SkRefCnt {
+class PropertyObserver : public SkRefCnt {
 public:
     template <typename T>
     using LazyHandle = std::function<std::unique_ptr<T>()>;
diff --git a/modules/skresources/include/SkResources.h b/modules/skresources/include/SkResources.h
index c5bdb81dfa..af6b2baa36 100644
--- a/modules/skresources/include/SkResources.h
+++ b/modules/skresources/include/SkResources.h
@@ -26,7 +26,7 @@ namespace skresources {
 /**
  * Image asset proxy interface.
  */
-class SK_API ImageAsset : public SkRefCnt {
+class ImageAsset : public SkRefCnt {
 public:
     /**
      * Returns true if the image asset is animated.
@@ -75,7 +75,7 @@ private:
  * ResourceProvider is an interface that lets rich-content modules defer loading of external
  * resources (images, fonts, etc.) to embedding clients.
  */
-class SK_API ResourceProvider : public SkRefCnt {
+class ResourceProvider : public SkRefCnt {
 public:
     /**
      * Load a generic resource (currently only nested animations) specified by |path| + |name|,
diff --git a/modules/sksg/BUILD.gn b/modules/sksg/BUILD.gn
index 3bf998b173..319a4d522e 100644
--- a/modules/sksg/BUILD.gn
+++ b/modules/sksg/BUILD.gn
@@ -9,7 +9,7 @@ config("public_config") {
   include_dirs = [ "include" ]
 }
 
-component("sksg") {
+static_library("sksg") {
   check_includes = false
   import("sksg.gni")
   public_configs = [ ":public_config" ]
diff --git a/src/core/SkTextBlobPriv.h b/src/core/SkTextBlobPriv.h
index 5394b50d5d..2fa56a9cab 100644
--- a/src/core/SkTextBlobPriv.h
+++ b/src/core/SkTextBlobPriv.h
@@ -199,7 +199,7 @@ private:
  *         .....
  *    }
  */
-class SkTextBlobRunIterator {
+class SK_API SkTextBlobRunIterator {
 public:
     SkTextBlobRunIterator(const SkTextBlob* blob);
 
diff --git a/src/utils/SkJSON.h b/src/utils/SkJSON.h
index d3f0b1d48f..970d64cd5b 100644
--- a/src/utils/SkJSON.h
+++ b/src/utils/SkJSON.h
@@ -53,7 +53,7 @@ namespace skjson {
  *         }
  *     }
  */
-class alignas(8) Value {
+class SK_API alignas(8) Value {
 public:
     enum class Type {
         kNull,
@@ -209,7 +209,7 @@ private:
 #endif
 };
 
-class NullValue final : public Value {
+class SK_API NullValue final : public Value {
 public:
     static constexpr Type kType = Type::kNull;
 
@@ -321,7 +321,7 @@ struct Member {
           Value fValue;
 };
 
-class ObjectValue final : public VectorValue<Member, Value::Type::kObject> {
+class SK_API ObjectValue final : public VectorValue<Member, Value::Type::kObject> {
 public:
     ObjectValue(const Member* src, size_t size, SkArenaAlloc& alloc);
 
@@ -332,7 +332,7 @@ public:
     }
 };
 
-class DOM final : public SkNoncopyable {
+class SK_API DOM final : public SkNoncopyable {
 public:
     DOM(const char*, size_t);