aboutsummaryrefslogtreecommitdiffstats
path: root/build/conf
diff options
context:
space:
mode:
authoralexv-smirnov <alex@ydb.tech>2023-03-15 19:59:12 +0300
committeralexv-smirnov <alex@ydb.tech>2023-03-15 19:59:12 +0300
commit056bb284ccf8dd6793ec3a54ffa36c4fb2b9ad11 (patch)
tree4740980126f32e3af7937ba0ca5f83e59baa4ab0 /build/conf
parent269126dcced1cc8b53eb4398b4a33e5142f10290 (diff)
downloadydb-056bb284ccf8dd6793ec3a54ffa36c4fb2b9ad11.tar.gz
add library/cpp/actors, ymake build to ydb oss export
Diffstat (limited to 'build/conf')
-rw-r--r--build/conf/bison_lex.conf133
-rw-r--r--build/conf/compilers/gnu_compiler.conf217
-rw-r--r--build/conf/compilers/msvc_compiler.conf90
-rw-r--r--build/conf/compilers/nvcc.conf3
-rw-r--r--build/conf/coverage_full_instrumentation.conf8
-rw-r--r--build/conf/coverage_selective_instrumentation.conf5
-rw-r--r--build/conf/docs.conf402
-rw-r--r--build/conf/export_gradle.no.conf3
-rw-r--r--build/conf/export_gradle.yes.conf3
-rw-r--r--build/conf/java.ymake.conf241
-rw-r--r--build/conf/jbuild.ymake.conf124
-rw-r--r--build/conf/license.conf438
-rw-r--r--build/conf/linkers/ld.conf338
-rw-r--r--build/conf/linkers/msvc_linker.conf271
-rw-r--r--build/conf/opensource.conf74
-rw-r--r--build/conf/project_specific/maps/aar.conf350
-rw-r--r--build/conf/project_specific/maps/asrc.conf121
-rw-r--r--build/conf/project_specific/maps/mapkit.conf313
-rw-r--r--build/conf/project_specific/maps/sproto.conf21
-rw-r--r--build/conf/project_specific/other.conf11
-rw-r--r--build/conf/project_specific/uservices.conf12
-rw-r--r--build/conf/project_specific/yql_udf.conf247
-rw-r--r--build/conf/project_specific/yt.conf5
-rw-r--r--build/conf/rules.conf74
-rw-r--r--build/conf/settings.conf102
-rw-r--r--build/conf/sysincl.conf74
-rw-r--r--build/conf/toolchains/gnu_toolchain.conf0
-rw-r--r--build/conf/toolchains/msvc_toolchain.conf7
-rw-r--r--build/conf/ts.conf319
29 files changed, 4006 insertions, 0 deletions
diff --git a/build/conf/bison_lex.conf b/build/conf/bison_lex.conf
new file mode 100644
index 0000000000..49f01474dc
--- /dev/null
+++ b/build/conf/bison_lex.conf
@@ -0,0 +1,133 @@
+# This defines macros and rules for Bison and Flex source processing
+#
+# This specilizes _SRC() macro, so should be imported after generic version definition
+# Thus uses _ADD_HIDDEN_INPUTS() macro from ymake.core.conf
+
+LEX_FLAGS=
+BISON_FLAGS=-v
+
+_BISON_DATA_DIR=contrib/tools/bison/bison/data
+_CPP_BISON_SKELS=${_BISON_DATA_DIR}/glr.cc ${_BISON_DATA_DIR}/lalr1.cc ${_BISON_DATA_DIR}/yacc.c ${_BISON_DATA_DIR}/stack.hh ${_BISON_DATA_DIR}/variant.hh ${_BISON_DATA_DIR}/c++.m4 ${_BISON_DATA_DIR}/c++-skel.m4
+
+_BISON_GEN_EXT=.cpp
+_FLEX_GEN_EXT=.cpp
+
+_BISON_HEADER=--defines=${nopath;noext;output;main;addincl;norel;suf=.h:SRC}
+_BISON_PP=$YMAKE_PYTHON ${input:"build/scripts/preprocess.py"} $_ADD_HIDDEN_INPUTS($_CPP_BISON_SKELS) ${nopath;noext;tmp:SRC.h}
+
+_FLEX_TOOL=${tool:"contrib/tools/flex-old"}
+_FLEX_TOOL_DIR=contrib/tools/flex-old
+_FLEX_HEADER=
+
+### @usage: FLEX_FLAGS(<flags>)
+###
+### Set flags for Lex tool (flex) invocations.
+macro FLEX_FLAGS(Flags...) {
+ SET_APPEND(LEX_FLAGS $Flags)
+}
+
+### @usage: BISON_FLAGS(<flags>)
+###
+### Set flags for Bison tool invocations.
+macro BISON_FLAGS(Flags...) {
+ SET_APPEND(BISON_FLAGS $Flags)
+}
+
+### @usage: BISON_GEN_C()
+###
+### Generate C from Bison grammar. The C++ is generated by default.
+macro BISON_GEN_C() {
+ SET(_BISON_GEN_EXT .c)
+ SET(_BISON_PP)
+}
+
+### @usage: BISON_GEN_CPP()
+###
+### Generate C++ from Bison grammar. This is current default.
+macro BISON_GEN_CPP() {
+ SET(_BISON_GEN_EXT .cpp)
+}
+
+
+### @usage: FLEX_GEN_C()
+###
+### Generate C from Lex grammar. The C++ is generated by default.
+macro FLEX_GEN_C() {
+ SET(_FLEX_GEN_EXT .c)
+}
+
+### @usage: FLEX_GEN_CPP()
+###
+### Generate C++ from Lex grammar. This is current default.
+macro FLEX_GEN_CPP() {
+ SET(_FLEX_GEN_EXT .cpp)
+}
+
+### @usage: BISON_HEADER(<header_suffix>)
+###
+### Use SUFF (including extension) to name Bison defines header file. The default is just `.h`.
+macro BISON_HEADER(Suffix) {
+ SET(_BISON_HEADER --defines=\${nopath;noext;output;main;addincl;norel;suf=$Suffix:SRC})
+}
+
+### @usage: BISON_NO_HEADER()
+###
+### Don't emit Bison defines header file.
+macro BISON_NO_HEADER() {
+ SET(_BISON_HEADER)
+}
+
+### @usage: USE_MODERN_FLEX()
+###
+### Use `contrib/tools/flex` as flex tool. Default is `contrib/tools/flex-old`.
+### @note: by default no header is emitted. Use `USE_MODERN_FLEX_WITH_HEADER` to add header emission.
+macro USE_MODERN_FLEX() {
+ SET(_FLEX_TOOL \${tool:"contrib/tools/flex"} --m4=\${tool:"contrib/tools/bison/m4"})
+ SET(_FLEX_TOOL_DIR contrib/tools/flex)
+}
+
+### @usage: USE_MODERN_FLEX_WITH_HEADER(<header_suffix>)
+###
+### Use `contrib/tools/flex` as flex tool. Default is `contrib/tools/flex-old`.
+### Additionally emit headers with suffix provided. Header suffix should include extension `.h`.
+###
+### @example: USE_MODERN_FLEX_WITH_HEADER(_lexer.h)
+macro USE_MODERN_FLEX_WITH_HEADER(Suffix) {
+ SET(_FLEX_TOOL \${tool:"contrib/tools/flex"} --m4=\${tool:"contrib/tools/bison/m4"})
+ SET(_FLEX_TOOL_DIR contrib/tools/flex)
+ SET(_FLEX_HEADER --header-file=\${nopath;noext;output;main;addincl;norel;suf=$Suffix:SRC})
+}
+
+### @usage: USE_OLD_FLEX()
+###
+### Use `contrib/tools/flex-old` as flex tool. This is current default.
+macro USE_OLD_FLEX() {
+ SET(_FLEX_TOOL \${tool:"contrib/tools/flex-old"})
+ SET(_FLEX_TOOL_DIR contrib/tools/flex-old)
+}
+
+macro _SRC("y", SRC, SRCFLAGS...) {
+ .CMD=${tool:"contrib/tools/bison/bison"} $BISON_FLAGS --m4=${tool:"contrib/tools/bison/m4"} $_BISON_HEADER -o ${nopath;output;suf=$_BISON_GEN_EXT:SRC} ${input:SRC} ${SRCFLAGS} ${kv;hide:"p YC"} ${kv;hide:"pc light-green"} && $_BISON_PP
+ .SEM=target_bison_parser PRIVATE ${input:SRC} ${output;nopath;noext;hide;suf=${OBJ_SUF}.o:SRC} ${nopath;noext;output;hide:SRC.h} ${nopath;noext;output;addincl;hide:SRC.h} && set_global_flags BISON_FLAGS $BISON_FLAGS && conan_require bison/3.5.3 && conan_import '"bin, bison* -> ./bin/bison/bin"' && conan_import '"res, * -> ./bin/bison/res"'
+}
+
+macro _SRC("ypp", SRC, SRCFLAGS...) {
+ .CMD=$_SRC(y $SRC $SRCFLAGS)
+ .SEM=$_SRC(y $SRC $SRCFLAGS)
+}
+
+macro _SRC("l", SRC, SRCFLAGS...) {
+ .CMD=$_FLEX_TOOL $LEX_FLAGS ${SRCFLAGS} $_FLEX_HEADER -o${output;suf=$_FLEX_GEN_EXT:SRC} ${output_include;hide:"util/system/compiler.h"} ${input:SRC} ${kv;hide:"p LX"} ${kv;hide:"pc yellow"}
+ .ADDINCL=$_FLEX_TOOL_DIR
+ .SEM=target_flex_lexers ${tool;hide:_FLEX_TOOL} ${output;hide;suf=${OBJ_SUF}.o:SRC} ${input:SRC} && set_global_flags LEX_FLAGS $LEX_FLAGS
+}
+
+# tag:src-processing
+macro _SRC("lex", SRC, SRCFLAGS...) {
+ .CMD=$_SRC(l $SRC $SRCFLAGS)
+}
+
+# tag:src-processing
+macro _SRC("lpp", SRC, SRCFLAGS...) {
+ .CMD=$_SRC(l $SRC $SRCFLAGS)
+}
diff --git a/build/conf/compilers/gnu_compiler.conf b/build/conf/compilers/gnu_compiler.conf
new file mode 100644
index 0000000000..1144465700
--- /dev/null
+++ b/build/conf/compilers/gnu_compiler.conf
@@ -0,0 +1,217 @@
+_OPTIMIZE_RELEASE=
+when ($_BUILD_RELEASE == "yes") {
+ when ($_BUILD_SIZE_OPTIMIZED == "yes") {
+ # -Oz is clang's more size-aggressive version of -Os
+ # For ARM specifically, clang -Oz is on par with gcc -Os:
+ # https://github.com/android/ndk/issues/133#issuecomment-365763507
+ when($CLANG == "yes") {
+ _OPTIMIZE_RELEASE=-Oz
+ }
+ otherwise {
+ _OPTIMIZE_RELEASE=-Os
+ }
+ }
+ otherwise {
+ _OPTIMIZE_RELEASE=-O3
+ }
+}
+
+_SFDL_FLAGS=-E -C -x c++
+when ($CLANG == "yes") {
+ _SFDL_FLAGS+=-Qunused-arguments
+}
+
+_DEBUG_INFO_FLAGS=-g
+when ($OS_LINUX == "yes") {
+ _DEBUG_INFO_FLAGS=-g -ggnu-pubnames
+}
+
+_CROSS_SUFFIX=.pic
+when ($FORCE_NO_PIC == "yes") {
+ _CROSS_SUFFIX=
+}
+
+C_COMPILER=${quo:C_COMPILER_UNQUOTED}
+OPTIMIZE=$_OPTIMIZE_RELEASE
+FSTACK=-fstack-protector
+DUMP_DEPS=
+GCC_PREPROCESSOR_OPTS=$DUMP_DEPS $C_DEFINES
+
+# PIE is only valid for executables, while PIC implies a shared library
+# `-pie` with a shared library is either ignored or fails to link
+when ($PIC == "yes") {
+ CFLAGS+=-fPIC
+ LDFLAGS+=-fPIC
+}
+elsewhen ($PIE == "yes") {
+ CFLAGS+=-fPIE
+ LDFLAGS+=-fPIE -pie
+}
+
+CFLAGS+=$_C_FLAGS $DEBUG_INFO_FLAGS $_C_FOPTIONS $C_WARNING_OPTS $GCC_PREPROCESSOR_OPTS $USER_CFLAGS $USER_CFLAGS_GLOBAL
+CXXFLAGS+=$CFLAGS $_CXX_STD $CXX_WARNING_OPTS $USER_CXXFLAGS $USER_CXXFLAGS_GLOBAL
+CONLYFLAGS+=$USER_CONLYFLAGS $USER_CONLYFLAGS_GLOBAL
+CXX_COMPILER=${quo:CXX_COMPILER_UNQUOTED}
+NOGCCSTACKCHECK=yes
+SFDL_FLAG=$_SFDL_FLAGS -o $SFDL_TMP_OUT
+WERROR_FLAG=-Werror
+DEBUG_INFO_FLAGS=$_DEBUG_INFO_FLAGS
+
+when ($NO_WSHADOW == "yes") {
+ C_WARNING_OPTS += -Wno-shadow
+}
+# Though -w is intended to switch off all the warnings,
+# it does not switch at least -Wregister and -Wreserved-user-defined-literal under clang.
+#
+# Use -Wno-everything to force warning suppression.
+when ($NO_COMPILER_WARNINGS == "yes") {
+ C_WARNING_OPTS = -w
+ CXX_WARNING_OPTS = -Wno-everything
+}
+when ($NO_OPTIMIZE == "yes") {
+ OPTIMIZE = -O0
+}
+when ($SAVE_TEMPS == "yes") {
+ CXXFLAGS += -save-temps
+}
+when ($NOGCCSTACKCHECK != "yes") {
+ FSTACK += -fstack-check
+}
+
+when ($FORCE_CONSISTENT_DEBUG == "yes") {
+ when ($CLANG == "yes") {
+ CL_DEBUG_INFO=-fdebug-prefix-map=${ARCADIA_BUILD_ROOT}=/-B -fdebug-prefix-map=${ARCADIA_ROOT}=/-S -fdebug-prefix-map=$(TOOL_ROOT)=/-T -Xclang -fdebug-compilation-dir -Xclang /tmp
+ }
+ otherwise {
+ CL_DEBUG_INFO=-fdebug-prefix-map=${ARCADIA_BUILD_ROOT}=/-B -fdebug-prefix-map=${ARCADIA_ROOT}=/-S -fdebug-prefix-map=$(TOOL_ROOT)=/-T
+ }
+ YASM_DEBUG_INFO=--replace=${ARCADIA_BUILD_ROOT}=/-B --replace=${ARCADIA_ROOT}=/-S --replace=$(TOOL_ROOT)=/-T ${env:"YASM_TEST_SUITE=1"}
+}
+elsewhen ($CONSISTENT_DEBUG == "yes") {
+ when ($CLANG == "yes") {
+ CL_DEBUG_INFO_DISABLE_CACHE__NO_UID__=-fdebug-prefix-map=${ARCADIA_BUILD_ROOT}=/-B -fdebug-prefix-map=${ARCADIA_ROOT}=/-S -fdebug-prefix-map=$(TOOL_ROOT)=/-T -Xclang -fdebug-compilation-dir -Xclang /tmp
+ }
+ otherwise {
+ CL_DEBUG_INFO_DISABLE_CACHE__NO_UID__=-fdebug-prefix-map=${ARCADIA_BUILD_ROOT}=/-B -fdebug-prefix-map=${ARCADIA_ROOT}=/-S -fdebug-prefix-map=$(TOOL_ROOT)=/-T
+ }
+ YASM_DEBUG_INFO_DISABLE_CACHE__NO_UID__=--replace=${ARCADIA_BUILD_ROOT}=/-B --replace=${ARCADIA_ROOT}=/-S --replace=$(TOOL_ROOT)=/-T ${env:"YASM_TEST_SUITE=1"}
+}
+elsewhen ($CONSISTENT_DEBUG_LIGHT == "yes") {
+ when ($CLANG == "yes") {
+ CL_DEBUG_INFO_DISABLE_CACHE__NO_UID__=-fdebug-prefix-map=${ARCADIA_BUILD_ROOT}=/-B -Xclang -fdebug-compilation-dir -Xclang /tmp
+ }
+ otherwise {
+ CL_DEBUG_INFO_DISABLE_CACHE__NO_UID__=-fdebug-prefix-map=${ARCADIA_BUILD_ROOT}=/-B
+ }
+ YASM_DEBUG_INFO_DISABLE_CACHE__NO_UID__=--replace=${ARCADIA_BUILD_ROOT}=/-B ${env:"YASM_TEST_SUITE=1"}
+}
+
+when ($FORCE_CONSISTENT_BUILD == "yes") {
+ CL_MACRO_INFO=-Wno-builtin-macro-redefined -D__DATE__=\""Sep 31 2019\"" -D__TIME__=\"00:00:00\" -fmacro-prefix-map=${ARCADIA_BUILD_ROOT}/= -fmacro-prefix-map=${ARCADIA_ROOT}/= -fmacro-prefix-map=$(TOOL_ROOT)/=
+}
+elsewhen ($CONSISTENT_BUILD == "yes") {
+ CL_MACRO_INFO_DISABLE_CACHE__NO_UID__=-Wno-builtin-macro-redefined -D__DATE__=\""Sep 31 2019\"" -D__TIME__=\"00:00:00\" -fmacro-prefix-map=${ARCADIA_BUILD_ROOT}/= -fmacro-prefix-map=${ARCADIA_ROOT}/= -fmacro-prefix-map=$(TOOL_ROOT)/=
+}
+
+_CFLAGS_ARCH_I386=
+when ($ARCH_I386 == "yes" && $ARCH_I686 != "yes") {
+ _CFLAGS_ARCH_I386=-march=pentiumpro -mtune=pentiumpro
+}
+
+CFLAGS+=$_CFLAGS_ARCH_I386
+
+BC_CFLAGS+=$CFLAGS
+BC_CXXFLAGS+=$CXXFLAGS
+C_DEFINES+=-D__LONG_LONG_SUPPORTED
+
+OBJ_CROSS_SUF=$OBJ_SUF$_CROSS_SUFFIX
+OBJECT_SUF=$OBJ_SUF$_CROSS_SUFFIX.o
+GCC_COMPILE_FLAGS=$EXTRA_C_FLAGS -c -o $_COMPILE_OUTPUTS ${pre=-I:_C__INCLUDE}
+EXTRA_COVERAGE_OUTPUT=${output;noauto;hide;suf=${OBJECT_SUF}.gcno:SRC}
+CLANG_TIDY_OUTPUT_FILE=${output;noauto;suf=${OBJECT_SUF}.tidyjson:SRC}
+YNDEXER_OUTPUT_FILE=${output;noauto;suf=${OBJECT_SUF}${COMPILE_OUT_SUFFIX}.ydx.pb2:SRC}
+
+when ($DUMP_COMPILER_DEPS == "yes") {
+ DUMP_DEPS=-MD ${output;hide;noauto;suf=${OBJ_SUF}.o.d:SRC}
+}
+elsewhen ($DUMP_COMPILER_DEPS_FAST == "yes") {
+ DUMP_DEPS=-E -M -MF ${output;noauto;suf=${OBJ_SUF}.o.d:SRC}
+}
+
+_COMPILER_TIME_TRACE_GRANULARITY=500
+when ($TIME_TRACE_GRANULARITY && $TIME_TRACE_GRANULARITY != "") {
+ _COMPILER_TIME_TRACE_GRANULARITY=$TIME_TRACE_GRANULARITY
+}
+
+_COMPILER_TIME_TRACE_FLAGS=
+_COMPILER_TIME_TRACE_POSTPROCESS=
+when (($TIME_TRACE == "yes" || $COMPILER_TIME_TRACE == "yes") && $_HAS_TIME_TRACE == "yes") {
+ _COMPILER_TIME_TRACE_FLAGS=-ftime-trace -ftime-trace-granularity=$_COMPILER_TIME_TRACE_GRANULARITY
+ _COMPILER_TIME_TRACE_POSTPROCESS=$YMAKE_PYTHON ${input:"build/scripts/find_time_trace.py"} $_COMPILE_OUTPUTS $_COMPILE_TIME_TRACE_OUTPUTS
+}
+
+_C_CPP_KV_STYLE=${hide;kv:"p CC"} ${hide;kv:"pc green"}
+_CPP_ARGS=\
+ $CLANG_TIDY_ARGS \
+ $YNDEXER_ARGS \
+ $CXX_COMPILER \
+ $C_FLAGS_PLATFORM \
+ $GCC_COMPILE_FLAGS \
+ $CXXFLAGS \
+ $CL_MACRO_INFO \
+ $CL_MACRO_INFO_DISABLE_CACHE__NO_UID__ \
+ $_COMPILER_TIME_TRACE_FLAGS \
+ $EXTRA_OUTPUT \
+ $SRCFLAGS \
+ $_LANG_CFLAGS_VALUE \
+ ${input:SRC} \
+ $TOOLCHAIN_ENV \
+ $YNDEXER_OUTPUT \
+ && $_COMPILER_TIME_TRACE_POSTPROCESS \
+ $_C_CPP_KV_STYLE
+
+_C_ARGS=\
+ $CLANG_TIDY_ARGS \
+ $YNDEXER_ARGS \
+ $C_COMPILER \
+ $C_FLAGS_PLATFORM \
+ $GCC_COMPILE_FLAGS \
+ $CFLAGS \
+ $CL_MACRO_INFO \
+ $CL_MACRO_INFO_DISABLE_CACHE__NO_UID__ \
+ $_COMPILER_TIME_TRACE_FLAGS \
+ $CONLYFLAGS \
+ $EXTRA_OUTPUT \
+ $SRCFLAGS \
+ ${input:SRC} \
+ $TOOLCHAIN_ENV \
+ $YNDEXER_OUTPUT \
+ $_C_CPP_KV_STYLE
+
+### _SRC_C_NODEPS_CMD is obtained from _C_ARGS by filtering the following elements:
+### ${input:SRC}
+### $CL_MACRO_INFO
+### $CL_MACRO_INFO_DISABLE_CACHE__NO_UID__
+### $CLANG_TIDY_ARGS
+### $EXTRA_OUTPUT
+### $EXTRA_COVERAGE_OUTPUT
+### $SRCFLAGS
+### $YNDEXER_ARGS
+### $YNDEXER_OUTPUT
+###
+### $GCC_COMPILE_FLAGS is substituted for $EXTRA_C_FLAGS -c -o ${OUTFILE} ${SRC} ${pre=-I:INC}
+_SRC_C_NODEPS_CMD=\
+ $C_COMPILER \
+ $C_FLAGS_PLATFORM \
+ $EXTRA_C_FLAGS -c -o ${OUTFILE} ${SRC} ${pre=-I:INC} \
+ $CFLAGS \
+ $CONLYFLAGS \
+ $TOOLCHAIN_ENV \
+ $_C_CPP_KV_STYLE
+
+_FORCE_CPP_FLAGS=-x c++
+
+_SRC_CPP_CMD=$_CPP_ARGS
+_SRC_C_CMD=$_C_ARGS
+_SRC_M_CMD=$SRC_c($SRC $SRCFLAGS)
+_SRC_MASM_CMD=$_EMPTY_CMD
diff --git a/build/conf/compilers/msvc_compiler.conf b/build/conf/compilers/msvc_compiler.conf
new file mode 100644
index 0000000000..a509b02348
--- /dev/null
+++ b/build/conf/compilers/msvc_compiler.conf
@@ -0,0 +1,90 @@
+MSVC_INLINE_OPTIMIZED=yes
+when ($MSVC_INLINE_OPTIMIZED == "yes") {
+ MSVC_INLINE_FLAG=/Zc:inline
+}
+when ($MSVC_INLINE_OPTIMIZED == "no") {
+ MSVC_INLINE_FLAG=/Zc:inline-
+}
+
+# Provide proper __cplusplus value
+# https://devblogs.microsoft.com/cppblog/msvc-now-correctly-reports-__cplusplus/
+_CXX_FLAGS=/Zc:__cplusplus
+
+_MSVC_ONLY_FLAGS=
+DEBUG_INFO_FLAGS=/Z7
+when ($IDE_MSVS == "yes") {
+ when ($CLANG_CL != "yes") {
+ _MSVC_ONLY_FLAGS=/FD /MP
+ }
+ DEBUG_INFO_FLAGS=/Zi /FS
+}
+
+# https://msdn.microsoft.com/en-us/library/abx4dbyh.aspx
+when ($DLL_RUNTIME == "yes") {
+ _FLAGS_DEBUG_RUNTIME=/MDd
+ _FLAGS_RELEASE_RUNTIME=/MD
+}
+otherwise {
+ _FLAGS_DEBUG_RUNTIME=/MTd
+ _FLAGS_RELEASE_RUNTIME=/MT
+}
+CFLAGS_DEBUG=/Ob0 /Od /D_DEBUG $_FLAGS_DEBUG_RUNTIME
+CFLAGS_RELEASE=/Ox /Ob2 /Oi /DNDEBUG $_FLAGS_RELEASE_RUNTIME
+
+MASMFLAGS=
+_MASM_IO=/nologo /c /Fo${output;suf=${OBJECT_SUF}:SRC} ${input;msvs_source:SRC}
+when ($ARCH_ARMV7) {
+ _MASM_IO=-o ${output;suf=${OBJECT_SUF}:SRC} ${input;msvs_source:SRC}
+}
+
+OBJ_CROSS_SUF=$OBJ_SUF
+OBJECT_SUF=$OBJ_SUF.obj
+
+CFLAGS+=$_MSVC_FLAGS $_MSVC_ONLY_FLAGS $CFLAGS_PER_TYPE $DEBUG_INFO_FLAGS $C_WARNING_OPTS $C_DEFINES $USER_CFLAGS $USER_CFLAGS_GLOBAL
+CXXFLAGS+=$CFLAGS $_STD_CXX $_CXX_FLAGS $_CXX_DEFINES $CXX_WARNING_OPTS $USER_CXXFLAGS $USER_CXXFLAGS_GLOBAL
+CONLYFLAGS+=$USER_CONLYFLAGS $USER_CONLYFLAGS_GLOBAL
+
+BC_CFLAGS+=$CFLAGS
+BC_CXXFLAGS+=$BC_CFLAGS $CXXFLAGS
+
+CFLAGS+=$_CFLAGS_UCRT_VC_INCLUDES
+
+when ($NO_WSHADOW == "yes") {
+ C_WARNING_OPTS+=/wd4456 /wd4457
+}
+
+when ($NO_COMPILER_WARNINGS == "yes") {
+ C_WARNING_OPTS=/w
+ when ($CLANG_CL == "yes") {
+ # Though /w is intended to switch off all the warnings,
+ # it does not switch at least -Wregister and -Wreserved-user-defined-literal under clang-cl.
+ #
+ # Use -Wno-everything to force warning suppression.
+ CXX_WARNING_OPTS=-Wno-everything
+ }
+ otherwise {
+ CXX_WARNING_OPTS=
+ }
+}
+
+when ($NO_OPTIMIZE == "yes") {
+ OPTIMIZE=/Od
+}
+
+SFDL_FLAG=/E /C /P /TP /Fi$SFDL_TMP_OUT
+WERROR_FLAG=/WX
+
+CL_WRAPPER=${FIX_MSVC_OUTPUT} cl
+ML_WRAPPER=${FIX_MSVC_OUTPUT} ml
+when ($_UNDER_WINE == "yes" && $CLANG_CL !="yes") {
+ CL_WRAPPER=
+ ML_WRAPPER=
+}
+
+_FORCE_CPP_FLAGS=/TP
+
+_SRC_C_NODEPS_CMD=${TOOLCHAIN_ENV} ${CL_WRAPPER} ${C_COMPILER} /c /Fo${OUTFILE} ${SRC} ${EXTRA_C_FLAGS} ${pre=/I :INC} ${CFLAGS} ${hide;kv:"soe"} ${hide;kv:"p CC"} ${hide;kv:"pc yellow"}
+_SRC_CPP_CMD=${TOOLCHAIN_ENV} ${CL_WRAPPER} ${CXX_COMPILER} /c /Fo$_COMPILE_OUTPUTS ${input;msvs_source:SRC} ${EXTRA_C_FLAGS} ${pre=/I :_C__INCLUDE} ${CXXFLAGS} ${SRCFLAGS} ${_LANG_CFLAGS_VALUE} ${hide;kv:"soe"} ${hide;kv:"p CC"} ${hide;kv:"pc yellow"}
+_SRC_C_CMD=${TOOLCHAIN_ENV} ${CL_WRAPPER} ${C_COMPILER} /c /Fo$_COMPILE_OUTPUTS ${input;msvs_source:SRC} ${EXTRA_C_FLAGS} ${pre=/I :_C__INCLUDE} ${CFLAGS} ${CONLYFLAGS} ${SRCFLAGS} ${hide;kv:"soe"} ${hide;kv:"p CC"} ${hide;kv:"pc yellow"}
+_SRC_M_CMD=$_EMPTY_CMD
+_SRC_MASM_CMD=${cwd:ARCADIA_BUILD_ROOT} ${TOOLCHAIN_ENV} ${ML_WRAPPER} ${MASM_COMPILER} ${MASMFLAGS} ${SRCFLAGS} $_MASM_IO ${kv;hide:"p AS"} ${kv;hide:"pc yellow"}
diff --git a/build/conf/compilers/nvcc.conf b/build/conf/compilers/nvcc.conf
new file mode 100644
index 0000000000..12ea72eaa9
--- /dev/null
+++ b/build/conf/compilers/nvcc.conf
@@ -0,0 +1,3 @@
+when ($NO_COMPILER_WARNINGS == "yes") {
+ CUDA_NVCC_FLAGS += -w
+}
diff --git a/build/conf/coverage_full_instrumentation.conf b/build/conf/coverage_full_instrumentation.conf
new file mode 100644
index 0000000000..b87313e7d6
--- /dev/null
+++ b/build/conf/coverage_full_instrumentation.conf
@@ -0,0 +1,8 @@
+USE_SCU_VALUE="yes"
+
+macro POPULATE_CPP_COVERAGE_FLAGS() {
+ when ($CLANG_COVERAGE && $CLANG_COVERAGE != "no") {
+ CFLAGS+=-fprofile-instr-generate -fcoverage-mapping -DCLANG_COVERAGE
+ LDFLAGS+=-fprofile-instr-generate -fcoverage-mapping
+ }
+}
diff --git a/build/conf/coverage_selective_instrumentation.conf b/build/conf/coverage_selective_instrumentation.conf
new file mode 100644
index 0000000000..7039e194ce
--- /dev/null
+++ b/build/conf/coverage_selective_instrumentation.conf
@@ -0,0 +1,5 @@
+USE_SCU_VALUE="no"
+
+macro POPULATE_CPP_COVERAGE_FLAGS() {
+ SET_CPP_COVERAGE_FLAGS()
+}
diff --git a/build/conf/docs.conf b/build/conf/docs.conf
new file mode 100644
index 0000000000..bc0f8a8955
--- /dev/null
+++ b/build/conf/docs.conf
@@ -0,0 +1,402 @@
+#
+# Documentation build support
+#
+
+# tag:docs
+TOUCH_DOCS=$YMAKE_PYTHON3 ${input:"build/scripts/touch.py"} ${kv;hide:"p DC"} ${kv;hide:"pc light-cyan"} $TARGET
+TOUCH_DOCS_MF=$TOUCH_DOCS && $GENERATE_MF
+
+# tag:docs
+### @usage: DOCS_COPY_FILES(FROM src_dir [NAMESPCE dst_dir] files...)
+###
+### Copy files from src_dir to $BINDIR/dst_dir
+macro DOCS_COPY_FILES(FROM="${CURDIR}", NAMESPACE=".", FILES...) {
+ .CMD=$YMAKE_PYTHON3 ${input:"build/scripts/copy_docs_files.py"} ${input;hide:"build/scripts/process_command_files.py"} --source-root $ARCADIA_ROOT --build-root $ARCADIA_BUILD_ROOT --src-dir $FROM --dst-dir $BINDIR/$NAMESPACE $FILES ${input;hide;context=TEXT;pre=${FROM}/:FILES} ${output;hide;pre=${NAMESPACE}/:FILES}
+}
+
+# tag:docs
+_DOCS_USE_PLANTUML=no
+_DOCS_EXTRA_TOOLS=
+_DOCS_EXTRA_INPUTS=
+_DOCS_ENV=
+_DOCS_KV=${kv;hide:"p DO"} ${kv;hide:"pc light-cyan"} ${kv;hide:"show_out yes"}
+
+_DOCS_PLANTUML_ENV=\
+${env:"JAVA_PATH=$JDK19_RESOURCE_GLOBAL/bin/java"} \
+${env:"PLANTUML_PATH=contrib/tools/plantuml/plantuml.run.cp.jar"} \
+${env:"_JAVA_OPTIONS='-Dsun.awt.fontconfig=contrib/java/openjdk-fontconfig/fontconfig.properties -Djava.awt.headless=true'"} \
+${env:"LANG=en_US.UTF-8"} \
+${env:"LC_ALL=C.UTF-8"}
+
+_DOCS_SRCS_VALUE=
+_DOCS_VARS_FLAG=
+
+_DOCS_YFM_OUTPUT_FORMAT=
+_DOCS_YFM_BOOK_OUTPUT_FORMAT=--output-format html --allowHTML
+_DOCS_YFM_LIB_OUTPUT_FORMAT=--output-format md --add-map-file
+
+_DOCS_YFM_CMDLINE=\
+${cwd:ARCADIA_BUILD_ROOT} $YMAKE_PYTHON3 ${input:"build/scripts/extract_docs.py"} ${input;hide:"build/scripts/process_command_files.py"} --skip-prefix $ARCADIA_BUILD_ROOT --dest-dir $BINDIR/__s ${rootrel:PEERS} \
+&& ${cwd:ARCADIA_BUILD_ROOT} $YMAKE_PYTHON3 ${input:"build/scripts/stdout2stderr.py"} $YFM_TOOL_RESOURCE_GLOBAL/yfm-docs --input $BINDIR/__s --output $BINDIR/__docsbuild $_DOCS_VARS_FLAG $_DOCS_YFM_OUTPUT_FORMAT --config ${input:CONFIG} $_DOCS_EXTRA_TOOLS ${hide;input:EXTRA_INPUTS} $_DOCS_ENV \
+&& $YMAKE_PYTHON3 ${input:"build/scripts/tar_sources.py"} --output $TARGET --input $BINDIR/__docsbuild $_DOCS_KV
+
+# tag:internal tag:docs
+macro _DOCS_YFM_CMD_IMPL(CONFIG, EXTRA_INPUTS[]) {
+ .CMD=$_DOCS_YFM_CMDLINE
+}
+
+_DOCS_YFM_CMD=$_DOCS_YFM_CMD_IMPL($_DOCS_CONFIG_VALUE EXTRA_INPUTS $_DOCS_EXTRA_INPUTS)
+
+# tag:docs
+### This module is intended for internal use only. Common parts for DOCS and MKDOCS multimodules
+### should be defined here.
+module _DOCS_BARE_UNIT: _BARE_UNIT {
+ .ALLOWED=DOCS_DIR DOCS_CONFIG DOCS_VARS
+ .CMD=TOUCH_DOCS_MF
+ .FINAL_TARGET=no
+ .NODE_TYPE=Bundle
+ .PEERDIR_POLICY=as_include
+
+ ENABLE(_DOCS_BARE_UNIT)
+
+ SET(MODULE_SUFFIX .tar.gz)
+ SET(MODULE_LANG DOCS)
+}
+
+# tag:docs tag:internal
+_DOCS_DIR_INTERNAL_NAMESPACE=
+
+# tag:internal tag:docs
+_DOCS_LIBRARY_CMDLINE=\
+$YMAKE_PYTHON3 ${input:"build/scripts/copy_docs_files_to_dir.py"} ${input;hide:"build/scripts/process_command_files.py"} $_DOCS_SRCS_VALUE $_DOCS_DIR_VALUE $_DOCS_BIN_DIR_VALUE --dest-dir $BINDIR/__s --source-root $ARCADIA_ROOT --build-root $ARCADIA_BUILD_ROOT ${input;context=TEXT:INCLUDE_SRCS} \
+&& $YMAKE_PYTHON3 ${input:"build/scripts/tar_sources.py"} --output $TARGET --input $BINDIR/__s $_DOCS_KV
+
+# tag:internal tag:docs
+macro _DOCS_LIBRARY_CMD_IMPL(INCLUDE_SRCS[], EXTRA_INPUTS[]) {
+ .CMD=$_DOCS_LIBRARY_CMDLINE
+}
+
+_DOCS_LIBRARY_CMD=$_DOCS_LIBRARY_CMD_IMPL(INCLUDE_SRCS $_DOCS_INCLUDE_SOURCES_VALUE)
+
+# tag:docs
+module DOCS_LIBRARY: _DOCS_BARE_UNIT {
+ .CMD=_DOCS_LIBRARY_CMD
+ .ALIASES=SRCS=_DOCS_SRCS DOCS_DIR=_YFM_DOCS_DIR
+ .EPILOGUE=_DOCS_LIBRARY_EPILOGUE
+ .NODE_TYPE=Library
+
+ ENABLE(DOCS_LIBRARY)
+
+ SET(MODULE_TYPE LIBRARY)
+ SET(MODULE_TAG DOCS_LIBRARY)
+ SET(PEERDIR_TAGS DOCS_LIBRARY)
+
+ SET(MODULE_SUFFIX .docslib)
+}
+
+# tag:docs
+macro _DOCS_SRCS(SRCDIR=".", EXCLUDE[], INCLUDE...) {
+ SET(_VAR_DOCS_SRCS_SALT __SRCDIR__ $SRCDIR __EXCLUDE__ $EXCLUDE __INCLUDE__ $INCLUDE)
+ SET(_DOCS_SRCS_GLOB uniq_docs_${hash:_VAR_DOCS_SRCS_SALT})
+ _GLOB(${_DOCS_SRCS_GLOB} ${pre=${SRCDIR}/:INCLUDE} EXCLUDE ${EXCLUDE})
+ SET_APPEND(_DOCS_INCLUDE_SOURCES_VALUE ${input:$_DOCS_SRCS_GLOB})
+ SET(_YFM_DOCS_DIR_DEFAULT_VALUE __dummy_dir__)
+}
+
+# tag:docs
+macro _DOCS_LIBRARY_EPILOGUE() {
+ _YFM_DOCS_DIR($_YFM_DOCS_DIR_DEFAULT_VALUE)
+ _SET_DOCS_BIN_DIR_FLAG($_DOCS_DIR_INTERNAL_NAMESPACE $MODDIR)
+}
+
+# tag:docs
+### This module is intended for internal use only. Common parts for submodules of DOCS multimodule
+### should be defined here.
+module _DOCS_BASE_UNIT: _DOCS_BARE_UNIT {
+ .ALIASES=DOCS_DIR=_YFM_DOCS_DIR
+ .NODE_TYPE=Library
+
+ ENABLE(_DOCS_BASE_UNIT)
+
+ PEERDIR+=build/platform/yfm
+ DOCS_CONFIG($_DOCS_YFM_DEFAULT_CONFIG)
+}
+
+# tag:internal tag:docs
+### _DOCS_YFM_USE_PLANTUML() # internal
+###
+### This macr sets appropriate dependencies for use of plantuml plugin
+macro _DOCS_YFM_USE_PLANTUML() {
+ when ($DOCSLIB == "yes") {
+ PEERDIR+=build/platform/java/jdk/jdk19 contrib/java/openjdk-fontconfig
+
+ _DOCS_ENV+=$_DOCS_PLANTUML_ENV
+ _DOCS_EXTRA_TOOLS+=${hide;tool:"contrib/tools/plantuml"}
+ }
+}
+
+# tag:docs
+### @usage: DOCS()
+###
+### Documentation project multimodule.
+###
+### When built directly, via RECURSE, DEPENDS or BUNDLE the output artifact is docs.tar.gz with statically generated site.
+### When PEERDIRed from other DOCS() module behaves like a UNION (supplying own content and dependencies to build target).
+### Peerdirs from modules other than DOCS are not accepted.
+### Most usual macros are not accepted, only used with the macros DOCS_DIR(), DOCS_CONFIG(), DOCS_VARS().
+###
+### @see: [DOCS_DIR()](#macro_DOCS_DIR), [DOCS_CONFIG()](#macro_DOCS_CONFIG), [DOCS_VARS()](#macro_DOCS_VARS).
+multimodule DOCS {
+ module DOCSBOOK: _DOCS_BASE_UNIT {
+ .CMD=_DOCS_YFM_CMD
+ .FINAL_TARGET=yes
+ .PEERDIR_POLICY=as_build_from
+ .IGNORED=DOCS_DIR DOCS_INCLUDE_SOURCES DOCS_COPY_FILES PEERDIR PYTHON RUN_PROGRAM RUN_PYTHON3 RUN_LUA RUN_JAVA_PROGRAM FROM_SANDBOX SRCS
+ .PEERDIRSELF=DOCSLIB
+
+ ENABLE(DOCSBOOK)
+
+ SET(MODULE_TAG DOCSBOOK)
+ SET(PEERDIR_TAGS DOCSLIB)
+
+ _DOCS_YFM_OUTPUT_FORMAT=$_DOCS_YFM_BOOK_OUTPUT_FORMAT
+
+ PROCESS_DOCS()
+ }
+
+ module DOCSLIB: _DOCS_BASE_UNIT {
+ .CMD=_DOCS_YFM_CMD
+ .PEERDIR_POLICY=as_build_from
+ .IGNORED=DOCS_DIR DOCS_INCLUDE_SOURCES DOCS_COPY_FILES PEERDIR PYTHON RUN_PROGRAM RUN_PYTHON3 RUN_LUA RUN_JAVA_PROGRAM FROM_SANDBOX SRCS
+ .PEERDIRSELF=DOCSLIB_INTERNAL
+ .PROXY=yes
+
+ ENABLE(DOCSLIB)
+
+ SET(MODULE_TAG DOCSLIB)
+ SET(PEERDIR_TAGS DOCSLIB_INTERNAL)
+
+ REALPRJNAME=preprocessed
+
+ _DOCS_YFM_OUTPUT_FORMAT=$_DOCS_YFM_LIB_OUTPUT_FORMAT
+
+ PROCESS_DOCS()
+ }
+
+ module DOCSLIB_INTERNAL: DOCS_LIBRARY {
+ .IGNORED=DOCS_CONFIG
+ .EPILOGUE=_DOCS_LIBRARY_EPILOGUE
+
+ ENABLE(DOCSLIB_INTERNAL)
+ DISABLE(START_TARGET)
+
+ SET(MODULE_TAG DOCSLIB_INTERNAL)
+ SET(PEERDIR_TAGS DOCSLIB_EXTERNAL DOCS_LIBRARY)
+ # additional .fake extension make this output suppressed by ya-bin
+ SET(MODULE_SUFFIX .docslib.fake)
+
+ SET(_DOCS_DIR_INTERNAL_NAMESPACE .)
+
+ REALPRJNAME=__docs_internal
+ }
+
+ module DOCSLIB_EXTERNAL: DOCS_LIBRARY {
+ .IGNORED=DOCS_CONFIG
+ .EPILOGUE=_DOCS_LIBRARY_EPILOGUE
+
+ ENABLE(DOCSLIB_EXTERNAL)
+ DISABLE(START_TARGET)
+
+ SET(MODULE_TAG DOCSLIB_EXTERNAL)
+ SET(PEERDIR_TAGS DOCSLIB_EXTERNAL DOCS_LIBRARY)
+
+ REALPRJNAME=__docs_external
+ }
+}
+
+_DOCS_FS_TOOLS=$YMAKE_PYTHON3 ${input:"build/scripts/fs_tools.py"} ${input;hide:"build/scripts/process_command_files.py"}
+
+_DOCS_MKDOCS_CMDLINE_SUFFIX=
+_DOCS_MKDOCS_BOOK_CMDLINE_SUFFIX=${pre=--dep ;ext=preprocessed.tar.gz:PEERS}
+_DOCS_MKDOCS_LIB_CMDLINE_SUFFIX=--preprocess-md-only
+
+_DOCS_MKDOCS_CMDLINE=\
+${cwd:ARCADIA_ROOT} $_DOCS_FS_TOOLS copy_all_files $_MKDOCS_DOCS_DIR_VALUE $BINDIR/__s $_DOCS_SRCS_VALUE \
+&& $YMAKE_PYTHON3 ${input:"build/scripts/copy_files_to_dir.py"} ${input;hide:"build/scripts/process_command_files.py"} --dest-dir $BINDIR/__s --skip-prefix $ARCADIA_ROOT --skip-prefix $ARCADIA_BUILD_ROOT ${input;context=TEXT:INCLUDE_SRCS} \
+&& ${cwd:BINDIR} $YMAKE_PYTHON3 ${input:"build/scripts/mkdocs_builder_wrapper.py"} $ARCADIA_BUILD_ROOT ${tool:"tools/mkdocs_builder"} --docs-dir $BINDIR/__s --output-tar $TARGET --config ${input:CONFIG} $_DOCS_VARS_FLAG $_DOCS_MKDOCS_CMDLINE_SUFFIX $_DOCS_EXTRA_TOOLS ${hide;input:EXTRA_INPUTS} $_DOCS_ENV $_DOCS_KV
+
+# tag:internal tag:docs
+macro _DOCS_MKDOCS_CMD_IMPL(CONFIG, INCLUDE_SRCS[], EXTRA_INPUTS[]) {
+ .CMD=$_DOCS_MKDOCS_CMDLINE
+}
+
+_DOCS_MKDOCS_CMD=$_DOCS_MKDOCS_CMD_IMPL($_DOCS_CONFIG_VALUE INCLUDE_SRCS $_DOCS_INCLUDE_SOURCES_VALUE)
+
+_DOCS_YFM_DEFAULT_CONFIG=$MODDIR/.yfm
+_DOCS_MKDOCS_DEFAULT_CONFIG=$MODDIR/mkdocs.yml
+
+# tag:docs
+### This module is intended for internal use only. Common parts for submodules of MKDOCS multimodule
+### should be defined here.
+module _MKDOCS_BASE_UNIT: _DOCS_BARE_UNIT {
+ .ALIASES=DOCS_DIR=_MKDOCS_DOCS_DIR
+
+ ENABLE(_MKDOCS_BASE_UNIT)
+
+ DOCS_CONFIG($_DOCS_MKDOCS_DEFAULT_CONFIG)
+}
+
+# tag:internal tag:docs
+### _MKDOCS_EPILOOGUE() # internal
+###
+### This macro executes macros which should be envoked after all user
+### specified macros in the ya.make file
+macro _MKDOCS_EPILOGUE() {
+ _LATE_GLOB(_DOCS_SRCS_GLOB ${pre=${ARCADIA_ROOT}/;suf=/**/*:_MKDOCS_DOCS_DIR_VALUE})
+ SET(_DOCS_SRCS_VALUE \${input;hide:_DOCS_SRCS_GLOB})
+}
+
+# tag:docs
+### @usage: MKDOCS()
+###
+### Documentation project multimodule.
+###
+### When built directly, via RECURSE, DEPENDS or BUNDLE the output artifact is docs.tar.gz with statically generated site (using mkdocs as builder).
+### When PEERDIRed from other MKDOCS() module behaves like a UNION (supplying own content and dependencies to build target).
+### Peerdirs from modules other than MKDOCS are not accepted.
+### Most usual macros are not accepted, only used with the macros DOCS_DIR(), DOCS_CONFIG(), DOCS_VARS().
+###
+### @see: [DOCS_DIR()](#macro_DOCS_DIR), [DOCS_CONFIG()](#macro_DOCS_CONFIG), [DOCS_VARS()](#macro_DOCS_VARS).
+multimodule MKDOCS {
+ module MKDOCSBOOK: _MKDOCS_BASE_UNIT {
+ .CMD=_DOCS_MKDOCS_CMD
+ .EPILOGUE=_MKDOCS_EPILOGUE
+ .FINAL_TARGET=yes
+ .PEERDIR_POLICY=as_build_from
+
+ ENABLE(MKDOCSBOOK)
+
+ SET(MODULE_TYPE PROGRAM)
+ SET(PEERDIR_TAGS MKDOCSLIB)
+ SET(MODULE_TAG MKDOCSBOOK)
+
+ _DOCS_MKDOCS_CMDLINE_SUFFIX=$_DOCS_MKDOCS_BOOK_CMDLINE_SUFFIX
+
+ PROCESS_MKDOCS()
+ }
+
+ module MKDOCSLIB: _MKDOCS_BASE_UNIT {
+ .CMD=_DOCS_MKDOCS_CMD
+ .EPILOGUE=_MKDOCS_EPILOGUE
+ .PEERDIR_POLICY=as_include
+
+ ENABLE(MKDOCSLIB)
+
+ SET(MODULE_TYPE LIBRARY)
+ SET(PEERDIR_TAGS MKDOCSLIB)
+ SET(MODULE_TAG MKDOCSLIB)
+
+ REALPRJNAME=preprocessed
+
+ _DOCS_MKDOCS_CMDLINE_SUFFIX=$_DOCS_MKDOCS_LIB_CMDLINE_SUFFIX
+
+ PROCESS_MKDOCS()
+ }
+}
+
+# tag:docs
+_DOCS_USE_PLANTUML=
+### @usage: USE_PLANTUML()
+###
+### Use PlantUML plug-in for yfm builder to render UML diagrams into documentation
+macro USE_PLANTUML() {
+ ENABLE(_DOCS_USE_PLANTUML)
+}
+
+# tag:docs
+_DOCS_DIR_VALUE=
+_DOCS_BIN_DIR_VALUE=
+### @usage: DOCS_DIR(path)
+###
+### Specify directory with source .md files for DOCS multimodule if it differs from project directory.
+### Path must be Arcadia root relative.
+###
+### @see: [DOCS](#multimodule_DOCS)
+macro DOCS_DIR(Dir) {
+ ENABLE(UNUSED_MACRO)
+}
+
+# tag:docs tag:internal
+macro _APPEND_DOCS_DIR_FLAG(DIR, NAMESPACE, DYMMY...) {
+ SET_APPEND(_DOCS_DIR_VALUE --docs-dir $DIR $NAMESPACE)
+}
+
+# tag:docs tag:internal
+macro _SET_DOCS_BIN_DIR_FLAG(NAMESPACE, DUMMY...) {
+ SET(_DOCS_BIN_DIR_VALUE --bin-dir $BINDIR $NAMESPACE $AUTO_INPUT)
+}
+
+# tag:docs tag:internal
+_YFM_DOCS_DIR_DEFAULT_VALUE=$MODDIR
+_YFM_DEFAULT_NAMESPACE=
+### @usage: DOCS_DIR(path) # internal
+macro _YFM_DOCS_DIR(DIR) {
+ _APPEND_DOCS_DIR_FLAG($DIR $_DOCS_DIR_INTERNAL_NAMESPACE $DIR)
+
+ SET(_VAR_DOCS_DIR_SALT __MODDIR__ $MODDIR __DIR__ $DIR)
+ SET(_DOCS_DIR_GLOB uniq_docs_dir_${hash:_VAR_DOCS_DIR_SALT})
+ _LATE_GLOB(${_DOCS_DIR_GLOB} ${ARCADIA_ROOT}/$DIR/**/*)
+ SET_APPEND(_DOCS_SRCS_VALUE \${input;hide:$_DOCS_DIR_GLOB})
+
+ # We set the value of var _YFM_DOCS_DIR_DEFAULT_VALUE to some non-existing dir. This value
+ # will be used in _DOCS_LIBRARY_EPILOGUE calls. In case when this macro _YFM_DOCS_DIR is
+ # explicitly called in DOCS_LIBRARY module $MODDIR as default DOCS_DIR for DOCS_LIBRARY will
+ # be ignore.
+ SET(_YFM_DOCS_DIR_DEFAULT_VALUE __dummy_dir__)
+}
+
+# tag:docs tag:internal
+_MKDOCS_DOCS_DIR_VALUE=$MODDIR
+### @usage: DOCS_DIR(path) # internal
+macro _MKDOCS_DOCS_DIR(Dir) {
+ SET(_MKDOCS_DOCS_DIR_VALUE $Dir)
+}
+
+# tag:docs
+_DOCS_DEFAULT_CONFIG=
+_DOCS_CONFIG_VALUE=$_DOCS_DEFAULT_CONFIG
+### @usage: DOCS_CONFIG(path)
+###
+### Specify path to config file for DOCS multimodule if it differs from default path.
+### If used for [MKDOCS](#multimodule_MKDOCS) multimodule the default path is "%%project_directory%%/mkdocs.yml".
+### If used for [DOCS](#multimodule_DOCS) multimodule the default path is "%%project_directory%%/.yfm".
+### Path must be either Arcadia root relative.
+###
+### @see: [DOCS](#multimodule_DOCS)
+macro DOCS_CONFIG(File) {
+ SET(_DOCS_CONFIG_VALUE $File)
+}
+
+# tag:docs
+_DOCS_VARS_VALUE=
+### @usage: DOCS_VARS(variable1=value1 variable2=value2 ...)
+###
+### Specify a set of default values of template variables for DOCS multimodule.
+### There must be no spaces around "=". Values will be treated as strings.
+###
+### @see: [DOCS](#multimodule_DOCS)
+macro DOCS_VARS(Args...) {
+ SET_APPEND(_DOCS_VARS_VALUE $Args)
+}
+
+# tag:docs
+_DOCS_INCLUDE_SOURCES_VALUE=
+### @usage: DOCS_INCLUDE_SOURCES(path...)
+###
+### Specify a list of paths to source code files which will be used as text includes in a documentation project.
+### Paths must be Arcadia root relative.
+###
+### @see: [DOCS](#multimodule_DOCS)
+macro DOCS_INCLUDE_SOURCES(Args...) {
+ SET_APPEND(_DOCS_INCLUDE_SOURCES_VALUE $Args)
+}
diff --git a/build/conf/export_gradle.no.conf b/build/conf/export_gradle.no.conf
new file mode 100644
index 0000000000..31eb5159b2
--- /dev/null
+++ b/build/conf/export_gradle.no.conf
@@ -0,0 +1,3 @@
+macro _WHEN_EXPORT_GRADLE() {
+ ENABLE(UNUSED)
+}
diff --git a/build/conf/export_gradle.yes.conf b/build/conf/export_gradle.yes.conf
new file mode 100644
index 0000000000..e1c085526a
--- /dev/null
+++ b/build/conf/export_gradle.yes.conf
@@ -0,0 +1,3 @@
+macro _WHEN_EXPORT_GRADLE() {
+ _SETUP_PROJECT_COORDS_IF_NEEDED($MODDIR)
+}
diff --git a/build/conf/java.ymake.conf b/build/conf/java.ymake.conf
new file mode 100644
index 0000000000..f3d9577143
--- /dev/null
+++ b/build/conf/java.ymake.conf
@@ -0,0 +1,241 @@
+YMAKE_JAVA_MODULES=yes
+JBUILD_JAVA_MODULES=no
+
+macro _INPUT_WITH_FLAG(Flag, IN[]) {
+ .CMD=$_INPUT_WITH_FLAG_IMPL(${pre=$Flag :IN} IN $IN)
+}
+
+macro _INPUT_WITH_FLAG_IMPL(IN{input}[], Args...) {
+ .CMD=$Args ${input;hide:IN}
+}
+
+macro ACCELEO(XSD{input}[], MTL{input}[], MTL_ROOT="${MODDIR}", LANG{input}[], OUT{output}[], OUT_NOAUTO{output}[], OUTPUT_INCLUDES[], DEBUG?"stdout2stderr":"stderr2stdout") {
+ .PEERDIR=build/platform/java/jdk $JDK_RESOURCE_PEERDIR
+ .CMD=${cwd:ARCADIA_BUILD_ROOT} $YMAKE_PYTHON ${input;pre=build/scripts/:DEBUG.py} $JDK_RESOURCE/bin/java -Dfile.encoding=utf8 -classpath ${RUN_JAR_PROG_CP_PRE}${tool:"tools/acceleo"}${RUN_JAR_PROG_CP_SUF} ru.yandex.se.logsng.tool.Cli $_INPUT_WITH_FLAG(--xsd IN $XSD) $_INPUT_WITH_FLAG(--mtl IN $MTL) $_INPUT_WITH_FLAG(--lang IN $LANG) --output-dir $BINDIR --build-root ${ARCADIA_BUILD_ROOT} --source-root ${ARCADIA_ROOT} --mtl-root $MTL_ROOT ${output_include;hide:OUTPUT_INCLUDES} ${output;hide:OUT} ${output;noauto;hide:OUT_NOAUTO} ${kv;hide:"p JV"} ${kv;hide:"pc light-blue"} ${kv;hide:"show_out"}
+}
+
+### @usage: JAVA_LIBRARY()
+###
+### The module describing java library build.
+###
+### Documentation: https://wiki.yandex-team.ru/yatool/java/
+module JAVA_LIBRARY: JAR_LIBRARY {
+ .SEM=BUILD_JAR_SEM
+}
+
+PROGRAM_AND_TESTS_CP_COLLECTING_NODES_SEM=IGNORED
+
+### @usage: JAVA_PROGRAM()
+###
+### The module describing java programs build.
+### Output artifacts: .jar and directory with all the jar to the classpath of the formation.
+###
+### Documentation: https://wiki.yandex-team.ru/yatool/java/
+multimodule JAVA_PROGRAM {
+ module JAR_RUNNABLE: _JAR_RUNNABLE {
+ .ALLOWED=JAVA_RUNTIME_PEERDIR JAVA_RUNTIME_EXCLUDE
+ .SEM=PROGRAM_AND_TESTS_CP_COLLECTING_NODES_SEM
+ # TODO(svidyuk) JAVA_DEPENDENCIES_CONFIGURATION must not be ignored here but there are diagnostics issues in case of ECLUDE in the middle:
+ # * A -> B -> C -> lib-v1.4
+ # | |-> DM(lib-v1.1)
+ # | |-> EXCLUDE(lib-v1.4)
+ # | |-> FORBID_CONFLICT_DM_RECENT = OK
+ # |-> DM(lib-v1.1)
+ # |-> FORBID_CONFLICT_DM_RECENT = FAIL (because downgrade from v1.4 to v1.1 is detected before understanding that v1.4 was excuded on the examined path)
+ .IGNORED=RUN_JAVA_PROGRAM JAVA_DEPENDENCIES_CONFIGURATION PROVIDES
+ .ALIASES=JAVA_RUNTIME_PEERDIR=PEERDIR JAVA_RUNTIME_EXCLUDE=EXCLUDE
+ .PEERDIRSELF=JAR_COMPILATION
+
+ SET(MODULE_TYPE JAVA_PROGRAM)
+ }
+ module JAR_COMPILATION: JAR_LIBRARY {
+ .IGNORED=JAVA_RUNTIME_PEERDIR JAVA_RUNTIME_EXCLUDE
+ .ALIASES=JAVA_RUNTIME_PEERDIR=_NOOP_MACRO JAVA_RUNTIME_EXCLUDE=_NOOP_MACRO
+ .SEM=BUILD_JAR_SEM
+ .FINAL_TARGET=no
+ SET(MODULE_TYPE JAVA_PROGRAM)
+ }
+}
+
+BUILD_JUNIT5_JAR_SEM=$BUILD_JAR_SEM && junit5_test
+
+multimodule JUNIT5 {
+ module JAR_TESTABLE: _JAR_TEST {
+ .ALLOWED=YT_SPEC
+ # TODO(svidyuk) JAVA_DEPENDENCIES_CONFIGURATION must not be ignored here but there are diagnostics issues in case of ECLUDE in the middle:
+ # * A -> B -> C -> lib-v1.4
+ # | |-> DM(lib-v1.1)
+ # | |-> EXCLUDE(lib-v1.4)
+ # | |-> FORBID_CONFLICT_DM_RECENT = OK
+ # |-> DM(lib-v1.1)
+ # |-> FORBID_CONFLICT_DM_RECENT = FAIL (because downgrade from v1.4 to v1.1 is detected before understanding that v1.4 was excuded on the examined path)
+ .IGNORED=JAVA_SRCS RUN_JAVA_PROGRAM JAVA_DEPENDENCIES_CONFIGURATION
+ .ALIASES=JAVA_TEST_PEERDIR=PEERDIR JAVA_TEST_EXCLUDE=EXCLUDE
+ .PEERDIRSELF=JAR_COMPILATION
+ .SEM=PROGRAM_AND_TESTS_CP_COLLECTING_NODES_SEM
+
+ PEERDIR(devtools/jtest-annotations/junit5)
+
+ SET(MODULE_TYPE JUNIT5)
+ }
+ module JAR_COMPILATION: JAR_LIBRARY {
+ .ALLOWED=YT_SPEC
+ .ALIASES=JAVA_TEST_PEERDIR=_NOOP_MACRO JAVA_TEST_EXCLUDE=_NOOP_MACRO
+ .FINAL_TARGET=no
+ .DEFAULT_NAME_GENERATOR=FullPath
+ .SEM=BUILD_JUNIT5_JAR_SEM
+
+ PEERDIR+=devtools/junit5-runner
+ PEERDIR+=build/platform/java/jacoco-agent
+
+ when ($OPENSOURCE != "yes") {
+ PEERDIR+=devtools/jtest-annotations/junit5
+ }
+ SET(MODULE_TYPE JUNIT5)
+ }
+}
+
+BUILD_JUNIT4_JAR_SEM=$BUILD_JAR_SEM && junit4_test
+
+multimodule JTEST {
+ module JAR_TESTABLE: _JAR_TEST {
+ .ALLOWED=YT_SPEC
+ # TODO(svidyuk) JAVA_DEPENDENCIES_CONFIGURATION must not be ignored here but there are diagnostics issues in case of ECLUDE in the middle:
+ # * A -> B -> C -> lib-v1.4
+ # | |-> DM(lib-v1.1)
+ # | |-> EXCLUDE(lib-v1.4)
+ # | |-> FORBID_CONFLICT_DM_RECENT = OK
+ # |-> DM(lib-v1.1)
+ # |-> FORBID_CONFLICT_DM_RECENT = FAIL (because downgrade from v1.4 to v1.1 is detected before understanding that v1.4 was excuded on the examined path)
+ .IGNORED=JAVA_SRCS RUN_JAVA_PROGRAM JAVA_DEPENDENCIES_CONFIGURATION
+ .ALIASES=JAVA_TEST_PEERDIR=PEERDIR JAVA_TEST_EXCLUDE=EXCLUDE
+ .PEERDIRSELF=JAR_COMPILATION
+ .SEM=PROGRAM_AND_TESTS_CP_COLLECTING_NODES_SEM
+
+ SET(MODULE_TYPE JTEST)
+ PEERDIR(devtools/junit-runner devtools/jtest-annotations/junit4)
+ DEPENDENCY_MANAGEMENT(contrib/java/com/google/code/gson/gson/2.8.6 contrib/java/com/beust/jcommander/1.72 contrib/java/junit/junit/4.12)
+ }
+ module JAR_COMPILATION: JAR_LIBRARY {
+ .ALLOWED=YT_SPEC
+ .ALIASES=JAVA_TEST_PEERDIR=_NOOP_MACRO JAVA_TEST_EXCLUDE=_NOOP_MACRO
+ .FINAL_TARGET=no
+ .DEFAULT_NAME_GENERATOR=FullPath
+ .SEM=BUILD_JUNIT4_JAR_SEM
+
+ SET(MODULE_TYPE JTEST)
+ DEPENDS(contrib/java/org/sonarsource/scanner/cli/sonar-scanner-cli/2.8)
+
+ PEERDIR+=build/platform/java/jacoco-agent
+ when ($OPENSOURCE != "yes") {
+ PEERDIR+=devtools/jtest-annotations/junit4
+ }
+ }
+}
+
+multimodule JTEST_FOR {
+ module JAR_TESTABLE: _JAR_TEST {
+ .ALLOWED=YT_SPEC
+ # TODO(svidyuk) JAVA_DEPENDENCIES_CONFIGURATION must not be ignored here but there are diagnostics issues in case of ECLUDE in the middle:
+ # * A -> B -> C -> lib-v1.4
+ # | |-> DM(lib-v1.1)
+ # | |-> EXCLUDE(lib-v1.4)
+ # | |-> FORBID_CONFLICT_DM_RECENT = OK
+ # |-> DM(lib-v1.1)
+ # |-> FORBID_CONFLICT_DM_RECENT = FAIL (because downgrade from v1.4 to v1.1 is detected before understanding that v1.4 was excuded on the examined path)
+ .IGNORED=JAVA_SRCS RUN_JAVA_PROGRAM JAVA_DEPENDENCIES_CONFIGURATION
+ .ALIASES=JAVA_TEST_PEERDIR=PEERDIR JAVA_TEST_EXCLUDE=EXCLUDE
+ .PEERDIRSELF=JAR_COMPILATION
+ .SEM=PROGRAM_AND_TESTS_CP_COLLECTING_NODES_SEM
+
+ SET(MODULE_TYPE JTEST_FOR)
+ PEERDIR(${UNITTEST_DIR} devtools/junit-runner)
+ DEPENDENCY_MANAGEMENT(contrib/java/com/google/code/gson/gson/2.8.6 contrib/java/com/beust/jcommander/1.72 contrib/java/junit/junit/4.12)
+ }
+ module JAR_COMPILATION: JAR_LIBRARY {
+ .ALLOWED=YT_SPEC
+ .ALIASES=JAVA_TEST_PEERDIR=_NOOP_MACRO JAVA_TEST_EXCLUDE=_NOOP_MACRO
+ .FINAL_TARGET=no
+ .DEFAULT_NAME_GENERATOR=FullPath
+ .SEM=BUILD_JUNIT4_JAR_SEM
+
+ SET(MODULE_TYPE JTEST_FOR)
+ DEPENDS(contrib/java/org/sonarsource/scanner/cli/sonar-scanner-cli/2.8)
+ PEERDIR(devtools/junit-runner build/platform/java/jacoco-agent ${UNITTEST_DIR})
+ }
+}
+
+multimodule JAVA_CONTRIB_PROGRAM {
+ module JAR_RUNNABLE: _JAR_RUNNABLE {
+ .IGNORED=JAVA_SRCS RUN_JAR_PROGRAM RUN_JAVA_PROGRAM JAR_RESOURCE SRC_RESOURCE LOCAL_JAR
+ .PEERDIRSELF=JAR_COMPILATION
+
+ SET(MODULE_TYPE JAVA_PROGRAM)
+ ENABLE(DISABLE_SCRIPTGEN)
+ }
+ module JAR_COMPILATION: JAVA_CONTRIB {
+ .ALIASES=JAVA_RUNTIME_PEERDIR=_NOOP_MACRO JAVA_RUNTIME_EXCLUDE=_NOOP_MACRO
+ .FINAL_TARGET=no
+ .SEM=BUILD_JAR_SEM
+ }
+}
+
+_EXPLICIT_SWIG_JAVA_SOURCES=
+_EXPLICIT_SWIG_IFACE_SOURCES=
+macro _EXPORT_JAVA_BINDINGS(JavaSrcs...) {
+ SET_APPEND(_EXPLICIT_SWIG_JAVA_SOURCES ${input:JavaSrcs})
+ .SEM=find_package SWIG COMPONENTS java && find_package Java && find_package JNI && include UseSWIG && include UseJava ${input;hide:JavaSrcs} ${output;hide;pre=$_HASH_HELPER($Args):".o"}
+}
+macro _EXPORT_SWIG_SOURCES(SwigSrcs...) {
+ SET_APPEND(_EXPLICIT_SWIG_IFACE_SOURCES ${input:SwigSrcs})
+}
+
+macro _JNI_CPP_SWIG_SRCS(Srcs...) {
+ SRCS(${ext=.cpp:Srcs} ${ext=.swg:Srcs})
+ _EXPORT_JAVA_BINDINGS(${ext=.java:Srcs})
+ _EXPORT_SWIG_SOURCES(${ext=.swg:Srcs})
+}
+macro _JNI_JAVA_SWIG_SRCS(Srcs...) {
+ SRCS(${ext=.java:Srcs} ${ext=.swg:Srcs})
+}
+
+SWIG_JNI_BINDINGS_SEM= \
+ add_swig_jni_library ${MODDIR} ${REALPRJNAME}-cpp GEN_JAVA_FILES_LIST ${"$"}{CMAKE_CURRENT_BINARY_DIR}/swig_gen_java.lst SOURCES ${_EXPLICIT_SWIG_IFACE_SOURCES} && \
+ set_target_property OUTPUT_NAME $REALPRJNAME && \
+ ${VCS_INFO_SEM} && \
+ target_include_directories PUBLIC $_C__INCLUDE_GLOBAL && \
+ target_include_directories PRIVATE $_C__INCLUDE_OWNED && \
+ target_compile_options PRIVATE $USER_CFLAGS $USER_CXXFLAGS $_SEM_EXTRA_CXX_FLAGS && target_compile_options PUBLIC $USER_CFLAGS_GLOBAL_RAW $USER_CXXFLAGS_GLOBAL_RAW && \
+ target_link_options PRIVATE $LDFLAGS_GLOBAL_RAW $LDFLAGS $OBJADDE_LIB $OBJADDE && \
+ add_jar ${REALPRJNAME} SOURCES $_EXPLICIT_SWIG_JAVA_SOURCES @${"$"}{CMAKE_CURRENT_BINARY_DIR}/swig_gen_java.lst ${hide:TARGET}
+
+### @usage: DLL_JAVA()
+###
+### DLL built using swig for Java. Produces dynamic library and a .jar.
+### Dynamic library is treated the same as in the case of PEERDIR from Java to DLL.
+### .jar goes on the classpath.
+###
+### Documentation: https://wiki.yandex-team.ru/yatool/java/#integracijascpp/pythonsborkojj
+multimodule DLL_JAVA {
+ module JNI_DLL: DLL {
+ .ALIASES=SRCS=_JNI_CPP_SWIG_SRCS
+ .FINAL_TARGET=no
+ .SEM=SWIG_JNI_BINDINGS_SEM
+ SWIG_LANG=jni_cpp
+ }
+ module JAR_COMPILATION: EXTERNAL_JAVA_LIBRARY {
+ .ARGS_PARSER=DLL
+ .ALIASES=SRCS=_JNI_JAVA_SWIG_SRCS PEERDIR=_NOOP_MACRO
+ .PEERDIRSELF=JNI_DLL
+ PEERDIR+=build/platform/java/jdk
+ PEERDIR+=$JDK_RESOURCE_PEERDIR
+ SET(DONT_RESOLVE_INCLUDES yes)
+ .FINAL_TARGET=yes
+
+ SWIG_LANG=jni_java
+ _SWIG_CMD=$_SWIG_JNI_JAVA_CMD
+ _SWIG_ADDINCLS=$_SWIG_JNI_ADDINCLS
+ _SWIG_PEERDIR=$_SWIG_JNI_PEERDIR
+ _SWIG_SEM_TO_MODULE_LINK=${output;hide;suf=.jsrc:SRC}
+ }
+}
diff --git a/build/conf/jbuild.ymake.conf b/build/conf/jbuild.ymake.conf
new file mode 100644
index 0000000000..b9c88dd2db
--- /dev/null
+++ b/build/conf/jbuild.ymake.conf
@@ -0,0 +1,124 @@
+YMAKE_JAVA_MODULES=no
+JBUILD_JAVA_MODULES=yes
+
+EXTERNAL_JAR_VALUE=
+### @usage: EXTERNAL_JAR(library.jar)
+###
+### Provide an external name for built JAVA_LIBRARY() or JAVA_PROGRAM()
+###
+### Documentation: https://wiki.yandex-team.ru/yatool/java/#ispolzovanievneshnixmavenbibliotek
+macro EXTERNAL_JAR(Args...) {
+ SET_APPEND(EXTERNAL_JAR_VALUE $ARGS_DELIM $Args)
+}
+
+### @usage: JAVA_LIBRARY()
+###
+### The module describing java library build.
+###
+### Documentation: https://wiki.yandex-team.ru/yatool/java/
+module JAVA_LIBRARY: _JAVA_PLACEHOLDER {
+ SET(MODULE_TYPE JAVA_LIBRARY)
+}
+
+### @usage: JAVA_PROGRAM()
+###
+### The module describing java programs build.
+### Output artifacts: .jar and directory with all the jar to the classpath of the formation.
+###
+### Documentation: https://wiki.yandex-team.ru/yatool/java/
+module JAVA_PROGRAM: _JAVA_PLACEHOLDER {
+ .ALIASES=JAVA_RUNTIME_PEERDIR=PEERDIR JAVA_RUNTIME_EXCLUDE=EXCLUDE
+ SET(MODULE_TYPE JAVA_PROGRAM)
+}
+
+### @usage: JUNIT5()
+###
+### Java tests module based on JUnit 5 framework.
+###
+### If requested, build system will scan the source code of the module for the presence of junit tests and run them.
+### Output artifacts: a jar, a directory of exhaust tests(if required run the tests) - test logs, system logs testiranja, temporary files, tests, etc.
+###
+### Documentation: https://wiki.yandex-team.ru/yatool/test/#testynajava
+module JUNIT5: _JAVA_PLACEHOLDER {
+ .ALIASES=JAVA_TEST_PEERDIR=PEERDIR JAVA_TEST_EXCLUDE=EXCLUDE
+ SET(MODULE_TYPE JUNIT5)
+ SET(TEST_RUNNER devtools/junit5-runner)
+ SET(TEST_CLASSPATH_VALUE ${MODDIR} ${TEST_RUNNER})
+ PEERDIR(devtools/jtest-annotations/junit5)
+ # Used as place to add managed dependencies for test execution and take them into account
+ # during traverses properly.
+ _RUN_JAVA(TOOL ${TEST_RUNNER} OUT fake.out.java_test_cmd)
+
+ PEERDIR(${TEST_RUNNER})
+ PEERDIR(build/platform/java/jacoco-agent)
+ JAVA_TEST()
+}
+
+### @usage: JTEST()
+###
+### Java tests module based on JUnit 4 framework.
+###
+### If requested, build system will scan the source code of the module for the presence of junit tests and run them.
+### Output artifacts: a jar, a directory of exhaust tests(if required run the tests) - test logs, system logs testiranja, temporary files, tests, etc.
+###
+### Documentation: https://wiki.yandex-team.ru/yatool/test/#testynajava
+module JTEST: _JAVA_PLACEHOLDER {
+ .ALLOWED=YT_SPEC
+ .ALIASES=JAVA_TEST_PEERDIR=PEERDIR JAVA_TEST_EXCLUDE=EXCLUDE
+ SET(MODULE_TYPE JTEST)
+ SET(TEST_RUNNER devtools/junit-runner)
+ SET(TEST_CLASSPATH_VALUE ${MODDIR} ${TEST_RUNNER})
+ # Used as place to add managed dependencies for test execution and take them into account
+ # during traverses properly.
+ _RUN_JAVA(TOOL ${TEST_RUNNER} OUT fake.out.java_test_cmd)
+
+ PEERDIR(devtools/jtest-annotations/junit4)
+
+ # TODO: if <needs_sonar>
+ DEPENDS(contrib/java/org/sonarsource/scanner/cli/sonar-scanner-cli/2.8)
+ DEPENDS(${TEST_RUNNER})
+ _GHOST_PEERDIR(${TEST_RUNNER})
+ PEERDIR(build/platform/java/jacoco-agent)
+ JAVA_TEST()
+
+ SET_APPEND(_MAKEFILE_INCLUDE_LIKE_DEPS canondata/result.json)
+}
+
+### @usage: JTEST_FOR(ModuleDir)
+###
+### Convinience java tests module based on JUnit 4 framework for specified library or program.
+###
+### In contrast to the JTEST, the build system will scan for the presence of the test sources of the module in ModuleDir . As ModuleDir should contain JAVA_PROGRAM or JAVA_LIBRARY . JTEST_FOR also can have its own source, in this case they will be compiled and added to the classpath of a test run.
+### Output artifacts: a jar, a directory of exhaust tests(if requested tests are run).
+###
+### Documentation: https://wiki.yandex-team.ru/yatool/test/#testynajava
+module JTEST_FOR: JTEST {
+ .ALIASES=JAVA_TEST_PEERDIR=PEERDIR JAVA_TEST_EXCLUDE=EXCLUDE
+ SET(MODULE_TYPE JTEST_FOR)
+ SET(TEST_CLASSPATH_VALUE ${MODDIR} ${TEST_RUNNER} ${UNITTEST_DIR})
+
+ PEERDIR(devtools/jtest-annotations/junit4 $UNITTEST_DIR)
+ SET(REALPRJNAME jtest)
+ JAVA_TEST()
+}
+
+module JAVA_CONTRIB_PROGRAM: JAVA_CONTRIB {
+ SET(MODULE_TYPE JAVA_PROGRAM)
+ ENABLE(DISABLE_SCRIPTGEN)
+}
+
+### @usage: DLL_JAVA()
+###
+### DLL built using swig for Java. Produces dynamic library and a .jar.
+### Dynamic library is treated the same as in the case of PEERDIR from Java to DLL.
+### .jar goes on the classpath.
+###
+### Documentation: https://wiki.yandex-team.ru/yatool/java/#integracijascpp/pythonsborkojj
+module DLL_JAVA: DLL {
+ .EXTS=.o .obj .jsrc .java .mf
+ .CMD=SWIG_DLL_JAR_CMD
+ PEERDIR(build/platform/java/jdk)
+ PEERDIR+=$JDK_RESOURCE_PEERDIR
+
+ SWIG_LANG=java
+}
diff --git a/build/conf/license.conf b/build/conf/license.conf
new file mode 100644
index 0000000000..a5e8142f0c
--- /dev/null
+++ b/build/conf/license.conf
@@ -0,0 +1,438 @@
+LICENSE_EXPRESSION_IMPLICIT_OR=yes
+LICENSE_EXPRESSION_IMPLICIT_AND=yes
+LICENSE_EXPRESSION=
+LICENSE_NAMES=
+
+MODULE_LICENSES_RESTRICTIONS=
+MODULE_LICENSES_RESTRICTION_EXCEPTIONS=
+MODULE_LICENSES_RESTRICTION_TYPES=
+DEFAULT_MODULE_LICENSE=YandexUncategorized
+EXPLICIT_LICENSE_PREFIXES=
+
+# List of license properties which can be used to restrict transitive dependencies. There are three variables checked for each
+# property:
+# * LICENSES_<PROP_NAME>_STATIC: list of licenses which propagates this property when linking with code published by one of
+# them statically.
+# * LICENSES_<PROP_NAME>_DYNAMIC: list of licenses which propagates this property when linking with code published by one of
+# them dyamically.
+# * LICENSES_<PROP_NAME>: list of licenses which propagates this property regrdless of type of linking with code published by
+# one of them. Putting some license into this list is equivalent to putting it into both
+# LICENSES_<PROP_NAME>_STATIC and LICENSES_<PROP_NAME>_DYNAMIC lists.
+LICENSE_PROPERTIES= \
+ FORBIDDEN NDA REQUIRE_DISCLOSURE PERMISSIVE REQUIRE_CITATION SERVICE PROTESTWARE
+
+
+# NB: Licenses lists below are sorted case-insensitively. Please, keep the list sorted.
+LICENSES_UNATTRIBUTED= \
+ AFL-2.0 \
+ Amazon-SL \
+ AML \
+ APSL-1.0 \
+ Artistic-1.0-Perl \
+ Artistic-2.0 \
+ ASM-BSD-3-Clause \
+ BCL \
+ Bison-Exception \
+ Bison-exception-2.2 \
+ BouncyCastle-MIT \
+ BSD-3-Clause-Clear \
+ BSD-3-Clause-Open-MPI \
+ BSD-4-Clause-Shortened \
+ Bsd-New-Tcpdump \
+ Bsd-Original-Uc-1986 \
+ BSLA \
+ Carnegie-Mellon \
+ Carnegie-Mellon-Contributors \
+ CC-BY-1.0 \
+ CC-BY-2.0 \
+ CC-BY-2.5 \
+ CC-BY-3.0 \
+ CC-BY-4.0 \
+ CC-BY-NC-1.0 \
+ CC-BY-NC-2.0 \
+ CC-BY-NC-2.5 \
+ CC-BY-NC-3.0 \
+ CC-BY-NC-ND-1.0 \
+ CC-BY-NC-ND-2.0 \
+ CC-BY-NC-ND-2.5 \
+ CC-BY-NC-ND-3.0 \
+ CC-BY-NC-SA-1.0 \
+ CC-BY-NC-SA-2.0 \
+ CC-BY-NC-SA-2.5 \
+ CC-BY-NC-SA-3.0 \
+ CC-BY-ND-1.0 \
+ CC-BY-ND-2.0 \
+ CC-BY-ND-2.5 \
+ CC-BY-ND-3.0 \
+ CC-BY-SA-1.0 \
+ CC-BY-SA-2.0 \
+ CC-BY-SA-2.5 \
+ CC-BY-SA-3.0 \
+ CC-BY-SA-4.0 \
+ CDDL \
+ CECILL-B \
+ ClArtistic \
+ DOC \
+ DSO-1.1 \
+ Elastic-License-2.0 \
+ Fftpack-2004 \
+ FSFUL \
+ FSFULLR \
+ GCC-exception-3.1 \
+ GDAL \
+ GFDL-1.1-or-later \
+ Go-License \
+ Google-Patent-License-Webm \
+ Google-Patent-License-Webrtc \
+ GPL-2.0 WITH Classpath-exception-2.0 \
+ GPL-2.0 WITH FOSS-exception \
+ GPL-2.0-only WITH freertos-exception-2.0 \
+ GPL-2.0-only WITH Mysql-Linking-Exception-2018 \
+ GPL-2.0-only WITH Universal-FOSS-exception-1.0 \
+ GPL-2.0-or-later WITH Avisynth-C-Interface-Exception \
+ GPL-2.0-or-later WITH Bison-Exception-2.0 \
+ GPL-2.0-or-later WITH Bison-exception-2.2 \
+ GPL-2.0-or-later WITH C-Interface-Exception \
+ GPL-2.0-or-later WITH freertos-exception-2.0 \
+ GPL-2.0-or-later WITH Libtool-exception \
+ GPL-2.0-or-later WITH mif-exception \
+ GWT-Terms \
+ Hdf5 \
+ HPND \
+ HPND-sell-variant \
+ HPND-sell-variant \
+ HSQLDB-BSD-3-Clause \
+ Ibm-Dhcp \
+ Ietf-trust \
+ ImageMagick \
+ Info-Zip \
+ Intel-Material \
+ IPL-1.0 \
+ JAMon-BSD-3-Clause \
+ jQuery-MIT \
+ LGPL-2.0-or-later WITH Sdbus-C++-LGPL-exception-1.1 \
+ LGPL-3.0-or-later WITH ZeroMQ-Exception \
+ LicenseRef-scancode-afpl-9.0 \
+ LicenseRef-scancode-amd-historical \
+ LicenseRef-scancode-anu-license \
+ LicenseRef-scancode-bsd-3-clause-jtag \
+ LicenseRef-scancode-bsd-axis-nomod \
+ LicenseRef-scancode-bsd-new-nomod \
+ LicenseRef-scancode-bsd-no-disclaimer \
+ LicenseRef-scancode-bsd-x11 \
+ LicenseRef-scancode-bsla-no-advert \
+ LicenseRef-scancode-cavium-malloc \
+ LicenseRef-scancode-cc-by-2.0-uk \
+ LicenseRef-scancode-cc-devnations-2.0 \
+ LicenseRef-scancode-cc-sampling-1.0 \
+ LicenseRef-scancode-cmu-simple \
+ LicenseRef-scancode-commercial-license \
+ LicenseRef-scancode-commons-clause \
+ LicenseRef-scancode-delorie-historical \
+ LicenseRef-scancode-flex-2.5 \
+ LicenseRef-scancode-free-unknown \
+ LicenseRef-scancode-gary-s-brown \
+ LicenseRef-scancode-generic-cla \
+ LicenseRef-scancode-generic-exception \
+ LicenseRef-scancode-intel-osl-1993 \
+ LicenseRef-scancode-mit-xfig \
+ LicenseRef-scancode-newlib-historical \
+ LicenseRef-scancode-nilsson-historical \
+ LicenseRef-scancode-openssl \
+ LicenseRef-scancode-openssl-exception-lgpl-3.0-plus \
+ LicenseRef-scancode-openssl-nokia-psk-contribution \
+ LicenseRef-scancode-osf-1990 \
+ LicenseRef-scancode-other-copyleft \
+ LicenseRef-scancode-other-permissive \
+ LicenseRef-scancode-paul-mackerras \
+ LicenseRef-scancode-paul-mackerras-binary \
+ LicenseRef-scancode-paul-mackerras-new \
+ LicenseRef-scancode-pcre \
+ LicenseRef-scancode-ppp \
+ LicenseRef-scancode-proprietary-license \
+ LicenseRef-scancode-secret-labs-2011 \
+ LicenseRef-scancode-ssleay-windows \
+ LicenseRef-scancode-sun-source \
+ LicenseRef-scancode-swig \
+ LicenseRef-scancode-unknown \
+ LicenseRef-scancode-unknown-license-reference \
+ LicenseRef-scancode-unknown-spdx \
+ LicenseRef-scancode-warranty-disclaimer \
+ LicenseRef-scancode-xfree86-1.0 \
+ LPL-1.02 \
+ MirOS \
+ Mit-Xfig \
+ Mozilla-GC \
+ NAIST-2003 \
+ Nvidia-Gov \
+ Oracle \
+ Oracle-technology \
+ PSF-3.7.2 \
+ Qhull \
+ Quicklz \
+ Ruby \
+ Sendmail \
+ Softsurfer \
+ Spencer-99 \
+ SSPL-1.0 \
+ Stlport-4.5 \
+ SZIP \
+ TCL \
+ TU-Berlin-1.0 \
+ Unicode-TOU \
+ Universal-FOSS-exception-1.0 \
+ Unknown \
+ Vcalendar \
+ Vim \
+ X11-Adobe-Dec \
+ X11-Hanson \
+ X11-XConsortium-Veillard \
+ Xfree86-1.0 \
+ Xnet
+
+LICENSES_PATCHES_FORBIDDEN= \
+ Unicode
+
+LICENSES_FORBIDDEN= \
+ AGPL-3.0-only \
+ AGPL-3.0-or-later \
+ Artistic-1.0 \
+ Musl-Exception \
+ ${LICENSES_UNATTRIBUTED}
+
+# Group for proprietary code licenses
+LICENSES_NDA= \
+ Intel-NDA \
+ mimepp \
+ OracleOebs \
+ Sophos-SDK \
+ YandexUncategorized \
+ YandexNDA
+
+# These licenses allow use with opensource code only
+LICENSES_REQUIRE_DISCLOSURE= \
+ CDDL-1.0 \
+ CDDL-1.1 \
+ CECILL-2.0 \
+ CPL-1.0 \
+ EPL-1.0 \
+ EPL-2.0 \
+ GPL \
+ GPL-1.0-only \
+ GPL-1.0-or-later \
+ GPL-1.0-or-later WITH Linux-syscall-note \
+ GPL-1.1 \
+ GPL-2.0 \
+ GPL-2.0-only \
+ GPL-2.0-only WITH GCC-exception-2.0 \
+ GPL-2.0-only WITH Linux-syscall-note \
+ GPL-2.0-or-later \
+ GPL-2.0-or-later WITH GCC-exception-2.0 \
+ GPL-2.0-or-later WITH Linux-syscall-note \
+ GPL-3.0-only \
+ GPL-3.0-only WITH Bison-exception-2.2 \
+ GPL-3.0-or-later \
+ GPL-3.0-or-later WITH Bison-exception-2.2 \
+ GPLv2+
+
+LICENSES_REQUIRE_DISCLOSURE_STATIC= \
+ LGPL \
+ LGPL-1.0-or-later \
+ LGPL-2.0-only \
+ LGPL-2.0-or-later \
+ LGPL-2.0-or-later WITH Libtool-exception \
+ LGPL-2.0-or-later WITH Linux-syscall-note \
+ LGPL-2.1-only \
+ LGPL-2.1-only WITH Linux-syscall-note \
+ LGPL-2.1-or-later \
+ LGPL-2.1-or-later WITH Linux-syscall-note \
+ LGPL-3.0-only \
+ LGPL-3.0-or-later
+
+# These licenses allows any kind of linkage with proprietary code
+LICENSES_PERMISSIVE= \
+ 0BSD \
+ Apache-1.0 \
+ Apache-1.1 \
+ Apache-2.0 \
+ Apache-2.0 WITH LLVM-exception \
+ APSL-2.0 \
+ Beerware \
+ blessing \
+ BSD \
+ BSD-1-Clause \
+ BSD-2-Clause \
+ BSD-2-Clause-Patent \
+ BSD-2-Clause-Views \
+ BSD-3-Clause \
+ BSD-4-Clause \
+ BSD-4-Clause-UC \
+ BSD-derived \
+ BSD-ORIGINAL-UC-1986 \
+ Bsd-Simplified-Darwin \
+ BSD-Source-Code \
+ Bsd-Unchanged \
+ Bsd-Unmodified \
+ BSL-1.0 \
+ bzip2-1.0.6 \
+ CC-PDDC \
+ CC0-1.0 \
+ Cmu-Computing-Services \
+ CUP-Parser \
+ curl \
+ Custom-Punycode \
+ EDL-1.0 \
+ Facebook-SDK \
+ FDK \
+ FSFAP \
+ FTL \
+ H2 \
+ IBM-pibs \
+ ICU \
+ Ietf \
+ IJG \
+ Intel-LLVM-SGA \
+ Intel-Simplified \
+ ISC \
+ JSON \
+ Khronos \
+ Libpbm \
+ Libpng \
+ libpng-2.0 \
+ libtiff \
+ LicenseRef-scancode-ams-fonts \
+ LicenseRef-scancode-bitstream \
+ Linux-OpenIB \
+ Martin-Birgmeier \
+ Minpack \
+ MIT \
+ MIT-0 \
+ MIT-CMU \
+ MIT-Modern-Variant \
+ MIT-Nagy \
+ Mit-Old-Style \
+ MIT-open-group \
+ Mit-Veillard-Variant \
+ MPL-1.0 \
+ MPL-1.1 \
+ MPL-2.0 \
+ NCSA \
+ Not-Applicable \
+ NTP \
+ Nvidia \
+ OGC-1.0 \
+ OLDAP-2.8 \
+ OML \
+ OpenSSL \
+ PayPal-SDK \
+ PCRE \
+ PD \
+ PHP-3.01 \
+ PIL \
+ Plexus \
+ PostgreSQL \
+ Protobuf-License \
+ PSF \
+ PSF-2.0 \
+ Public-Domain \
+ Public-Domain-US-Govt \
+ Python-2.0 \
+ Qhull \
+ Red-Hat-Attribution \
+ Repoze-public \
+ RSA-1990 \
+ RSA-MD \
+ RSA-MD4 \
+ SGI-B-2.0 \
+ Sleepycat \
+ SMLNJ \
+ Snprintf \
+ SSH-short \
+ SSLeay \
+ Sunpro \
+ Unicode-DFS-2016 \
+ Unicode-Icu-58 \
+ Unicode-Mappings \
+ Unlicense \
+ Unrar \
+ UPL-1.0 \
+ Vertica \
+ W3C \
+ WTFPL \
+ X11 \
+ X11-Lucent \
+ YandexOpen \
+ Zlib \
+ zlib-acknowledgement \
+ ZPL-2.1 \
+ ${CUSTOM_LICENSE_LINUX_SYSCALL_NOTE} \
+ ${CUSTOM_LICENSE_MUSL_EXCEPTION} \
+ ${LICENSES_PATCHES_FORBIDDEN}
+
+LICENSES_PERMISSIVE_DYNAMIC= \
+ LGPL \
+ LGPL-2.0-only \
+ LGPL-2.0-or-later \
+ LGPL-2.1-only \
+ LGPL-2.1-or-later \
+ LGPL-3.0-only \
+ LGPL-3.0-or-later
+
+# https://st.yandex-team.ru/ARCADIAWGSUP-34
+CUSTOM_LICENSE_LIBSSH2_AGENT_WIN=Libssh2-Agent-Win
+# Permissive if the code is used to declare and invoke syscalls
+CUSTOM_LICENSE_LINUX_SYSCALL_NOTE=Linux-syscall-note-in-syscall-glue
+# Permissive only in musllib
+CUSTOM_LICENSE_MUSL_EXCEPTION=Musl-Exception-in-Musllib
+
+# TODO: this list is almost empty. needed for DEVRULES-151
+LICENSES_REQUIRE_CITATION= \
+ Apache-2.0 \
+ Brian-Gladman-3-Clause \
+ Cmu-Computing-Services \
+ Custom-Oasis-Pkcs11 \
+ EDL-1.0 \
+ OpenSSL \
+ Spencer-94 \
+ NetCDF \
+ ${CUSTOM_LICENSE_LIBSSH2_AGENT_WIN}
+
+LICENSES_SERVICE= \
+ Service-Dll-Harness \
+ Service-Prebuilt-Tool \
+ Service-Py23-Proxy
+
+LICENSES_PROTESTWARE= \
+ Protestware
+
+macro _REQUIRE_EXPLICIT_LICENSE(Prefix...) {
+ SET(EXPLICIT_LICENSE_PREFIXES ${Prefix})
+}
+
+### @usage: LICENSE(licenses...)
+###
+### Specify the licenses of the module, separated by spaces. Specifying multiple licenses interpreted as permission to use this
+### library satisfying all conditions of any of the listed licenses.
+###
+### A license must be prescribed for contribs
+macro LICENSE(Flags...) {
+ SET(LICENSE_EXPRESSION $Flags)
+ SET(LICENSE_NAMES $Flags)
+}
+
+### @usage RESTRICT_LICENSES(ALLOW_ONLY|DENY LicenseProperty...)
+###
+### Restrict licenses of direct and indirect module dependencies.
+###
+### ALLOW_ONLY restriction type requires dependent module to have at leas one license without propertis not listed in restrictions
+### list.
+###
+### DENY restriction type forbids dependency on module with no license without any listed propery from the list.
+###
+### Note: Can be used multiple times on the same module all specified constraints will be checked.
+### All macro invocation for the same module must use same constraints type (DENY or ALLOW_ONLY)
+macro RESTRICT_LICENSES(TYPE, EXCEPT[], RESTRICTIONS...) {
+ SET_APPEND(MODULE_LICENSES_RESTRICTION_TYPES $TYPE)
+ SET_APPEND(MODULE_LICENSES_RESTRICTIONS $RESTRICTIONS)
+ SET_APPEND(MODULE_LICENSES_RESTRICTION_EXCEPTIONS $EXCEPT)
+}
diff --git a/build/conf/linkers/ld.conf b/build/conf/linkers/ld.conf
new file mode 100644
index 0000000000..17985e52b3
--- /dev/null
+++ b/build/conf/linkers/ld.conf
@@ -0,0 +1,338 @@
+LDFLAGS+=$USER_LDFLAGS $_LD_FLAGS
+LDFLAGS_GLOBAL+=
+
+_START_GROUP=
+_END_GROUP=
+START_WHOLE_ARCHIVE_VALUE=
+END_WHOLE_ARCHIVE_VALUE=
+LD_STRIP_FLAG=
+_SONAME_OPTION=
+_LD_SRCS_GLOBALS=--start-wa ${rootrel;ext=.a:SRCS_GLOBAL} --end-wa ${rootrel;ext=.o:SRCS_GLOBAL} ${rootrel;ext=.supp:SRCS_GLOBAL}
+when ($OS_LINUX == "yes" || $OS_ANDROID == "yes" || $OS_CYGWIN == "yes" || $OS_NONE == "yes") {
+ _START_GROUP=-Wl,--start-group
+ _END_GROUP=-Wl,--end-group
+ START_WHOLE_ARCHIVE_VALUE=-Wl,--whole-archive
+ END_WHOLE_ARCHIVE_VALUE=-Wl,--no-whole-archive
+ LD_STRIP_FLAG=-s
+ _SONAME_OPTION=-soname
+ _LD_SRCS_GLOBALS=-Wl,--whole-archive ${rootrel;ext=.a:SRCS_GLOBAL} -Wl,--no-whole-archive ${rootrel;ext=.o:SRCS_GLOBAL} ${rootrel;ext=.supp:SRCS_GLOBAL}
+}
+
+when ($_LD_WHOLE_ARCHIVE == "yes") {
+}
+
+when ($OS_DARWIN == "yes" || $OS_IOS == "yes") {
+ _SONAME_OPTION=-install_name
+}
+
+_LD_LINKER_OUTPUT=
+_LD_LINKER_OUTPUT_FLAG=--linker-output ${output;pre=$MODULE_PREFIX;suf=$MODULE_SUFFIX$MODULE_VERSION.linker.txt:REALPRJNAME}
+
+# Enable section-level DCE (dead code elimination):
+# remove whole unused code and data sections
+# (needs `-ffunction-sections` and `-fdata-sections` to be useful)
+#
+# NOTE: CGO linker doesn't seem to support DCE, but shares common LDFLAGS
+_LD_DCE_FLAG_GC_SECTIONS=
+_LD_DCE_FLAG_PRINT_SECTIONS=
+when ($OS_DARWIN == "yes") {
+ _LD_DCE_FLAG_GC_SECTIONS=-Wl,-dead_strip
+}
+elsewhen ($OS_LINUX == "yes" || $OS_ANDROID == "yes" || $OS_NONE == "yes") {
+ _LD_DCE_FLAG_GC_SECTIONS=-Wl,--gc-sections
+ when ($LINKER_DCE_PRINT_SECTIONS == "yes") {
+ _LD_DCE_FLAG_PRINT_SECTIONS=-Wl,--print-gc-sections
+ _LD_LINKER_OUTPUT=$_LD_LINKER_OUTPUT_FLAG
+ }
+}
+LD_DCE_FLAG =
+LD_DCE_FLAG+=$_LD_DCE_FLAG_GC_SECTIONS
+LD_DCE_FLAG+=$_LD_DCE_FLAG_PRINT_SECTIONS
+DCE_FLAG=
+
+_LD_ICF_FLAG=
+_LD_ICF_FLAG_PRINT_SECTIONS=
+when ($_DEFAULT_LINKER_ID == "lld") {
+ # Enable ICF (identical code folding pass) in safe mode
+ # https://research.google/pubs/pub36912/
+ _LD_ICF_FLAG=-Wl,-icf=safe
+ when ($LINKER_ICF_PRINT_SECTIONS == "yes") {
+ _LD_ICF_FLAG_PRINT_SECTIONS=-Wl,--print-icf-sections
+ _LD_LINKER_OUTPUT=$_LD_LINKER_OUTPUT_FLAG
+ }
+}
+LD_ICF_FLAG =
+LD_ICF_FLAG+=$_LD_ICF_FLAG
+LD_ICF_FLAG+=$_LD_ICF_FLAG_PRINT_SECTIONS
+ICF_FLAG=
+
+STRIP_FLAG=
+
+C_LIBRARY_PATH=
+C_SYSTEM_LIBRARIES_INTERCEPT=
+when ($USEMPROF == "yes" || $USE_MPROF == "yes") {
+ C_SYSTEM_LIBRARIES_INTERCEPT+=-ldmalloc
+}
+
+_LD_THREAD_LIBRARY=
+when ($OS_LINUX == "yes" || $OS_DARWIN == "yes") {
+ _LD_THREAD_LIBRARY=-lpthread
+}
+
+_LD_USE_STDLIB=
+when ($_BUILD_COVERAGE == "yes" || $GCOV_COVERAGE == "yes" || $CLANG_COVERAGE == "yes" || $_BUILD_SANITIZED == "yes") {
+ _LD_USE_STDLIB=
+}
+elsewhen ($OS_ANDROID == "yes") {
+ when ($_ANDROID_NDK_VERSION_LESS_THEN_23 == "yes") {
+ # Preserve old behaviour: specify runtime libs manually
+ _LD_USE_STDLIB=-nodefaultlibs
+ }
+ otherwise {
+ # Use toolchain defaults to link with libunwind/clang_rt.builtins
+ _LD_USE_STDLIB=-nostdlib++
+ }
+}
+elsewhen ($OS_LINUX == "yes" || $OS_DARWIN == "yes" || $OS_IOS == "yes") {
+ _LD_USE_STDLIB=-nodefaultlibs
+}
+
+_C_SYSTEM_LIBRARIES=$_LD_USE_STDLIB $_LD_THREAD_LIBRARY $_LD_SYS_LIB -lc
+when ($MUSL == "yes") {
+ _C_SYSTEM_LIBRARIES=-nostdlib
+}
+C_SYSTEM_LIBRARIES=$_C_SYSTEM_LIBRARIES
+
+OBJADDE=
+
+LD_EXPORT_ALL_DYNAMIC_SYMBOLS_FLAG=
+when ($OS_LINUX == "yes" || $OS_ANDROID == "yes") {
+ LD_EXPORT_ALL_DYNAMIC_SYMBOLS_FLAG=-rdynamic
+}
+
+NO_EXPORT_DYNAMIC_SYMBOLS=
+EXPORTS_VALUE=$LD_EXPORT_ALL_DYNAMIC_SYMBOLS_FLAG
+when ($EXPORTS_FILE) {
+ EXPORTS_VALUE=$LD_EXPORT_ALL_DYNAMIC_SYMBOLS_FLAG -Wl,--version-script=${input:EXPORTS_FILE}
+}
+when ($NO_EXPORT_DYNAMIC_SYMBOLS == "yes") {
+ EXPORTS_VALUE=
+}
+
+LINKER_SCRIPT_VALUE=${ext=.ld;pre=-T:SRCS_GLOBAL}
+
+_LINKER_TIME_TRACE_GRANULARITY=500
+when ($TIME_TRACE_GRANULARITY && $TIME_TRACE_GRANULARITY != "") {
+ _LINKER_TIME_TRACE_GRANULARITY=$TIME_TRACE_GRANULARITY
+}
+
+_LINKER_TIME_TRACE_FLAG=
+when (($TIME_TRACE == "yes" || $LINKER_TIME_TRACE == "yes") && $_DEFAULT_LINKER_ID == "lld") {
+ _LINKER_TIME_TRACE_FLAG=\
+ -Wl,--time-trace \
+ -Wl,--time-trace-granularity=$_LINKER_TIME_TRACE_GRANULARITY \
+ -Wl,--time-trace-file=${output;rootrel;pre=$MODULE_PREFIX;suf=$MODULE_SUFFIX.time_trace.json:REALPRJNAME}
+}
+
+_EXE_FLAGS=\
+ $C_FLAGS_PLATFORM \
+ $BEFORE_PEERS \
+ $_START_GROUP \
+ ${rootrel:PEERS} \
+ $_END_GROUP \
+ $AFTER_PEERS \
+ $EXPORTS_VALUE \
+ $LINKER_SCRIPT_VALUE \
+ $LDFLAGS \
+ $LDFLAGS_GLOBAL \
+ $OBJADDE \
+ $OBJADDE_LIB \
+ $C_LIBRARY_PATH \
+ $C_SYSTEM_LIBRARIES_INTERCEPT \
+ $C_SYSTEM_LIBRARIES \
+ $STRIP_FLAG \
+ $DCE_FLAG \
+ $ICF_FLAG \
+ $_LINKER_TIME_TRACE_FLAG
+
+_SONAME_FLAG=-Wl,$_SONAME_OPTION,$_SONAME
+_SHARED_FLAG=-shared
+_EXEC_SHARED_FLAG=
+when ($OS_LINUX == "yes") {
+ _EXEC_SHARED_FLAG=-pie -fPIE -Wl,--unresolved-symbols=ignore-all -rdynamic
+}
+
+_LD_ENV_STYLE=${cwd:ARCADIA_BUILD_ROOT} $TOOLCHAIN_ENV ${kv;hide:"p LD"} ${kv;hide:"pc light-blue"} ${kv;hide:"show_out"}
+
+# Program
+GENERATE_MF_CMD=\
+ $YMAKE_PYTHON ${input:"build/scripts/generate_mf.py"} ${input;hide:"build/scripts/process_command_files.py"} \
+ --build-root $ARCADIA_BUILD_ROOT \
+ --module-name $REALPRJNAME \
+ -o ${output;rootrel;pre=$MODULE_PREFIX;suf=$MODULE_SUFFIX.mf:REALPRJNAME} \
+ -t $MODULE_TYPE \
+ --ya-start-command-file \
+ -Ya,lics $LICENSE_NAMES \
+ -Ya,peers ${rootrel:PEERS} \
+ -Ya,credits ${input:CREDITS_TEXTS_FILE} $CREDITS_FLAGS \
+ --ya-end-command-file
+
+LINK_SCRIPT_EXE_FLAGS=
+
+REAL_LINK_EXE_CMDLINE =\
+ $YMAKE_PYTHON ${input:"build/scripts/link_exe.py"} \
+ --source-root $ARCADIA_ROOT
+ REAL_LINK_EXE_CMDLINE+=$_LD_LINKER_OUTPUT
+ REAL_LINK_EXE_CMDLINE+=\
+ ${pre=--whole-archive-peers :WHOLE_ARCHIVE_PEERS} \
+ ${pre=--whole-archive-libs :_WHOLE_ARCHIVE_LIBS_VALUE_GLOBAL} \
+ $_LD_ARCH_FLAG \
+ $LINK_SCRIPT_EXE_FLAGS \
+ $CXX_COMPILER \
+ $_LD_SRCS_GLOBALS \
+ $VCS_C_OBJ $AUTO_INPUT -o $TARGET \
+ $_EXE_FLAGS \
+ $_LD_ENV_STYLE
+
+REAL_LINK_EXE_TIDY=\
+ $YMAKE_PYTHON ${input:"build/scripts/clang_tidy_arch.py"} \
+ --build-root $ARCADIA_BUILD_ROOT \
+ --source-root $ARCADIA_ROOT \
+ --output-file $TARGET \
+ $AUTO_INPUT \
+ $_LD_ENV_STYLE
+
+# Executable Shared Library
+
+REAL_LINK_EXEC_DYN_LIB_CMDLINE =\
+ $YMAKE_PYTHON ${input:"build/scripts/link_dyn_lib.py"} \
+ --target $TARGET
+REAL_LINK_EXEC_DYN_LIB_CMDLINE+=$_LD_LINKER_OUTPUT
+REAL_LINK_EXEC_DYN_LIB_CMDLINE+=\
+ ${pre=--whole-archive-peers :WHOLE_ARCHIVE_PEERS} \
+ ${pre=--whole-archive-libs :_WHOLE_ARCHIVE_LIBS_VALUE_GLOBAL} \
+ $_LD_ARCH_FLAG \
+ $LINK_DYN_LIB_FLAGS \
+ $CXX_COMPILER \
+ $_LD_SRCS_GLOBALS \
+ $VCS_C_OBJ $AUTO_INPUT -o $TARGET \
+ $_EXEC_SHARED_FLAG \
+ $_SONAME_FLAG \
+ $_EXE_FLAGS \
+ $_LD_ENV_STYLE
+
+REAL_LINK_EXEC_DYN_LIB=$REAL_LINK_EXEC_DYN_LIB_IMPL($_WHOLE_ARCHIVE_PEERS_VALUE)
+
+# Shared Library
+
+LINK_DYN_LIB_FLAGS=
+
+REAL_LINK_DYN_LIB_CMDLINE =\
+ $YMAKE_PYTHON ${input:"build/scripts/link_dyn_lib.py"} \
+ --target $TARGET
+REAL_LINK_DYN_LIB_CMDLINE+=$_LD_LINKER_OUTPUT
+REAL_LINK_DYN_LIB_CMDLINE+=\
+ ${pre=--whole-archive-peers :WHOLE_ARCHIVE_PEERS} \
+ ${pre=--whole-archive-libs :_WHOLE_ARCHIVE_LIBS_VALUE_GLOBAL} \
+ $_LD_ARCH_FLAG \
+ $LINK_DYN_LIB_FLAGS \
+ $CXX_COMPILER \
+ $_LD_SRCS_GLOBALS \
+ $VCS_C_OBJ $AUTO_INPUT -o $TARGET \
+ $_SHARED_FLAG \
+ $_SONAME_FLAG \
+ $_EXE_FLAGS \
+ $_LD_ENV_STYLE
+
+REAL_LINK_DYN_LIB=$REAL_LINK_DYN_LIB_IMPL($_WHOLE_ARCHIVE_PEERS_VALUE)
+
+_DWARF_COMMAND=
+when ($OS_DARWIN == "yes" && $NO_DEBUGINFO != "yes" && $SPLIT_DWARF_VALUE != "no" && $NO_SPLIT_DWARF != "yes") {
+ _DWARF_COMMAND=$DWARF_TOOL $TARGET -o ${output;pre=$MODULE_PREFIX$REALPRJNAME.dSYM/Contents/Resources/DWARF/$MODULE_PREFIX:REALPRJNAME} $_LD_ENV_STYLE
+}
+elsewhen ($OS_DARWIN == "yes" && $NO_DEBUGINFO != "yes") {
+ _EXE_FLAGS+=$DEBUG_INFO_FLAGS
+}
+otherwise {
+ _DWARF_COMMAND=
+}
+DWARF_COMMAND=$_DWARF_COMMAND
+
+_REAL_LINK_EXE=$REAL_LINK_EXE_IMPL($_WHOLE_ARCHIVE_PEERS_VALUE)
+_LINK_EXE=$GENERATE_MF && $GENERATE_VCS_C_INFO_NODEP && $REAL_LINK_EXE && $DWARF_COMMAND && $LINK_ADDITIONAL_SECTIONS_COMMAND && $PACK_IOS_CMD
+_LINK_DYN_LIB=$GENERATE_MF && $GENERATE_VCS_C_INFO_NODEP && $REAL_LINK_DYN_LIB && $DWARF_COMMAND && $LINK_ADDITIONAL_SECTIONS_COMMAND
+when ($TIDY == "yes") {
+ _REAL_LINK_EXE=$REAL_LINK_EXE_TIDY
+ _LINK_EXE=$REAL_LINK_EXE
+ _LINK_DYN_LIB=$REAL_LINK_EXE
+}
+REAL_LINK_EXE=$_REAL_LINK_EXE
+LINK_EXE=$_LINK_EXE
+LINK_DYN_LIB=$_LINK_DYN_LIB
+
+LINK_EXEC_DYN_LIB=\
+ $GENERATE_MF && \
+ $GENERATE_VCS_C_INFO_NODEP && \
+ $REAL_LINK_EXEC_DYN_LIB && \
+ $DWARF_COMMAND && \
+ $LINK_ADDITIONAL_SECTIONS_COMMAND
+
+SWIG_DLL_JAR_CMD=\
+ $GENERATE_MF && \
+ $GENERATE_VCS_C_INFO_NODEP && \
+ $REAL_SWIG_DLL_JAR_CMD && \
+ $DWARF_COMMAND
+
+_LD_TAIL_LINK_LIB=$AUTO_INPUT ${kv;hide:"p AR"} $TOOLCHAIN_ENV ${kv;hide:"pc light-red"} ${kv;hide:"show_out"}
+_LD_ARCHIVER=$YMAKE_PYTHON ${input:"build/scripts/link_lib.py"} ${quo:AR_TOOL} $AR_TYPE $_LD_LLVM_AR_FORMAT $ARCADIA_BUILD_ROOT $_LD_AR_PLUGIN
+_LD_LIB_GENERATE_MF=$GENERATE_MF &&
+when ($TIDY == "yes") {
+ _LD_ARCHIVER=$YMAKE_PYTHON ${input:"build/scripts/clang_tidy_arch.py"} --source-root $ARCADIA_ROOT --build-root $ARCADIA_BUILD_ROOT --output-file
+ _LD_LIB_GENERATE_MF=
+}
+LINK_LIB=$_LD_LIB_GENERATE_MF $_LD_ARCHIVER $TARGET $_LD_TAIL_LINK_LIB
+GLOBAL_LINK_LIB=$_LD_ARCHIVER $GLOBAL_TARGET $_LD_TAIL_LINK_LIB
+
+# "Fat Object" : pre-linked global objects and static library with all dependencies
+_LD_LINK_FAT_PREFIX=$GENERATE_MF && $GENERATE_VCS_C_INFO_NODEP && $YMAKE_PYTHON ${input:"build/scripts/link_fat_obj.py"} --build-root $ARCADIA_BUILD_ROOT
+_LD_LINK_FAT_SRCS_GLOBALS_WA=$_LD_SRCS_GLOBALS
+_LD_LINK_FAT_SRCS_GLOBALS_NO_WA=${rootrel;ext=.a:SRCS_GLOBAL} ${rootrel;ext=.o:SRCS_GLOBAL}
+
+_LD_LINK_FAT_SUFFIX1=$_LD_ARCH_FLAG \
+ -Ya,input $AUTO_INPUT $VCS_C_OBJ \
+ -Ya,global_srcs
+
+_LD_LINK_FAT_SUFFIX2=-Ya,peers $PEERS \
+ -Ya,linker $CXX_COMPILER \
+ $LDFLAGS_GLOBAL $C_FLAGS_PLATFORM $LD_SDK_VERSION \
+ -Ya,archiver $_LD_ARCHIVER \
+ $TOOLCHAIN_ENV ${kv;hide:"p LD"} ${kv;hide:"pc light-blue"} ${kv;hide:"show_out"}
+
+LINK_FAT_OBJECT=\
+ $_LD_LINK_FAT_PREFIX \
+ --obj=$TARGET --lib=${output:REALPRJNAME.a} \
+ $_LD_LINK_FAT_SUFFIX1 \
+ $_LD_LINK_FAT_SRCS_GLOBALS_WA \
+ $_LD_LINK_FAT_SUFFIX2
+
+LINK_RECURSIVE_LIBRARY=\
+ $_LD_LINK_FAT_PREFIX \
+ --lib=$TARGET --with-own-obj --with-global-srcs \
+ $_LD_LINK_FAT_SUFFIX1 \
+ $_LD_LINK_FAT_SRCS_GLOBALS_NO_WA \
+ $_LD_LINK_FAT_SUFFIX2
+
+LINK_FAT_OBJECT_LIBRARY=\
+ $_LD_LINK_FAT_PREFIX \
+ --lib=$TARGET $FAT_OBJECT_ARGS $FAT_OBJECT_OUTS \
+ $_LD_LINK_FAT_SUFFIX1 \
+ $_LD_LINK_FAT_SRCS_GLOBALS_NO_WA \
+ $_LD_LINK_FAT_SUFFIX2
+
+LIBRT=-lrt
+MD5LIB=-lcrypt
+LIBRESOLV=
+when ($OS_LINUX || $OS_DARWIN || $OS_ANDROID) {
+ LIBRESOLV=-lresolv
+}
+PROFFLAG=-pg
diff --git a/build/conf/linkers/msvc_linker.conf b/build/conf/linkers/msvc_linker.conf
new file mode 100644
index 0000000000..9f852b1ef4
--- /dev/null
+++ b/build/conf/linkers/msvc_linker.conf
@@ -0,0 +1,271 @@
+_MSVC_ARCH=
+when ($ARCH_I386 == "yes" || $ARCH_I686 == "yes") {
+ _MSVC_ARCH=x86
+}
+elsewhen ($ARCH_X86_64 == "yes") {
+ _MSVC_ARCH=x64
+}
+elsewhen ($ARCH_ARM == "yes") {
+ _MSVC_ARCH=arm
+}
+
+_FLAGS_MACHINE=/MACHINE:${toupper:_MSVC_ARCH}
+
+_FLAGS_IGNORE=/IGNORE:4221
+
+_FLAGS_COMMON_IDE_MSVS=
+when ($IDE_MSVS == "yes") {
+ _FLAGS_COMMON_IDE_MSVS=/INCREMENTAL
+}
+otherwise {
+ _FLAGS_COMMON_IDE_MSVS=/INCREMENTAL:NO
+}
+
+# TODO(nslus): DEVTOOLS-1868 remove restriction.
+_FLAGS_DEBUG_ONLY_DEBUG=
+_FLAGS_RELEASE_ONLY_DEBUG=
+_FLAGS_COMMON_DEBUG=
+when (!$NO_DEBUGINFO || $NO_DEBUGINFO == "no" || $NO_DEBUGINFO == "0") {
+ when ($IDE_MSVS == "yes") {
+ when ($CLANG_CL == "yes") {
+ _FLAGS_DEBUG_ONLY_DEBUG=/DEBUG
+ }
+ otherwise {
+ _FLAGS_DEBUG_ONLY_DEBUG=/DEBUG:FASTLINK
+ }
+ _FLAGS_RELEASE_ONLY_DEBUG=/DEBUG
+ }
+ otherwise {
+ _FLAGS_COMMON_DEBUG=/DEBUG
+ }
+}
+
+_FLAGS_COMMON_LIBPATHS=
+when ($IDE_MSVS != "yes") {
+ _FLAGS_COMMON_LIBPATHS=\
+ /LIBPATH:"$_MSVC_TC_KIT_LIBS/um/$_MSVC_ARCH" \
+ /LIBPATH:"$_MSVC_TC_KIT_LIBS/ucrt/$_MSVC_ARCH" \
+ /LIBPATH:"$_MSVC_TC_VC_ROOT/lib/$_MSVC_ARCH"
+}
+
+_FLAGS_COMMON =/NOLOGO /ERRORREPORT:PROMPT /SUBSYSTEM:CONSOLE /TLBID:1 $MSVC_DYNAMICBASE /NXCOMPAT
+_FLAGS_COMMON+=$_FLAGS_IGNORE
+_FLAGS_COMMON+=$_FLAGS_MACHINE
+_FLAGS_COMMON+=$_FLAGS_COMMON_IDE_MSVS
+_FLAGS_COMMON+=$_FLAGS_COMMON_DEBUG
+_FLAGS_COMMON+=$_FLAGS_COMMON_LIBPATHS
+
+_FLAGS_DEBUG_ONLY_CLANG_CL=
+when ($CLANG_CL == "yes") {
+ _FLAGS_DEBUG_ONLY_CLANG_CL=/STACK:4194304
+}
+
+_FLAGS_DEBUG_ONLY =$_FLAGS_DEBUG_ONLY_CLANG_CL
+_FLAGS_DEBUG_ONLY+=$_FLAGS_DEBUG_ONLY_DEBUG
+_FLAGS_RELEASE_ONLY =$_FLAGS_RELEASE_ONLY_DEBUG
+
+LINK_EXE_FLAGS_DEBUG =$_FLAGS_COMMON
+LINK_EXE_FLAGS_DEBUG+=$_FLAGS_DEBUG_ONLY
+
+LINK_EXE_FLAGS_RELEASE =$_FLAGS_COMMON
+LINK_EXE_FLAGS_RELEASE+=$_FLAGS_RELEASE_ONLY
+
+LINK_LIB_FLAGS=$_FLAGS_IGNORE $_FLAGS_MACHINE
+
+LINK_STDLIBS=\
+ advapi32.lib \
+ comdlg32.lib \
+ crypt32.lib \
+ dnsapi.lib \
+ gdi32.lib \
+ iphlpapi.lib \
+ kernel32.lib \
+ mswsock.lib \
+ ole32.lib \
+ oleaut32.lib \
+ psapi.lib \
+ rpcrt4.lib \
+ secur32.lib \
+ shell32.lib \
+ shlwapi.lib \
+ user32.lib \
+ userenv.lib \
+ uuid.lib \
+ version.lib \
+ winmm.lib \
+ winspool.lib \
+ ws2_32.lib
+
+LDFLAGS_GLOBAL=
+LDFLAGS=
+OBJADDE=
+
+LINK_EXE_FLAGS=$LINK_EXE_FLAGS_PER_TYPE
+
+LINK_IMPLIB=/IMPLIB:${output;noext;rootrel;pre=$MODULE_PREFIX:REALPRJNAME.lib}
+_LINK_EXTRA_OUTPUT=
+when (!$NO_DEBUGINFO || $NO_DEBUGINFO == "no" || $NO_DEBUGINFO == "0") {
+ _LINK_EXTRA_OUTPUT=/PDB:${output;noext;rootrel;pre=$MODULE_PREFIX:REALPRJNAME.pdb}
+}
+LINK_EXTRA_OUTPUT=$_LINK_EXTRA_OUTPUT
+
+LIB_WRAPPER=${FIX_MSVC_OUTPUT} lib
+LINK_WRAPPER=${FIX_MSVC_OUTPUT} link
+when ($_UNDER_WINE == "yes") {
+ LIB_WRAPPER=
+ LINK_WRAPPER=
+}
+
+LINK_WRAPPER_DYNLIB=${YMAKE_PYTHON} ${input:"build/scripts/link_dyn_lib.py"} --arch WINDOWS --target $TARGET
+
+EXPORTS_VALUE=
+LINK_IMPLIB_VALUE=
+when ($EXPORTS_FILE) {
+ LINK_IMPLIB_VALUE=$LINK_IMPLIB
+ EXPORTS_VALUE=/DEF:${input:EXPORTS_FILE}
+}
+
+GENERATE_MF_CMD=\
+ $YMAKE_PYTHON ${input:"build/scripts/generate_mf.py"} ${input;hide:"build/scripts/process_command_files.py"} \
+ --build-root $ARCADIA_BUILD_ROOT \
+ --module-name $REALPRJNAME \
+ -o ${output;rootrel;pre=$MODULE_PREFIX;suf=$MODULE_SUFFIX.mf:REALPRJNAME} \
+ -t $MODULE_TYPE \
+ --ya-start-command-file \
+ -Ya,lics $LICENSE_NAMES \
+ -Ya,peers ${rootrel:PEERS} \
+ -Ya,credits ${input:CREDITS_TEXTS_FILE} $CREDITS_FLAGS \
+ --ya-end-command-file
+
+# we split srcs_global into two groups: libs and objs
+# # each group can be in its own command file
+# first group need /WHOLEARCHIVE: prefix which will be added in fix_msvc_output.py or run_msvc_wine.py
+# the tail of link commands will be added in the third command file
+_MSVC_SRCS_GLOBALS=\
+--start-wa --ya-start-command-file ${qe;rootrel;ext=.lib:SRCS_GLOBAL} --ya-end-command-file --end-wa \
+--ya-start-command-file ${qe;rootrel;ext=.obj:SRCS_GLOBAL} --ya-end-command-file
+
+REAL_LINK_DYN_LIB_CMDLINE=\
+ ${TOOLCHAIN_ENV} \
+ ${cwd:ARCADIA_BUILD_ROOT} \
+ ${LINK_WRAPPER} \
+ ${LINK_WRAPPER_DYNLIB} \
+ ${LINK_EXE_CMD} \
+ ${LINK_IMPLIB_VALUE} \
+ /DLL \
+ /OUT:${qe;rootrel:TARGET} \
+ ${LINK_EXTRA_OUTPUT} \
+ ${EXPORTS_VALUE} \
+ ${pre=--whole-archive-peers :WHOLE_ARCHIVE_PEERS} \
+ ${pre=--whole-archive-libs :_WHOLE_ARCHIVE_LIBS_VALUE_GLOBAL} \
+ $_MSVC_SRCS_GLOBALS \
+ --ya-start-command-file \
+ ${VCS_C_OBJ_RR} \
+ ${qe;rootrel:AUTO_INPUT} \
+ ${qe;rootrel;ext=.lib:PEERS} ${qe;rootrel;ext=.dll;noext;suf=.lib:PEERS} \
+ $LINK_EXE_FLAGS \
+ $LINK_STDLIBS $LDFLAGS \
+ $LDFLAGS_GLOBAL \
+ $OBJADDE \
+ --ya-end-command-file
+
+REAL_LINK_DYN_LIB=$REAL_LINK_DYN_LIB_IMPL($_WHOLE_ARCHIVE_PEERS_VALUE)
+
+SWIG_DLL_JAR_CMD=$GENERATE_MF && $GENERATE_VCS_C_INFO_NODEP && $REAL_SWIG_DLL_JAR_CMD
+
+_MSVC_HEAD_LINK_LIB=${TOOLCHAIN_ENV} ${cwd:ARCADIA_BUILD_ROOT} ${LIB_WRAPPER} ${LINK_LIB_CMD}
+_MSVC_TAIL_LINK_LIB=\
+ --ya-start-command-file \
+ ${qe;rootrel:AUTO_INPUT} \
+ $LINK_LIB_FLAGS \
+ --ya-end-command-file \
+ ${hide;kv:"soe"} ${hide;kv:"p AR"} ${hide;kv:"pc light-red"}
+
+LINK_LIB=${GENERATE_MF} && $_MSVC_HEAD_LINK_LIB /OUT:${qe;rootrel:TARGET} $_MSVC_TAIL_LINK_LIB
+GLOBAL_LINK_LIB=$_MSVC_HEAD_LINK_LIB /OUT:${qe;rootrel:GLOBAL_TARGET} $_MSVC_TAIL_LINK_LIB
+
+LINK_EXE_CMDLINE=\
+ ${GENERATE_MF} && \
+ $GENERATE_VCS_C_INFO_NODEP && \
+ ${TOOLCHAIN_ENV} \
+ ${cwd:ARCADIA_BUILD_ROOT} \
+ ${LINK_WRAPPER} \
+ ${LINK_EXE_CMD} \
+ /OUT:${qe;rootrel:TARGET} \
+ ${pre=--whole-archive-peers :WHOLE_ARCHIVE_PEERS} \
+ ${pre=--whole-archive-libs :_WHOLE_ARCHIVE_LIBS_VALUE_GLOBAL} \
+ ${LINK_EXTRA_OUTPUT} \
+ $_MSVC_SRCS_GLOBALS \
+ --ya-start-command-file \
+ ${VCS_C_OBJ_RR} \
+ ${qe;rootrel:AUTO_INPUT} \
+ $LINK_EXE_FLAGS \
+ $LINK_STDLIBS \
+ $LDFLAGS \
+ $LDFLAGS_GLOBAL \
+ $OBJADDE \
+ ${qe;rootrel;ext=.lib:PEERS} ${qe;rootrel;ext=.dll;noext;suf=.lib:PEERS} \
+ --ya-end-command-file \
+ ${hide;kv:"soe"} ${hide;kv:"p LD"} ${hide;kv:"pc blue"}
+
+LINK_EXE=$LINK_EXE_IMPL($_WHOLE_ARCHIVE_PEERS_VALUE)
+
+LINK_DYN_LIB=${GENERATE_MF} && $GENERATE_VCS_C_INFO_NODEP && $REAL_LINK_DYN_LIB ${hide;kv:"soe"} ${hide;kv:"p LD"} ${hide;kv:"pc blue"}
+
+LINK_EXEC_DYN_LIB_CMDLINE=\
+ ${GENERATE_MF} && \
+ $GENERATE_VCS_C_INFO_NODEP && \
+ ${TOOLCHAIN_ENV} \
+ ${cwd:ARCADIA_BUILD_ROOT} \
+ ${LINK_WRAPPER} \
+ ${LINK_WRAPPER_DYNLIB} \
+ ${LINK_EXE_CMD} \
+ /OUT:${qe;rootrel:TARGET} \
+ ${LINK_EXTRA_OUTPUT} \
+ ${EXPORTS_VALUE} \
+ ${pre=--whole-archive-peers :WHOLE_ARCHIVE_PEERS} \
+ ${pre=--whole-archive-libs :_WHOLE_ARCHIVE_LIBS_VALUE_GLOBAL} \
+ $_MSVC_SRCS_GLOBALS \
+ '--ya-start-command-file \
+ ${VCS_C_OBJ_RR} \
+ ${qe;rootrel:AUTO_INPUT} \
+ ${qe;rootrel;ext=.lib:PEERS} ${qe;rootrel;ext=.dll;noext;suf=.lib:PEERS} \
+ $LINK_EXE_FLAGS \
+ $LINK_STDLIBS \
+ $LDFLAGS $LDFLAGS_GLOBAL \
+ $OBJADDE \
+ --ya-end-command-file \
+ ${hide;kv:"soe"} ${hide;kv:"p LD"} ${hide;kv:"pc blue"}
+
+LINK_EXEC_DYN_LIB=$LINK_EXEC_DYN_LIB_IMPL($_WHOLE_ARCHIVE_PEERS_VALUE)
+
+LINK_GLOBAL_FAT_OBJECT=\
+ ${TOOLCHAIN_ENV} \
+ ${cwd:ARCADIA_BUILD_ROOT} \
+ ${LIB_WRAPPER} \
+ ${LINK_LIB_CMD} \
+ /OUT:${qe;rootrel:TARGET} \
+ --ya-start-command-file \
+ ${qe;rootrel;ext=.lib:SRCS_GLOBAL} \
+ ${qe;rootrel;ext=.obj:SRCS_GLOBAL} \
+ ${qe;rootrel:AUTO_INPUT} \
+ $LINK_LIB_FLAGS \
+ --ya-end-command-file
+
+LINK_PEERS_FAT_OBJECT=\
+ ${TOOLCHAIN_ENV} \
+ ${cwd:ARCADIA_BUILD_ROOT} \
+ ${LIB_WRAPPER} \
+ ${LINK_LIB_CMD} \
+ /OUT:${qe;rootrel;output:REALPRJNAME.lib} \
+ --ya-start-command-file \
+ ${qe;rootrel:PEERS} \
+ $LINK_LIB_FLAGS \
+ --ya-end-command-file
+
+LINK_FAT_OBJECT=\
+ ${GENERATE_MF} && \
+ $GENERATE_VCS_C_INFO_NODEP && \
+ $LINK_GLOBAL_FAT_OBJECT && \
+ $LINK_PEERS_FAT_OBJECT \
+ ${kv;hide:"p LD"} ${kv;hide:"pc light-blue"} ${kv;hide:"show_out"}
diff --git a/build/conf/opensource.conf b/build/conf/opensource.conf
new file mode 100644
index 0000000000..3725fd0853
--- /dev/null
+++ b/build/conf/opensource.conf
@@ -0,0 +1,74 @@
+EXPORT_CMAKE=no
+EXPORT_GRADLE=no
+
+when ($CATBOOST_OPENSOURCE == "yes") {
+ OPENSOURCE=yes
+ CFLAGS+=-DCATBOOST_OPENSOURCE=yes
+ CXXFLAGS+=-DCATBOOST_OPENSOURCE=yes
+}
+
+when ($OPENSOURCE == "yes") {
+ LOCAL_YDB_DOCKER_PUBLIC_BUILD=yes
+ CATBOOST_OPENSOURCE=yes
+ GO_VET=no
+ USE_DYNAMIC_IDN=yes
+ USE_DYNAMIC_AIO=yes
+ USE_DYNAMIC_ICONV=yes
+ USE_ASMLIB=no
+ SO_OUTPUTS=yes
+ UDF_NO_PROBE=yes
+ HAVE_MKL=no
+ USE_MKL=no
+ USE_PREBUILT_TOOLS=no
+}
+
+# Extra macros to control how gradle export works
+
+when ($OPENSOURCE == "yes" && $EXPORT_GRADLE == "yes") {
+ RECURSIVE_ADD_PEERS_TESTS=yes
+}
+
+# Extra macros to control how cmake export works
+
+when ($OPENSOURCE == "yes" && $EXPORT_CMAKE == "yes") {
+ # Python version is not acttually used in exported cmake's rigth now.
+ # The only reason to set it is to avoid any deps on contrib/python|contrib/libs/python when
+ # exporting PY_*_MODULE and force dependency to build/platform/python there.
+ USE_SYSTEM_PYTHON=3.10
+ USE_ARCADIA_PYTHON=no
+ # YMAKE-477. yexport does not support USE_GLOBAL_CMD=no and crashes with OOM.
+ # USE_GLOBAL_CMD=yes does not work for Windows with ya make builds but works with exported CMake files: YMAKE-657.
+ USE_GLOBAL_CMD=yes
+}
+
+CMAKE_PACKAGE=
+CMAKE_PACKAGE_COMPONENT=
+CMAKE_PACKAGE_TARGET=
+CONAN_REFERENCE=
+CONAN_PKG_OPTS=
+### @usage: OPENSOURCE_EXPORT_REPLACEMENT(CMAKE PkgName CMAKE_TARGET PkgName::PkgTarget CONAN ConanRef CMAKE_COMPONENT OptCmakePkgComponent)
+###
+### Use specified conan/system pacakcge when exporting cmake build scripts for arcadia C++ project
+### for opensource publication.
+macro OPENSOURCE_EXPORT_REPLACEMENT(CMAKE[], CMAKE_TARGET[], CMAKE_COMPONENT[], CONAN[], CONAN_OPTIONS[]) {
+ SET(CMAKE_PACKAGE $CMAKE)
+ SET(CMAKE_PACKAGE_COMPONENT $CMAKE_COMPONENT)
+ SET(CMAKE_LINK_TARGET $CMAKE_TARGET)
+ SET(CONAN_REFERENCE $CONAN)
+ SET(CONAN_PKG_OPTS $CONAN_OPTIONS)
+}
+
+CMAKE_TARGET_NAME=$REALPRJNAME
+CMAKE_TARGET_ARTEFACT_RENAME_RULES=
+### @usage CMAKE_EXPORTED_TARGET_NAME(Name)
+###
+### Forces to use the name given as cmake target name without changing the name of output artefact.
+### This macro should be used to resolve target name conflicts in exported cmake project when
+### changing module name is not applicable. For example both CUDA and non-CUDA py modules for
+### catboost should have same name lib_catboost.so and both of them are defined as PY_ANY_MODULE(_catboost).
+### adding CMAKE_EXPORTED_TARGET_NAME(_catboost_non_cuda) to the non CUDA module ya.make file
+### changes exported cmake target name but preserve generated artefact file name.
+macro CMAKE_EXPORTED_TARGET_NAME(Name) {
+ SET(CMAKE_TARGET_NAME $Name)
+ SET(CMAKE_TARGET_ARTEFACT_RENAME_RULES && set_target_property OUTPUT_NAME $REALPRJNAME)
+}
diff --git a/build/conf/project_specific/maps/aar.conf b/build/conf/project_specific/maps/aar.conf
new file mode 100644
index 0000000000..7ac21e5d8e
--- /dev/null
+++ b/build/conf/project_specific/maps/aar.conf
@@ -0,0 +1,350 @@
+
+_GRADLE_FLAGS_VALUE=
+### @usage: GRADLE_FLAGS(flags...) # internal
+###
+### SEt additional flags for gradle
+macro GRADLE_FLAGS(FLAGS...) {
+ SET_APPEND(_GRADLE_FLAGS_VALUE $FLAGS)
+}
+
+### @usage: PROGUARD_RULES(ProguardRuleFiles...)
+###
+### This macro is strictly prohibited to use outside of mapsmobi project
+macro PROGUARD_RULES(RULES...) {
+ SET_APPEND(_PROGUARD_RULES_GLOBAL $RULES)
+}
+
+### @usage: AARS(Aars...)
+###
+### This macro is strictly prohibited to use outside of mapsmobi project
+macro AARS(DEPS...) {
+ SET_APPEND(_AARS_GLOBAL $DEPS)
+}
+
+### @usage: MOBILE_DLL() # internal
+module MOBILE_DLL: DLL {
+ .CMD=LINK_MOBILE_DLL
+
+ PEERDIR(build/external_resources/android_sdk)
+ PEERDIR(build/external_resources/gradle)
+ PEERDIR(build/platform/java/jdk)
+ PEERDIR($JDK_RESOURCE_PEERDIR)
+
+ SET(BIN_AAR_DIR $BINDIR/aar)
+ SET(BIN_TMP_DIR $BINDIR/tmp)
+}
+
+_MOBILE_TEST_APK_AAR_MANIFEST_VALUE=
+### @usage: MOBILE_TEST_APK_AAR_MANIFEST(file) # internal
+macro MOBILE_TEST_APK_AAR_MANIFEST(FILE) {
+ SET(_MOBILE_TEST_APK_AAR_MANIFEST_VALUE $FILE)
+}
+
+_MOBILE_TEST_APK_AAR_PROGUARD_RULES_VALUE=
+### @usage: MOBILE_TEST_APK_AAR_PROGUARD_RULES(file) # internal
+macro MOBILE_TEST_APK_AAR_PROGUARD_RULES(FILE) {
+ SET(_MOBILE_TEST_APK_AAR_PROGUARD_RULES_VALUE $FILE)
+}
+
+_MOBILE_TEST_APK_AAR_AARS_VALUE=
+### @usage: MOBILE_TEST_APK_AAR_AARS(filenames...) # internal
+macro MOBILE_TEST_APK_AAR_AARS(AARS...) {
+ SET_APPEND(_MOBILE_TEST_APK_AAR_AARS_VALUE $AARS)
+}
+
+_MOBILE_TEST_APK_AAR_BUNDLES_VALUE=
+### @usage: MOBILE_TEST_APK_AAR_BUNDLES(filenames...) # internal
+macro MOBILE_TEST_APK_AAR_BUNDLES(BUNDLES...) {
+ SET_APPEND(_MOBILE_TEST_APK_AAR_BUNDLES_VALUE $BUNDLES)
+ BUNDLE_EXTRA_INPUTS($BUNDLES)
+}
+
+_MOBILE_TEST_APK_TEMPLATE_DIR=
+### @usage: MOBILE_TEST_APK_TEMPLATE(dir filenames...) # internal
+macro MOBILE_TEST_APK_TEMPLATE(TEMPLATE_DIR, INPUTS...) {
+ SET(_MOBILE_TEST_APK_TEMPLATE_DIR $TEMPLATE_DIR)
+ BUNDLE_EXTRA_INPUTS(${pre=$TEMPLATE_DIR/:INPUTS})
+}
+
+_MOBILE_TEST_APK_CMDLINE=\
+$FS_TOOLS md $BIN_TMP_DIR \
+&& $FS_TOOLS md $BINDIR/.android \
+&& $COPY_CMD $GRADLE_DEBUG_STORE_RESOURCE_GLOBAL/debug.keystore $BINDIR/.android/debug.keystore \
+&& $FS_TOOLS md $BINDIR/jni_libs/$ARCH_NAME \
+&& $YMAKE_PYTHON ${input:"build/scripts/extract_asrc.py"} --output $BIN_TMP_DIR --input ${suf=.asrc:PEERS} \
+&& $MOVE_FILE $OUTPUT $BINDIR/jni_libs/$ARCH_NAME/${pre=lib;suf=.so:_MOBILE_TEST_APK_LIBRARY_NAME} \
+&& $FS_TOOLS md $BIN_AAR_DIR \
+&& $YMAKE_PYTHON ${input:"build/scripts/gen_aar_gradle_script.py"} \
+${input;hide:EXTRA_INPUTS} \
+--aidl-dirs $BIN_TMP_DIR/aidl \
+--assets-dirs $BIN_TMP_DIR/assets \
+--java-dirs $BIN_TMP_DIR/src \
+--jni-libs-dirs $BINDIR/jni_libs \
+--res-dirs $BIN_TMP_DIR/res \
+--manifest ${input:_MOBILE_TEST_APK_AAR_MANIFEST_VALUE} \
+--proguard-rules ${input:_MOBILE_TEST_APK_AAR_PROGUARD_RULES_VALUE} ${input:_PROGUARD_RULES_GLOBAL} \
+--aars $_MOBILE_TEST_APK_AAR_AARS_VALUE $_AARS_GLOBAL \
+--bundles $_MOBILE_TEST_APK_AAR_BUNDLES_VALUE \
+--output-dir $BIN_AAR_DIR \
+--bundle-name unittest \
+--maven-repos ${MAPSMOBI_MAVEN_REPO_RESOURCE_GLOBAL} \
+&& ${cwd:BIN_AAR_DIR} ${GRADLE_RESOURCE_GLOBAL}/bin/gradle $_GRADLE_FLAGS_VALUE --no-daemon --offline -g $BIN_GRADLE_USER_HOME_DIR assemble${_BUNDLE_BUILD_TYPE} ${env:"ANDROID_HOME=$ANDROID_SDK_RESOURCE_GLOBAL/android_sdk"} ${env:"JAVA_HOME=$JDK_RESOURCE"} ${env:"ANDROID_SDK_HOME=$BINDIR"} \
+&& $FS_TOOLS md $BIN_APK_DIR \
+&& $FS_TOOLS md $BIN_APK_DIR/res \
+&& $COPY_CMD $_MOBILE_TEST_APK_TEMPLATE_DIR/Manifest.xml $BIN_APK_DIR/Manifest.xml \
+&& $YMAKE_PYTHON ${input:"build/scripts/gen_test_apk_gradle_script.py"} \
+${input;hide:EXTRA_INPUTS} \
+--app-id $REALPRJNAME \
+--assets-dirs $_MOBILE_TEST_APK_ASSETS_DIRS_VALUE \
+--java-dirs $_MOBILE_TEST_APK_TEMPLATE_DIR/java \
+--jni-libs-dirs \
+--res-dirs $BIN_APK_DIR/res $_MOBILE_TEST_APK_TEMPLATE_DIR/res $BIN_TMP_DIR/res \
+--manifest Manifest.xml \
+--aars \
+--output-dir $BIN_APK_DIR \
+--bundle-name $REALPRJNAME \
+--bundles $BIN_AAR_DIR/build/outputs/aar/unittest-${tolower:_BUNDLE_BUILD_TYPE}.aar $_MOBILE_TEST_APK_AAR_BUNDLES_VALUE \
+--library-name $_MOBILE_TEST_APK_LIBRARY_NAME \
+--maven-repos ${MAPSMOBI_MAVEN_REPO_RESOURCE_GLOBAL} \
+&& ${cwd:BIN_APK_DIR} ${GRADLE_RESOURCE_GLOBAL}/bin/gradle $_GRADLE_FLAGS_VALUE --no-daemon --offline -g $BIN_GRADLE_USER_HOME_DIR assembleDebug ${env:"ANDROID_HOME=$ANDROID_SDK_RESOURCE_GLOBAL/android_sdk"} ${env:"JAVA_HOME=$JDK_RESOURCE"} ${env:"ANDROID_SDK_HOME=$BINDIR"} \
+&& $COPY_CMD $BIN_APK_DIR/build/outputs/apk/${tolower:_BUNDLE_BUILD_TYPE}/$REALPRJNAME.apk ${OUTPUT}
+
+_MOBILE_TEST_APK_EXTRA_INPUTS_VALUE=
+
+macro _MOBILE_TEST_APK_CMD_IMPL(OUTPUT, EXTRA_INPUTS...) {
+ .CMD=$_MOBILE_TEST_APK_CMDLINE
+}
+
+_MOBILE_TEST_APK_CMD=$_MOBILE_TEST_APK_CMD_IMPL($TARGET $_BUNDLE_EXTRA_INPUTS_VALUE)
+
+LINK_MOBILE_TEST_APK=$LINK_DYN_LIB && $_MOBILE_TEST_APK_CMD
+
+### @usage: MOBILE_TEST_APK() # internal
+module MOBILE_TEST_APK: DLL {
+ .CMD=LINK_MOBILE_TEST_APK
+ .GLOBAL=_AARS _PROGUARD_RULES
+
+ PEERDIR(build/external_resources/android_sdk)
+ PEERDIR(build/external_resources/gradle)
+ PEERDIR(build/platform/java/jdk)
+ PEERDIR($JDK_RESOURCE_PEERDIR)
+
+ SET(MODULE_PREFIX)
+ SET(MODULE_SUFFIX .apk)
+
+ SET(BIN_AAR_DIR $BINDIR/aar)
+ SET(BIN_APK_DIR $BINDIR/apk)
+ SET(BIN_TMP_DIR $BINDIR/tmp)
+ SET(BIN_GRADLE_USER_HOME_DIR $BINDIR/gradle)
+
+ SET(_MOBILE_TEST_APK_LIBRARY_NAME unittests)
+
+ when ($OS_ANDROID == "yes") {
+ when ($ARCH_ARM7 == "yes") {
+ ARCH_NAME=armeabi-v7a
+ }
+ elsewhen ($ARCH_ARM64 == "yes") {
+ ARCH_NAME=arm64-v8a
+ }
+ elsewhen ($ARCH_I386 == "yes") {
+ ARCH_NAME=x86
+ }
+ elsewhen ($ARCH_X86_64 == "yes") {
+ ARCH_NAME=x86_64
+ }
+ otherwise {
+ ARCH_NAME=unsupported
+ }
+ }
+}
+
+
+### @usage: MOBILE_BOOST_TEST_APK() # internal
+module MOBILE_BOOST_TEST_APK: MOBILE_TEST_APK {
+ PEERDIR(devtools/dummy_arcadia/test/test_apk/template)
+ PEERDIR(build/external_resources/mapsmobi_maven_repo)
+ ADD_YTEST($MODULE_PREFIX$REALPRJNAME boost.test)
+
+ MOBILE_TEST_APK_TEMPLATE(${ARCADIA_ROOT}/devtools/dummy_arcadia/test/test_apk/template Manifest.xml java/com/yandex/test/unittests/RunTestsActivity.java java/com/yandex/test/unittests/CrashHandler.java res/values/strings.xml)
+}
+
+when ($BT_RELEASE) {
+ _BUNDLE_BUILD_TYPE=Release
+}
+otherwise {
+ _BUNDLE_BUILD_TYPE=Debug
+}
+
+_AAR_EXTRA_INPUTS_VALUE=
+
+_AAR_MANIFEST_VALUE=
+### @usage: AAR_MANIFEST(filename) # internal
+macro AAR_MANIFEST(FILE) {
+ SET(_AAR_MANIFEST_VALUE $FILE)
+}
+
+_AAR_PROGUARD_RULES_VALUE=
+### @usage: AAR_PROGUARD_RULES(filename) # internal
+macro AAR_PROGUARD_RULES(FILE) {
+ SET(_AAR_PROGUARD_RULES_VALUE $FILE)
+}
+
+_AAR_AARS_VALUE=
+### @usage: AAR_AARS(aars...) # internal
+macro AAR_AARS(Aars...) {
+ SET_APPEND(_AAR_AARS_VALUE $Aars)
+}
+
+_AAR_COMPILE_ONLY_AARS_VALUE=
+### @usage: AAR_COMPILE_ONLY_AARS(compile_only_aars...) # internal
+macro AAR_COMPILE_ONLY_AARS(Aars...) {
+ SET_APPEND(_AAR_COMPILE_ONLY_AARS_VALUE $Aars)
+}
+
+
+_AAR_AIDL_DIRS_VALUE=
+### @usage: AAR_AIDL_SRCS(dir filenames...) # internal
+macro AAR_AIDL_SRCS(PREFIX, ABSOLUTE[], FILES...) {
+ SET_APPEND(_AAR_AIDL_DIRS_VALUE $PREFIX)
+ SET_APPEND(_AAR_EXTRA_INPUTS_VALUE ${pre=$PREFIX/:FILES} ${ABSOLUTE})
+}
+
+_AAR_ASSETS_DIRS_VALUE=
+### @usage: AAR_ASSETS_SRCS(dir filenames...) # internal
+macro AAR_ASSETS_SRCS(PREFIX, ABSOLUTE[], FILES...) {
+ SET_APPEND(_AAR_ASSETS_DIRS_VALUE $PREFIX)
+ SET_APPEND(_AAR_EXTRA_INPUTS_VALUE ${pre=$PREFIX/:FILES} ${ABSOLUTE})
+}
+
+_AAR_BUNDLES_VALUE=
+### @usage: AAR_BUNDLES(filenames...) # internal
+macro AAR_BUNDLES(BUNDLES...) {
+ SET_APPEND(_AAR_BUNDLES_VALUE $BUNDLES)
+ SET_APPEND(_AAR_EXTRA_INPUTS_VALUE $BUNDLES)
+}
+
+_AAR_JNI_LIB_DIRS_VALUE=
+### @usage: AAR_JNI_LIBS(dir filenames...) # internal
+macro AAR_JNI_LIBS(PREFIX, ABSOLUTE[], FILES...) {
+ SET_APPEND(_AAR_JNI_LIB_DIRS_VALUE $PREFIX)
+ SET_APPEND(_AAR_EXTRA_INPUTS_VALUE ${pre=$PREFIX/:FILES} ${ABSOLUTE})
+}
+
+_AAR_JAVA_DIRS_VALUE=
+### @usage: AAR_JAVA_SRCS(dir filenames...) # internal
+macro AAR_JAVA_SRCS(PREFIX, ABSOLUTE[], FILES...) {
+ SET_APPEND(_AAR_JAVA_DIRS_VALUE $PREFIX)
+ SET_APPEND(_AAR_EXTRA_INPUTS_VALUE ${pre=$PREFIX/:FILES} ${ABSOLUTE})
+}
+
+_AAR_RES_DIRS_VALUE=
+### @usage: AAR_RES_SRCS(dir filenames...) # internal
+macro AAR_RES_SRCS(PREFIX, ABSOLUTE[], FILES...) {
+ SET_APPEND(_AAR_RES_DIRS_VALUE $PREFIX)
+ SET_APPEND(_AAR_EXTRA_INPUTS_VALUE ${pre=$PREFIX/:FILES} ${ABSOLUTE})
+}
+
+_AAR_LOCAL_MAVEN_REPO_VALUE=
+### @usage: AAR_LOCAL_MAVEN_REPO(repo...)
+macro AAR_LOCAL_MAVEN_REPO(REPO...) {
+ SET_APPEND(_AAR_LOCAL_MAVEN_REPO_VALUE $REPO)
+}
+
+_AAR_GRADLE_SCRIPT_GENERATOR_VALUE=
+### @usage: AAR_GRADLE_SCRIPT_GENERATOR(python_script)
+macro AAR_GRADLE_SCRIPT_GENERATOR(GENERATOR) {
+ SET(_AAR_GRADLE_SCRIPT_GENERATOR_VALUE $GENERATOR)
+}
+
+when ($AAR_GENERATE_DOC) {
+ _AAR_GENERATE_DOC_VALUE=--generate-doc
+ _AAR_COPY_DOC_VALUE=\
+ && ${cwd:BINDIR} $COPY_CMD build/${REALPRJNAME}-javadoc.tar.gz ${output;suf=-javadoc.tar.gz:REALPRJNAME}
+}
+otherwise {
+ _AAR_GENERATE_DOC_VALUE=
+ _AAR_COPY_DOC_VALUE=
+}
+
+when ($AAR_NO_STRIP) {
+ _AAR_NO_STRIP_VALUE=--do-not-strip
+}
+otherwise {
+ _AAR_NO_STRIP_VALUE=
+}
+
+_AAR_CMDLINE=\
+$FS_TOOLS md $BIN_TMP_DIR \
+&& $FS_TOOLS md $BINDIR/.android \
+&& $COPY_CMD $GRADLE_DEBUG_STORE_RESOURCE_GLOBAL/debug.keystore $BINDIR/.android/debug.keystore \
+&& $YMAKE_PYTHON ${input:"build/scripts/extract_asrc.py"} --output $BIN_TMP_DIR --input ${suf=.asrc:PEERS} \
+&& $YMAKE_PYTHON ${input:_AAR_GRADLE_SCRIPT_GENERATOR_VALUE} \
+${input;hide:EXTRA_INPUTS} \
+--aidl-dirs $_AAR_AIDL_DIRS_VALUE $BIN_TMP_DIR/aidl \
+--assets-dirs $_AAR_ASSETS_DIRS_VALUE $BIN_TMP_DIR/assets \
+--java-dirs $_AAR_JAVA_DIRS_VALUE $BIN_TMP_DIR/src \
+--jni-libs-dirs $_AAR_JNI_LIB_DIRS_VALUE $BIN_TMP_DIR/jni_libs \
+--res-dirs $_AAR_RES_DIRS_VALUE $BIN_TMP_DIR/res \
+--manifest ${input:_AAR_MANIFEST_VALUE} \
+--proguard-rules ${input:_AAR_PROGUARD_RULES_VALUE} ${input:_PROGUARD_RULES_GLOBAL} \
+--aars $_AAR_AARS_VALUE $_AARS_GLOBAL \
+--compile-only-aars $_AAR_COMPILE_ONLY_AARS_VALUE \
+--bundles $_AAR_BUNDLES_VALUE \
+--output-dir $BINDIR \
+--bundle-name $REALPRJNAME \
+--peers $PEERS \
+--maven-repos $_AAR_LOCAL_MAVEN_REPO_VALUE \
+$_AAR_GENERATE_DOC_VALUE \
+$_AAR_NO_STRIP_VALUE \
+&& ${cwd:BINDIR} ${GRADLE_RESOURCE_GLOBAL}/bin/gradle $_GRADLE_FLAGS_VALUE --no-daemon --offline -g $BIN_GRADLE_USER_HOME_DIR bundle${_BUNDLE_BUILD_TYPE}Aar ${env:"ANDROID_HOME=$ANDROID_SDK_RESOURCE_GLOBAL/android_sdk"} ${env:"JAVA_HOME=$JDK_RESOURCE"} ${env:"ANDROID_SDK_HOME=$BINDIR"} $VCS_INFO_DISABLE_CACHE__NO_UID__ \
+&& ${cwd:BINDIR} $COPY_CMD build/outputs/aar/${REALPRJNAME}-${tolower:_BUNDLE_BUILD_TYPE}.aar $TARGET \
+$_AAR_COPY_DOC_VALUE \
+&& ${cwd:BINDIR} $COPY_CMD build/${suf=-pom.xml:REALPRJNAME} ${output;suf=-pom.xml:REALPRJNAME} \
+&& ${cwd:BINDIR} $COPY_CMD build/libs/${suf=-sources.jar:REALPRJNAME} ${output;suf=-sources.jar:REALPRJNAME}
+
+macro _AAR_CMD_IMPL(EXTRA_INPUTS...) {
+ .CMD=$_AAR_CMDLINE && $GENERATE_MF
+}
+
+AAR_CMD=$_AAR_CMD_IMPL($_AAR_EXTRA_INPUTS_VALUE)
+
+### @usage: AAR() # internal
+module AAR: _BASE_UNIT {
+ .CMD=AAR_CMD
+ .GLOBAL=_AARS _PROGUARD_RULES
+ .PEERDIR_POLICY=as_build_from
+ .FINAL_TARGET=yes
+
+ SET(MODULE_PREFIX)
+ SET(MODULE_SUFFIX .aar)
+ SET(DONT_RESOLVE_INCLUDES yes)
+ SET(NEED_PLATFORM_PEERDIRS no)
+ NO_PLATFORM()
+
+ PEERDIR(build/external_resources/android_sdk)
+ PEERDIR(build/external_resources/gradle)
+ PEERDIR(build/platform/java/jdk)
+ PEERDIR($JDK_RESOURCE_PEERDIR)
+
+ SET(BIN_TMP_DIR $BINDIR/tmp)
+ SET(BIN_GRADLE_USER_HOME_DIR $BINDIR/gradle)
+}
+
+_SECONDARY_OUTPUT_VALUE=
+
+### @usage: SECONDARY_OUTPUT(filename) # internal
+###
+### The use of this macro is strictly prohibited!!!
+macro SECONDARY_OUTPUT(OUTPUT) {
+ SET(_SECONDARY_OUTPUT_VALUE $OUTPUT)
+}
+
+_AAR_PROXY_LIBRARY_CMD=$LINK_LIB && $COPY_CMD $_SECONDARY_OUTPUT_VALUE ${input;hide:_SECONDARY_OUTPUT_VALUE} ${output:REALPRJNAME.aar}
+
+### @usage: AAR_PROXY_LIBRARY() # internal
+###
+### The use of this module is strictly prohibited!!!
+module AAR_PROXY_LIBRARY: _PROXY_LIBRARY {
+ .ALLOWED=SECONDARY_OUTPUT
+ .CMD=_AAR_PROXY_LIBRARY_CMD
+}
diff --git a/build/conf/project_specific/maps/asrc.conf b/build/conf/project_specific/maps/asrc.conf
new file mode 100644
index 0000000000..cdecd2b1a4
--- /dev/null
+++ b/build/conf/project_specific/maps/asrc.conf
@@ -0,0 +1,121 @@
+_BUNDLE_DELIM_JAVA=__DELIM_JAVA__
+_BUNDLE_DELIM_RES=__DELIM_RES__
+_BUNDLE_DELIM_ASSETS=__DELIM_ASSETS__
+_BUNDLE_DELIM_AIDL=__DELIM_AIDL__
+
+_BUNDLE_EXTRA_INPUTS_VALUE=
+### @usage: BUNDLE_EXTRA_INPUTS(filenames...) # internal
+macro BUNDLE_EXTRA_INPUTS(INPUTS...) {
+ SET_APPEND(_BUNDLE_EXTRA_INPUTS_VALUE $INPUTS)
+}
+
+_BUNDLE_AIDL_SRCS_VALUE=
+### @usage: BUNDLE_AIDL_SRCS(dirname filenames...) # internal
+macro BUNDLE_AIDL_SRCS(PREFIX, ABSOLUTE[], FILES...) {
+ SET_APPEND(_BUNDLE_AIDL_SRCS_VALUE $_BUNDLE_DELIM_AIDL $PREFIX ${pre=$PREFIX/:FILES} ${ABSOLUTE})
+ BUNDLE_EXTRA_INPUTS(${pre=$PREFIX/:FILES} ${ABSOLUTE})
+}
+
+_BUNDLE_JAVA_SRCS_VALUE=
+### @usage: BUNDLE_JAVA_SRCS(dirname filenames...) # internal
+macro BUNDLE_JAVA_SRCS(PREFIX, ABSOLUTE[], FILES...) {
+ SET_APPEND(_BUNDLE_JAVA_SRCS_VALUE $_BUNDLE_DELIM_JAVA $PREFIX ${pre=$PREFIX/:FILES} ${ABSOLUTE})
+ BUNDLE_EXTRA_INPUTS(${pre=$PREFIX/:FILES} ${ABSOLUTE})
+}
+
+_BUNDLE_RES_SRCS_VALUE=
+### @usage: BUNDLE_RES_SRCS(dirname filenames...) # internal
+macro BUNDLE_RES_SRCS(PREFIX, ABSOLUTE[], FILES...) {
+ SET_APPEND(_BUNDLE_RES_SRCS_VALUE $_BUNDLE_DELIM_RES $PREFIX ${pre=$PREFIX/:FILES} ${ABSOLUTE})
+ BUNDLE_EXTRA_INPUTS(${pre=$PREFIX/:FILES} ${ABSOLUTE})
+}
+
+_BUNDLE_ASSETS_SRCS_VALUE=
+### @usage: BUNDLE_ASSETS_SRCS(dirname filenames...) # internal
+macro BUNDLE_ASSETS_SRCS(PREFIX, ABSOLUTE[], FILES...) {
+ SET_APPEND(_BUNDLE_ASSETS_SRCS_VALUE $_BUNDLE_DELIM_ASSETS $PREFIX ${pre=$PREFIX/:FILES} ${ABSOLUTE})
+ BUNDLE_EXTRA_INPUTS(${pre=$PREFIX/:FILES} ${ABSOLUTE})
+}
+
+_BUNDLE_SRCS_VALUE=$_BUNDLE_AIDL_SRCS_VALUE $_BUNDLE_ASSETS_SRCS_VALUE $_BUNDLE_JAVA_SRCS_VALUE $_BUNDLE_RES_SRCS_VALUE
+
+macro _COMPILE_ASRC_IMPL(EXTRA_INPUTS...) {
+ .CMD=${cwd:ARCADIA_BUILD_ROOT} $YMAKE_PYTHON ${input:"build/scripts/link_asrc.py"} --work $BINDIR --input $_BUNDLE_SRCS_VALUE ${input;hide:EXTRA_INPUTS} --output $TARGET ${kv;hide:"p AC"} $kv;hide:"pc light-blue"} ${kv;hide:"show_out"}
+}
+
+_COMPILE_ASRC=$_COMPILE_ASRC_IMPL($_ASRC_EXTRA_INPUTS_VALUE)
+
+COMPILE_ASRC_MF=$_COMPILE_ASRC && $GENERATE_MF
+
+### @usage: ASRC_LIBRARY() # internal
+module ASRC_LIBRARY: _BASE_UNIT {
+ .CMD=COMPILE_ASRC_MF
+ .PEERDIR_POLICY=as_include
+ .FINAL_TARGET=no
+ PEERDIR_TAGS=JAVA_PROTO JAVA_IDL
+ MODULE_TYPE=Library
+ SET(MODULE_SUFFIX .asrc)
+ SET(DONT_RESOLVE_INCLUDES yes)
+ SET(NEED_PLATFORM_PEERDIRS no)
+
+ NO_RUNTIME()
+}
+
+macro _MOBILE_LIBRARY_PREREQUISITES_IMPL(OUTPUT, EXTRA_INPUTS...) {
+ .CMD=${cwd:ARCADIA_BUILD_ROOT} $YMAKE_PYTHON ${input:"build/scripts/link_asrc.py"} --work $BINDIR --input $_BUNDLE_SRCS_VALUE --output $OUTPUT ${kv;hide:"p AC"} ${kv;hide:"pc lite-blue"} ${kv;hide:"show_out"}
+}
+
+macro _MOBILE_LIBRARY_PREREQUISITES_CMD(OUTPUT, EXTRA_INPUTS...) {
+ .CMD=${output;hide:OUTPUT} ${input;hide:EXTRA_INPUTS} ${kv;hide:"p AC"} ${kv;hide:"pc lite-blue"} ${kv;hide:"show_out"} $_MOBILE_LIBRARY_PREREQUISITES_IMPL($OUTPUT $EXTRA_INPUTS)
+}
+
+when ($OS_ANDROID == "yes") {
+ LINK_MOBILE_LIB=$LINK_LIB && $_MOBILE_LIBRARY_PREREQUISITES_CMD(${BINDIR}/$MODULE_PREFIX$REALPRJNAME$MODULE_SUFFIX.asrc $_BUNDLE_EXTRA_INPUTS_VALUE)
+}
+otherwise {
+ LINK_MOBILE_LIB=$LINK_LIB
+}
+
+### @usage: MOBILE_LIBRARY() # internal
+module MOBILE_LIBRARY: LIBRARY {
+ .CMD=LINK_MOBILE_LIB
+ DISABLE(NEED_ADD_FAKE_SRC)
+}
+
+_JSRC_PROXY_MOBILE_LIBRARY_CMDLINE=${cwd:ARCADIA_BUILD_ROOT} $YMAKE_PYTHON ${input:"build/scripts/link_asrc.py"} --work $BINDIR --jsrcs ${ext=.jsrc;tags_in=local:PEERS} --input $_BUNDLE_SRCS_VALUE ${input;hide:EXTRA_INPUTS} --output ${output;pre=$MODULE_PREFIX;suf=$MODULE_SUFFIX.asrc:REALPRJNAME} ${kv;hide:"p AC"} ${kv;hide:"pc lite-blue"} ${kv;hide:"show_out"}
+
+macro _JSRC_PROXY_MOBILE_LIBRARY_CMD_IMPL(EXTRA_INPUTS...) {
+ .CMD=$_JSRC_PROXY_MOBILE_LIBRARY_CMDLINE
+}
+
+JSRC_PROXY_MOBILE_LIBRARY_CMD=$LINK_LIB && $_JSRC_PROXY_MOBILE_LIBRARY_CMD_IMPL($_BUNDLE_EXTRA_INPUTS_VALUE)
+
+### @usage: JSRC_PROXY_MOBILE_LIBRARY() # internal
+module JSRC_PROXY_MOBILE_LIBRARY: MOBILE_LIBRARY {
+ .CMD=JSRC_PROXY_MOBILE_LIBRARY_CMD
+ .PEERDIR_POLICY=as_build_from
+ .PROXY=yes
+
+ SET(MODULE_TYPE LIBRARY)
+ DISABLE(NEED_ADD_FAKE_SRC)
+
+ PEERDIR_TAGS=JAVA_PROTO JAVA_IDL
+
+ SET(BIN_TMP_DIR ${BINDIR}/tmp)
+
+ NO_UTIL()
+}
+
+_MOBILE_DLL_PREREQUISITES_CMDLINE=${cwd:ARCADIA_BUILD_ROOT} $YMAKE_PYTHON ${input:"build/scripts/link_asrc.py"} --work $BINDIR --asrcs ${PEERS.arcs} --input $_BUNDLE_SRCS_VALUE ${input;hide:EXTRA_INPUTS} --output ${output;pre=$MODULE_PREFIX;suf=$MODULE_SUFFIX.asrc:REALPRJNAME} ${kv;hide:"p AC"} ${kv;hide:"pc lite-blue"} ${kv;hide:"show_out"}
+
+macro _MOBILE_DLL_PREREQUISITES_CMD(EXTRA_INPUTS...) {
+ .CMD=$_MOBILE_DLL_PREREQUISITES_CMDLINE
+}
+
+when ($OS_ANDROID == "yes") {
+ LINK_MOBILE_DLL=$LINK_DYN_LIB && $_MOBILE_DLL_PREREQUISITES_CMD($_BUNDLE_EXTRA_INPUTS_VALUE)
+}
+otherwise {
+ LINK_MOBILE_DLL=$LINK_DYN_LIB
+}
+
diff --git a/build/conf/project_specific/maps/mapkit.conf b/build/conf/project_specific/maps/mapkit.conf
new file mode 100644
index 0000000000..67ffa3bf26
--- /dev/null
+++ b/build/conf/project_specific/maps/mapkit.conf
@@ -0,0 +1,313 @@
+MAPKIT_IDL_INCLUDES=
+macro MAPKIT_ADDINCL(Dirs...) {
+ ADDINCL(${pre=FOR idl :Dirs})
+ SET_APPEND(MAPKIT_IDL_INCLUDES $Dirs)
+}
+
+### @usage: MAPS_IDL_ADDINCL(dirnames...) # internal
+###
+### Warpper for MAPKIT_ADDINCL macro which is used for mobile mapkit build
+macro MAPS_IDL_ADDINCL(Dirs...) {
+ MAPKIT_ADDINCL($Dirs)
+}
+
+### @usage: _MAPKITIDL_PROXY(args...) # internal
+###
+### Proxy macro for MAPKITIDL which adds PEERDIR to YMAKE resources
+macro _MAPKITIDL_PROXY(Args...) {
+ MAPKITIDL($Args)
+ ENABLE(USE_YMAKE_RESOURCE)
+ SET_APPEND(_MAKEFILE_INCLUDE_LIKE_TEXT_DEPS ${ext=idl:Args})
+}
+
+MAPS_IDL_FILTER=
+
+### @usage: MAPS_IDL_SRCS(filenames...) # internal
+###
+### Warpper for MAPKITIDL macro which is used for mobile mapkit build
+macro MAPS_IDL_SRCS(Srcs...) {
+ _MAPKITIDL_PROXY($Srcs ${MAPS_IDL_FILTER})
+}
+
+### @usage: MAPS_IDL_GLOBAL_SRCS(filenames...) # internal
+###
+### Warpper for MAPKITIDL macro which is used for mobile mapkit build
+macro MAPS_IDL_GLOBAL_SRCS(Srcs...) {
+ _MAPKITIDL_PROXY(GLOBAL_OUTPUTS $Srcs ${MAPS_IDL_FILTER})
+}
+
+### @usage: MAPSMOBI_SRCS(filenames...) # internal
+###
+### Make all source files listed as GLOBAL or not (depending on the value of
+### MAPSMOBI_USE_SRCS_GLOBAL). Be careful since the value of
+### MAPSMOBI_USE_SRCS_GLOBAL matters! If the value of this variable is equal to
+### GLOBAL then call to MAPSMOBI_SRCS() macro behaves like call to
+### GLOBAL_SRCS() macro otherwise the value of MAPSMOBI_USE_SRCS_GLOBAL is
+### treated as a file name and a call to MAPSMOBI_SRCS() macro behaves like a
+### call to SRCS() macro with additional argument which is the value of
+### MAPSMOBI_USE_SRCS_GLOBAL variable
+macro MAPSMOBI_SRCS(FILES...) {
+ ALL_SRCS(${MAPSMOBI_USE_SRCS_GLOBAL} $FILES)
+}
+
+### @usage: EXPORT_MAPKIT_PROTO() # internal deprecated
+###
+### This macro is a temporary one and should be changed to EXPORT_YMAPS_PROTO
+### when transition of mapsmobi to arcadia is finished
+macro EXPORT_MAPKIT_PROTO() {
+ PROTO_NAMESPACE(GLOBAL maps/mapsmobi/external/proto)
+}
+
+BEFORE_PEERS=
+AFTER_PEERS=
+when ($MAPKIT_WHOLE_ARCHIVE == "yes") {
+ when($OS_LINUX) {
+ BEFORE_PEERS += $START_WHOLE_ARCHIVE_VALUE
+ AFTER_PEERS += $END_WHOLE_ARCHIVE_VALUE
+ }
+ elsewhen($OS_DARWIN) {
+ LDFLAGS+=-Wl,-all_load
+ }
+}
+
+### @usage: MAPKIT_ENABLE_WHOLE_ARCHIVE() # internal deprecated
+###
+### This macro is strictly prohibited to use outside of mapsmobi project
+macro MAPKIT_ENABLE_WHOLE_ARCHIVE() {
+ ENABLE(MAPKIT_WHOLE_ARCHIVE)
+}
+
+### @usage: USE_IDL_CPP()
+###
+### This macro forces to use H_CPP_IDL (implementation library) variant of
+### MAPS_IDL_LIBRARY multimodule instead of H_IDL (header only library) variant
+### which is used by default
+macro USE_IDL_CPP() {
+ SET(PEERDIR_TAGS __EMPTY__ CPP_PROTO H_CPP_IDL)
+}
+
+### @usage: MAPS_IDL_LIBRARY()
+###
+### Definition of multimodule that builds various variants of libraries.
+### The particular variant is selected based on where PEERDIR to IDL_LIBRARY comes from.
+### Now supported 2 variants: C++, Java
+### Java version is not really a library but an archive of generated Java sources
+multimodule MAPS_IDL_LIBRARY {
+ module H_IDL: LIBRARY {
+ .ALIASES=SRCS=MAPS_IDL_SRCS GLOBAL_SRCS=MAPS_IDL_GLOBAL_SRCS ADDINCL=MAPKIT_ADDINCL MAPSMOBI_SRCS=MAPS_IDL_SRCS
+
+ ENABLE(H_IDL)
+ ENABLE(CPP_IDL)
+ SET(PEERDIR_TAGS H_IDL CPP_PROTO __EMPTY__)
+ SET(MAPS_IDL_FILTER FILTER .h)
+
+ NO_UTIL()
+
+ PROTO_ADDINCL(${MAPKIT_PROTO_ROOT})
+ }
+
+ module H_CPP_IDL: LIBRARY {
+ .ALIASES=SRCS=MAPS_IDL_SRCS GLOBAL_SRCS=MAPS_IDL_GLOBAL_SRCS ADDINCL=MAPKIT_ADDINCL MAPSMOBI_SRCS=MAPS_IDL_SRCS
+ .DEFAULT_NAME_GENERATOR=DirName
+ .PEERDIRSELF=H_IDL
+
+ ENABLE(H_CPP_IDL)
+ ENABLE(CPP_IDL)
+ SET(PEERDIR_TAGS H_IDL CPP_PROTO __EMPTY__)
+ SET(MAPS_IDL_FILTER FILTER .cpp .m .mm)
+ DISABLE(START_TARGET)
+
+ NO_UTIL()
+ }
+
+ module JAVA_IDL: JSRC_LIBRARY {
+ .ALIASES=SRCS=MAPS_IDL_SRCS GLOBAL_SRCS=MAPS_IDL_SRCS ADDINCL=MAPKIT_ADDINCL MAPSMOBI_SRCS=MAPS_IDL_SRCS
+ .IGNORED=CPP_ADDINCL
+ SET(PEERDIR_TAGS JAVA_IDL JAVA_PROTO)
+ SET(MAPS_IDL_FILTER FILTER .java)
+ ENABLE(JAVA_IDL)
+
+ PROTO_ADDINCL(${MAPKIT_PROTO_ROOT})
+ }
+}
+
+### @usage: MAPSMOBI_COLLECT_ASSETS_FILES(varname [dir]) # internal
+###
+### This macro is strictly prohibited to use outside of mapsmobi project
+macro MAPSMOBI_COLLECT_ASSETS_FILES(VAR, DIR="") {
+ _GLOB($VAR ${suf=/:DIR}**/*)
+ RESTRICT_PATH(maps/mobile maps/automotive MSG This macro is for use in mapsmobi projects)
+}
+
+### @usage: MAPSMOBI_COLLECT_AIDL_FILES(varname [dir]) # internal
+###
+### This macro is strictly prohibited to use outside of mapsmobi project
+macro MAPSMOBI_COLLECT_AIDL_FILES(VAR, DIR="") {
+ _GLOB($VAR ${suf=/:DIR}**/*.aidl)
+ RESTRICT_PATH(maps/mobile maps/automotive MSG This macro is for use in mapsmobi projects)
+}
+
+### @usage: MAPSMOBI_COLLECT_JAVA_FILES(varname [dir]) # internal
+###
+### This macro is strictly prohibited to use outside of mapsmobi project
+macro MAPSMOBI_COLLECT_JAVA_FILES(VAR, DIR="") {
+ _GLOB($VAR ${suf=/:DIR}**/*.java)
+ RESTRICT_PATH(maps/mobile maps/automotive MSG This macro is for use in mapsmobi projects)
+}
+
+### @usage: MAPSMOBI_COLLECT_JNI_LIBS_FILES(varname [dir]) # internal
+###
+### This macro is strictly prohibited to use outside of mapsmobi project
+macro MAPSMOBI_COLLECT_JNI_LIBS_FILES(VAR, DIR="") {
+ _GLOB($VAR ${suf=/:DIR}**/*.so)
+ RESTRICT_PATH(maps/mobile maps/automotive MSG This macro is for use in mapsmobi projects)
+}
+
+### @usage: MAPSMOBI_COLLECT_RES_FILES(varname [dir]) # internal
+###
+### This macro is strictly prohibited to use outside of mapsmobi project
+macro MAPSMOBI_COLLECT_RES_FILES(VAR, DIR="") {
+ _GLOB($VAR ${suf=/:DIR}**/*.(xml|png))
+ RESTRICT_PATH(maps/mobile maps/automotive MSG This macro is for use in mapsmobi projects)
+}
+
+### @usage: MAPSMOBI_COLLECT_TPL_FILES(varname [dir]) # internal
+###
+### This macro is strictly prohibited to use outside of mapsmobi project
+macro MAPSMOBI_COLLECT_TPL_FILES(VAR, DIR="") {
+ _GLOB($VAR ${suf=/:DIR}**/*.tpl)
+ RESTRICT_PATH(tools/idl MSG This macro is for use in mapsmobi projects)
+}
+
+### @usage: MAPS_GARDEN_COLLECT_MODULE_TRAITS(varnamei dir) # internal
+###
+### This macro is strictly prohibited to use outside of maps/garden project
+macro MAPS_GARDEN_COLLECT_MODULE_TRAITS(VAR, DIR) {
+ _GLOB($VAR $DIR/*/module_traits.json)
+ RESTRICT_PATH(maps/garden/sdk/module_traits/tests/module_traits_bundle MSG This macro is for use in maps/garden project)
+}
+
+# mapsmobi build configuration
+
+MAPSMOBI_FAKEID=${FAKEID}_r9927169
+MAPSMOBI_BUILD=
+YANDEX_EXPORT=
+YRT_EXPORT=
+MAPSMOBI_CPP_PROTO_PLUGINS=
+STATIC_STL=
+EXPORT_ALL_SYMBOLS=
+when ($MAPSMOBI_BUILD_HOST || $MAPSMOBI_BUILD_TARGET) {
+ MAPSMOBI_BUILD=yes
+}
+when ($MAPSMOBI_BUILD) {
+ CFLAGS+=-DMOBILE_BUILD ${hide:MAPSMOBI_FAKEID}
+ MAPKIT_BASE_PROTO_PACKAGE=yandex.maps.proto
+ MAPKIT_PROTO_ROOT=maps/doc/proto
+ MAPKIT_IDL_FRAMEWORK=maps/mobile/libs/idl_frameworks
+}
+when ($MAPSMOBI_BUILD_TARGET) {
+ ALLOCATOR=FAKE
+ USE_VANILLA_PROTOC=yes
+ PROTOBUF_LITE=yes
+ CPP_PROTO_PLUGINS=lite${pre=,:MAPSMOBI_CPP_PROTO_PLUGINS}:
+ when ($OPENSOURCE != "yes") {
+ SYSINCL+=build/yandex_specific/sysincl/mapsmobi.yml
+ }
+
+ CFLAGS+=-U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=1 -DBOOST_CB_DISABLE_DEBUG -DBOOST_COROUTINES_NO_DEPRECATION_WARNING -DYANDEX_EXPORT=${YANDEX_EXPORT} -DYRT_EXPORT=${YRT_EXPORT}
+}
+when ($MAPSMOBI_BUILD_TARGET && $OS_ANDROID) {
+ JDK_REAL_VERSION=11
+ MAPSMOBI_CPP_PROTO_PLUGINS="dllexport_decl=YANDEX_EXPORT"
+ YANDEX_EXPORT=__attribute__((visibility(\"default\")))
+ CFLAGS+=-fvisibility=hidden
+
+ when ($MAPS_MOBILE_EXPORT_CPP_API) {
+ LDFLAGS+=-lc++_shared
+ CFLAGS+=-DZLIB_DLL
+ CFLAGS+=-DPROTOBUF_USE_DLLS -DLIBPROTOBUF_EXPORTS
+ CFLAGS+=-DPNG_IMPEXP=${YANDEX_EXPORT}
+ CFLAGS+=-DBOOST_ALL_DYN_LINK
+ CFLAGS+=-DBOOST_SYMBOL_EXPORT=${YANDEX_EXPORT}
+ DYNAMIC_BOOST=yes
+ }
+ otherwise {
+ STATIC_STL=yes
+ YANDEX_EXPORT=
+ CFLAGS+=-DBOOST_SYMBOL_EXPORT=
+ CFLAGS+=-DBOOST_SYMBOL_VISIBLE=
+ LDFLAGS+=-lc++_static -Wl,--exclude-libs,ALL -static-libstdc++
+ USE_GLOBAL_CMD=no
+ }
+
+ when ($EXPORT_ALL_SYMBOLS) {
+ CFLAGS+=-fvisibility=default
+ }
+
+ when ($NO_DEBUGINFO != "yes" && $REDUCED_DEBUGINFO) {
+ CFLAGS+=-g1
+ }
+
+ CFLAGS+=-DANDROID -fpic -ffunction-sections -funwind-tables -fstack-protector -no-canonical-prefixes -Wa,--noexecstack
+ CFLAGS+=-Qunused-arguments -Wno-unused-function -Wno-pessimizing-move -Wno-missing-field-initializers -Wno-missing-braces -Wno-unused-parameter -Wno-vexing-parse -Wno-sign-compare -Wno-deprecated-declarations
+
+ LDFLAGS+=-lc -lm -llog -Bsymbolic -Wl,-z,noexecstack -Qunused-arguments -Wl,-z,relro -Wl,-z,now -Wl,--no-undefined
+
+ when ($BT_RELEASE || $BT_RELWITHDEBINFO) {
+ CFLAGS+=-fomit-frame-pointer -fvisibility-inlines-hidden -ffunction-sections -fdata-sections
+ LDFLAGS+=-Wl,--gc-sections -Wl,--build-id
+ }
+
+ when ($ARCH_ARM7) {
+ CFLAGS+=-mfloat-abi=softfp
+ #Android clang overaligns some float types which causes NEON programs to fail on old Android versions. So we disable NEON.
+ #See https://github.com/android/ndk/issues/640 for more information
+ CFLAGS+=-mfpu=vfpv3-d16
+ }
+ elsewhen ($ARCH_ARM64) {
+ }
+ elsewhen ($ARCH_I386) {
+ CFLAGS+=-fstrict-aliasing -mstackrealign -DBOOST_CONTEXT_TLS_STACK_PROTECTOR
+ }
+ elsewhen ($ARCH_X86_64) {
+ CFLAGS+=-fstrict-aliasing -mstackrealign -march=x86-64 -msse4.2 -mpopcnt -m64 -DBOOST_CONTEXT_TLS_STACK_PROTECTOR
+ }
+ otherwise {
+ PEERDIR+=__unsupported_architecture_for_android__
+ }
+}
+when ($MAPSMOBI_BUILD_TARGET && $OS_DARWIN) {
+ QT_REQUIRED=yes
+ LDFLAGS+=-lc++
+ CFLAGS+=-DBOOST_SYMBOL_EXPORT=
+ CFLAGS+=-DBOOST_SYMBOL_VISIBLE=
+}
+when ($MAPSMOBI_BUILD_TARGET && $OS_IOS) {
+ CFLAGS+=-DIOS -stdlib=libc++ -fvisibility=hidden
+ CFLAGS+=-DBOOST_SYMBOL_EXPORT=
+ CFLAGS+=-DBOOST_SYMBOL_VISIBLE=
+ when ($MAPS_MOBILE_EXPORT_OBJC_API) {
+ YRT_EXPORT=__attribute__((visibility(\"default\")))
+ }
+ when(!$MAPS_MOBILE_PUBLIC_API || $OS_IOSSIM) {
+ CFLAGS+=-DBUILDING_WITH_VULKAN_IOS
+ BUILDING_WITH_VULKAN_IOS=yes
+ }
+}
+when ($MAPSMOBI_BUILD_TARGET && $OS_LINUX) {
+ when ($NO_GRAPHICS != "yes") {
+ QT_REQUIRED=yes
+ OPENGL_REQUIRED=yes
+ }
+ OS_SDK=ubuntu-16
+ PIC=yes
+ LDFLAGS+=-lstdc++ -lgcc_s
+ CFLAGS+=-DBOOST_SYMBOL_EXPORT=
+ CFLAGS+=-DBOOST_SYMBOL_VISIBLE=
+}
+when ($MAPSMOBI_BUILD_TARGET && $OS_YOCTO) {
+ QT_REQUIRED=yes
+ PIC=yes
+ CFLAGS+=-DBOOST_SYMBOL_EXPORT=
+ CFLAGS+=-DBOOST_SYMBOL_VISIBLE=
+}
diff --git a/build/conf/project_specific/maps/sproto.conf b/build/conf/project_specific/maps/sproto.conf
new file mode 100644
index 0000000000..1a62563fc1
--- /dev/null
+++ b/build/conf/project_specific/maps/sproto.conf
@@ -0,0 +1,21 @@
+### @usage: EXPORT_YMAPS_PROTO() # maps-specific
+###
+### Maps-specific .proto handling: IMPORT_YMAPS_PROTO() + maps protobuf namespace.
+macro EXPORT_YMAPS_PROTO() {
+ PROTO_NAMESPACE(GLOBAL maps/doc/proto)
+}
+
+macro _YMAPS_GENERATE_SPROTO_HEADER(File) {
+ .CMD=${cwd;rootdir;input:File} ${tool:"maps/libs/sproto/sprotoc"} -I=./$PROTO_NAMESPACE -I=$ARCADIA_ROOT/$PROTO_NAMESPACE -I=$ARCADIA_BUILD_ROOT -I=$PROTOBUF_PATH --sproto_out=$ARCADIA_BUILD_ROOT/$PROTO_NAMESPACE ${input;rootrel:File} ${output;hide;norel;nopath;noext:File.sproto.h} ${kv;hide:"p PB"} ${kv;hide:"pc yellow"}
+ .PEERDIR=maps/libs/sproto
+}
+
+### @usage: YMAPS_SPROTO(ProtoFiles...) # maps-specific
+###
+### Maps-specific .proto handling: generate .sproto.h files using maps/libs/sproto/sprotoc.
+macro YMAPS_SPROTO(FILES...) {
+ SET(PROTO_HEADER_EXTS .pb.h .sproto.h)
+ foreach (FILE : $FILES) {
+ [.proto]=$_YMAPS_GENERATE_SPROTO_HEADER($FILE)
+ }
+}
diff --git a/build/conf/project_specific/other.conf b/build/conf/project_specific/other.conf
new file mode 100644
index 0000000000..602ed5cfa3
--- /dev/null
+++ b/build/conf/project_specific/other.conf
@@ -0,0 +1,11 @@
+# Catboost
+BUILD_CATBOOST_SCRIPT=build/scripts/build_catboost.py
+### @usage: BUILD_CATBOOST(cbmodel cbname)
+###
+### Generate catboost model and access code.
+### cbmodel - CatBoost model file name (*.cmb).
+### cbname - name for a variable (of NCatboostCalcer::TCatboostCalcer type) to be available in CPP code.
+### CatBoost specific macro.
+macro BUILD_CATBOOST(CbModel, CbName) {
+ .CMD=$YMAKE_PYTHON ${input:BUILD_CATBOOST_SCRIPT} build_cb_f $ARCADIA_ROOT $ARCH_TOOL ${input:CbModel} $CbName ${output;chksum;pre=cb.:CbName.cpp} ${output;hide;pre=CB_External_;suf=.rodata:CbName} ${output_include;hide:"kernel/catboost/catboost_calcer.h"} ${kv;hide:"p CB"} ${kv;hide:"pc yellow"}
+}
diff --git a/build/conf/project_specific/uservices.conf b/build/conf/project_specific/uservices.conf
new file mode 100644
index 0000000000..ef57665635
--- /dev/null
+++ b/build/conf/project_specific/uservices.conf
@@ -0,0 +1,12 @@
+macro _MOVE(Src, OUT="", OUT_NOAUTO="", CPP_DEPS[], OUTPUT_INCLUDES[]) {
+ .CMD=$MOVE_FILE ${input:Src} ${output;norel:OUT} ${output;noauto;norel:OUT_NOAUTO} ${induced_deps=h+cpp;hide:CPP_DEPS} ${output_includes;hide:OUTPUT_INCLUDES} ${kv;hide:"p MV"} ${kv;hide:"pc light-cyan"}
+}
+
+macro USRV_BUILD(FROM="Please specify generated .tar-file as FROM", DEPS_FILE="NO_DEPS", Files...) {
+ .CMD=${tool:"taxi/uservices/arc-gen/unpack-tar"} --source ${input:FROM} --target ${BINDIR} --suffix .usrv ${Files} ${output;noauto;hide;suf=.usrv:Files} ${kv;hide:"p USB"} ${kv;hide:"pc light-cyan"}
+ _PROCESS_USRV_FILES(${DEPS_FILE} ${Files})
+}
+
+macro _PROCESS_USRV_FILES(DepsFile, Files...) {
+ SET_APPEND(_MAKEFILE_INCLUDE_LIKE_DEPS ${DepsFile})
+} \ No newline at end of file
diff --git a/build/conf/project_specific/yql_udf.conf b/build/conf/project_specific/yql_udf.conf
new file mode 100644
index 0000000000..91ca0a3362
--- /dev/null
+++ b/build/conf/project_specific/yql_udf.conf
@@ -0,0 +1,247 @@
+when ($SANITIZER_TYPE || $USE_ARCADIA_PYTHON == "no" || $UDF_NO_PROBE == "yes" || $MUSL == "yes" || $TIDY == "yes") {
+ YQL_UDF_LINK_CMD=$LINK_DYN_LIB
+ YQL_UDF_LINK_PRG_CMD=$LINK_EXEC_DYN_LIB
+}
+otherwise {
+ YQL_UDF_LINK_CMD=$LINK_DYN_LIB && ${tool:"yql/tools/udf_probe"} $TARGET ${kv;hide:"p UD"}
+ YQL_UDF_LINK_PRG_CMD=$LINK_EXEC_DYN_LIB && ${tool:"yql/tools/udf_probe"} $TARGET ${kv;hide:"p UD"}
+}
+
+### @usage: UDF_BASE(name [EXPORTS symlist_file] [PREFIX prefix]) #internal
+###
+### The base logic of all UDF extension modules (User-Defined Functions).
+### Processing EXPORTS and PREFIX is the same as for DLL.
+###
+### https://wiki.yandex-team.ru/robot/manual/kiwi/userguide/#polzovatelskiefunkciiudftriggerykwcalc
+module UDF_BASE: DLL_UNIT {
+ when ($MSVC != "yes" && $DARWIN != "yes") {
+ LDFLAGS+= -Wl,-Bsymbolic
+ }
+}
+
+UDF_NO_PROBE="no"
+### @usage: UDF_NO_PROBE()
+###
+### Disable UDF import check at build stage
+macro UDF_NO_PROBE() {
+ ENABLE(UDF_NO_PROBE)
+}
+
+### @usage: YQL_UDF_TEST([name])
+###
+### The module to test YQL C++ UDF.
+###
+### Documentation: https://yql.yandex-team.ru/docs/yt/libraries/testing/
+### Documentation about the Arcadia test system: https://wiki.yandex-team.ru/yatool/test/
+module YQL_UDF_TEST: PY3TEST_BIN {
+ PEERDIR(yql/library/udf_test)
+ PEERDIR(yt/python/client_lite)
+
+ DEPENDS(yql/tools/astdiff)
+ DEPENDS(yql/tools/udf_resolver)
+ DEPENDS(yql/tools/yqlrun)
+ DATA(arcadia/ydb/library/yql/mount)
+ DATA(arcadia/yql/cfg/tests)
+}
+
+### @usage: _ADD_YQL_UDF_DEPS()
+###
+### Add all needed PEERDIRs to a YQL_UDF.
+###
+### https://yql.yandex-team.ru/docs/yt/udf/cpp/
+macro _ADD_YQL_UDF_DEPS() {
+ PEERDIR(ydb/library/yql/public/udf)
+ PEERDIR(ydb/library/yql/public/udf/support)
+}
+
+### @usage: _MAKE_YQL_UDF()
+###
+### Make module definition an YQL UDF: add all needed dependencies, properties and flags
+###
+### https://yql.yandex-team.ru/docs/yt/udf/cpp/
+macro _MAKE_YQL_UDF() {
+ _ADD_YQL_UDF_DEPS()
+ SET_APPEND(USER_CXXFLAGS -DBUILD_UDF)
+ # For Windows using declspecs
+ DEFAULT(YQL_UDF_EXPORT ${ARCADIA_ROOT}/ydb/library/yql/public/udf/udfs_exports.exports)
+
+ when ($WINDOWS == "yes") {
+ YQL_UDF_EXPORT=
+ }
+
+ SET(EXPORTS_FILE $YQL_UDF_EXPORT)
+}
+
+### @usage: YQL_UDF_MODULE(name)
+###
+### The extension module for YQL with C++ UDF (User Defined Function YQL)
+###
+### https://yql.yandex-team.ru/docs/yt/udf/cpp/
+module YQL_UDF_MODULE: UDF_BASE {
+ .CMD=YQL_UDF_LINK_CMD
+ _MAKE_YQL_UDF()
+ PROVIDES(YqlServicePolicy)
+}
+
+module _YQL_UDF_PROGRAM_BASE: SO_PROGRAM {
+ .CMD=YQL_UDF_LINK_PRG_CMD
+ _MAKE_YQL_UDF()
+}
+
+UDF_SHARED_SEM=IGNORED
+
+### @usage: YQL_UDF(name)
+###
+### User-defined function for YQL
+###
+### Multimodule which is YQL_UDF_MODULE when built directly or referred by BUNDLE and DEPENDS macros.
+### If used by PEERDIRs it is usual static LIBRARY with default YQL dependencies, allowing code reuse between UDFs.
+###
+### @see: [YQL_UDF_MODULE()](#module_YQL_UDF_MODULE)
+multimodule YQL_UDF {
+ module YQL_UDF_SHARED: YQL_UDF_MODULE {
+ .SEM=UDF_SHARED_SEM
+ NO_CLANG_TIDY()
+ }
+ module YQL_UDF_STATIC: _DLL_COMPATIBLE_LIBRARY {
+ .ALIASES=SRCS=GLOBAL_SRCS
+ .SEM=CPP_LIBRARY_SEM
+ .GLOBAL_SEM=CPP_OBJ_LIBRARY_SEM
+ OBJ_SUF=.udfs
+ _ADD_YQL_UDF_DEPS()
+ # disable credits generation for static library
+ SET(CREDITS_FLAGS)
+ when ($MSVC == "yes" || $CYGWIN == "yes") {
+ MODULE_SUFFIX=.static.lib
+ }
+ }
+}
+
+### @usage: YQL_ABI_VERSION(major minor release))
+###
+### Specifying the supported ABI for YQL_UDF.
+###
+### @see: [YQL_UDF()](#multimodule_YQL_UDF)
+macro YQL_ABI_VERSION(Major, Minor, Patch) {
+ YQL_ABI_FLAGS=-DUDF_ABI_VERSION_MAJOR=$Major -DUDF_ABI_VERSION_MINOR=$Minor -DUDF_ABI_VERSION_PATCH=$Patch
+ SET_APPEND(USER_CXXFLAGS $YQL_ABI_FLAGS)
+}
+
+### @usage: YQL_LAST_ABI_VERSION()
+###
+### Use the last ABI for YQL_UDF
+###
+macro YQL_LAST_ABI_VERSION() {
+ YQL_ABI_FLAGS=-DUSE_CURRENT_UDF_ABI_VERSION
+ SET_APPEND(USER_CXXFLAGS $YQL_ABI_FLAGS)
+}
+
+### @usage: YQL_PYTHON_UDF(name)
+###
+### Definition of the extension module for YQL with Python 2.x UDF (User Defined Function for YQL).
+### Unlike YQL_UDF this is plain DLL module, so PEERDIRs to it are not allowed.
+###
+### https://yql.yandex-team.ru/docs/yt/udf/python/
+module YQL_PYTHON_UDF: YQL_UDF_MODULE {
+ .IGNORED=USE_PYTHON2
+ .RESTRICTED=PYTHON3_ADDINCL USE_PYTHON3 PYTHON2_ADDINCL
+
+ USE_PYTHON2()
+ _ARCADIA_PYTHON_ADDINCL()
+ PEERDIR(build/platform/python/ldflags)
+ PEERDIR(library/python/type_info)
+
+ DEFAULT(YQL_PYTHON_UDF_EXPORT ${ARCADIA_ROOT}/yql/udfs/common/python/python_udf/python_udfs_exports.exports)
+
+ when ($WINDOWS == "yes") {
+ YQL_PYTHON_UDF_EXPORT=
+ }
+
+ ### FIXME: XXX the statement below uncoditionally set EXPORTS_FILE (due to incorrect behaviour of old ConfReader
+ ###when ($USE_ARCADIA_PYTHON == "yes") SET(EXPORTS_FILE $YQL_PYTHON_UDF_EXPORT)
+ SET(EXPORTS_FILE $YQL_PYTHON_UDF_EXPORT)
+}
+
+### @usage: YQL_PYTHON_UDF_PROGRAM(name)
+###
+### Definition of the extension module for YQL with Python 2.x UDF (User Defined Function for YQL).
+### Unlike YQL_UDF this is plain DLL module, so PEERDIRs to it are not allowed.
+###
+### https://yql.yandex-team.ru/docs/yt/udf/python/
+module YQL_PYTHON_UDF_PROGRAM: _YQL_UDF_PROGRAM_BASE {
+ .IGNORED=USE_PYTHON2
+ .RESTRICTED=PYTHON3_ADDINCL USE_PYTHON3 PYTHON2_ADDINCL
+ USE_PYTHON2()
+ _ARCADIA_PYTHON_ADDINCL()
+ PEERDIR(build/platform/python/ldflags)
+ PEERDIR(library/python/type_info)
+
+ DEFAULT(YQL_PYTHON_UDF_EXPORT ${ARCADIA_ROOT}/yql/udfs/common/python/python_udf/python_udfs_exports.exports)
+
+ when ($WINDOWS == "yes") {
+ YQL_PYTHON_UDF_EXPORT=
+ }
+
+ ### FIXME: XXX the statement below uncoditionally set EXPORTS_FILE (due to incorrect behaviour of old ConfReader
+ ###when ($USE_ARCADIA_PYTHON == "yes") SET(EXPORTS_FILE $YQL_PYTHON_UDF_EXPORT)
+ SET(EXPORTS_FILE $YQL_PYTHON_UDF_EXPORT)
+}
+
+### @usage: YQL_PYTHON3_UDF(name)
+###
+### The extension module for YQL with Python 3.x UDF (User Defined Function for YQL).
+### Unlike YQL_UDF this is plain DLL module, so PEERDIRs to it are not allowed.
+###
+### Documentation: https://yql.yandex-team.ru/docs/yt/udf/python/
+module YQL_PYTHON3_UDF: YQL_UDF_MODULE {
+ .RESTRICTED=PYTHON2_ADDINCL PYTHON3_ADDINCL USE_PYTHON2 USE_PYTHON3
+ _ARCADIA_PYTHON3_ADDINCL()
+ PEERDIR(build/platform/python/ldflags)
+ PEERDIR(library/python/type_info)
+
+ DEFAULT(YQL_PYTHON_UDF_EXPORT ${ARCADIA_ROOT}/yql/udfs/common/python/python_udf/python_udfs_exports.exports)
+
+ when ($WINDOWS == "yes") {
+ YQL_PYTHON_UDF_EXPORT=
+ }
+
+ ### FIXME: XXX the statement below uncoditionally set EXPORTS_FILE (due to incorrect behaviour of old ConfReader
+ ###when ($USE_ARCADIA_PYTHON == "yes") SET(EXPORTS_FILE $YQL_PYTHON_UDF_EXPORT)
+ SET(EXPORTS_FILE $YQL_PYTHON_UDF_EXPORT)
+}
+
+macro _MAKE_YQL_PYTHON_UDF_TEST() {
+ PEERDIR(library/python/pytest)
+ DEPENDS(yql/tools/run_python_udf)
+ SETUP_PYTEST_BIN(RUNNER_BIN $(BUILD_ROOT)/yql/tools/run_python_udf/run_python_udf)
+}
+
+### @usage: YQL_PYTHON_UDF_TEST(name)
+###
+### The Python test for Python YQL UDF (Python User Defined Function for YQL). The code should be a proper YQL_PYTHON_UDF.
+###
+### This module will basically build itself as UDF and run as test using yql/tools/run_python_udf/run_python_udf tool.
+###
+### Documentation: https://yql.yandex-team.ru/docs/yt/udf/python/
+###
+### @example: https://a.yandex-team.ru/arc/trunk/arcadia/yql/udfs/test/simple/ya.make
+###
+### @see: [YQL_PYTHON_UDF()](#module_YQL_PYTHON_UDF)
+module YQL_PYTHON_UDF_TEST: YQL_PYTHON_UDF {
+ _MAKE_YQL_PYTHON_UDF_TEST()
+ SET_APPEND(_MAKEFILE_INCLUDE_LIKE_DEPS canondata/result.json)
+}
+
+### @usage: YQL_PYTHON3_UDF_TEST(name)
+###
+### The Python test for Python 3.x YQL UDF (User Defined Function for YQL). The code should be a proper YQL_PYTHON3_UDF.
+###
+### This module will basically build itself as UDF and run as test using yql/tools/run_python_udf/run_python_udf tool.
+###
+### Documentation: https://yql.yandex-team.ru/docs/yt/udf/python/
+###
+### @see: [YQL_PYTHON3_UDF()](#module_YQL_PYTHON3_UDF)
+module YQL_PYTHON3_UDF_TEST: YQL_PYTHON3_UDF {
+ _MAKE_YQL_PYTHON_UDF_TEST()
+ SET_APPEND(_MAKEFILE_INCLUDE_LIKE_DEPS canondata/result.json)
+}
diff --git a/build/conf/project_specific/yt.conf b/build/conf/project_specific/yt.conf
new file mode 100644
index 0000000000..5bd292108f
--- /dev/null
+++ b/build/conf/project_specific/yt.conf
@@ -0,0 +1,5 @@
+macro GENERATE_YT_RECORD(Yaml, OUTPUT_INCLUDES[]) {
+ .CMD=${tool:"yt/yt/tools/record_codegen"} --input ${input:Yaml} --output-root $ARCADIA_BUILD_ROOT --output-cpp ${output;norel;noext;suf=.record.cpp:Yaml} ${output;hide;norel;noext;suf=.record.h:Yaml} ${pre=--output-include :OUTPUT_INCLUDES} ${output_include;hide:OUTPUT_INCLUDES} ${output_include;hide:"yt/yt/client/table_client/record_codegen_deps.h"} ${kv;hide:"p RC"}
+ .SEM=find_package Python3 && add_custom_command OUTPUT ${output;norel;noext;suf=.record.cpp:Yaml} ${output;norel;noext;suf=.record.h:Yaml} DEPENDS ${input:Yaml} ${input:"yt/yt/tools/record_codegen/__main__.py"} COMMAND Python3::Interpreter ${input:"yt/yt/tools/record_codegen/__main__.py"} --input ${input:Yaml} --output-root $ARCADIA_BUILD_ROOT --output-cpp ${output;norel;noext;suf=.record.cpp:Yaml} ${pre=--output-include :OUTPUT_INCLUDES} ${output;hide;norel;noext;suf=.record.h:Yaml}
+ PEERDIR(yt/yt/client)
+}
diff --git a/build/conf/rules.conf b/build/conf/rules.conf
new file mode 100644
index 0000000000..44c14544cf
--- /dev/null
+++ b/build/conf/rules.conf
@@ -0,0 +1,74 @@
+when ($OPENSOURCE == "yes") {
+ PEERDIRS_RULES_PATH=
+}
+otherwise {
+ PEERDIRS_RULES_PATH=\
+ build/rules/junk.policy \
+ build/rules/go/contrib.policy \
+ build/rules/go/vendor.policy \
+ build/rules/base_layers.policy \
+ build/rules/contrib_deprecated.policy \
+ build/rules/contrib_python.policy \
+ build/rules/contrib_restricted.policy \
+ build/rules/contrib_deps.policy \
+ build/rules/library_deps.policy \
+ build/rules/library_deprecated.policy \
+ build/rules/passport.policy \
+ build/rules/yt.policy \
+ build/rules/catboost.policy \
+ build/rules/maps/maps.policy \
+ build/rules/taxi.policy \
+ build/rules/yp.policy \
+ build/rules/alice.policy \
+ build/rules/kikimr.policy \
+ build/rules/market.policy \
+ build/rules/yadi.policy
+}
+
+CHECK_INTERNAL=yes
+INTERNAL_EXCEPTIONS=\
+ contrib \
+ search/begemot/rules/internal \
+ mssngr/router/lib/protos/internal \
+ mssngr/router/lib/registry/method/internal \
+ cv/imageproc/ocr/api/mobile_c/internal \
+ kernel/ugc/security/lib/internal \
+ maps/mobile/libs/mapkit/internal
+
+_BLACKLISTS=
+when ($DISABLE_BLACKLIST == "yes" || $OPENSOURCE == "yes") {
+ _BLACKLISTS=
+}
+elsewhen ($CUSTOM_BLACKLIST != "") {
+ _BLACKLISTS=$CUSTOM_BLACKLIST
+}
+elsewhen ($AUTOCHECK == "yes" || $TEST_BLACKLIST_AUTOCHECK == "yes") {
+ _BLACKLISTS+=build/rules/autocheck.blacklist
+}
+otherwise {
+ _BLACKLISTS+=build/rules/local.blacklist
+}
+
+_ISOLATED_PROJECTS=
+when ($DISABLE_ISOLATED_PROJECTS == "yes" || $OPENSOURCE == "yes") {
+ _ISOLATED_PROJECTS=
+}
+elsewhen ($CUSTOM_ISOLATED_PROJECTS != "") {
+ _ISOLATED_PROJECTS=$CUSTOM_ISOLATED_PROJECTS
+}
+elsewhen ($AUTOCHECK == "yes" || $TEST_ISOLATED_PROJECTS_AUTOCHECK == "yes") {
+## The block below is parsed by CI machinery to limit CI checks
+## Please contact CI on any modification! Do not alter the block structure!
+## - Keep one file per line with first line without file
+## - Keep comments text and layout intact
+## - Do not move or rename this file without CI team aggreement
+## BEGIN AUTOCHECK ISOLATED PROJECTS -- DO NOT EDIT COMMENT AND KEEP THE CODE STRUCTURE!
+ _ISOLATED_PROJECTS=\
+ build/rules/autocheck.isolated_projects \
+ build/rules/taxi_backend_py3/taxi_backend_py3.isolated_projects \
+ build/rules/taxi_uservices/taxi_uservices.isolated_projects
+## END AUTOCHECK ISOLATED PROJECTS -- DO NOT EDIT COMMENT AND KEEP THE CODE STRUCTURE!
+}
+otherwise {
+ _ISOLATED_PROJECTS+=build/rules/local.isolated_projects
+}
diff --git a/build/conf/settings.conf b/build/conf/settings.conf
new file mode 100644
index 0000000000..3f1a5fe69c
--- /dev/null
+++ b/build/conf/settings.conf
@@ -0,0 +1,102 @@
+GLOBAL_SRCS_IN_RESULTS=yes
+JSON_CACHE_IS_ATTACHED=yes
+USE_ADDINCL_WITHOUT_FOR_AS_ADDINCL_FOR_C=yes
+LANGS_REQUIRE_BUILD_AND_SRC_ROOTS=c asm cython proto flatc swig ydl nlg
+CHECK_GO_INCORRECT_DEPS=yes
+REPORT_RECURSE_NO_YAMAKE=yes
+USE_PREBUILT_TOOLS=yes
+RESOLVE_OUTPUT_INCLUDES_AS_INCLUDES=yes
+CHKPEERS_GLOBAL_SRCS=yes
+
+# NOTE! Only foldable vars should be listed here
+_FOLDABLE_VARS=\
+ CL_WRAPPER \
+ END_WHOLE_ARCHIVE_VALUE \
+ JDK_LATEST_VERSION \
+ LD_SDK_VERSION \
+ LD_STRIP_FLAG \
+ LIB_WRAPPER \
+ LINK_EXE_FLAGS_DEBUG \
+ LINK_EXE_FLAGS_RELEASE \
+ LINK_IMPLIB \
+ LINK_LIB_FLAGS \
+ LINK_STDLIBS \
+ LINK_WRAPPER \
+ LINK_WRAPPER_DYNLIB \
+ ML_WRAPPER \
+ START_WHOLE_ARCHIVE_VALUE \
+ _CFLAGS_ARCH_I386 \
+ _CFLAGS_UCRT_VC_INCLUDES \
+ _COMPILER_TIME_TRACE_FLAGS \
+ _COMPILER_TIME_TRACE_GRANULARITY \
+ _COMPILER_TIME_TRACE_POSTPROCESS \
+ _CPP_ARGS \
+ _CROSS_SUFFIX \
+ _CXX_DEFINES \
+ _CXX_FLAGS \
+ _CXX_STD \
+ _C_ARGS \
+ _C_CPP_KV_STYLE \
+ _C_FLAGS \
+ _C_FOPTIONS \
+ _C_SYSTEM_LIBRARIES \
+ _DEBUG_INFO_FLAGS \
+ _END_GROUP \
+ _EXEC_SHARED_FLAG \
+ _EXE_FLAGS \
+ _FLAGS_COMMON \
+ _FLAGS_COMMON_DEBUG \
+ _FLAGS_COMMON_IDE_MSVS \
+ _FLAGS_COMMON_LIBPATHS \
+ _FLAGS_DEBUG_ONLY \
+ _FLAGS_DEBUG_ONLY_CLANG_CL \
+ _FLAGS_DEBUG_ONLY_DEBUG \
+ _FLAGS_DEBUG_RUNTIME \
+ _FLAGS_IGNORE \
+ _FLAGS_MACHINE \
+ _FLAGS_RELEASE_ONLY \
+ _FLAGS_RELEASE_ONLY_DEBUG \
+ _FLAGS_RELEASE_RUNTIME \
+ _LD_ARCHIVER \
+ _LD_ARCH_FLAG \
+ _LD_AR_PLUGIN \
+ _LD_DCE_FLAG_GC_SECTIONS \
+ _LD_DCE_FLAG_PRINT_SECTIONS \
+ _LD_ENV_STYLE \
+ _LD_FLAGS \
+ _LD_ICF_FLAG \
+ _LD_ICF_FLAG_PRINT_SECTIONS \
+ _LD_LIB_GENERATE_MF \
+ _LD_LINKER_OUTPUT\
+ _LD_LINKER_OUTPUT_FLAG \
+ _LD_LINK_FAT_PREFIX \
+ _LD_LINK_FAT_SRCS_GLOBALS_NO_WA \
+ _LD_LINK_FAT_SRCS_GLOBALS_WA \
+ _LD_LINK_FAT_SUFFIX1 \
+ _LD_LINK_FAT_SUFFIX2 \
+ _LD_LLVM_AR_FORMAT \
+ _LD_SRCS_GLOBALS \
+ _LD_SYS_LIB \
+ _LD_TAIL_LINK_LIB \
+ _LD_THREAD_LIBRARY \
+ _LD_USE_STDLIB \
+ _LINKER_TIME_TRACE_FLAG \
+ _LINKER_TIME_TRACE_GRANULARITY \
+ _LINK_EXTRA_OUTPUT \
+ _MASM_IO \
+ _MSVC_ARCH \
+ _MSVC_FLAGS \
+ _MSVC_HEAD_LINK_LIB \
+ _MSVC_SRCS_GLOBALS \
+ _MSVC_TAIL_LINK_LIB \
+ _MSVC_TC_KIT_LIBS \
+ _MSVC_TC_VC_ROOT \
+ _OPTIMIZE_RELEASE \
+ _SFDL_FLAGS \
+ _SHARED_FLAG \
+ _SONAME_FLAG \
+ _SONAME_OPTION \
+ _START_GROUP \
+ _STD_CXX \
+
+# end of _FOLDABLE_VARS list
diff --git a/build/conf/sysincl.conf b/build/conf/sysincl.conf
new file mode 100644
index 0000000000..6356dbd36a
--- /dev/null
+++ b/build/conf/sysincl.conf
@@ -0,0 +1,74 @@
+SYSINCL=
+SYSINCL+=build/sysincl/macro.yml
+SYSINCL+=build/sysincl/libc-to-compat.yml
+SYSINCL+=build/sysincl/libc-to-nothing.yml
+SYSINCL+=build/sysincl/stl-to-nothing.yml
+SYSINCL+=build/sysincl/linux.yml
+SYSINCL+=build/sysincl/windows.yml
+SYSINCL+=build/sysincl/darwin.yml
+SYSINCL+=build/sysincl/intrinsic.yml
+SYSINCL+=build/sysincl/nvidia.yml
+SYSINCL+=build/sysincl/misc.yml
+SYSINCL+=build/sysincl/unsorted.yml
+
+when ($USE_LOCAL_SWIG == "yes") {
+ SYSINCL+=build/sysincl/swig-to-nothing.yml
+}
+otherwise {
+ SYSINCL+=build/sysincl/swig.yml
+}
+
+when ($USE_SYSTEM_JDK) {
+ SYSINCL+=build/sysincl/system-jdk.yml
+}
+
+when ($OPENSOURCE == "yes") {
+ SYSINCL += build/sysincl/opensource.yml
+}
+otherwise {
+ SYSINCL+=build/yandex_specific/sysincl/speechkit.yml
+ SYSINCL+=build/yandex_specific/sysincl/sophos.yml
+ SYSINCL+=build/yandex_specific/sysincl/misc.yml
+ SYSINCL+=build/yandex_specific/sysincl/taxi.yml
+}
+
+when ($MUSL == "yes") {
+ SYSINCL+=build/sysincl/libc-to-musl.yml
+ SYSINCL+=build/sysincl/linux-musl.yml
+}
+
+when ($OS_WINDOWS == "yes") {
+ SYSINCL+=build/sysincl/misc-win.yml
+ when ($OPENSOURCE !="yes") {
+ SYSINCL+=build/yandex_specific/sysincl/misc-win.yml
+ }
+}
+
+when ($OS_ANDROID == "yes") {
+ SYSINCL+=build/sysincl/android.yml
+}
+
+when ($OS_LINUX != "yes") {
+ SYSINCL+=build/sysincl/linux-headers.yml
+}
+
+when ($OS_LINUX != "yes" || $CATBOOST_OPENSOURCE == "yes") {
+ SYSINCL+=build/sysincl/ibdrv.yml
+}
+
+when ($WITH_VALGRIND == "yes") {
+ SYSINCL+=build/sysincl/valgrind.yml
+}
+
+when ($OS_LINUX == "yes" && $OS_SDK == "ubuntu-12") {
+ SYSINCL+=build/sysincl/linux-ubuntu-12.yml
+}
+
+when ($ARCH_NDS32) {
+ SYSINCL+=build/sysincl/nds32.yml
+}
+
+when ($ARCH_RISCV32) {
+ SYSINCL+=build/sysincl/newlib.yml
+ SYSINCL+=build/sysincl/esp-idf.yml
+}
diff --git a/build/conf/toolchains/gnu_toolchain.conf b/build/conf/toolchains/gnu_toolchain.conf
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/build/conf/toolchains/gnu_toolchain.conf
diff --git a/build/conf/toolchains/msvc_toolchain.conf b/build/conf/toolchains/msvc_toolchain.conf
new file mode 100644
index 0000000000..6b4d6b5c45
--- /dev/null
+++ b/build/conf/toolchains/msvc_toolchain.conf
@@ -0,0 +1,7 @@
+# TODO(somov): Заглушка для тех мест, где C_FLAGS_PLATFORM используется
+# для любых платформ. Нужно унифицировать с GnuToolchain.
+C_FLAGS_PLATFORM=
+
+when ($_UNDER_WINE == "yes") {
+ WINE_ENV=${env:"WINEPREFIX_SUFFIX=4.0"}
+}
diff --git a/build/conf/ts.conf b/build/conf/ts.conf
new file mode 100644
index 0000000000..b00a186609
--- /dev/null
+++ b/build/conf/ts.conf
@@ -0,0 +1,319 @@
+NODEJS_ROOT=$NODEJS_RESOURCE_GLOBAL
+NODEJS_BIN=$NODEJS_ROOT/node
+PNPM_ROOT=$PNPM_RESOURCE_GLOBAL
+PNPM_SCRIPT=$PNPM_ROOT/node_modules/pnpm/dist/pnpm.cjs
+
+NOTS_TOOL=${tool:"devtools/frontend_build_platform/nots/builder"}
+NOTS_TOOL_CURDIR=$CURDIR
+NOTS_TOOL_BINDIR=$BINDIR
+NOTS_TOOL_BASE_ARGS=--build-root $ARCADIA_BUILD_ROOT --bindir $NOTS_TOOL_BINDIR --curdir $NOTS_TOOL_CURDIR --nodejs-bin $NODEJS_BIN
+NOTS_TOOL_NODE_MODULES_BUNDLE=$BINDIR/$NODE_MODULES_BUNDLE
+# Base path for pluggable modules.
+NOTS_PLUGINS_PATH=devtools/frontend_build_platform/nots/toolchain_plugins
+
+#
+# npm contribs
+#
+
+NPM_CONTRIBS_PATH=build/platform/yandex_specific/ts/contribs
+
+### @usage: NPM_CONTRIBS() # internal
+###
+### Defines special module that provides contrib tarballs from internal npm registry.
+### Should be used only with `NODE_MODULES` macro.
+###
+### @see [FROM_NPM_LOCKFILES()](#macro_FROM_NPM_LOCKFILES)
+### @see [NODE_MODULES()](#macro_NODE_MODULES)
+module NPM_CONTRIBS: _BASE_UNIT {
+ .CMD=TOUCH_UNIT
+ .PEERDIR_POLICY=as_build_from
+ .FINAL_TARGET=no
+ .ALLOWED=FROM_NPM_LOCKFILES
+ .RESTRICTED=PEERDIR
+
+ SET(MODULE_TAG NPM_CONTRIBS)
+
+ MODULE_SUFFIX=.fake
+
+ _BARE_MODULE()
+}
+
+### @usage: FROM_NPM_LOCKFILES(LOCKFILES...) # internal
+###
+### Defines lockfile list for `NPM_CONTRIBS` module.
+###
+### @see [NPM_CONTRIBS()](#module_NPM_CONTRIBS)
+macro FROM_NPM_LOCKFILES(LOCKFILES...) {
+ SET_APPEND(_MAKEFILE_INCLUDE_LIKE_DEPS $LOCKFILES)
+ # See implementation in build/plugins/nots.py
+ _FROM_NPM_LOCKFILES($LOCKFILES)
+}
+
+### @usage: FROM_NPM(NAME VERSION SKY_ID INTEGRITY INTEGRITY_ALGO TARBALL_PATH)
+macro FROM_NPM(NAME, VERSION, SKY_ID, INTEGRITY, INTEGRITY_ALGO, TARBALL_PATH) {
+ .CMD=${cwd:BINDIR} $YMAKE_PYTHON ${input:"build/scripts/fetch_from_npm.py"} ${input;hide:"build/scripts/fetch_from.py"} ${input;hide:"build/scripts/sky.py"} --name $NAME --version $VERSION --sky-id $SKY_ID --integrity $INTEGRITY --integrity-algorithm $INTEGRITY_ALGO --copy-to ${output:TARBALL_PATH} ${requirements;hide:"network:full"} ${kv;hide:"p NP"} ${kv;hide:"pc yellow"}
+}
+
+#
+# node_modules
+#
+
+NODE_MODULES_BUNDLE=node_modules.tar
+NODE_MODULES_BUNDLE_AS_OUTPUT=
+
+### @usage: NODE_MODULES()
+###
+### Materializes `node_modules.tar` bundle according to the module's lockfile.
+###
+### @see [NPM_CONTRIBS()](#module_NPM_CONTRIBS)
+macro NODE_MODULES() {
+ # See implementation in build/plugins/nots.py
+}
+
+macro _NODE_MODULES(IN{input}[], OUT{output}[]) {
+ PEERDIR($NPM_CONTRIBS_PATH)
+ SET(NODE_MODULES_BUNDLE_AS_OUTPUT \${output;hide:"workspace_node_modules.tar"})
+
+ .CMD=${cwd:BINDIR} $NOTS_TOOL create-node-modules $NOTS_TOOL_BASE_ARGS --pnpm-script $PNPM_SCRIPT --contribs $NPM_CONTRIBS_PATH ${input;hide:IN} ${output;hide:OUT} ${kv;hide:"p NM"} ${kv;hide:"pc yellow"}
+}
+
+#
+# TS library
+#
+
+module _TS_BASE_UNIT: _BASE_UNIT {
+ .PEERDIR_POLICY=as_build_from
+ .FINAL_TARGET=yes
+
+ SET(MODULE_TYPE LIBRARY)
+ SET(MODULE_TAG TS)
+ SET(PEERDIR_TAGS TS NPM_CONTRIBS)
+
+ PEERDIR(build/platform/nodejs)
+ PEERDIR(build/external_resources/pnpm)
+ PEERDIR(build/external_resources/typescript)
+ PEERDIR(build/external_resources/eslint)
+
+ MODULE_SUFFIX=.fake
+
+ _BARE_MODULE()
+}
+
+TSC_ROOT=$TYPESCRIPT_RESOURCE_GLOBAL/node_modules
+TS_CONFIG_PATH=tsconfig.json
+TS_COMPILE_TYPINGS=
+TS_COMPILE_PLUGINS=
+TS_COMPILE=$TOUCH_UNIT \
+ && ${cwd:BINDIR} $NOTS_TOOL compile-ts $NOTS_TOOL_BASE_ARGS --tsc-resource $TSC_ROOT \
+ --ts-config ${input:TS_CONFIG_PATH} --node-modules-bundle $NOTS_TOOL_NODE_MODULES_BUNDLE \
+ --typings $TS_COMPILE_TYPINGS --plugins $TS_COMPILE_PLUGINS $NODE_MODULES_BUNDLE_AS_OUTPUT \
+ ${hide:PEERS} ${input;hide:"./package.json"} ${TS_CONFIG_FILES} \
+ ${output;hide:"package.json"} ${output;hide:TS_COMPILE_OUTPUT} ${kv;hide:"p FE"} ${kv;hide:"pc yellow"}
+
+module _TS_BASE_LIBRARY : _TS_BASE_UNIT {
+ .CMD=TS_COMPILE
+
+ SET_APPEND(_MAKEFILE_INCLUDE_LIKE_DEPS ${CURDIR}/${TS_CONFIG_PATH} ${CURDIR}/package.json)
+ SET(TS_CONFIG_DEDUCE_OUT yes)
+
+ _TS_CONFIGURE($TS_CONFIG_PATH)
+}
+
+### @usage: TS_LIBRARY([name])
+###
+### The TypeScript/JavaScript library module, compiles TypeScript sources to JavaScript.
+### Build results are JavaScript files, typings and source mappings (depending on local tsconfig.json settings).
+###
+### @see [NODE_MODULES()](#macro_NODE_MODULES)
+### @example
+###
+### TS_LIBRARY()
+### SRCS(src/index.ts)
+### NODE_MODULES()
+### END()
+###
+module TS_LIBRARY : _TS_BASE_LIBRARY {
+ .EPILOGUE=_TS_LIBRARY_EPILOGUE
+}
+
+#
+# TS bundle
+#
+
+WEBPACK_ROOT=$WEBPACK_RESOURCE_GLOBAL/node_modules
+WEBPACK_CONFIG_PATH=webpack.config.js
+TS_BUNDLE_WEBPACK=$TOUCH_UNIT \
+ && ${cwd:BINDIR} $NOTS_TOOL bundle-webpack $NOTS_TOOL_BASE_ARGS --webpack-resource $WEBPACK_ROOT \
+ --webpack-config ${input:WEBPACK_CONFIG_PATH} --ts-config ${input:TS_CONFIG_PATH} \
+ --node-modules-bundle $NOTS_TOOL_NODE_MODULES_BUNDLE $NODE_MODULES_BUNDLE_AS_OUTPUT ${hide:PEERS} \
+ ${input;hide:"./package.json"} ${TS_CONFIG_FILES} ${output;hide:"bundle.tar"} \
+ ${output;hide:"package.json"} ${kv;hide:"p FE"} ${kv;hide:"pc yellow"}
+
+### @usage: TS_BUNDLE([name])
+###
+### The Webpack bundle, bundles JavaScript code.
+### Build results are bundle.tar, typings and source mappings (depending on local tsconfig.json settings).
+###
+### @see [NODE_MODULES()](#macro_NODE_MODULES)
+### @example
+###
+### TS_BUNDLE()
+### SRCS(src/index.ts)
+### NODE_MODULES()
+### END()
+###
+module TS_BUNDLE : _TS_BASE_UNIT {
+ .CMD=TS_BUNDLE_WEBPACK
+
+ PEERDIR(build/external_resources/webpack)
+ SET_APPEND(_MAKEFILE_INCLUDE_LIKE_DEPS ${CURDIR}/${TS_CONFIG_PATH} ${CURDIR}/package.json)
+ SET(TS_CONFIG_DEDUCE_OUT no)
+ SRCS(${CURDIR}/${WEBPACK_CONFIG_PATH})
+
+ _TS_CONFIGURE($TS_CONFIG_PATH)
+}
+
+#
+# TS NextJS
+#
+_NEXTJS_SRC_FILES=
+
+macro _NEXTJS_EPILOG() {
+ _GLOB(_NEXTJS_SRC_FILES ${CURDIR}/src/pages/**/* ${CURDIR}/pages/**/* ${CURDIR}/src/app/**/* ${CURDIR}/app/**/* ${CURDIR}/public/**/*)
+ SRCS($_NEXTJS_SRC_FILES)
+}
+
+NEXTJS_ROOT=$NEXTJS_RESOURCE_GLOBAL/node_modules
+NEXTJS_CONFIG_PATH=next.config.js
+TS_NEXTJS_BUILD=$TOUCH_UNIT \
+ && ${cwd:BINDIR} $NOTS_TOOL build-nextjs $NOTS_TOOL_BASE_ARGS \
+ --nextjs-resource $NEXTJS_ROOT \
+ --nextjs-config ${input:NEXTJS_CONFIG_PATH} --ts-config ${input:TS_CONFIG_PATH} \
+ --node-modules-bundle $NOTS_TOOL_NODE_MODULES_BUNDLE $NODE_MODULES_BUNDLE_AS_OUTPUT ${hide:PEERS} \
+ ${input;hide:"./package.json"} ${TS_CONFIG_FILES} ${output;hide:"bundle.tar"} \
+ ${output;hide:"package.json"} ${kv;hide:"p FE"} ${kv;hide:"pc yellow"}
+
+### @usage: TS_NEXTJS()
+###
+### NextJS app, built with `next build`. Requires sources to be under /src folder.
+### /pages and /app on the root level ar not supported.
+### Build results are bundle.tar.
+###
+### @see [NODE_MODULES()](#macro_NODE_MODULES)
+### @example
+###
+### TS_NEXTJS()
+### NODE_MODULES()
+### END()
+###
+module TS_NEXTJS : _TS_BASE_UNIT {
+ .CMD=TS_NEXTJS_BUILD
+ .EPILOGUE=_NEXTJS_EPILOG
+
+ SET_APPEND(_MAKEFILE_INCLUDE_LIKE_DEPS ${CURDIR}/${TS_CONFIG_PATH} ${CURDIR}/package.json)
+ SET(TS_CONFIG_DEDUCE_OUT no)
+
+ _TS_CONFIGURE($TS_CONFIG_PATH)
+}
+
+
+#
+# TS library testing
+#
+
+JEST_CONFIG_PATH=jest.config.js
+JEST_TEST_EXTENSION=test.(ts|tsx|js|jsx)
+JEST_EXTRA_SRCS_MASK=/**/__mocks__/*
+
+HERMIONE_CONFIG_PATH=.hermione.conf.js
+HERMIONE_TEST_EXTENSION=hermione.(ts|js)
+HERMIONE_EXTRA_SRCS_MASK=
+
+TS_TEST_RUNNER=jest
+TS_TEST_CONFIG_PATH_VAR=
+TS_TEST_EXTENSION=
+TS_TEST_EXTRA_SRCS_MASK=
+
+# tag:test
+_TS_TEST_SRCS_VALUE=
+_TS_TEST_EXTRA_SRCS_VALUE=
+### @usage: TS_TEST_SRCS(DIRS...)
+###
+### Macro to define directories where the test source files should be located.
+###
+### - DIRS... - directories.
+macro TS_TEST_SRCS(DIRS...) {
+ _GLOB(_TS_TEST_SRCS_VALUE ${suf=/**/*.$TS_TEST_EXTENSION:DIRS})
+ SRCS($_TS_TEST_SRCS_VALUE)
+
+ _GLOB(_TS_TEST_EXTRA_SRCS_VALUE ${suf=$TS_TEST_EXTRA_SRCS_MASK:DIRS})
+ SRCS($_TS_TEST_EXTRA_SRCS_VALUE)
+}
+
+# tag:test
+_TS_TEST_DATA_VALUE=
+_TS_TEST_DATA_DIRS_RENAME_VALUE=
+### @usage: TS_TEST_DATA([RENAME] GLOBS...)
+###
+### Macro to add tests data (i.e. snapshots) used in testing to a bindir from curdir.
+### Creates symbolic links to directories of files found by the specified globs.
+###
+### Parameters:
+### - RENAME - adds ability to rename paths for tests data from curdir to bindir.
+### For example if your tested module located on "module" path and tests data in "module/tests_data".
+### Then you can be able to rename "tests_data" folder to something else - `RENAME tests_data:example`.
+### As a result in your bindir will be created folder - "module/example" which is a symbolic link on "module/tests_data" in curdir.
+### It is possible to specify multiple renaming rules in the following format "dir1:dir2;dir3/foo:dir4/bar", where "dir1" and "dir3" folders in curdir.
+### - GLOBS... - globs to tests data files, symbolic links will be created to their folders. For example - "tests_data/**/*".
+macro TS_TEST_DATA(RENAME="", GLOBS...) {
+ _GLOB(_TS_TEST_DATA_VALUE $GLOBS)
+ SET(_TS_TEST_DATA_DIRS_RENAME_VALUE $RENAME)
+}
+
+# tag:test
+ESLINT_CONFIG_NAME=.eslintrc.js
+_TS_LINT_SRCS_VALUE=
+### _TS_LIBRARY_EPILOGUE() # internal
+###
+### This macro executes macros which should be invoked after all user specified macros in the ya.make file
+macro _TS_LIBRARY_EPILOGUE() {
+ _GLOB(_TS_LINT_SRCS_VALUE ${CURDIR}/**/*.(ts|tsx) EXCLUDE **/node_modules/**/*.(ts|tsx))
+}
+
+# tag:test
+### @usage: TS_TEST()
+###
+### @see [TS_TEST_SRCS()](#macro_TS_TEST_SRCS)
+### @see [TS_TEST_DATA()](#macro_TS_TEST_DATA)
+module TS_TEST: _TS_BASE_LIBRARY {
+ .CMD=TS_COMPILE
+ # Disable `SRCS` macro in "parent" module (sources will be added by `TS_TEST_SRCS`).
+ .ALIASES=SRCS=_NOOP_MACRO
+
+ # Use "parent's" CURDIR/BINDIR since TS_TEST borrows sources from parent module.
+ SET(TEST_FOR_BINDIR $ARCADIA_BUILD_ROOT/$TS_TEST_FOR_PATH)
+ SET(TEST_FOR_CURDIR $ARCADIA_ROOT/$TS_TEST_FOR_PATH)
+ SET(NOTS_TOOL_CURDIR $TEST_FOR_CURDIR)
+ SET(NOTS_TOOL_NODE_MODULES_BUNDLE $TEST_FOR_BINDIR/$NODE_MODULES_BUNDLE)
+
+ PEERDIR(build/external_resources/$TS_TEST_RUNNER)
+ # PEERDIR can't be conditional.
+ PEERDIR($NOTS_PLUGINS_PATH/jest)
+ PEERDIR($NOTS_PLUGINS_PATH/typescript)
+ SET(TS_COMPILE_PLUGINS $ARCADIA_BUILD_ROOT/$NOTS_PLUGINS_PATH/typescript/build/hoist-jest-mocks.js)
+
+ when ($TS_TEST_RUNNER == "jest") {
+ TS_TEST_CONFIG_PATH_VAR=JEST_CONFIG_PATH
+ TS_TEST_EXTENSION=$JEST_TEST_EXTENSION
+ TS_TEST_EXTRA_SRCS_MASK=$JEST_EXTRA_SRCS_MASK
+ TS_COMPILE_TYPINGS+=@types/jest:$JEST_RESOURCE_GLOBAL/node_modules/@types/jest
+ }
+ when ($TS_TEST_RUNNER == "hermione") {
+ TS_TEST_CONFIG_PATH_VAR=HERMIONE_CONFIG_PATH
+ TS_TEST_EXTENSION=$HERMIONE_TEST_EXTENSION
+ TS_TEST_EXTRA_SRCS_MASK=$HERMIONE_EXTRA_SRCS_MASK
+ TS_COMPILE_TYPINGS+=@types/hermione:$HERMIONE_RESOURCE_GLOBAL/node_modules/hermione/typings
+ }
+
+ _TS_TEST_CONFIGURE()
+}