Browse Source

PROTO_SCHEMA() module
commit_hash:3c9b927dbb3ddefcaa455eccb51ae1ded847c736

iniklyaev 3 months ago
parent
commit
5111ad5847
7 changed files with 268 additions and 174 deletions
  1. 6 6
      build/conf/go.conf
  2. 3 3
      build/conf/java.conf
  3. 242 148
      build/conf/proto.conf
  4. 7 7
      build/conf/python.conf
  5. 1 1
      build/conf/ts/ts.conf
  6. 4 4
      build/conf/ts/ts_test.conf
  7. 5 5
      build/ymake.core.conf

+ 6 - 6
build/conf/go.conf

@@ -225,17 +225,17 @@ GO_TOOL=$YMAKE_PYTHON3 ${input:"build/scripts/go_tool.py"} $_PROCESS_WHOLE_ARCHI
 
 # tag:go-specific
 macro _GO_LINK_LIB_IMPL(CGO_FILES[], EXTRA_INPUTS[], EXTRA_TEXT_INPUTS[], GO_FILES...) {
-    .CMD=${hide:_GO_FAKEID} $GO_TOOL ${hide;input:EXTRA_INPUTS} ${hide;context=TEXT;input:EXTRA_TEXT_INPUTS} --ya-start-command-file $_GO_TOOL_COMMON_FLAGS ++peers ${rootrel;tags_in=local,GO|local,GO_PROTO|local,GO_FBS:PEERS} --ya-end-command-file ${hide;kv:"p GO"} ${hide;kv:"pc light-red"} ${hide;kv:"show_out"}
+    .CMD=${hide:_GO_FAKEID} $GO_TOOL ${hide;input:EXTRA_INPUTS} ${hide;context=TEXT;input:EXTRA_TEXT_INPUTS} --ya-start-command-file $_GO_TOOL_COMMON_FLAGS ++peers ${rootrel;tags_in=local,GO|local,GO_PROTO|local,GO_PROTO_FROM_SCHEMA|local,GO_FBS:PEERS} --ya-end-command-file ${hide;kv:"p GO"} ${hide;kv:"pc light-red"} ${hide;kv:"show_out"}
 }
 
 # tag:go-specific
 macro _GO_LINK_EXE_IMPL(CGO_FILES[], EXTRA_INPUTS[], EXTRA_TEXT_INPUTS[], GO_FILES...) {
-    .CMD=${hide:_GO_FAKEID} $GO_TOOL ${hide;input:EXTRA_INPUTS} ${hide;context=TEXT;input:EXTRA_TEXT_INPUTS} --ya-start-command-file $_GO_TOOL_COMMON_FLAGS ++vcs $VCS_GO $GO_WITH_MUSL $GO_EXTLD ++peers ${rootrel;tags_in=local,GO|local,GO_PROTO|local,GO_FBS:PEERS} ++non-local-peers ${rootrel;tags_in=GO|GO_PROTO|GO_FBS|;tags_out=local:PEERS} ++cgo-peers ${VCS_C_OBJ_RR} ${_EXTRA_OBJS} ${rootrel;tags_out=GO|GO_PROTO|GO_FBS|RESOURCE_LIB:PEERS} --ya-end-command-file ${hide;kv:"p LD"} ${hide;kv:"pc light-red"} ${hide;kv:"show_out"} && $_GO_LINK_EXE_EXT_CMD
+    .CMD=${hide:_GO_FAKEID} $GO_TOOL ${hide;input:EXTRA_INPUTS} ${hide;context=TEXT;input:EXTRA_TEXT_INPUTS} --ya-start-command-file $_GO_TOOL_COMMON_FLAGS ++vcs $VCS_GO $GO_WITH_MUSL $GO_EXTLD ++peers ${rootrel;tags_in=local,GO|local,GO_PROTO|local,GO_PROTO_FROM_SCHEMA|local,GO_FBS:PEERS} ++non-local-peers ${rootrel;tags_in=GO|GO_PROTO|GO_PROTO_FROM_SCHEMA|GO_FBS|;tags_out=local:PEERS} ++cgo-peers ${VCS_C_OBJ_RR} ${_EXTRA_OBJS} ${rootrel;tags_out=GO|GO_PROTO|GO_PROTO_FROM_SCHEMA|GO_FBS|RESOURCE_LIB:PEERS} --ya-end-command-file ${hide;kv:"p LD"} ${hide;kv:"pc light-red"} ${hide;kv:"show_out"} && $_GO_LINK_EXE_EXT_CMD
 }
 
 # tag:go-specific
 macro _GO_LINK_TEST_IMPL(CGO_FILES[], EXTRA_INPUTS[], EXTRA_TEXT_INPUTS[], GO_TEST_FILES[], GO_XTEST_FILES[], GO_FILES...) {
-    .CMD=${hide:_GO_FAKEID} $GO_TOOL ${hide;input:EXTRA_INPUTS} ${hide;context=TEXT;input:EXTRA_TEXT_INPUTS} --ya-start-command-file $_GO_TOOL_COMMON_FLAGS ++vcs $VCS_GO $GO_WITH_MUSL $GO_EXTLD ++test-miner $GO_TEST_MINER ++test-import-path $GO_TEST_IMPORT_PATH ++peers ${rootrel;tags_in=local,GO|local,GO_PROGRAM|local,GO_PROTO|local,GO_FBS:PEERS} ++non-local-peers ${rootrel;tags_in=GO|GO_PROTO|GO_FBS;tags_out=local:PEERS} ++cgo-peers ${VCS_C_OBJ_RR} ${rootrel;tags_out=GO|GO_PROGRAM|GO_PROTO|GO_FBS|RESOURCE_LIB:PEERS} ++test_srcs ${input:GO_TEST_FILES} ++xtest_srcs ${input:GO_XTEST_FILES} ++cover_info $GO_COVER_INFO_VALUE ++skip-tests $_GO_SKIP_TEST_VALUE --ya-end-command-file ${hide;kv:"p GO"} ${hide;kv:"pc light-red"} ${hide;kv:"show_out"}
+    .CMD=${hide:_GO_FAKEID} $GO_TOOL ${hide;input:EXTRA_INPUTS} ${hide;context=TEXT;input:EXTRA_TEXT_INPUTS} --ya-start-command-file $_GO_TOOL_COMMON_FLAGS ++vcs $VCS_GO $GO_WITH_MUSL $GO_EXTLD ++test-miner $GO_TEST_MINER ++test-import-path $GO_TEST_IMPORT_PATH ++peers ${rootrel;tags_in=local,GO|local,GO_PROGRAM|local,GO_PROTO|local,GO_PROTO_FROM_SCHEMA|local,GO_FBS:PEERS} ++non-local-peers ${rootrel;tags_in=GO|GO_PROTO|GO_PROTO_FROM_SCHEMA|GO_FBS;tags_out=local:PEERS} ++cgo-peers ${VCS_C_OBJ_RR} ${rootrel;tags_out=GO|GO_PROGRAM|GO_PROTO|GO_PROTO_FROM_SCHEMA|GO_FBS|RESOURCE_LIB:PEERS} ++test_srcs ${input:GO_TEST_FILES} ++xtest_srcs ${input:GO_XTEST_FILES} ++cover_info $GO_COVER_INFO_VALUE ++skip-tests $_GO_SKIP_TEST_VALUE --ya-end-command-file ${hide;kv:"p GO"} ${hide;kv:"pc light-red"} ${hide;kv:"show_out"}
 }
 
 # tag:go-specific
@@ -649,7 +649,7 @@ module _GO_BASE_UNIT: _BASE_UNIT {
 
     ENABLE(_GO_MODULE)
     SET(MODULE_TAG GO)
-    SET(PEERDIR_TAGS GO GO_PROTO GO_FBS __EMPTY__ RESOURCE_LIB)
+    SET(PEERDIR_TAGS GO GO_PROTO GO_PROTO_FROM_SCHEMA GO_FBS __EMPTY__ RESOURCE_LIB)
     DEFAULT(_GO_VET_TOOL)
     DEFAULT(_GO_VET_FLAGS)
     DEFAULT(_GO_VET_EXTS)
@@ -815,7 +815,7 @@ module GO_LIBRARY: _GO_BASE_UNIT {
     .FINAL_TARGET=no
     SET(_GO_TOOL_MODE lib)
     SET(MODULE_TYPE LIBRARY)
-    SET(PEERDIR_TAGS GO GO_PROTO GO_FBS __EMPTY__ RESOURCE_LIB PACKAGE_UNION)
+    SET(PEERDIR_TAGS GO GO_PROTO GO_PROTO_FROM_SCHEMA GO_FBS __EMPTY__ RESOURCE_LIB PACKAGE_UNION)
 
     MODULE_SUFFIX=.a
 }
@@ -956,7 +956,7 @@ module GO_TEST: GO_PROGRAM {
     .ALLOWED=GO_SKIP_TESTS YT_SPEC
     .FINAL_TARGET=no
     SET(MODULE_TAG GO_TEST)
-    SET(PEERDIR_TAGS GO GO_PROGRAM GO_PROTO GO_FBS __EMPTY__ RESOURCE_LIB)
+    SET(PEERDIR_TAGS GO GO_PROGRAM GO_PROTO GO_PROTO_FROM_SCHEMA GO_FBS __EMPTY__ RESOURCE_LIB)
     SET(_GO_TOOL_MODE test)
     SET(MODULE_TYPE PROGRAM)
     ENABLE(GO_TEST_MODULE)

+ 3 - 3
build/conf/java.conf

@@ -375,7 +375,7 @@ module EXTERNAL_JAVA_LIBRARY: _BASE_UNIT {
         MAVEN_EXPORT_COORDS_GLOBAL=$MAVEN_EXPORT_GROUP_ID:${MODULE_PREFIX}${REALPRJNAME}:${MAVEN_EXPORT_VERSION}:
     }
 
-    PEERDIR_TAGS=JAVA JAVA_PROTO JAVA_FBS JAVA_IDL PACKAGE_UNION
+    PEERDIR_TAGS=JAVA JAVA_PROTO JAVA_PROTO_FROM_SCHEMA JAVA_FBS JAVA_IDL PACKAGE_UNION
     HAS_MANAGEABLE_PEERS=yes
     DYNAMIC_LINK=yes
     _PROTO_CMDLINE=$_JAVA_PROTO_CMDLINE
@@ -563,7 +563,7 @@ module _JAR_BASE: _BARE_UNIT {
 
     SET(MODULE_TAG JAVA)
 
-    PEERDIR_TAGS=JAVA JAVA_PROTO JAVA_FBS JAVA_IDL DLL JAR_COMPILATION __EMPTY__ RESOURCE_LIB
+    PEERDIR_TAGS=JAVA JAVA_PROTO JAVA_PROTO_FROM_SCHEMA JAVA_FBS JAVA_IDL DLL JAR_COMPILATION __EMPTY__ RESOURCE_LIB
 
     HAS_MANAGEABLE_PEERS=yes
     DYNAMIC_LINK=yes
@@ -2087,7 +2087,7 @@ module JSRC_LIBRARY: _BARE_UNIT {
     .PEERDIR_POLICY=as_include
     .FINAL_TARGET=no
     .ALIASES=SRCS=FILES
-    PEERDIR_TAGS=JAVA JAVA_PROTO JAVA_FBS JAVA_IDL
+    PEERDIR_TAGS=JAVA JAVA_PROTO JAVA_PROTO_FROM_SCHEMA JAVA_FBS JAVA_IDL
     MODULE_TYPE=LIBRARY
     SET(MODULE_SUFFIX .jsrc)
     SET(DONT_RESOLVE_INCLUDES yes)

+ 242 - 148
build/conf/proto.conf

@@ -655,6 +655,162 @@ CPP_PROTO_LIBRARY_SEM=$CPP_LIBRARY_SEM
 
 JAVA_PROTO_LIBRARY_SEM=$BUILD_PROTO_JAR_SEM $_GRADLE_EXPORT_PUBLISHING_SEM
 
+module _CPP_PROTO : LIBRARY {
+    .ALLOWED=_EXPOSE LIST_PROTO
+    # TODO(svidyuk): think about marker which forces semantics inheritance
+    .SEM=CPP_PROTO_LIBRARY_SEM
+    FORCE_COVERAGE_DISABLED=yes
+    ENABLE(CPP_PROTO)
+    ENABLE(GEN_PROTO)
+    NO_CLANG_TIDY()
+    CPP_PROTOLIBS_DEBUG_INFO()
+    SET(PEERDIR_TAGS)
+
+    when ($BUILD_PROTO_AS_EVLOG == "yes" && $USE_VANILLA_PROTOC == "yes") {
+        _OK=no
+    }
+    ASSERT(_OK BUILD_PROTO_AS_EVLOG and USE_VANILLA_PROTOC are incompatible yet)
+
+    MODULE_SUFFIX=$_CPP_PROTO_MODULE_SUFFIX
+    MODULE_PREFIX=$_CPP_PROTO_MODULE_PREFIX
+
+    when ($_COMMON_GOOGLE_APIS != "None") {
+        PEERDIR += contrib/libs/googleapis-common-protos
+    }
+}
+
+module _JAVA_PROTO: EXTERNAL_JAVA_LIBRARY {
+    .EXTS=.jsrc
+    .ALLOWED=GRPC
+    .SEM=JAVA_PROTO_LIBRARY_SEM
+    SET(PEERDIR_TAGS JAVA)
+    ENABLE(JAVA_PROTO)
+    DISABLE(_NEED_SBOM_INFO)
+    PEERDIR+=$JAVA_PROTOBUF_PEERS
+
+    when ($KOTLIN_PROTO == "yes") {
+        KOTLIN_PROTO_PEERS=contrib/java/com/google/protobuf/protobuf-kotlin/${JAVA_PROTO_RUNTIME_VERSION}
+        KOTLIN_PROTO_FLAGS=--kotlin_out=$ARCADIA_BUILD_ROOT/java_out
+    }
+    when ($GRADLE_EXPORT_PUBLISHING == "yes") {
+        _GRADLE_EXPORT_PUBLISHING_SEM=$_DO_GRADLE_EXPORT_PUBLISHING_SEM
+    }
+
+    .IGNORED=GENERATE_ENUM_SERIALIZATION GENERATE_ENUM_SERIALIZATION_WITH_HEADER USE_SKIFF CPP_PROTO_PLUGIN2 PY_PROTO_PLUGIN YMAPS_SPROTO RESOURCE
+    ADDINCL(FOR proto $PROTOBUF_INCLUDE_PATH)
+
+    when ($_COMMON_GOOGLE_APIS != "None") {
+        PEERDIR += contrib/java/com/google/api/grpc/proto-google-common-protos/${JAVA_PROTO_COMMON_VERSION}
+        ADDINCL += GLOBAL FOR proto ${ARCADIA_ROOT}/contrib/libs/googleapis-common-protos
+    }
+}
+
+module _PY_PROTO: PY2_LIBRARY {
+    .ALIASES=SRCS=PY_SRCS
+    .ALLOWED=OPTIMIZE_PY_PROTOS NO_OPTIMIZE_PY_PROTOS
+    .SEM=IGNORED
+    SET(PEERDIR_TAGS PY2)
+    ENABLE(PY_PROTO)
+    DISABLE(_NEED_SBOM_INFO)
+    OPTIMIZE_PY_PROTOS()
+    OBJ_SUF=.py2
+    # Can not use NO_LINT(), because is not allowed outside of contrib directory
+    SET(_NO_LINT_VALUE none_internal)
+
+    when ($_COMMON_GOOGLE_APIS != "None") {
+        PEERDIR += contrib/libs/googleapis-common-protos
+    }
+
+    _IGNORE_SELF_PEERS=
+    _CPP_PROTO_LIBRARY=${MODDIR}/$_CPP_PROTO_MODULE_PREFIX$REALPRJNAME$_CPP_PROTO_MODULE_SUFFIX
+    when ($OPTIMIZE_PY_PROTOS_FLAG == "no") {
+        _IGNORE_PEERDIRSELF=CPP_PROTO
+    }
+    SET_APPEND(_WHOLE_ARCHIVE_LIBS_VALUE_GLOBAL $_CPP_PROTO_LIBRARY)
+}
+
+module _PY3_PROTO: PY3_LIBRARY {
+    .ALIASES=SRCS=PY_SRCS
+    .ALLOWED=OPTIMIZE_PY_PROTOS NO_OPTIMIZE_PY_PROTOS
+    .SEM=IGNORED
+    SET(PEERDIR_TAGS PY3)
+    ENABLE(PY3_PROTO)
+    DISABLE(_NEED_SBOM_INFO)
+    OPTIMIZE_PY_PROTOS()
+    OBJ_SUF=.py3
+    # Can not use NO_LINT(), because is not allowed outside of contrib directory
+    SET(_NO_LINT_VALUE none_internal)
+
+    when ($_COMMON_GOOGLE_APIS != "None") {
+        PEERDIR += contrib/libs/googleapis-common-protos
+    }
+
+    _IGNORE_SELF_PEERS=
+    _CPP_PROTO_LIBRARY=${MODDIR}/$_CPP_PROTO_MODULE_PREFIX$REALPRJNAME$_CPP_PROTO_MODULE_SUFFIX
+    when ($OPTIMIZE_PY_PROTOS_FLAG == "no") {
+        _IGNORE_PEERDIRSELF=CPP_PROTO
+    }
+    SET_APPEND(_WHOLE_ARCHIVE_LIBS_VALUE_GLOBAL $_CPP_PROTO_LIBRARY)
+}
+
+module _GO_PROTO: GO_LIBRARY {
+    .IGNORED=GENERATE_ENUM_SERIALIZATION GENERATE_ENUM_SERIALIZATION_WITH_HEADER YMAPS_SPROTO
+    .SEM=IGNORED
+    SET(PEERDIR_TAGS GO)
+    ENABLE(GO_PROTO)
+
+    when ($_COMMON_GOOGLE_APIS == "None") {
+    }
+    elsewhen ($_COMMON_GOOGLE_APIS == "") {
+        PEERDIR += $_GO_COMMON_GOOGLE_APIS
+        ADDINCL += GLOBAL FOR proto ${ARCADIA_ROOT}/contrib/libs/googleapis-common-protos
+    }
+    otherwise {
+        PEERDIR += $_COMMON_GOOGLE_APIS
+        ADDINCL += GLOBAL FOR proto ${ARCADIA_ROOT}/contrib/libs/googleapis-common-protos
+    }
+}
+
+module _TS_PROTO: _TS_PROTO_IMPL {
+    DISABLE(_NEED_SBOM_INFO)
+}
+
+module _TS_PREPARE_DEPS: _PREPARE_DEPS_BASE {
+    .IGNORED=PEERDIR
+    DISABLE(_NEED_SBOM_INFO)
+}
+
+module _DESC_PROTO: _BARE_UNIT {
+    .CMD=_PROTO_DESC_MERGE_CMD
+    .SEM=IGNORED
+    .EXTS=.desc .rawproto
+    .NODE_TYPE=Library
+    .IGNORED=GENERATE_ENUM_SERIALIZATION GENERATE_ENUM_SERIALIZATION_WITH_HEADER YMAPS_SPROTO RESOURCE GO_PROTO_PLUGIN GRPC
+    .ALIASES=SRCS=_SRCS_NO_GLOBAL
+
+    ENABLE(DESC_PROTO)
+    DISABLE(_NEED_SBOM_INFO)
+    MODULE_SUFFIX=.self.protodesc
+    SET(MODULE_TYPE LIBRARY)
+    SET(_MODDIR_HASH ${hash:MODDIR})
+
+    _EVLOG_CMDLINE=$_PROTO_DESC_CMDLINE
+    _PROTO_CMDLINE=$_PROTO_DESC_CMDLINE
+
+    when ($_COMMON_GOOGLE_APIS != "None") {
+        PEERDIR += contrib/libs/googleapis-common-protos
+    }
+
+    when ($NEED_GOOGLE_PROTO_PEERDIRS == "yes") {
+        when ($USE_VANILLA_PROTOC == "yes") {
+            PEERDIR += contrib/libs/protobuf_std/builtin_proto/protos_from_protobuf
+        }
+        otherwise {
+            PEERDIR += contrib/libs/protobuf/builtin_proto/protos_from_protoc
+        }
+    }
+}
+
 # tag:proto
 ### @usage: PROTO_LIBRARY()
 ###
@@ -674,173 +830,44 @@ JAVA_PROTO_LIBRARY_SEM=$BUILD_PROTO_JAR_SEM $_GRADLE_EXPORT_PUBLISHING_SEM
 ###
 ### See: [GRPC()](#macro_GRPC), [OPTIMIZE_PY_PROTOS()](#macro_OPTIMIZE_PY_PROTOS), [INCLUDE_TAGS()](#macro_INCLUDE_TAGS), [EXCLUDE_TAGS()](#macro_EXCLUDE_TAGS)
 multimodule PROTO_LIBRARY {
-    module CPP_PROTO : LIBRARY {
-        .ALLOWED=_EXPOSE LIST_PROTO
-        # TODO(svidyuk): think about marker which forces semantics inheritance
-        .SEM=CPP_PROTO_LIBRARY_SEM
-        FORCE_COVERAGE_DISABLED=yes
-        ENABLE(CPP_PROTO)
-        ENABLE(GEN_PROTO)
-        NO_CLANG_TIDY()
-        CPP_PROTOLIBS_DEBUG_INFO()
-        SET(PEERDIR_TAGS CPP_PROTO)
-
-        when ($BUILD_PROTO_AS_EVLOG == "yes" && $USE_VANILLA_PROTOC == "yes") {
-            _OK=no
-        }
-        ASSERT(_OK BUILD_PROTO_AS_EVLOG and USE_VANILLA_PROTOC are incompatible yet)
-
-        MODULE_SUFFIX=$_CPP_PROTO_MODULE_SUFFIX
-        MODULE_PREFIX=$_CPP_PROTO_MODULE_PREFIX
-
-        when ($_COMMON_GOOGLE_APIS != "None") {
-            PEERDIR += contrib/libs/googleapis-common-protos
-        }
+    module CPP_PROTO: _CPP_PROTO {
+        SET_APPEND(PEERDIR_TAGS CPP_PROTO)
     }
 
-    module JAVA_PROTO: EXTERNAL_JAVA_LIBRARY {
-        .EXTS=.jsrc
-        .ALLOWED=GRPC
-        .SEM=JAVA_PROTO_LIBRARY_SEM
-        SET(PEERDIR_TAGS JAVA JAVA_PROTO)
-        ENABLE(JAVA_PROTO)
-        DISABLE(_NEED_SBOM_INFO)
-        PEERDIR+=$JAVA_PROTOBUF_PEERS
-
-        when ($KOTLIN_PROTO == "yes") {
-            KOTLIN_PROTO_PEERS=contrib/java/com/google/protobuf/protobuf-kotlin/${JAVA_PROTO_RUNTIME_VERSION}
-            KOTLIN_PROTO_FLAGS=--kotlin_out=$ARCADIA_BUILD_ROOT/java_out
-        }
-        when ($GRADLE_EXPORT_PUBLISHING == "yes") {
-            _GRADLE_EXPORT_PUBLISHING_SEM=$_DO_GRADLE_EXPORT_PUBLISHING_SEM
-        }
-
-        .IGNORED=GENERATE_ENUM_SERIALIZATION GENERATE_ENUM_SERIALIZATION_WITH_HEADER USE_SKIFF CPP_PROTO_PLUGIN2 PY_PROTO_PLUGIN YMAPS_SPROTO RESOURCE
-        ADDINCL(FOR proto $PROTOBUF_INCLUDE_PATH)
-
-        when ($_COMMON_GOOGLE_APIS != "None") {
-            PEERDIR += contrib/java/com/google/api/grpc/proto-google-common-protos/${JAVA_PROTO_COMMON_VERSION}
-            ADDINCL += GLOBAL FOR proto ${ARCADIA_ROOT}/contrib/libs/googleapis-common-protos
-        }
+    module JAVA_PROTO: _JAVA_PROTO {
+        SET_APPEND(PEERDIR_TAGS JAVA_PROTO)
     }
 
-    module PY_PROTO: PY2_LIBRARY {
-        .ALIASES=SRCS=PY_SRCS
-        .ALLOWED=OPTIMIZE_PY_PROTOS NO_OPTIMIZE_PY_PROTOS
+    module PY_PROTO: _PY_PROTO {
+        SET_APPEND(PEERDIR_TAGS PY_PROTO)
         .PEERDIRSELF=CPP_PROTO
-        .SEM=IGNORED
-        SET(PEERDIR_TAGS PY2 PY_PROTO)
-        ENABLE(PY_PROTO)
-        DISABLE(_NEED_SBOM_INFO)
-        OPTIMIZE_PY_PROTOS()
-        OBJ_SUF=.py2
-        # Can not use NO_LINT(), because is not allowed outside of contrib directory
-        SET(_NO_LINT_VALUE none_internal)
-
-        when ($_COMMON_GOOGLE_APIS != "None") {
-            PEERDIR += contrib/libs/googleapis-common-protos
-        }
-
-        _IGNORE_SELF_PEERS=
-        _CPP_PROTO_LIBRARY=${MODDIR}/$_CPP_PROTO_MODULE_PREFIX$REALPRJNAME$_CPP_PROTO_MODULE_SUFFIX
-        when ($OPTIMIZE_PY_PROTOS_FLAG == "no") {
-            _IGNORE_PEERDIRSELF=CPP_PROTO
-        }
-        SET_APPEND(_WHOLE_ARCHIVE_LIBS_VALUE_GLOBAL $_CPP_PROTO_LIBRARY)
     }
 
-    module PY3_PROTO: PY3_LIBRARY {
-        .ALIASES=SRCS=PY_SRCS
-        .ALLOWED=OPTIMIZE_PY_PROTOS NO_OPTIMIZE_PY_PROTOS
+    module PY3_PROTO: _PY3_PROTO {
+        SET_APPEND(PEERDIR_TAGS PY3_PROTO)
         .PEERDIRSELF=CPP_PROTO
-        .SEM=IGNORED
-        SET(PEERDIR_TAGS PY3 PY3_PROTO)
-        ENABLE(PY3_PROTO)
-        DISABLE(_NEED_SBOM_INFO)
-        OPTIMIZE_PY_PROTOS()
-        OBJ_SUF=.py3
-        # Can not use NO_LINT(), because is not allowed outside of contrib directory
-        SET(_NO_LINT_VALUE none_internal)
-
-        when ($_COMMON_GOOGLE_APIS != "None") {
-            PEERDIR += contrib/libs/googleapis-common-protos
-        }
-
-        _IGNORE_SELF_PEERS=
-        _CPP_PROTO_LIBRARY=${MODDIR}/$_CPP_PROTO_MODULE_PREFIX$REALPRJNAME$_CPP_PROTO_MODULE_SUFFIX
-        when ($OPTIMIZE_PY_PROTOS_FLAG == "no") {
-            _IGNORE_PEERDIRSELF=CPP_PROTO
-        }
-        SET_APPEND(_WHOLE_ARCHIVE_LIBS_VALUE_GLOBAL $_CPP_PROTO_LIBRARY)
     }
 
-    module GO_PROTO: GO_LIBRARY {
-        .IGNORED=GENERATE_ENUM_SERIALIZATION GENERATE_ENUM_SERIALIZATION_WITH_HEADER YMAPS_SPROTO
-        .SEM=IGNORED
-        SET(PEERDIR_TAGS GO GO_PROTO)
-        ENABLE(GO_PROTO)
-
-        when ($_COMMON_GOOGLE_APIS == "None") {
-        }
-        elsewhen ($_COMMON_GOOGLE_APIS == "") {
-            PEERDIR += $_GO_COMMON_GOOGLE_APIS
-            ADDINCL += GLOBAL FOR proto ${ARCADIA_ROOT}/contrib/libs/googleapis-common-protos
-        }
-        otherwise {
-            PEERDIR += $_COMMON_GOOGLE_APIS
-            ADDINCL += GLOBAL FOR proto ${ARCADIA_ROOT}/contrib/libs/googleapis-common-protos
-        }
+    module GO_PROTO: _GO_PROTO {
+        SET_APPEND(PEERDIR_TAGS GO_PROTO)
     }
 
-    module TS_PROTO: _TS_PROTO_IMPL {
+    module TS_PROTO: _TS_PROTO {
         # opt-in. We don't want to have TS_PROTO by default
         # To include TS_PROTO user have to set INCLUDE_TAGS(TS_PROTO TS_PREPARE_DEPS) in ya.make
         .INCLUDE_TAG=no
-        .EPILOGUE=_TS_CONFIG_EPILOGUE
         .PEERDIRSELF=TS_PREPARE_DEPS
-        DISABLE(_NEED_SBOM_INFO)
-        
-        when ($_COMMON_GOOGLE_APIS != "None") {
-            PEERDIR += contrib/libs/googleapis-common-protos
-        }
+        .EPILOGUE=_TS_CONFIG_EPILOGUE
+        SET_APPEND(PEERDIR_TAGS TS_PROTO)
     }
 
-    module TS_PREPARE_DEPS: _PREPARE_DEPS_BASE {
+    module TS_PREPARE_DEPS: _TS_PREPARE_DEPS {
         .INCLUDE_TAG=no
-        .IGNORED=PEERDIR SRCS GENERATE_ENUM_SERIALIZATION
-        DISABLE(_NEED_SBOM_INFO)
-    }
-
-    module DESC_PROTO: _BARE_UNIT {
-        .CMD=_PROTO_DESC_MERGE_CMD
-        .SEM=IGNORED
-        .EXTS=.desc .rawproto
-        .NODE_TYPE=Library
-        .IGNORED=GENERATE_ENUM_SERIALIZATION GENERATE_ENUM_SERIALIZATION_WITH_HEADER YMAPS_SPROTO RESOURCE GO_PROTO_PLUGIN GRPC
-        .ALIASES=SRCS=_SRCS_NO_GLOBAL
-
-        SET(PEERDIR_TAGS DESC_PROTO)
-        ENABLE(DESC_PROTO)
-        DISABLE(_NEED_SBOM_INFO)
-        MODULE_SUFFIX=.self.protodesc
-        SET(MODULE_TYPE LIBRARY)
-        SET(_MODDIR_HASH ${hash:MODDIR})
-
-        _EVLOG_CMDLINE=$_PROTO_DESC_CMDLINE
-        _PROTO_CMDLINE=$_PROTO_DESC_CMDLINE
-
-        when ($_COMMON_GOOGLE_APIS != "None") {
-            PEERDIR += contrib/libs/googleapis-common-protos
-        }
+        SET_APPEND(PEERDIR_TAGS TS_PREPARE_DEPS)
+    }
 
-        when ($NEED_GOOGLE_PROTO_PEERDIRS == "yes") {
-            when ($USE_VANILLA_PROTOC == "yes") {
-                PEERDIR += contrib/libs/protobuf_std/builtin_proto/protos_from_protobuf
-            }
-            otherwise {
-                PEERDIR += contrib/libs/protobuf/builtin_proto/protos_from_protoc
-            }
-        }
+    module DESC_PROTO: _DESC_PROTO {
+        SET_APPEND(PEERDIR_TAGS DESC_PROTO)
     }
 }
 
@@ -852,7 +879,7 @@ module PROTO_DESCRIPTIONS: _BARE_UNIT {
     .FINAL_TARGET=yes
 
     SET(MODULE_TAG PROTO_DESCRIPTIONS)
-    SET(PEERDIR_TAGS DESC_PROTO)
+    SET(PEERDIR_TAGS DESC_PROTO DESC_PROTO_FROM_SCHEMA)
     SET(MODULE_SUFFIX .protodesc)
     SET(MODULE_TYPE PROTO_DESCRIPTIONS)
 }
@@ -862,6 +889,73 @@ module PROTO_REGISTRY: PROTO_DESCRIPTIONS {
     SET(MODULE_TYPE PROTO_REGISTRY)
 }
 
+# tag:proto
+### @usage: PROTO_SCHEMA()
+###
+### Build some variant of protocol buffers library or proto descriptions.
+###
+### When used as a PEERDIR from a language module like GO_PROGRAM it behaves like PROTO_LIBRARY.
+### When built directly it produces proto descriptions. When required by RECURSE it produces
+### both proto descriptions and language libraries.
+### PROTO_SCHEMA can depend on PROTO_LIBRARY, but PROTO_LIBRARY cannot depend on PROTO_SCHEMA.
+###
+### See: [PROTO_LIBRARY()](#module_PROTO_LIBRARY)
+multimodule PROTO_SCHEMA {
+    module CPP_PROTO_FROM_SCHEMA: _CPP_PROTO {
+        DISABLE(START_TARGET)
+        SET_APPEND(PEERDIR_TAGS CPP_PROTO CPP_PROTO_FROM_SCHEMA)
+    }
+
+    module JAVA_PROTO_FROM_SCHEMA: _JAVA_PROTO {
+        DISABLE(START_TARGET)
+        SET_APPEND(PEERDIR_TAGS JAVA_PROTO JAVA_PROTO_FROM_SCHEMA)
+    }
+
+    module PY_PROTO_FROM_SCHEMA: _PY_PROTO {
+        .PEERDIRSELF=CPP_PROTO_FROM_SCHEMA
+        DISABLE(START_TARGET)
+        SET_APPEND(PEERDIR_TAGS PY_PROTO PY_PROTO_FROM_SCHEMA)
+    }
+
+    module PY3_PROTO_FROM_SCHEMA: _PY3_PROTO {
+        .PEERDIRSELF=CPP_PROTO_FROM_SCHEMA
+        DISABLE(START_TARGET)
+        SET_APPEND(PEERDIR_TAGS PY3_PROTO PY3_PROTO_FROM_SCHEMA)
+    }
+
+    module GO_PROTO_FROM_SCHEMA: _GO_PROTO {
+        DISABLE(START_TARGET)
+        SET_APPEND(PEERDIR_TAGS GO_PROTO GO_PROTO_FROM_SCHEMA)
+    }
+
+    module TS_PROTO_FROM_SCHEMA: _TS_PROTO {
+        # opt-in. We don't want to have TS_PROTO by default
+        # To include TS_PROTO user have to set INCLUDE_TAGS(TS_PROTO TS_PREPARE_DEPS) in ya.make
+        .INCLUDE_TAG=no
+        .PEERDIRSELF=TS_PREPARE_DEPS_FROM_SCHEMA
+        .EPILOGUE=_TS_CONFIG_EPILOGUE
+        DISABLE(START_TARGET)
+        SET_APPEND(PEERDIR_TAGS TS_PROTO TS_PROTO_FROM_SCHEMA)
+    }
+
+    module TS_PREPARE_DEPS_FROM_SCHEMA: _TS_PREPARE_DEPS {
+        .INCLUDE_TAG=no
+        DISABLE(START_TARGET)
+        SET_APPEND(PEERDIR_TAGS TS_PREPARE_DEPS TS_PREPARE_DEPS_FROM_SCHEMA)
+    }
+
+    module DESC_PROTO_FROM_SCHEMA: _DESC_PROTO {
+        DISABLE(START_TARGET)
+        SET_APPEND(PEERDIR_TAGS DESC_PROTO DESC_PROTO_FROM_SCHEMA)
+    }
+
+    module PROTO_DESCRIPTIONS_: PROTO_DESCRIPTIONS {
+        .PEERDIRSELF=DESC_PROTO_FROM_SCHEMA
+        .FINAL_TARGET=yes
+        SET_APPEND(PEERDIR_TAGS DESC_PROTO_FROM_SCHEMA)
+    }
+}
+
 macro EVLOG_CMD(SRC) {
     .CMD=$_EVLOG_CMDLINE
     .SEM=$_EVLOG_CMDLINE

+ 7 - 7
build/conf/python.conf

@@ -559,7 +559,7 @@ module _PY_PACKAGE: UNION {
     .ALLOWED=GRPC USE_SKIFF
     .IGNORED=GENERATE_ENUM_SERIALIZATION GENERATE_ENUM_SERIALIZATION_WITH_HEADER
     ENABLE(PY_PROTOS_FOR)
-    SET(PEERDIR_TAGS PY_PROTO)
+    SET(PEERDIR_TAGS PY_PROTO PY_PROTO_FROM_SCHEMA)
     SET(DONT_RESOLVE_INCLUDES no)
 }
 
@@ -833,7 +833,7 @@ macro NO_PYTHON_INCLUDES() {
 macro PYTHON2_ADDINCL() {
     _PYTHON_ADDINCL()
     SET(MODULE_TAG PY2_NATIVE)
-    SET(PEERDIR_TAGS CPP_PROTO CPP_FBS CPP_ROS PY2_NATIVE YQL_UDF_STATIC __EMPTY__ RESOURCE_LIB DLL_LIB)
+    SET(PEERDIR_TAGS CPP_PROTO CPP_PROTO_FROM_SCHEMA CPP_FBS CPP_ROS PY2_NATIVE YQL_UDF_STATIC __EMPTY__ RESOURCE_LIB DLL_LIB)
 }
 
 # tag:python-specific tag:internal
@@ -842,7 +842,7 @@ macro PYTHON2_ADDINCL() {
 macro _ARCADIA_PYTHON_ADDINCL() {
     _PYTHON_ADDINCL()
     SET(MODULE_TAG PY2)
-    SET(PEERDIR_TAGS PY2 PY2_NATIVE PY_PROTO PY2_FBS YQL_UDF_STATIC __EMPTY__ RESOURCE_LIB DLL_LIB)
+    SET(PEERDIR_TAGS PY2 PY2_NATIVE PY_PROTO PY_PROTO_FROM_SCHEMA PY2_FBS YQL_UDF_STATIC __EMPTY__ RESOURCE_LIB DLL_LIB)
 }
 
 # tag:python-specific tag:internal
@@ -881,7 +881,7 @@ macro _PYTHON_ADDINCL() {
 macro PYTHON3_ADDINCL() {
     _PYTHON3_ADDINCL()
     SET(MODULE_TAG PY3_NATIVE)
-    SET(PEERDIR_TAGS CPP_PROTO CPP_FBS CPP_ROS PY3_NATIVE YQL_UDF_STATIC __EMPTY__ RESOURCE_LIB DLL_LIB)
+    SET(PEERDIR_TAGS CPP_PROTO CPP_PROTO_FROM_SCHEMA CPP_FBS CPP_ROS PY3_NATIVE YQL_UDF_STATIC __EMPTY__ RESOURCE_LIB DLL_LIB)
 }
 
 # tag:python-specific tag:internal
@@ -891,7 +891,7 @@ macro PYTHON3_ADDINCL() {
 macro _ARCADIA_PYTHON3_ADDINCL() {
     _PYTHON3_ADDINCL()
     SET(MODULE_TAG PY3)
-    SET(PEERDIR_TAGS PY3 PY3_BIN_LIB PY3TEST_LIBRARY PY3_NATIVE PY3_PROTO PY3_FBS PY3_ROS YQL_UDF_STATIC __EMPTY__ RESOURCE_LIB DLL_LIB)
+    SET(PEERDIR_TAGS PY3 PY3_BIN_LIB PY3TEST_LIBRARY PY3_NATIVE PY3_PROTO PY3_PROTO_FROM_SCHEMA PY3_FBS PY3_ROS YQL_UDF_STATIC __EMPTY__ RESOURCE_LIB DLL_LIB)
 }
 
 # tag:python-specific  tag:internal
@@ -929,7 +929,7 @@ macro _PYTHON3_ADDINCL() {
 ### @see: [PY2_LIBRARY](#module_PY2_LIBRARY), [PY3_LIBRARY](#module_PY3_LIBRARY), [PY23_LIBRARY](#multimodule_PY23_LIBRARY)
 macro USE_PYTHON2() {
     _ARCADIA_PYTHON_ADDINCL()
-    SET(PEERDIR_TAGS PY2 PY2_NATIVE CPP_PROTO CPP_FBS CPP_ROS YQL_UDF_STATIC __EMPTY__ RESOURCE_LIB DLL_LIB)
+    SET(PEERDIR_TAGS PY2 PY2_NATIVE CPP_PROTO CPP_PROTO_FROM_SCHEMA CPP_FBS CPP_ROS YQL_UDF_STATIC __EMPTY__ RESOURCE_LIB DLL_LIB)
     PEERDIR(contrib/libs/python)
 }
 
@@ -946,7 +946,7 @@ macro USE_PYTHON2() {
 ### @see: [PY2_LIBRARY](#module_PY2_LIBRARY), [PY3_LIBRARY](#module_PY3_LIBRARY), [PY23_LIBRARY](#multimodule_PY23_LIBRARY)
 macro USE_PYTHON3() {
     _ARCADIA_PYTHON3_ADDINCL()
-    SET(PEERDIR_TAGS PY3 PY3_BIN_LIB PY3TEST_LIBRARY PY3_NATIVE CPP_PROTO CPP_FBS CPP_ROS YQL_UDF_STATIC __EMPTY__ RESOURCE_LIB DLL_LIB)
+    SET(PEERDIR_TAGS PY3 PY3_BIN_LIB PY3TEST_LIBRARY PY3_NATIVE CPP_PROTO CPP_PROTO_FROM_SCHEMA CPP_FBS CPP_ROS YQL_UDF_STATIC __EMPTY__ RESOURCE_LIB DLL_LIB)
     PEERDIR(contrib/libs/python)
 
     when ($USE_ARCADIA_PYTHON == "yes") {

+ 1 - 1
build/conf/ts/ts.conf

@@ -94,7 +94,7 @@ module _TS_BASE_UNIT: _BARE_UNIT {
     SET(MODULE_TAG TS)
     SET(MODULE_LANG TS)
     # TS should peer to TS
-    SET(PEERDIR_TAGS TS TS_PROTO)
+    SET(PEERDIR_TAGS TS TS_PROTO TS_PROTO_FROM_SCHEMA)
     # .fake tells builder to not materialize it in results
     SET(MODULE_SUFFIX .ts.fake)
 

+ 4 - 4
build/conf/ts/ts_test.conf

@@ -32,7 +32,7 @@ module TS_TEST_JEST_FOR: _TS_TEST_BASE {
     .CMD=TS_TEST_JEST_CMD
 
     # for multimodule peers we should choose NODE_MODULES
-    SET(PEERDIR_TAGS TS TS_PROTO)
+    SET(PEERDIR_TAGS TS TS_PROTO TS_PROTO_FROM_SCHEMA)
 
     # compatibility with old TS_TEST_SRCS
     SET(TS_TEST_EXTENSION test.(ts|tsx|js|jsx))
@@ -67,7 +67,7 @@ module TS_TEST_HERMIONE_FOR: _TS_TEST_BASE {
     .CMD=TS_TEST_HERMIONE_CMD
 
     # for multimodule peers we should choose TS
-    SET(PEERDIR_TAGS TS TS_PROTO)
+    SET(PEERDIR_TAGS TS TS_PROTO TS_PROTO_FROM_SCHEMA)
 
     # compatibility with old TS_TEST_SRCS
     SET(TS_TEST_EXTENSION hermione.(ts|js))
@@ -101,7 +101,7 @@ module TS_TEST_PLAYWRIGHT_FOR: _TS_TEST_BASE {
     .CMD=TS_TEST_PLAYWRIGHT_CMD
 
     # for multimodule peers we should choose TS
-    SET(PEERDIR_TAGS TS TS_PROTO)
+    SET(PEERDIR_TAGS TS TS_PROTO TS_PROTO_FROM_SCHEMA)
 
     # compatibility with old TS_TEST_SRCS
     SET(TS_TEST_EXTENSION (playwright|spec).(ts|js))
@@ -134,7 +134,7 @@ module TS_TEST_PLAYWRIGHT_LARGE_FOR: _TS_TEST_BASE {
     .CMD=TS_TEST_PLAYWRIGHT_LARGE_CMD
 
     # for multimodule peers we should choose TS
-    SET(PEERDIR_TAGS TS TS_PROTO)
+    SET(PEERDIR_TAGS TS TS_PROTO TS_PROTO_FROM_SCHEMA)
 
     # compatibility with old TS_TEST_SRCS
     SET(TS_TEST_EXTENSION (playwright|spec).(ts|js))

+ 5 - 5
build/ymake.core.conf

@@ -589,7 +589,7 @@ module GEN_LIBRARY: _BARE_UNIT {
 module _BASE_UNIT: _BARE_UNIT {
     .GLOBAL=_FBS_NAMESPACE_MAP
 
-    PEERDIR_TAGS=CPP_PROTO CPP_FBS CPP_ROS H_IDL PY2 PY2_NATIVE YQL_UDF_STATIC __EMPTY__ RESOURCE_LIB DLL_LIB
+    PEERDIR_TAGS=CPP_PROTO CPP_PROTO_FROM_SCHEMA CPP_FBS CPP_ROS H_IDL PY2 PY2_NATIVE YQL_UDF_STATIC __EMPTY__ RESOURCE_LIB DLL_LIB
 
     _CPP_PROTO_WRAPPER_BASE=$YMAKE_PYTHON3 ${input:"build/scripts/cpp_proto_wrapper.py"}
     _CPP_PROTO_CMDLINE_BASE=${cwd;rootdir;input:File} $PROTOC -I=./$PROTO_NAMESPACE -I=$ARCADIA_ROOT/$PROTO_NAMESPACE ${pre=-I=:_PROTO__INCLUDE} -I=$ARCADIA_BUILD_ROOT -I=$PROTOBUF_INCLUDE_PATH --cpp_out=${CPP_PROTO_PLUGINS}$ARCADIA_BUILD_ROOT/$PROTO_NAMESPACE $_PROTOC_FLAGS $PROTOC_STYLEGUIDE_OUT $PROTOC_PLUGIN_STYLEGUIDE ${hide:PROTO_FAKEID} ${input;rootrel:File}
@@ -2364,7 +2364,7 @@ multimodule PACKAGE {
         .USE_PEERS_LATE_OUTS=yes
         .PEERDIR_POLICY=as_build_from
         .FINAL_TARGET=yes
-        SET(PEERDIR_TAGS CPP_PROTO CPP_FBS PY2 PY3 PY2_NATIVE PY3_NATIVE YQL_UDF_SHARED __EMPTY__ RESOURCE_LIB DOCSBOOK JAR_RUNNABLE PY3_BIN PY3TEST_PROGRAM DLL GO_PROGRAM PACKAGE_UNION)
+        SET(PEERDIR_TAGS CPP_PROTO CPP_PROTO_FROM_SCHEMA CPP_FBS PY2 PY3 PY2_NATIVE PY3_NATIVE YQL_UDF_SHARED __EMPTY__ RESOURCE_LIB DOCSBOOK JAR_RUNNABLE PY3_BIN PY3TEST_PROGRAM DLL GO_PROGRAM PACKAGE_UNION)
 
         SET(MODULE_SUFFIX .final.pkg.fake)
         SET(DONT_RESOLVE_INCLUDES yes)
@@ -2382,7 +2382,7 @@ multimodule PACKAGE {
         .IGNORED=VCS_INFO_FILE
 
         SET(MODULE_SUFFIX .pkg.fake)
-        SET(PEERDIR_TAGS CPP_PROTO CPP_FBS PY2 PY3 PY2_NATIVE PY3_NATIVE YQL_UDF_SHARED __EMPTY__ RESOURCE_LIB DOCSBOOK JAR_RUNNABLE PY3_BIN PY3TEST_PROGRAM DLL GO_PROGRAM PACKAGE_UNION)
+        SET(PEERDIR_TAGS CPP_PROTO CPP_PROTO_FROM_SCHEMA CPP_FBS PY2 PY3 PY2_NATIVE PY3_NATIVE YQL_UDF_SHARED __EMPTY__ RESOURCE_LIB DOCSBOOK JAR_RUNNABLE PY3_BIN PY3TEST_PROGRAM DLL GO_PROGRAM PACKAGE_UNION)
 
         DISABLE(START_TARGET)
         SET(_COPY_FILE_CONTEXT TEXT)
@@ -2404,7 +2404,7 @@ module CI_GROUP: _BARE_UNIT  {
     .RESTRICTED=SRCS
     .USE_PEERS_LATE_OUTS=yes
     MODULE_SUFFIX=.ci.pkg.fake
-    PEERDIR_TAGS=CPP_PROTO PY3 PY3_NATIVE PY3_BIN PY3TEST_PROGRAM YQL_UDF_SHARED __EMPTY__ RESOURCE_LIB DOCSBOOK JAR_RUNNABLE DLL PACKAGE_FINAL
+    PEERDIR_TAGS=CPP_PROTO CPP_PROTO_FROM_SCHEMA PY3 PY3_NATIVE PY3_BIN PY3TEST_PROGRAM YQL_UDF_SHARED __EMPTY__ RESOURCE_LIB DOCSBOOK JAR_RUNNABLE DLL PACKAGE_FINAL
 }
 
 # tag:generic tag:internal
@@ -2429,7 +2429,7 @@ module UNION: _BASE_UNIT {
     SET(MODULE_SUFFIX .pkg.fake)
     SET(DONT_RESOLVE_INCLUDES yes)
     SET(NEED_PLATFORM_PEERDIRS no)
-    PEERDIR_TAGS=CPP_PROTO CPP_FBS PY2 PY2_NATIVE PY3_NATIVE YQL_UDF_SHARED __EMPTY__ RESOURCE_LIB DOCSBOOK JAR_RUNNABLE PY3_BIN DLL PACKAGE_UNION
+    PEERDIR_TAGS=CPP_PROTO CPP_PROTO_FROM_SCHEMA CPP_FBS PY2 PY2_NATIVE PY3_NATIVE YQL_UDF_SHARED __EMPTY__ RESOURCE_LIB DOCSBOOK JAR_RUNNABLE PY3_BIN DLL PACKAGE_UNION
 
     UNION_OUTS=${hide;late_out:AUTO_INPUT}
     when ($_UNION_EXPLICIT_OUTPUTS) {