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)