pw_polyfill: Split up the polyfill targets

Splits up the build rules for the polyfill targets to get ready
for explicit polyfill dependencies in Pigweed libraries instead of
relying on a blanket polyfill across the board.

Bug: 602
Bug: 603
Change-Id: Ibbdb8b1619d026a10fcaa18041783798b1b01f04
Reviewed-on: https://pigweed-review.googlesource.com/c/pigweed/pigweed/+/78587
Pigweed-Auto-Submit: Ewout van Bekkum <ewout@google.com>
Reviewed-by: Wyatt Hepler <hepler@google.com>
Commit-Queue: Auto-Submit <auto-submit@pigweed.google.com.iam.gserviceaccount.com>
diff --git a/pw_build/defaults.gni b/pw_build/defaults.gni
index 80a28e2..dc258fa 100644
--- a/pw_build/defaults.gni
+++ b/pw_build/defaults.gni
@@ -41,6 +41,8 @@
     "$dir_pw_build:cpp17",
     "$dir_pw_build:relative_paths",
   ]
+
+  # TODO(pwbug/602): Remove this once all uses explicitly depend on polyfills.
   public_deps += [ "$dir_pw_polyfill:overrides" ]
 }
 
diff --git a/pw_polyfill/BUILD.bazel b/pw_polyfill/BUILD.bazel
index 6612c53..9b3795f 100644
--- a/pw_polyfill/BUILD.bazel
+++ b/pw_polyfill/BUILD.bazel
@@ -50,29 +50,87 @@
         "public/pw_polyfill/standard.h",
     ],
     includes = ["public"],
+)
+
+# TODO(pwbug/602): Deprecate this once all users have been migrated to targeted
+# polyfill deps.
+pw_cc_library(
+    name = "overrides",
+    deps = [
+        ":bit",
+        ":cstddef",
+        ":iterator",
+        ":span",
+        ":type_traits",
+    ],
+)
+
+# Provides <bit>'s std::endian.
+pw_cc_library(
+    name = "bit",
+    hdrs = [
+        "public_overrides/bit",
+        "standard_library_public/pw_polyfill/standard_library/bit.h",
+    ],
+    includes = [
+        "public_overrides",
+        "standard_library_public",
+    ],
     deps = [":standard_library"],
 )
 
+# Provides <cstddef>'s std::byte.
 pw_cc_library(
-    name = "overrides",
+    name = "cstddef",
     hdrs = [
-        "public_overrides/bit",
         "public_overrides/cstddef",
-        "public_overrides/iterator",
-        "public_overrides/type_traits",
+        "standard_library_public/pw_polyfill/standard_library/cstddef.h",
     ],
-    includes = ["public_overrides"],
+    includes = [
+        "public_overrides",
+        "standard_library_public",
+    ],
+    deps = [":standard_library"],
+)
+
+# TODO(pwbug/603): Remove this polyfill.
+pw_cc_library(
+    name = "iterator",
+    hdrs = [
+        "public_overrides/iterator",
+        "standard_library_public/pw_polyfill/standard_library/iterator.h",
+    ],
+    includes = [
+        "public_overrides",
+        "standard_library_public",
+    ],
+    deps = [":standard_library"],
+)
+
+# Provides <span>.
+pw_cc_library(
+    name = "span",
+    deps = ["//pw_span"],
+)
+
+# TODO(pwbug/603): Remove this polyfill.
+pw_cc_library(
+    name = "type_traits",
+    hdrs = [
+        "public_overrides/type_traits",
+        "standard_library_public/pw_polyfill/standard_library/type_traits.h",
+    ],
+    includes = [
+        "public_overrides",
+        "standard_library_public",
+    ],
     deps = [":standard_library"],
 )
 
 pw_cc_library(
     name = "standard_library",
     hdrs = [
-        "standard_library_public/pw_polyfill/standard_library/bit.h",
-        "standard_library_public/pw_polyfill/standard_library/cstddef.h",
-        "standard_library_public/pw_polyfill/standard_library/iterator.h",
         "standard_library_public/pw_polyfill/standard_library/namespace.h",
-        "standard_library_public/pw_polyfill/standard_library/type_traits.h",
     ],
     includes = ["standard_library_public"],
     visibility = ["//visibility:private"],
diff --git a/pw_polyfill/BUILD.gn b/pw_polyfill/BUILD.gn
index 59c0bd4..1c0cd4b 100644
--- a/pw_polyfill/BUILD.gn
+++ b/pw_polyfill/BUILD.gn
@@ -18,13 +18,13 @@
 import("$dir_pw_docgen/docs.gni")
 import("$dir_pw_unit_test/test.gni")
 
-config("public") {
+config("public_include_path") {
   include_dirs = [ "public" ]
   visibility = [ ":*" ]
 }
 
 pw_source_set("pw_polyfill") {
-  public_configs = [ ":public" ]
+  public_configs = [ ":public_include_path" ]
   remove_public_deps = [ "*" ]
   public_deps = [ ":standard_library" ]
   public = [
@@ -38,18 +38,15 @@
   visibility = [ ":*" ]
 }
 
-pw_source_set("overrides") {
-  public_configs = [ ":overrides_config" ]
-  remove_public_deps = [ "*" ]
+# TODO(pwbug/602): Remove this overrides target by migrating all users to
+# explicitly depend on the polyfill(s) they require.
+group("overrides") {
   public_deps = [
-    ":standard_library",
-    "$dir_pw_span:polyfill",
-  ]
-  inputs = [
-    "public_overrides/bit",
-    "public_overrides/cstddef",
-    "public_overrides/iterator",
-    "public_overrides/type_traits",
+    ":bit",
+    ":cstddef",
+    ":iterator",
+    ":span",
+    ":type_traits",
   ]
 }
 
@@ -57,20 +54,67 @@
   include_dirs = [ "standard_library_public" ]
 }
 
+# Provides <bit>'s std::endian.
+pw_source_set("bit") {
+  public_configs = [
+    ":standard_library_public",
+    ":overrides_config",
+  ]
+  public_deps = [ ":standard_library" ]
+  remove_public_deps = [ "*" ]
+  inputs = [ "public_overrides/bit" ]
+  public = [ "standard_library_public/pw_polyfill/standard_library/bit.h" ]
+}
+
+# Provides <cstddef>'s std::byte.
+pw_source_set("cstddef") {
+  public_configs = [
+    ":standard_library_public",
+    ":overrides_config",
+  ]
+  public_deps = [ ":standard_library" ]
+  remove_public_deps = [ "*" ]
+  inputs = [ "public_overrides/cstddef" ]
+  public = [ "standard_library_public/pw_polyfill/standard_library/cstddef.h" ]
+}
+
+# TODO(pwbug/603): Remove this polyfill.
+pw_source_set("iterator") {
+  public_configs = [
+    ":standard_library_public",
+    ":overrides_config",
+  ]
+  public_deps = [ ":standard_library" ]
+  remove_public_deps = [ "*" ]
+  inputs = [ "public_overrides/iterator" ]
+  public = [ "standard_library_public/pw_polyfill/standard_library/iterator.h" ]
+}
+
+# Provides <span>.
+pw_source_set("span") {
+  remove_public_deps = [ "*" ]
+  public_deps = [ "$dir_pw_span:polyfill" ]
+}
+
+# TODO(pwbug/603): Remove this polyfill.
+pw_source_set("type_traits") {
+  public_configs = [
+    ":standard_library_public",
+    ":overrides_config",
+  ]
+  public_deps = [ ":standard_library" ]
+  remove_public_deps = [ "*" ]
+  inputs = [ "public_overrides/type_traits" ]
+  public =
+      [ "standard_library_public/pw_polyfill/standard_library/type_traits.h" ]
+}
+
 pw_source_set("standard_library") {
   public_configs = [ ":standard_library_public" ]
   remove_public_deps = [ "*" ]
-  public = [
-    "standard_library_public/pw_polyfill/standard_library/bit.h",
-    "standard_library_public/pw_polyfill/standard_library/cstddef.h",
-    "standard_library_public/pw_polyfill/standard_library/iterator.h",
-    "standard_library_public/pw_polyfill/standard_library/namespace.h",
-    "standard_library_public/pw_polyfill/standard_library/type_traits.h",
-  ]
-  visibility = [
-    ":overrides",
-    ":pw_polyfill",
-  ]
+  public =
+      [ "standard_library_public/pw_polyfill/standard_library/namespace.h" ]
+  visibility = [ ":*" ]
 }
 
 pw_test_group("tests") {
diff --git a/pw_polyfill/CMakeLists.txt b/pw_polyfill/CMakeLists.txt
index 621271a..c878dd3 100644
--- a/pw_polyfill/CMakeLists.txt
+++ b/pw_polyfill/CMakeLists.txt
@@ -12,19 +12,90 @@
 # License for the specific language governing permissions and limitations under
 # the License.
 
-add_library(pw_polyfill INTERFACE)
-target_include_directories(pw_polyfill INTERFACE public standard_library_public)
+include($ENV{PW_ROOT}/pw_build/pigweed.cmake)
+
+pw_add_module_library(pw_polyfill
+  HEADERS
+    public/pw_polyfill/language_feature_macros.h
+    public/pw_polyfill/standard.h
+  PUBLIC_INCLUDES
+    public
+)
 if(Zephyr_FOUND AND CONFIG_PIGWEED_POLYFILL)
   zephyr_link_libraries(pw_polyfill)
 endif()
 
-add_library(pw_polyfill.overrides INTERFACE)
-target_link_libraries(pw_polyfill.overrides INTERFACE pw_polyfill)
-target_include_directories(pw_polyfill.overrides
-  INTERFACE
-    public_overrides
-    standard_library_public
+# TODO(pwbug/602): Remove this overrides target by migrating all users to
+# explicitly depend on the polyfill(s) they require.
+pw_add_module_library(pw_polyfill.overrides
+  PUBLIC_DEPS
+    pw_polyfill.bit
+    pw_polyfill.cstddef
+    pw_polyfill.iterator
+    pw_polyfill.span
+    pw_polyfill.type_traits
 )
 if(Zephyr_FOUND AND CONFIG_PIGWEED_POLYFILL_OVERRIDES)
   zephyr_link_libraries(pw_polyfill.overrides)
 endif()
+
+# Provides <bit>'s std::endian.
+pw_add_module_library(pw_polyfill.bit
+  HEADERS
+    public_overrides/bit
+    standard_library_public/pw_polyfill/standard_library/bit.h
+  PUBLIC_INCLUDES
+    public_overrides
+    standard_library_public
+  PUBLIC_DEPS
+    pw_polyfill.standard_library
+)
+
+# Provides <cstddef>'s std::byte.
+pw_add_module_library(pw_polyfill.cstddef
+  HEADERS
+    public_overrides/cstddef
+    standard_library_public/pw_polyfill/standard_library/cstddef.h
+  PUBLIC_INCLUDES
+    public_overrides
+    standard_library_public
+  PUBLIC_DEPS
+    pw_polyfill.standard_library
+)
+
+# TODO(pwbug/603): Remove this polyfill.
+pw_add_module_library(pw_polyfill.iterator
+  HEADERS
+    public_overrides/iterator
+    standard_library_public/pw_polyfill/standard_library/iterator.h
+  PUBLIC_INCLUDES
+    public_overrides
+    standard_library_public
+  PUBLIC_DEPS
+    pw_polyfill.standard_library
+)
+
+# Provides <span>.
+pw_add_module_library(pw_polyfill.span
+  PUBLIC_DEPS
+    pw_span
+)
+
+# TODO(pwbug/603): Remove this polyfill.
+pw_add_module_library(pw_polyfill.type_traits
+  HEADERS
+    public_overrides/type_traits
+    standard_library_public/pw_polyfill/standard_library/type_traits.h
+  PUBLIC_INCLUDES
+    public_overrides
+    standard_library_public
+  PUBLIC_DEPS
+    pw_polyfill.standard_library
+)
+
+pw_add_module_library(pw_polyfill.standard_library
+  HEADERS
+    standard_library_public/pw_polyfill/standard_library/namespace.h
+  PUBLIC_INCLUDES
+    standard_library_public
+)
diff --git a/pw_polyfill/docs.rst b/pw_polyfill/docs.rst
index df26e7e..b998c84 100644
--- a/pw_polyfill/docs.rst
+++ b/pw_polyfill/docs.rst
@@ -23,9 +23,17 @@
 compiling with any standard C++14 or newer.
 
 The wrapper headers are in ``public_overrides``. These are provided through the
-``"$dir_pw_polyfill:overrides"`` library, which the GN build adds as a
-dependency for all targets. To apply overrides in Bazel or CMake, depend on the
-``//pw_polyfill:overrides`` or ``pw_polyfill.overrides`` targets.
+``"$dir_pw_polyfill"`` libraries, which the GN build adds as a
+dependency for all targets:
+
+* ``$dir_pw_polyfill:bit``
+* ``$dir_pw_polyfill:cstddef``
+* ``$dir_pw_polyfill:iterator``
+* ``$dir_pw_polyfill:span``
+* ``$dir_pw_polyfill:type_traits``
+
+To apply overrides in Bazel or CMake, depend on the targets you need such as
+``//pw_polyfill:span`` or ``pw_polyfill.span`` as an example.
 
 Backported features
 ===================
diff --git a/pw_span/CMakeLists.txt b/pw_span/CMakeLists.txt
index a0a3b0d..cd29e10 100644
--- a/pw_span/CMakeLists.txt
+++ b/pw_span/CMakeLists.txt
@@ -14,7 +14,11 @@
 
 include($ENV{PW_ROOT}/pw_build/pigweed.cmake)
 
-pw_auto_add_simple_module(pw_span PUBLIC_DEPS pw_polyfill)
+pw_auto_add_simple_module(pw_span
+  PUBLIC_DEPS
+    pw_polyfill
+    pw_polyfill.standard_library
+)
 target_include_directories(pw_span PUBLIC public_overrides)
 
 if(Zephyr_FOUND AND CONFIG_PIGWEED_SPAN)