From 79071f0f8b04188b297a0517a6e55b2d3641ab5a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mart=C3=ADn=20Conte=20Mac=20Donell?= Date: Fri, 28 Jan 2022 15:50:39 -0800 Subject: [PATCH] introduce a NOP template for cc (#533) Signed-off-by: Martin Conte Mac Donell --- bazel/BUILD | 9 ++++++ bazel/protobuf.bzl | 5 +++- templates/BUILD.bazel | 1 + templates/ccnop/BUILD.bazel | 15 ++++++++++ templates/ccnop/file.go | 56 +++++++++++++++++++++++++++++++++++++ templates/ccnop/register.go | 18 ++++++++++++ templates/pkg.go | 10 +++++-- 7 files changed, 110 insertions(+), 4 deletions(-) create mode 100644 templates/ccnop/BUILD.bazel create mode 100644 templates/ccnop/file.go create mode 100644 templates/ccnop/register.go diff --git a/bazel/BUILD b/bazel/BUILD index f27654f25..d7fa13632 100644 --- a/bazel/BUILD +++ b/bazel/BUILD @@ -1,5 +1,14 @@ +load("@bazel_skylib//rules:common_settings.bzl", "string_flag") + config_setting( name = "windows_x86_64", values = {"cpu": "x64_windows"}, visibility = ["//visibility:public"], ) + +string_flag( + name = "template-flavor", + build_setting_default = "", + visibility = ["//visibility:public"], +) + diff --git a/bazel/protobuf.bzl b/bazel/protobuf.bzl index a5585e749..62f0869a0 100644 --- a/bazel/protobuf.bzl +++ b/bazel/protobuf.bzl @@ -1,3 +1,4 @@ +load("@bazel_skylib//rules:common_settings.bzl", "BuildSettingInfo") load("@bazel_tools//tools/jdk:toolchain_utils.bzl", "find_java_runtime_toolchain", "find_java_toolchain") load("@rules_proto//proto:defs.bzl", "ProtoInfo") @@ -44,6 +45,7 @@ def _output_dir(ctx): def _protoc_gen_validate_cc_impl(ctx): """Generate C++ protos using protoc-gen-validate plugin""" + flavor = ctx.attr._flavor[BuildSettingInfo].value or "" protos = _proto_sources(ctx) out_files = [] @@ -54,7 +56,7 @@ def _protoc_gen_validate_cc_impl(ctx): dir_out = _output_dir(ctx) args = [ - "--validate_out=lang=cc:" + dir_out, + "--validate_out=lang=cc" + flavor + ":" + dir_out, ] return _protoc_gen_validate_impl( @@ -119,6 +121,7 @@ cc_proto_gen_validate = rule( allow_files = True, executable = True, ), + "_flavor": attr.label(default = ":template-flavor"), }, output_to_genfiles = True, implementation = _protoc_gen_validate_cc_impl, diff --git a/templates/BUILD.bazel b/templates/BUILD.bazel index 5bf8cf3b5..913040d0b 100644 --- a/templates/BUILD.bazel +++ b/templates/BUILD.bazel @@ -7,6 +7,7 @@ go_library( visibility = ["//visibility:public"], deps = [ "//templates/cc", + "//templates/ccnop", "//templates/go", "//templates/java", "//templates/shared", diff --git a/templates/ccnop/BUILD.bazel b/templates/ccnop/BUILD.bazel new file mode 100644 index 000000000..6d7d3223b --- /dev/null +++ b/templates/ccnop/BUILD.bazel @@ -0,0 +1,15 @@ +load("@io_bazel_rules_go//go:def.bzl", "go_library") + +go_library( + name = "ccnop", + srcs = [ + "file.go", + "register.go", + ], + importpath = "github.com/envoyproxy/protoc-gen-validate/templates/ccnop", + visibility = ["//visibility:public"], + deps = [ + "//templates/cc", + "@com_github_lyft_protoc_gen_star//:protoc-gen-star", + ], +) diff --git a/templates/ccnop/file.go b/templates/ccnop/file.go new file mode 100644 index 000000000..7a3b7b2bb --- /dev/null +++ b/templates/ccnop/file.go @@ -0,0 +1,56 @@ +package ccnop + +const headerFileTpl = `// Code generated by protoc-gen-validate +// source: {{ .InputPath }} +// DO NOT EDIT!!! + +#pragma once + +#include + +#include "validate/validate.h" +#include "{{ output .File ".h" }}" + +{{ range .Package.ProtoName.Split }} +namespace {{ . }} { +{{- end }} + +using std::string; + +{{ range .AllMessages }} + extern inline bool Validate(__attribute__((unused)) const {{ class . }}& m, __attribute__((unused)) pgv::ValidationMsg* err) { return true; } +{{ end }} + +{{ range .Package.ProtoName.Split -}} +} // namespace +{{ end }} + +#define X_{{ .Package.ProtoName.ScreamingSnakeCase }}_{{ .File.InputPath.BaseName | screaming_snake_case }}(X) \ +{{ range .AllMessages -}} +{{- if not (ignored .) -}} + X({{class . }}) \ +{{ end -}} +{{ end }} +` + +const moduleFileTpl = `// Code generated by protoc-gen-validate +// source: {{ .InputPath }} +// DO NOT EDIT!!! + +#include "{{ output .File ".validate.h" }}" + +namespace pgv { +namespace validate { +using std::string; + +{{ range .AllMessages }} +{{- if not (ignored .) -}} +{{- if not (disabled .) -}} +pgv::Validator<{{ class . }}> {{ staticVarName . }}(static_cast({{ package .}}::Validate)); +{{- end -}} +{{ end }} +{{ end }} + +} // namespace validate +} // namespace pgv +` diff --git a/templates/ccnop/register.go b/templates/ccnop/register.go new file mode 100644 index 000000000..a15e857bf --- /dev/null +++ b/templates/ccnop/register.go @@ -0,0 +1,18 @@ +package ccnop + +import ( + "text/template" + + "github.com/envoyproxy/protoc-gen-validate/templates/cc" + pgs "github.com/lyft/protoc-gen-star" +) + +func RegisterModule(tpl *template.Template, params pgs.Parameters) { + cc.RegisterModule(tpl, params) + template.Must(tpl.Parse(moduleFileTpl)) +} + +func RegisterHeader(tpl *template.Template, params pgs.Parameters) { + cc.RegisterHeader(tpl, params) + template.Must(tpl.Parse(headerFileTpl)) +} diff --git a/templates/pkg.go b/templates/pkg.go index 79dfa948c..3e0c14b23 100644 --- a/templates/pkg.go +++ b/templates/pkg.go @@ -6,6 +6,7 @@ import ( "github.com/lyft/protoc-gen-star" "github.com/lyft/protoc-gen-star/lang/go" "github.com/envoyproxy/protoc-gen-validate/templates/cc" + "github.com/envoyproxy/protoc-gen-validate/templates/ccnop" "github.com/envoyproxy/protoc-gen-validate/templates/go" "github.com/envoyproxy/protoc-gen-validate/templates/java" "github.com/envoyproxy/protoc-gen-validate/templates/shared" @@ -23,9 +24,10 @@ func makeTemplate(ext string, fn RegisterFn, params pgs.Parameters) *template.Te func Template(params pgs.Parameters) map[string][]*template.Template { return map[string][]*template.Template{ - "cc": {makeTemplate("h", cc.RegisterHeader, params), makeTemplate("cc", cc.RegisterModule, params)}, - "go": {makeTemplate("go", golang.Register, params)}, - "java": {makeTemplate("java", java.Register, params)}, + "cc": {makeTemplate("h", cc.RegisterHeader, params), makeTemplate("cc", cc.RegisterModule, params)}, + "ccnop": {makeTemplate("h", ccnop.RegisterHeader, params), makeTemplate("cc", ccnop.RegisterModule, params)}, + "go": {makeTemplate("go", golang.Register, params)}, + "java": {makeTemplate("java", java.Register, params)}, } } @@ -33,6 +35,8 @@ func FilePathFor(tpl *template.Template) FilePathFn { switch tpl.Name() { case "h": return cc.CcFilePath + case "ccnop": + return cc.CcFilePath case "cc": return cc.CcFilePath case "java":