Add bazel support for disabling enum traits

This adds bazel support for setting the `--no-cc-enum-traits` flag and
adds a test to exercise it.
diff --git a/build_defs.bzl b/build_defs.bzl
index 14e6045..0c1e6a8 100644
--- a/build_defs.bzl
+++ b/build_defs.bzl
@@ -26,7 +26,7 @@
 
 load("@bazel_tools//tools/cpp:toolchain_utils.bzl", "find_cpp_toolchain")
 
-def emboss_cc_library(name, srcs, deps = [], visibility = None, import_dirs = []):
+def emboss_cc_library(name, srcs, deps = [], visibility = None, import_dirs = [], enable_enum_traits = True):
     """Constructs a C++ library from an .emb file."""
     if len(srcs) != 1:
         fail(
@@ -45,6 +45,7 @@
         name = name,
         deps = [":" + name + "_ir"],
         visibility = visibility,
+        enable_enum_traits = enable_enum_traits,
     )
 
 # Full Starlark rules for emboss_library and cc_emboss_library.
@@ -174,6 +175,8 @@
     args.add_all(emboss_info.direct_ir)
     args.add("--output-file")
     args.add_all(headers)
+    if not ctx.attr.enable_enum_traits:
+      args.add("--no-cc-enum-traits")
     ctx.actions.run(
         executable = emboss_cc_compiler,
         arguments = [args],
@@ -222,6 +225,9 @@
         "_emboss_cc_runtime": attr.label(
             default = "@com_google_emboss//runtime/cpp:cpp_utils",
         ),
+        "enable_enum_traits": attr.bool(
+            default = True,
+        ),
     },
     toolchains = ["@bazel_tools//tools/cpp:toolchain_type"],
 )
@@ -244,6 +250,9 @@
             allow_rules = ["emboss_library"],
             allow_files = False,
         ),
+        "enable_enum_traits": attr.bool(
+            default = True,
+        ),
     },
     provides = [CcInfo, EmbossInfo],
 )
diff --git a/compiler/back_end/cpp/BUILD b/compiler/back_end/cpp/BUILD
index e9ae268..1c496d6 100644
--- a/compiler/back_end/cpp/BUILD
+++ b/compiler/back_end/cpp/BUILD
@@ -225,6 +225,17 @@
 )
 
 emboss_cc_test(
+    name = "no_enum_traits_test",
+    srcs = [
+        "testcode/no_enum_traits_test.cc",
+    ],
+    deps = [
+        "//testdata:no_enum_traits_emboss",
+        "@com_google_googletest//:gtest_main",
+    ],
+)
+
+emboss_cc_test(
     name = "start_size_range_test",
     srcs = [
         "testcode/start_size_range_test.cc",
diff --git a/compiler/back_end/cpp/testcode/no_enum_traits_test.cc b/compiler/back_end/cpp/testcode/no_enum_traits_test.cc
new file mode 100644
index 0000000..78dbd90
--- /dev/null
+++ b/compiler/back_end/cpp/testcode/no_enum_traits_test.cc
@@ -0,0 +1,48 @@
+// Copyright 2024 Google LLC
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     https://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+// Tests that an emb compiled with enable_enum_traits = False actually compiles.
+
+#include <stdint.h>
+
+#include <vector>
+
+#include "gmock/gmock.h"
+#include "gtest/gtest.h"
+#include "testdata/no_enum_traits.emb.h"
+
+namespace emboss {
+namespace test {
+namespace {
+
+TEST(NoEnumTraits, Compiles) {
+  ::std::vector<uint8_t> backing_store(1);
+  auto view = MakeBarView(&backing_store);
+  view.foo().Write(Foo::VALUE);
+  EXPECT_TRUE(view.Ok());
+
+  // Check that we don't accidentally include `emboss_text_util.h` via our
+  // generated header.
+#ifdef EMBOSS_RUNTIME_CPP_EMBOSS_TEXT_UTIL_H_
+  const bool emboss_text_util_is_present = true;
+#else
+  const bool emboss_text_util_is_present = false;
+#endif
+
+  EXPECT_FALSE(emboss_text_util_is_present);
+}
+
+}  // namespace
+}  // namespace test
+}  // namespace emboss
diff --git a/testdata/BUILD b/testdata/BUILD
index a04b4a6..a886d39 100644
--- a/testdata/BUILD
+++ b/testdata/BUILD
@@ -242,6 +242,14 @@
 )
 
 emboss_cc_library(
+    name = "no_enum_traits_emboss",
+    srcs = [
+        "no_enum_traits.emb",
+    ],
+    enable_enum_traits = False,
+)
+
+emboss_cc_library(
     name = "start_size_range_emboss",
     srcs = [
         "start_size_range.emb",
diff --git a/testdata/no_enum_traits.emb b/testdata/no_enum_traits.emb
new file mode 100644
index 0000000..bbe295e
--- /dev/null
+++ b/testdata/no_enum_traits.emb
@@ -0,0 +1,24 @@
+# Copyright 2019 Google LLC
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     https://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+-- Test .emb to ensure that compilation succedes if enum traits are disabled.
+
+[$default byte_order: "LittleEndian"]
+[(cpp) namespace: "emboss::test"]
+
+enum Foo:
+  VALUE = 10
+
+struct Bar:
+  0 [+1] Foo foo
\ No newline at end of file