go.conf 35 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018
  1. # tag:go-specific
  2. ### @usage: COLLECT_GO_SWAGGER_FILES(Varname, Dir)
  3. ###
  4. ### Recursively collect files for swagger config creation
  5. macro COLLECT_GO_SWAGGER_FILES(Varname, Dir) {
  6. _GLOB($Varname $Dir/**/*.go ${ARCADIA_ROOT}/go.mod)
  7. }
  8. # tag:go-specific
  9. GO_HOST_OS=unknown
  10. when ($HOST_OS_LINUX) {
  11. GO_HOST_OS=linux
  12. }
  13. elsewhen ($HOST_OS_DARWIN) {
  14. GO_HOST_OS=darwin
  15. }
  16. elsewhen($HOST_OS_WINDOWS) {
  17. GO_HOST_OS=windows
  18. }
  19. # tag:go-specific
  20. GO_HOST_ARCH=unknown
  21. when ($HOST_ARCH_X86_64) {
  22. GO_HOST_ARCH=amd64
  23. }
  24. elsewhen($HOST_ARCH_ARM64) {
  25. GO_HOST_ARCH=arm64
  26. }
  27. # tag:go-specific
  28. GO_TARG_OS=unknown
  29. when ($OS_LINUX) {
  30. GO_TARG_OS=linux
  31. }
  32. elsewhen ($OS_DARWIN) {
  33. GO_TARG_OS=darwin
  34. }
  35. elsewhen ($OS_WINDOWS) {
  36. GO_TARG_OS=windows
  37. }
  38. # tag:go-specific
  39. GO_TARG_ARCH=unknwon
  40. when ($ARCH_X86_64) {
  41. GO_TARG_ARCH=amd64
  42. }
  43. elsewhen ($ARCH_I386) {
  44. GO_TARG_ARCH=x86
  45. }
  46. elsewhen ($ARCH_ARM64) {
  47. GO_TARG_ARCH=arm64
  48. }
  49. # tag:go-specific
  50. GO_HOST_TARG_PARAMS=++host-os $GO_HOST_OS ++host-arch $GO_HOST_ARCH ++targ-os $GO_TARG_OS ++targ-arch $GO_TARG_ARCH
  51. # tag:go-specific
  52. GOSTD_VERSION=1.20
  53. when ($GOSTD_VERSION == "1.20") {
  54. GOSTD=contrib/go/_std_1.20/src
  55. }
  56. otherwise {
  57. GOSTD=__unsupported_go_std_library_version_[$GOSTD_VERSION]__
  58. }
  59. # tag:go-specific
  60. GO_DEBUG_PATH_RELATIVE=no
  61. _GO_DEBUG_PATH__NO_UID__=
  62. _GO_COMPILE_SYMABIS_TRIMPATH__NO_UID__=
  63. # tag:go-specific
  64. _GO_BUILDMODE=
  65. _GO_IMPORT_PATH=${MODDIR}
  66. # tag:go-specific
  67. GO_VET=yolint
  68. GO_VET_TOOL=
  69. GO_VET_FLAGS=
  70. GO_VET_EXTRA_FLAGS=
  71. # tag:go-specific
  72. _GO_VET_ADD_CHECK=yes
  73. _GO_FMT_ADD_CHECK=yes
  74. _GO_YDX_FILE=
  75. # tag:go-specific
  76. _GO_CGO1_WRAPPER_FLAGS=--build-prefix=/-B --source-prefix=/-S
  77. _GO_LINK_EXE_EXT_CMD=
  78. # tag:go-specific
  79. GO_WITH_MUSL=
  80. # tag:go-specific
  81. GO_TOOLS_ROOT=${GO_TOOLS_RESOURCE_GLOBAL}
  82. GO_TEST_MINER=${tool:"tools/go_test_miner"}
  83. GO_TEST_IMPORT_PATH=
  84. # tag:go-specific
  85. GO_STD_LIB_PREFIX=${GOSTD}/
  86. GO_STD_CMD_PREFIX=${GOSTD}/cmd/
  87. GO_ARCADIA_PROJECT_PREFIX=a.yandex-team.ru/
  88. GO_CONTRIB_PROJECT_PREFIX=vendor/
  89. GO_SKIP_IMPORTS=unsafe C
  90. GO_VET_INFO_EXT=.vet.out
  91. GO_VET_REPORT_EXT=.vet.txt
  92. GO_VET_OUTPUT_INFO=${output;rootrel;hide;pre=${MODULE_PREFIX};suf=${MODULE_SUFFIX}${GO_VET_INFO_EXT}:REALPRJNAME}
  93. GO_VET_OUTPUT_REPORT=${output;rootrel;hide;pre=${MODULE_PREFIX};suf=${MODULE_SUFFIX}${GO_VET_REPORT_EXT}:REALPRJNAME}
  94. # tag:go-specific tag:codenav
  95. _GO_YNDEXER_EXT=.ydx.pb2
  96. GO_YNDEXER_OUTPUT=${output;pre=${MODULE_PREFIX};suf=${MODULE_SUFFIX}${_GO_YNDEXER_EXT}:REALPRJNAME}
  97. # tag:go-specific
  98. GO_PROJECT_PREFIXES=++std-lib-prefix $GO_STD_LIB_PREFIX ++arc-project-prefix $GO_ARCADIA_PROJECT_PREFIX
  99. # tag:go-specific
  100. _GO_FAKEID=${FAKEID}.${BUILD_TYPE}.${GOSTD_VERSION}.${GO_FAKEID}
  101. _CGO_FAKEID=${_GO_FAKEID}.${CPP_FAKEID}
  102. # tag:go-specific
  103. CGO2_CFLAGS_VALUE=
  104. CGO2_LDFLAGS_VALUE=
  105. # tag:go-specific
  106. GO_ASM_FLAGS_VALUE=
  107. ### @usage: GO_ASM_FLAGS(flags)
  108. ### Add the specified flags to the go asm compile command line.
  109. macro GO_ASM_FLAGS(Flags...) {
  110. SET_APPEND(GO_ASM_FLAGS_VALUE $Flags)
  111. }
  112. # tag:go-specific
  113. GO_CGO1_FLAGS_VALUE=
  114. ### @usage: GO_CGO1_FLAGS(flags)
  115. ### Add the specified flags to the go cgo compile command line.
  116. macro GO_CGO1_FLAGS(Flags...) {
  117. SET_APPEND(GO_CGO1_FLAGS_VALUE $Flags)
  118. }
  119. # tag:go-specific
  120. GO_CGO2_FLAGS_VALUE=
  121. ### @usage: GO_CGO2_FLAGS(flags)
  122. ### Add the specified flags to the go cgo compile command line.
  123. macro GO_CGO2_FLAGS(Flags...) {
  124. SET_APPEND(GO_CGO2_FLAGS_VALUE $Flags)
  125. }
  126. # tag:go-specific
  127. GO_COMPILE_FLAGS_VALUE=$USER_GO_COMPILE_FLAGS
  128. ### @usage: GO_COMPILE_FLAGS(flags)
  129. ### Add the specified flags to the go compile command line.
  130. macro GO_COMPILE_FLAGS(Flags...) {
  131. SET_APPEND(GO_COMPILE_FLAGS_VALUE $Flags)
  132. }
  133. # tag:go-specific
  134. GO_LINK_FLAGS_VALUE=$USER_GO_LINK_FLAGS
  135. ### @usage: GO_LINK_FLAGS(flags)
  136. ### Add the specified flags to the go link command line.
  137. macro GO_LINK_FLAGS(Flags...) {
  138. SET_APPEND(GO_LINK_FLAGS_VALUE $Flags)
  139. }
  140. # tag:go-specific
  141. _GO_LANG_VERSION_VALUE=
  142. macro GOLANG_VERSION(Arg) {
  143. SET(_GO_LANG_VERSION_VALUE $Arg)
  144. }
  145. # tag:go-specific
  146. _GO_TOOL_MODE=
  147. # tag:go-specific
  148. _GO_TOOL_COMMON_FLAGS=\
  149. ++mode $_GO_TOOL_MODE \
  150. $GO_PROJECT_PREFIXES \
  151. ++goversion $GOSTD_VERSION \
  152. ++lang $_GO_LANG_VERSION_VALUE \
  153. ++source-root $ARCADIA_ROOT \
  154. ++build-root $ARCADIA_BUILD_ROOT \
  155. ++output-root $BINDIR \
  156. ++toolchain-root $GO_TOOLS_ROOT \
  157. $GO_HOST_TARG_PARAMS \
  158. ++output $TARGET \
  159. $GO_VET_OUTPUT \
  160. $_GO_YDX_FILE \
  161. $_GO_DEBUG_PATH__NO_UID__ \
  162. ++srcs $AUTO_INPUT ${input:GO_FILES} \
  163. ++asm-flags $GO_ASM_FLAGS_VALUE \
  164. ++compile-flags $GO_COMPILE_FLAGS_VALUE \
  165. ++link-flags $GO_LINK_FLAGS_VALUE \
  166. ++cgo-srcs ${input:CGO_FILES} \
  167. $_GO_EMBED_VALUE \
  168. $_GO_BUILDMODE \
  169. $GO_TOOLCHAIN_ENV
  170. # tag:go-specific
  171. macro _GO_GEN_COVER_GO(GO_FILE, GO_COVER_OUTPUT, VAR_ID) {
  172. .CMD=${hide:_GO_FAKEID} $GO_TOOLS_ROOT/pkg/tool/${GO_HOST_OS}_${GO_HOST_ARCH}/cover -mode set -var $VAR_ID -o ${output;noext;suf=.cover.go:GO_COVER_OUTPUT} ${input:GO_FILE}
  173. }
  174. # tag:go-specific
  175. macro _GO_COMPILE_SYMABIS(FLAGS[], ASM_FILES...) {
  176. .CMD=${hide:_CGO_FAKEID} $GO_TOOLS_ROOT/pkg/tool/${GO_HOST_OS}_${GO_HOST_ARCH}/asm $_GO_COMPILE_SYMABIS_TRIMPATH__NO_UID__ ${pre=-I :_C__INCLUDE} -I $GO_TOOLS_ROOT/pkg/include -D GOOS_${GO_TARG_OS} -D GOARCH_${GO_TARG_ARCH} $FLAGS $GO_ASM_FLAGS_VALUE -gensymabis -o ${output:"gen.symabis"} ${input:ASM_FILES} ${kv;hide:"p go"} ${kv;hide:"pc light-blue"} ${kv;hide:"show_out"}
  177. .ADDINCL=build/scripts/go_fake_include
  178. }
  179. # tag:go-specific
  180. macro _GO_COMPILE_CGO1(NAME, FLAGS[], FILES...) {
  181. .CMD=${hide:_CGO_FAKEID} ${cwd:ARCADIA_ROOT} $YMAKE_PYTHON ${input:"build/scripts/cgo1_wrapper.py"} $_GO_CGO1_WRAPPER_FLAGS --build-root ${ARCADIA_BUILD_ROOT} --source-root ${ARCADIA_ROOT} --cgo1-files ${output;noext:FILES.cgo1.go} --cgo2-files ${output;noauto;noext:FILES.cgo2.c} -- ${GO_TOOLS_ROOT}/pkg/tool/${GO_HOST_OS}_${GO_HOST_ARCH}/cgo -objdir $BINDIR -importpath $NAME $GO_CGO1_FLAGS_VALUE $FLAGS -- $C_FLAGS_PLATFORM ${pre=-I:_C__INCLUDE} ${CGO_CFLAGS_VALUE} ${input:FILES} ${output;hide:"_cgo_export.h"} ${output;hide:"_cgo_export.c"} ${output;hide:"_cgo_gotypes.go"} ${output;noauto;hide:"_cgo_main.c"} ${output;noauto;hide:"_cgo_flags"} $GO_TOOLCHAIN_ENV ${kv;hide:"p go"} ${kv;hide:"pc light-blue"} ${kv;hide:"show_out"}
  182. }
  183. # tag:go-specific
  184. macro _GO_COMPILE_CGO2(NAME, C_FILES[], S_FILES[], OBJ_FILES[], FILES...) {
  185. .CMD=${hide:_CGO_FAKEID} $C_COMPILER $C_FLAGS_PLATFORM ${pre=-I:_C__INCLUDE} $CGO_CFLAGS_VALUE ${input;tobindir:"_cgo_main.c"} -c -o ${tmp;noauto;suf=${OBJECT_SUF}:"_cgo_main.c"} && $C_COMPILER $C_FLAGS_PLATFORM ${pre=-I:_C__INCLUDE} -o ${tmp;noauto;suf=${OBJECT_SUF}:"_cgo_"} $LDFLAGS $LDFLAGS_GLOBAL $CGO2_LDFLAGS_VALUE ${input;hide:"_cgo_export.h"} ${tmp;noauto;suf=${OBJECT_SUF}:"_cgo_main.c"} ${input;suf=${OBJECT_SUF}:"_cgo_export.c"} ${input;nopath;noext;suf=.cgo2.c${OBJECT_SUF}:FILES} ${input;suf=${OBJECT_SUF}:C_FILES} ${input;suf=.o:S_FILES} ${input:OBJ_FILES} $CGO_LDFLAGS_VALUE && ${GO_TOOLS_ROOT}/pkg/tool/${GO_HOST_OS}_${GO_HOST_ARCH}/cgo -dynpackage $NAME -dynimport ${tmp;noauto;suf=${OBJECT_SUF}:"_cgo_"} -dynout ${output:"_cgo_import.go"} -dynlinker $GO_CGO2_FLAGS_VALUE $GO_TOOLCHAIN_ENV ${kv;hide:"p go"} ${kv;hide:"pc light-blue"} ${kv;hide:"show_out"}
  186. _USE_LINKER()
  187. }
  188. GO_TOOL=$YMAKE_PYTHON3 ${input:"build/scripts/go_tool.py"} $_PROCESS_WHOLE_ARCHIVE_SCRIPT
  189. # tag:go-specific
  190. macro _GO_LINK_LIB_IMPL(CGO_FILES[], EXTRA_INPUTS[], EXTRA_TEXT_INPUTS[], GO_FILES...) {
  191. .CMD=${hide:_GO_FAKEID} $GO_TOOL ${hide;input:EXTRA_INPUTS} ${hide;input;context=TEXT:EXTRA_TEXT_INPUTS} --ya-start-command-file $_GO_TOOL_COMMON_FLAGS ++peers ${rootrel;tags_in=local,GO|local,GO_PROTO|local,GO_FBS:PEERS} --ya-end-command-file ${kv;hide:"p GO"} ${kv;hide:"pc light-red"} ${kv;hide:"show_out"}
  192. }
  193. # tag:go-specific
  194. macro _GO_LINK_EXE_IMPL(CGO_FILES[], EXTRA_INPUTS[], EXTRA_TEXT_INPUTS[], GO_FILES...) {
  195. .CMD=${hide:_GO_FAKEID} $GO_TOOL ${hide;input:EXTRA_INPUTS} ${hide;input;context=TEXT:EXTRA_TEXT_INPUTS} --ya-start-command-file $_GO_TOOL_COMMON_FLAGS ++vcs $VCS_GO $GO_WITH_MUSL $GO_EXTLD ++peers ${rootrel;tags_in=local,GO|local,GO_PROTO|local,GO_FBS:PEERS} ++non-local-peers ${rootrel;tags_in=GO|GO_PROTO|GO_FBS;tags_out=local:PEERS} ++cgo-peers ${VCS_C_OBJ_RR} ${rootrel;tags_out=GO|GO_PROTO|GO_FBS:PEERS} --ya-end-command-file ${kv;hide:"p LD"} ${kv;hide:"pc light-red"} ${kv;hide:"show_out"} $_GO_LINK_EXE_EXT_CMD
  196. }
  197. # tag:go-specific
  198. macro _GO_LINK_TEST_IMPL(CGO_FILES[], EXTRA_INPUTS[], EXTRA_TEXT_INPUTS[], GO_TEST_FILES[], GO_XTEST_FILES[], GO_FILES...) {
  199. .CMD=${hide:_GO_FAKEID} $GO_TOOL ${hide;input:EXTRA_INPUTS} ${hide;input;context=TEXT:EXTRA_TEXT_INPUTS} --ya-start-command-file $_GO_TOOL_COMMON_FLAGS ++vcs $VCS_GO $GO_WITH_MUSL $GO_EXTLD ++test-miner $GO_TEST_MINER ++test-import-path $GO_TEST_IMPORT_PATH ++peers ${rootrel;tags_in=local,GO|local,GO_PROGRAM|local,GO_PROTO|local,GO_FBS:PEERS} ++non-local-peers ${rootrel;tags_in=GO|GO_PROTO|GO_FBS;tags_out=local:PEERS} ++cgo-peers ${VCS_C_OBJ_RR} ${rootrel;tags_out=GO|GO_PROGRAM|GO_PROTO|GO_FBS:PEERS} ++test_srcs ${input:GO_TEST_FILES} ++xtest_srcs ${input:GO_XTEST_FILES} ++cover_info $GO_COVER_INFO_VALUE ++skip-tests $_GO_SKIP_TEST_VALUE --ya-end-command-file ${kv;hide:"p GO"} ${kv;hide:"pc light-red"} ${kv;hide:"show_out"}
  200. }
  201. # tag:go-specific
  202. GO_LINK_LIB=
  203. GO_LINK_LIB+=$GENERATE_MF
  204. GO_LINK_LIB+=&& $_GO_LINK_LIB_IMPL($_GO_SRCS_VALUE CGO_FILES $_CGO_SRCS_VALUE EXTRA_TEXT_INPUTS $_GO_EMBED_INPUTS)
  205. GO_LINK_EXE=
  206. GO_LINK_EXE+=$GENERATE_MF
  207. GO_LINK_EXE+=&& $GENERATE_VCS_C_INFO_NODEP
  208. GO_LINK_EXE+=&& $GENERATE_VCS_GO_INFO_NODEP
  209. GO_LINK_EXE+=&& $COPY_PROFILE_RUNTIME
  210. GO_LINK_EXE+=&& $_GO_LINK_EXE_IMPL($_GO_SRCS_VALUE CGO_FILES $_CGO_SRCS_VALUE EXTRA_TEXT_INPUTS $_GO_EMBED_INPUTS)
  211. GO_LINK_TEST=
  212. GO_LINK_TEST+=$GENERATE_VCS_C_INFO_NODEP
  213. GO_LINK_TEST+=&& $GENERATE_VCS_GO_INFO_NODEP
  214. GO_LINK_TEST+=&& $COPY_PROFILE_RUNTIME
  215. GO_LINK_TEST+=&& $_GO_LINK_TEST_IMPL($_GO_SRCS_VALUE CGO_FILES $_CGO_SRCS_VALUE EXTRA_TEXT_INPUTS $_GO_EMBED_INPUTS GO_TEST_FILES $_GO_TEST_SRCS_VALUE GO_XTEST_FILES $_GO_XTEST_SRCS_VALUE)
  216. GO_LINK_DLL=
  217. GO_LINK_DLL+=$GO_LINK_EXE
  218. GO_LINK_DLL+=&& $COPY_CMD $BINDIR/_cgo_export.h ${output;pre=${MODULE_PREFIX};suf=.h:REALPRJNAME}
  219. # tag:go-specific
  220. CGO_ENABLED=yes
  221. _GO_LINK_FLAGS_LINKMODE=
  222. when ($OS_WINDOWS == "yes" || $SANITIZER_TYPE && $SANITIZER_TYPE != "no") {
  223. CGO_ENABLED=no
  224. }
  225. elsewhen ($CGO_ENABLED == "yes") {
  226. _GO_LINK_FLAGS_LINKMODE=-linkmode=external
  227. }
  228. # tag:go-specific
  229. GO_PACKAGE_VALUE=
  230. ### @usage: GO_PACKAGE_NAME(Name)
  231. ### Override name of a Go package.
  232. macro GO_PACKAGE_NAME(NAME) {
  233. SET(GO_PACKAGE_VALUE $NAME)
  234. }
  235. # tag:go-specific tag:internal
  236. _GO_SRCS_VALUE=
  237. ### @usage: _GO_SRCS(Files...) # internal
  238. ### This macro shouldn't be used in ya.make files, use SRCS() instead.
  239. ### This is internal macro collecting .go sources for processing within Go modules (GO_PROGRAM and GO_LIBRARY)
  240. macro _GO_SRCS(FILES...) {
  241. GO_FAKE_OUTPUT($FILES)
  242. SET_APPEND(_GO_SRCS_VALUE $FILES)
  243. }
  244. # tag:go-specific
  245. _GO_TEST_SRCS_VALUE=
  246. GO_HAS_INTERNAL_TESTS=no
  247. ### @usage: GO_TEST_SRCS(Files...)
  248. ### .go sources for internal tests of a module
  249. macro GO_TEST_SRCS(FILES...) {
  250. GO_FAKE_OUTPUT($FILES)
  251. _SET_FIRST_VALUE(GO_HAS_INTERNAL_TESTS ${pre=yes :FILES} ${GO_HAS_INTERNAL_TESTS})
  252. SET_APPEND(_GO_TEST_SRCS_VALUE $FILES)
  253. }
  254. # tag:go-specific
  255. _GO_XTEST_SRCS_VALUE=
  256. GO_HAS_EXTERNAL_TESTS=no
  257. ### @usage: GO_XTEST_SRCS(Files...)
  258. ### .go sources for external tests of a module
  259. macro GO_XTEST_SRCS(FILES...) {
  260. GO_FAKE_OUTPUT($FILES)
  261. SET(GO_HAS_EXTERNAL_TESTS yes)
  262. SET_APPEND(_GO_XTEST_SRCS_VALUE $FILES)
  263. }
  264. # tag:go-specific
  265. macro _GO_UNUSED_SRCS(FLAGS...) {
  266. ENABLE(UNUSED_MACRO)
  267. }
  268. # tag:go-specific
  269. _CGO_SRCS_VALUE=
  270. ### @usage: CGO_SRCS(Files...)
  271. ### .go sources to be built with CGO
  272. macro CGO_SRCS(FILES...) {
  273. SET_APPEND(_CGO_SRCS_VALUE $FILES)
  274. PEERDIR(${GOSTD}/syscall)
  275. }
  276. # tag:go-specific
  277. GO_LDFLAGS_GLOBAL=
  278. ### @usage: GO_LDFLAGS(Flags...)
  279. ### Link flags for GO_PROGRAM linking from .go sources
  280. macro GO_LDFLAGS(FLAGS...) {
  281. SET_APPEND(GO_LDFLAGS_GLOBAL $FLAGS)
  282. }
  283. # tag:go-specific
  284. CGO_CFLAGS_VALUE=
  285. ### @usage: CGO_CFLAGS(Flags...)
  286. ### Compiler flags specific to CGO compilation
  287. macro CGO_CFLAGS(FLAGS...) {
  288. SET_APPEND(CGO_CFLAGS_VALUE $FLAGS)
  289. CFLAGS($FLAGS)
  290. }
  291. # tag:go-specific
  292. CGO_LDFLAGS_VALUE=
  293. ### @usage: CGO_LDFLAGS(Files...)
  294. ### Linker flags specific to CGO linking
  295. macro CGO_LDFLAGS(FLAGS...) {
  296. SET_APPEND(CGO_LDFLAGS_VALUE $FLAGS)
  297. GO_LDFLAGS($FLAGS)
  298. }
  299. # tag:go-specific
  300. _GO_SKIP_TEST_VALUE=
  301. ### @usage: GO_SKIP_TESTS(TestNames...)
  302. ###
  303. ### Define a set of tests that should not be run.
  304. ### NB! Subtests are not taken into account!
  305. macro GO_SKIP_TESTS(TESTS...) {
  306. SET_APPEND(_GO_SKIP_TEST_VALUE $TESTS)
  307. RESTRICT_PATH(vendor MSG This macro is prohibited to be used outside the vendor/ directory)
  308. }
  309. # tag:go-specific tag:internal
  310. _GO_EMBED_VALUE=
  311. _GO_EMBED_INPUTS=
  312. ### @usage: _GO_EMBED_PATTERN(PATTERN) # internal
  313. ###
  314. ### Define an embed pattern.
  315. macro _GO_EMBED_PATTERN(XTEST?"_xtest":"", PATTERN, IMPORT_PATH) {
  316. SET(VAR_SALT1 $XTEST $PATTERN $IMPORT_PATH 1)
  317. SET(_PATTERN_GLOB1 uniq_embed_${hash:VAR_SALT1})
  318. _GLOB($_PATTERN_GLOB1 ${ARCADIA_ROOT}/${IMPORT_PATH}/${PATTERN}/**/* EXCLUDE ${ARCADIA_ROOT}/${IMPORT_PATH}/${PATTERN}/**/_* ${ARCADIA_ROOT}/${IMPORT_PATH}/${PATTERN}/**/.*)
  319. SET(VAR_SALT2 $XTEST $PATTERN $IMPORT_PATH 2)
  320. SET(_PATTERN_GLOB2 _uniq_embed_${hash:VAR_SALT2})
  321. _GLOB($_PATTERN_GLOB2 ${ARCADIA_ROOT}/${IMPORT_PATH}/${PATTERN})
  322. SET_APPEND(_GO_EMBED_VALUE ++embed$XTEST ${ARCADIA_ROOT}/${IMPORT_PATH} $PATTERN \$$_PATTERN_GLOB1 \$$_PATTERN_GLOB2)
  323. SET_APPEND(_GO_EMBED_INPUTS \$$_PATTERN_GLOB1 \$$_PATTERN_GLOB2)
  324. }
  325. # tag:go-specific
  326. ### @usage: GO_EMBED_PATTERN(PATTERN)
  327. ###
  328. ### Define an embed pattern.
  329. macro GO_EMBED_PATTERN(PATTERN) {
  330. _GO_EMBED_PATTERN($PATTERN $_GO_IMPORT_PATH)
  331. }
  332. # tag:go-specific
  333. ### @usage: GO_TEST_EMBED_PATTERN(PATTERN)
  334. ###
  335. ### Define an embed pattern for internal go tests.
  336. macro GO_TEST_EMBED_PATTERN(PATTERN) {
  337. _GO_EMBED_PATTERN($PATTERN $_GO_IMPORT_PATH)
  338. }
  339. # tag:go-specific
  340. ### @usage: GO_XTEST_EMBED_PATTERN(PATTERN)
  341. ###
  342. ### Define an embed pattern for external go tests.
  343. macro GO_XTEST_EMBED_PATTERN(PATTERN) {
  344. _GO_EMBED_PATTERN(XTEST $PATTERN $_GO_IMPORT_PATH)
  345. }
  346. # tag:go-specific tag:internal
  347. ### @usage: _GO_EMBED_DIR(PATTERN) # internal
  348. ###
  349. ### Define an embed directory DIR.
  350. macro _GO_EMBED_DIR(XTEST?"_xtest":"", DIR, IMPORT_PATH, ALL?"all:":"", EXCLUDES...) {
  351. SET(VAR_SALT $XTEST $DIR $IMPORT_PATH)
  352. SET(_PATTERN_GLOB uniq_embed_${hash:VAR_SALT})
  353. _GLOB($_PATTERN_GLOB ${ARCADIA_ROOT}/${IMPORT_PATH}/${DIR}/**/* EXCLUDE ${pre=${ARCADIA_ROOT}/${IMPORT_PATH}/${DIR}/**/:EXCLUDES})
  354. SET_APPEND(_GO_EMBED_VALUE ++embed$XTEST ${ARCADIA_ROOT}/${IMPORT_PATH} $ALL$DIR \$$_PATTERN_GLOB)
  355. SET_APPEND(_GO_EMBED_INPUTS \$$_PATTERN_GLOB)
  356. }
  357. # tag:go-specific
  358. ### @usage: GO_EMBED_DIR(DIR)
  359. ###
  360. ### Define an embed directory DIR.
  361. macro GO_EMBED_DIR(ALL?"ALL":"_* .*", DIR) {
  362. _GO_EMBED_DIR($DIR $_GO_IMPORT_PATH ${ALL})
  363. }
  364. # tag:go-specific
  365. ### @usage: GO_EMBED_TEST_DIR(DIR)
  366. ###
  367. ### Define an embed directory DIR for internal go tests.
  368. macro GO_EMBED_TEST_DIR(ALL?"ALL":"_* .*", DIR) {
  369. _GO_EMBED_DIR($DIR $_GO_IMPORT_PATH ${ALL})
  370. }
  371. # tag:go-specific
  372. ### @usage: GO_EMBED_XTEST_DIR(DIR)
  373. ###
  374. ### Define an embed directory DIR for external go tests.
  375. macro GO_EMBED_XTEST_DIR(ALL?"ALL":"_* .*", DIR) {
  376. _GO_EMBED_DIR(XTEST $DIR $_GO_IMPORT_PATH ${ALL})
  377. }
  378. # tag:go-specific tag:internal
  379. ### @usage: _GO_EMBED_BINDIR(DIR)
  380. ###
  381. ### Define an embed directory DIR for files from ARCADIA_BUILD_ROOT
  382. macro _GO_EMBED_BINDIR(XTEST?"_xtest":"", PREFIX, DIR, FILES...) {
  383. SET_APPEND(_GO_EMBED_VALUE ++embed$XTEST ${PREFIX} $DIR ${pre=$PREFIX/:FILES})
  384. SET_APPEND(_GO_EMBED_INPUTS ${pre=$PREFIX/:FILES})
  385. }
  386. # tag:go-specific
  387. ### @usage: GO_EMBED_BINDIR(DIR)
  388. ###
  389. ### Define an embed directory DIR for files from ARCADIA_BUILD_ROOT
  390. macro GO_EMBED_BINDIR(PREFIX="${_GO_IMPORT_PATH}", DIR, FILES[]) {
  391. _GO_EMBED_BINDIR(${ARCADIA_BUILD_ROOT}/${PREFIX} $DIR $FILES)
  392. }
  393. # tag:go-specific
  394. ### @usage: GO_TEST_EMBED_BINDIR(DIR)
  395. ###
  396. ### Define an embed directory DIR for files from ARCADIA_BUILD_ROOT for internal go tests
  397. macro GO_TEST_EMBED_BINDIR(PREFIX="${_GO_IMPORT_PATH}", DIR, FILES[]) {
  398. _GO_EMBED_BINDIR(${ARCADIA_BUILD_ROOT}/$PREFIX $DIR $FILES)
  399. }
  400. # tag:go-specific
  401. ### @usage: GO_XTEST_EMBED_BINDIR(DIR, FILES...)
  402. ###
  403. ### Define an embed directory DIR for files from ARCADIA_BUILD_ROOT for external go tests
  404. macro GO_XTEST_EMBED_BINDIR(PREFIX="${_GO_IMPORT_PATH}", DIR, FILES[]) {
  405. _GO_EMBED_BINDIR(XTEST ${ARCADIA_BUILD_ROOT}/$PREFIX $DIR $FILES)
  406. }
  407. # tag:go-specific
  408. _GO_TOOLCHAIN_ENV_GOARCH=unknown
  409. when ($ARCH_ARM64) {
  410. _GO_TOOLCHAIN_ENV_GOARCH=${env:"GOARCH=arm64"}
  411. }
  412. elsewhen ($ARCH_X86_64) {
  413. _GO_TOOLCHAIN_ENV_GOARCH=${env:"GOARCH=amd64"}
  414. }
  415. # tag:go-specific
  416. _GO_TOOLCHAIN_ENV_GOOS=unknown
  417. when ($OS_DARWIN) {
  418. _GO_TOOLCHAIN_ENV_GOOS=${env:"GOOS=darwin"}
  419. }
  420. elsewhen ($OS_LINUX) {
  421. _GO_TOOLCHAIN_ENV_GOOS=${env:"GOOS=linux"}
  422. }
  423. elsewhen ($OS_WINDOWS) {
  424. _GO_TOOLCHAIN_ENV_GOOS=${env:"GOOS=windows"}
  425. }
  426. _GO_TOOLCHAIN_ENV_PATH=
  427. # tag:go-specific
  428. GO_TOOLCHAIN_ENV=$TOOLCHAIN_ENV $_GO_TOOLCHAIN_ENV_GOARCH $_GO_TOOLCHAIN_ENV_GOOS $_GO_TOOLCHAIN_ENV_PATH
  429. # tag:go-specific
  430. _GO_GRPC_WELLKNOWN=\
  431. vendor/google.golang.org/grpc \
  432. vendor/google.golang.org/grpc \
  433. vendor/google.golang.org/grpc/codes \
  434. vendor/google.golang.org/grpc/grpclog \
  435. vendor/google.golang.org/grpc/status
  436. # tag:go-specific
  437. macro _GO_GRPC() {
  438. SET(GO_PROTO_GEN_PLUGINS plugins=grpc)
  439. SET(GO_PROTO_GRPC_OPTS \$GO_PROTO_GRPC_OPTS_V2)
  440. SET(GO_PROTO_GRPC_OUTS \$GO_PROTO_GRPC_OUTS_V2)
  441. PEERDIR(${GOSTD}/context ${_GO_GRPC_WELLKNOWN})
  442. }
  443. # tag:go-specific
  444. ### @usage: GO_GRPC_GATEWAY_SRCS()
  445. ###
  446. ### Use of grpc-gateway plugin (Supported for Go only).
  447. macro GO_GRPC_GATEWAY_SRCS(FILE...) {
  448. ENABLE(UNUSED_MACRO)
  449. }
  450. # tag:go-specific
  451. ### @usage: GO_GRPC_GATEWAY_SWAGGER_SRCS()
  452. ###
  453. ### Use of grpc-gateway plugin w/ swagger emission (Supported for Go only).
  454. macro GO_GRPC_GATEWAY_SWAGGER_SRCS(FILE...) {
  455. PEERDIR(vendor/github.com/grpc-ecosystem/grpc-gateway/protoc-gen-swagger/options)
  456. }
  457. # tag:go-specific
  458. _GO_PROTO_GRPC_GATEWAY_OPTS=
  459. _GO_PROTO_GRPC_GATEWAY_OUTS=
  460. # tag:go-specific
  461. macro _GO_GRPC_GATEWAY_SRCS_IMPL(Files...) {
  462. foreach (File : $Files) {
  463. [.proto]=$_GO_PROTO_CMD_IMPL($File $_GO_PROTO_GRPC_GATEWAY_OPTS $_GO_PROTO_GRPC_GATEWAY_OUTS)
  464. }
  465. PEERDIR(${GOSTD}/context ${GOSTD}/io ${GOSTD}/net/http)
  466. PEERDIR(vendor/github.com/golang/protobuf/descriptor)
  467. PEERDIR(vendor/github.com/grpc-ecosystem/grpc-gateway/runtime)
  468. PEERDIR(vendor/github.com/grpc-ecosystem/grpc-gateway/utilities)
  469. PEERDIR(vendor/google.golang.org/grpc/metadata)
  470. }
  471. # tag:go-specific
  472. macro _SETUP_GO_GRPC_GATEWAY() {
  473. SET(_GO_PROTO_GRPC_GATEWAY_OPTS $_PROTO_PLUGIN_ARGS_BASE(go_grpc_gw vendor/github.com/grpc-ecosystem/grpc-gateway/protoc-gen-grpc-gateway allow_repeated_fields_in_body=true))
  474. SET(_GO_PROTO_GRPC_GATEWAY_OUTS \${output;hide;norel;nopath;noext;suf=.pb.gw.go:File})
  475. }
  476. # tag:go-specific
  477. macro _GO_GRPC_GATEWAY_SRCS(Files...) {
  478. _SETUP_GO_GRPC_GATEWAY()
  479. _GO_GRPC_GATEWAY_SRCS_IMPL($Files)
  480. }
  481. # tag:go-specific
  482. macro _GO_GRPC_GATEWAY_SWAGGER_SRCS(Files...) {
  483. _SETUP_GO_GRPC_GATEWAY()
  484. SET_APPEND(_GO_PROTO_GRPC_GATEWAY_OPTS $_PROTO_PLUGIN_ARGS_BASE(swagger vendor/github.com/grpc-ecosystem/grpc-gateway/protoc-gen-swagger logtostderr=true allow_repeated_fields_in_body=true))
  485. SET_APPEND(_GO_PROTO_GRPC_GATEWAY_OUTS \${output;hide;norel;noauto;nopath;noext;suf=.swagger.json:File})
  486. _GO_GRPC_GATEWAY_SRCS_IMPL($Files)
  487. PEERDIR(vendor/github.com/grpc-ecosystem/grpc-gateway/protoc-gen-swagger/options)
  488. }
  489. #tag:go-specific
  490. ### @usage: GO_GRPC_GATEWAY_V2_OPENAPI_SRCS(Files...)
  491. ###
  492. ### Use of grpc-gateway plugin w/ openapi v2 emission (Supported for Go only).
  493. macro GO_GRPC_GATEWAY_V2_OPENAPI_SRCS(NO_JSON_NAMES_FOR_FIELDS?"":"", Files...) {
  494. PEERDIR(vendor/github.com/grpc-ecosystem/grpc-gateway/v2/protoc-gen-openapiv2/options)
  495. }
  496. macro _GO_GRPC_GATEWAY_V2_OPENAPI_SRCS(NO_JSON_NAMES_FOR_FIELDS?"json_names_for_fields=false":"", Files...) {
  497. _SETUP_GO_GRPC_GATEWAY_V2()
  498. SET_APPEND(_GO_PROTO_GRPC_GATEWAY_V2_OPTS $_PROTO_PLUGIN_ARGS_BASE(openapiv2 vendor/github.com/grpc-ecosystem/grpc-gateway/v2/protoc-gen-openapiv2 $NO_JSON_NAMES_FOR_FIELDS logtostderr=true))
  499. SET_APPEND(_GO_PROTO_GRPC_GATEWAY_V2_OPTS \${output;hide;norel;noauto;nopath;noext;suf=.swagger.json:File})
  500. _GO_GRPC_GATEWAY_V2_SRCS_IMPL($Files)
  501. PEERDIR(vendor/github.com/grpc-ecosystem/grpc-gateway/v2/protoc-gen-openapiv2/options)
  502. }
  503. # tag:go-specific
  504. ### @usage: GO_GRPC_GATEWAY_V2_SRCS()
  505. ###
  506. ### Use of grpc-gateway plugin (Supported for Go only).
  507. macro GO_GRPC_GATEWAY_V2_SRCS(FILE...) {
  508. ENABLE(UNUSED_MACRO)
  509. }
  510. # tag:go-specific
  511. _GO_PROTO_GRPC_GATEWAY_V2_OPTS=
  512. _GO_PROTO_GRPC_GATEWAY_V2_OUTS=
  513. # tag:go-specific
  514. macro _GO_GRPC_GATEWAY_V2_SRCS_IMPL(Files...) {
  515. foreach (File : $Files) {
  516. [.proto]=$_GO_PROTO_CMD_IMPL($File $_GO_PROTO_GRPC_GATEWAY_V2_OPTS $_GO_PROTO_GRPC_GATEWAY_V2_OUTS)
  517. }
  518. PEERDIR(${GOSTD}/context ${GOSTD}/io ${GOSTD}/net/http)
  519. PEERDIR(vendor/github.com/golang/protobuf/descriptor)
  520. PEERDIR(vendor/github.com/grpc-ecosystem/grpc-gateway/v2/runtime)
  521. PEERDIR(vendor/github.com/grpc-ecosystem/grpc-gateway/v2/utilities)
  522. PEERDIR(vendor/google.golang.org/grpc/metadata)
  523. PEERDIR(vendor/google.golang.org/protobuf/proto)
  524. }
  525. # tag:go-specific
  526. macro _SETUP_GO_GRPC_GATEWAY_V2() {
  527. SET(_GO_PROTO_GRPC_GATEWAY_V2_OPTS $_PROTO_PLUGIN_ARGS_BASE(go_grpc_gw vendor/github.com/grpc-ecosystem/grpc-gateway/v2/protoc-gen-grpc-gateway allow_repeated_fields_in_body=true))
  528. SET(_GO_PROTO_GRPC_GATEWAY_V2_OUTS \${output;hide;norel;nopath;noext;suf=.pb.gw.go:File})
  529. }
  530. # tag:go-specific
  531. macro _GO_GRPC_GATEWAY_V2_SRCS(Files...) {
  532. _SETUP_GO_GRPC_GATEWAY_V2()
  533. _GO_GRPC_GATEWAY_V2_SRCS_IMPL($Files)
  534. }
  535. # tag:go-specific
  536. when ($MUSL == "yes") {
  537. _GO_DEFAULT_ALLOCATOR=LF
  538. }
  539. otherwise {
  540. _GO_DEFAULT_ALLOCATOR=FAKE
  541. }
  542. # tag:go-specific tag:internal
  543. ### @usage _GO_BASE_UNIT # internal
  544. ###
  545. ### The base module of all golang modules. Defines common properties, dependencies and rules for go build.
  546. module _GO_BASE_UNIT: _BASE_UNIT {
  547. .EXTS=.go .gosrc .o .obj .a .symabis .mf
  548. .CMD=TOUCH_UNIT
  549. .NODE_TYPE=Bundle
  550. .GLOBAL=GO_LDFLAGS
  551. .PEERDIR_POLICY=as_build_from
  552. .ALIASES=SRCS=_GO_SRCS RESOURCE=_GO_RESOURCE GO_TEST_SRCS=_GO_UNUSED_SRCS GO_XTEST_SRCS=_GO_UNUSED_SRCS GRPC=_GO_GRPC GO_GRPC_GATEWAY_SRCS=_GO_GRPC_GATEWAY_SRCS GO_GRPC_GATEWAY_SWAGGER_SRCS=_GO_GRPC_GATEWAY_SWAGGER_SRCS CFLAGS=CGO_CFLAGS GO_TEST_EMBED_PATTERN=_GO_UNUSED_SRCS GO_XTEST_EMBED_PATTERN=_GO_UNUSED_SRCS GO_TEST_EMBED_DIR=_GO_UNUSED_SRCS GO_XTEST_EMBED_DIR=_GO_UNUSED_SRCS GO_TEST_EMBED_BINDIR=_GO_UNUSED_SRCS GO_XTEST_EMBED_BINDIR=_GO_UNUSED_SRCS GO_GRPC_GATEWAY_V2_SRCS=_GO_GRPC_GATEWAY_V2_SRCS GO_GRPC_GATEWAY_V2_OPENAPI_SRCS=_GO_GRPC_GATEWAY_V2_OPENAPI_SRCS
  553. .ALLOWED=GO_PROTO_PLUGIN USE_CXX USE_UTIL RESOURCE_FILES
  554. .IGNORED=GO_SKIP_TESTS USE_SKIFF
  555. .RESTRICTED=TEST_SRCS
  556. .DEFAULT_NAME_GENERATOR=UseDirNameOrSetGoPackage
  557. ENABLE(_GO_MODULE)
  558. SET(MODULE_TAG GO)
  559. SET(PEERDIR_TAGS GO GO_PROTO GO_FBS __EMPTY__)
  560. DEFAULT(_GO_VET_TOOL)
  561. DEFAULT(_GO_VET_FLAGS)
  562. DEFAULT(_GO_VET_EXTS)
  563. DEFAULT(_GO_SONAME)
  564. NO_RUNTIME()
  565. SET(COVERAGE_FLAGS)
  566. SET(EXTRA_OUTPUT)
  567. SET(MODULE_LANG GO)
  568. ENABLE(FORCE_CONSISTENT_DEBUG)
  569. PEERDIR(build/external_resources/go_tools)
  570. GO_PROTO_GRPC_OPTS_V2=--plugin=protoc-gen-go-grpc=${tool:_TOOL_PROTOC_GEN_GO_GRPC_V2} --go-grpc_out=${ARCADIA_BUILD_ROOT}/$PROTO_NAMESPACE
  571. GO_PROTO_GRPC_OUTS_V2=${output;norel;nopath;noext;suf=_grpc.pb.go:File}
  572. select ($GO_PROTO_V2) {
  573. "yes" | "on" ? {
  574. GO_PROTO_OUTS+=${output;hide;norel;nopath;noext;suf=.pb.go:File}
  575. GO_PROTO_OPTS+=--plugin=protoc-gen-go=${tool:_TOOL_PROTOC_GEN_GO_V2} --go_out=${ARCADIA_BUILD_ROOT}/$PROTO_NAMESPACE
  576. _GO_PROTO_CHECK_OUTPUT=--check $GO_PROTO_GRPC_OUTS_V2
  577. GO_PROTO_OPTS+=$GO_PROTO_GRPC_OPTS
  578. }
  579. default ? {
  580. GO_PROTO_OUTS+=${output;hide;norel;nopath;noext;suf=.pb.go:File}
  581. GO_PROTO_OPTS+=--plugin=protoc-gen-go=${tool:_TOOL_PROTOC_GEN_GO} --go_out=$GO_PROTO_GEN_PLUGINS:${ARCADIA_BUILD_ROOT}/$PROTO_NAMESPACE
  582. }
  583. }
  584. when ($COMPILER_PLATFORM && $NEED_PLATFORM_PEERDIRS == "yes") {
  585. PEERDIR+=$COMPILER_PLATFORM
  586. }
  587. when ($CLANG == "yes" || $GCC == "yes") {
  588. CGO_CFLAGS_VALUE += -w -pthread -fpic
  589. CGO2_CFLAGS_VALUE += -Wno-unused-variable
  590. }
  591. select ($GO_VET) {
  592. "yes" | "on" ? {
  593. _GO_VET=yes
  594. _GO_VET_FLAGS+=-cgocall=false
  595. }
  596. "yndexer" ? {
  597. _GO_VET=yes
  598. PEERDIR+=build/external_resources/goyndexer
  599. _GO_VET_TOOL=${GOYNDEXER_RESOURCE_GLOBAL}/goyndexer
  600. _GO_YDX_FILE=++ydx-file ${_GO_YNDEXER_EXT}
  601. _GO_VET_FLAGS=-indexer.arc ${ARCADIA_ROOT} -indexer.indexfile ${GO_YNDEXER_OUTPUT} -indexer.loglevel info
  602. _GO_FMT_ADD_CHECK=no
  603. _GO_VET_ADD_CHECK=no
  604. GO_VET_INFO_EXT=.ydx.out
  605. GO_VET_REPORT_EXT=.ydx.txt
  606. _GO_VET_EXTS=++vet-info-ext .ydx.out ++vet-report-ext .ydx.txt
  607. _GO_CGO1_WRAPPER_FLAGS=--build-prefix=__ARCADIA_BUILD_ROOT_PREFIX__ --source-prefix=__ARCADIA_SOURCE_ROOT_PREFIX__
  608. }
  609. "yolint" ? {
  610. _GO_VET=yes
  611. PEERDIR+=build/external_resources/yolint
  612. _GO_VET_TOOL=${YOLINT_RESOURCE_GLOBAL}/yolint
  613. _GO_VET_FLAGS=-migration.config=${input:"${ARCADIA_ROOT}/build/rules/go/migrations.yaml"} -scopelint.config=${input:"${ARCADIA_ROOT}/build/rules/go/extended_lint.yaml"}
  614. }
  615. "local" ? {
  616. _GO_VET=yes
  617. _GO_VET_FLAGS=
  618. }
  619. default ? {
  620. _GO_VET=no
  621. _GO_VET_FLAGS=
  622. }
  623. }
  624. SET(_GO_VET $_GO_VET)
  625. when ($GO_VET_TOOL == "") {
  626. _GO_VET_TOOL_REAL=$_GO_VET_TOOL
  627. }
  628. otherwise {
  629. _GO_VET_TOOL_REAL=$GO_VET_TOOL
  630. }
  631. when ($GO_VET_FLAGS == "") {
  632. _GO_VET_FLAGS_REAL=$_GO_VET_FLAGS
  633. }
  634. otherwise {
  635. _GO_VET_FLAGS_REAL=$GO_VET_FLAGS
  636. }
  637. when ($_GO_VET == "yes" && $NO_GO_VET != "yes") {
  638. GO_VET_OUTPUT=++vet $_GO_VET_TOOL_REAL ++vet-flags $_GO_VET_FLAGS_REAL $GO_VET_EXTRA_FLAGS $GO_VET_OUTPUT_INFO $GO_VET_OUTPUT_REPORT $_GO_VET_EXTS
  639. }
  640. otherwise {
  641. GO_VET_OUTPUT=
  642. _GO_VET_ADD_CHECK=no
  643. }
  644. when ($GO_DEBUG_PATH_RELATIVE == "yes") {
  645. _GO_DEBUG_PATH__NO_UID__=++debug-root-map source=;build=;tools= ++tools-root $(TOOL_ROOT)
  646. _GO_COMPILE_SYMABIS_TRIMPATH__NO_UID__=-trimpath $ARCADIA_ROOT=>;$ARCADIA_BUILD_ROOT=>;$(TOOL_ROOT)=>
  647. }
  648. otherwise {
  649. _GO_DEBUG_PATH__NO_UID__=++debug-root-map source=/-S;build=/-B;tools=/-T ++tools-root $(TOOL_ROOT)
  650. _GO_COMPILE_SYMABIS_TRIMPATH__NO_UID__=-trimpath $ARCADIA_ROOT=>/-S;$ARCADIA_BUILD_ROOT=>/-B;$(TOOL_ROOT)=>/-T
  651. }
  652. _GO_PROCESS_SRCS()
  653. when ($CLANG == "yes") {
  654. _GO_EXTLD=clang
  655. GO_TOOLCHAIN_ENV += ${env:"CC=clang"}
  656. }
  657. otherwise {
  658. _GO_EXTLD=gcc
  659. GO_TOOLCHAIN_ENV += ${env:"CC=gcc"}
  660. }
  661. when ($OS_DARWIN) {
  662. PEERDIR+=build/external_resources/go_fake_xcrun
  663. GO_EXTLD = ++extld $_GO_EXTLD ++extldflags $_GO_SONAME $LD_SDK_VERSION -undefined dynamic_lookup $C_FLAGS_PLATFORM --sysroot=$MACOS_SDK_RESOURCE_GLOBAL --start-wa ${rootrel;ext=.a:SRCS_GLOBAL} --end-wa ${rootrel;ext=.o:SRCS_GLOBAL} --cgo-peers $LDFLAGS $LDFLAGS_GLOBAL $OBJADDE $OBJADDE_LIB $GO_LDFLAGS_GLOBAL $C_LIBRARY_PATH $C_SYSTEM_LIBRARIES_INTERCEPT $C_SYSTEM_LIBRARIES $STRIP_FLAG
  664. CGO2_LDFLAGS_VALUE += $LD_SDK_VERSION -undefined dynamic_lookup -nodefaultlibs -lc
  665. }
  666. elsewhen ($OS_LINUX) {
  667. GO_EXTLD = ++extld $_GO_EXTLD ++extldflags $_GO_SONAME $C_FLAGS_PLATFORM --sysroot=$OS_SDK_ROOT_RESOURCE_GLOBAL -Wl,--whole-archive ${rootrel;ext=.a:SRCS_GLOBAL} -Wl,--no-whole-archive ${rootrel;ext=.o:SRCS_GLOBAL} --cgo-peers $LDFLAGS $LDFLAGS_GLOBAL $OBJADDE $OBJADDE_LIB $GO_LDFLAGS_GLOBAL $C_LIBRARY_PATH $C_SYSTEM_LIBRARIES_INTERCEPT $C_SYSTEM_LIBRARIES $STRIP_FLAG
  668. CGO2_LDFLAGS_VALUE += -Wl,--unresolved-symbols=ignore-all -nodefaultlibs -lc
  669. }
  670. otherwise {
  671. GO_EXTLD = ++extld $_GO_EXTLD
  672. }
  673. when ($RACE == "yes") {
  674. _GO_COMPILE_FLAGS_RACE=-race
  675. _GO_LINK_FLAGS_RACE=-race
  676. }
  677. otherwise {
  678. _GO_COMPILE_FLAGS_RACE=
  679. _GO_LINK_FLAGS_RACE=
  680. }
  681. when ($PIC == "yes" || $PIE == "yes") {
  682. _GO_COMPILE_FLAGS_SHARED=-shared
  683. _GO_ASM_FLAGS_SHARED=-shared
  684. }
  685. otherwise {
  686. _GO_COMPILE_FLAGS_SHARED=
  687. _GO_ASM_FLAGS_SHARED=
  688. }
  689. GO_ASM_FLAGS_VALUE += $_GO_ASM_FLAGS_SHARED
  690. GO_COMPILE_FLAGS_VALUE += $_GO_COMPILE_FLAGS_RACE $_GO_COMPILE_FLAGS_SHARED
  691. GO_LINK_FLAGS_VALUE += $_GO_LINK_FLAGS_LINKMODE $_GO_LINK_FLAGS_RACE
  692. ADDINCL(${GOSTD}/runtime)
  693. }
  694. # tag:go-specific
  695. ### @usage: GO_LIBRARY([name])
  696. ###
  697. ### Go library module definition.
  698. ### Compile Go module as a library suitable for PEERDIR from other Go modules.
  699. ### Will select Go implementation on PEERDIR to PROTO_LIBRARY.
  700. module GO_LIBRARY: _GO_BASE_UNIT {
  701. .CMD=GO_LINK_LIB
  702. .NODE_TYPE=Bundle
  703. .FINAL_TARGET=no
  704. SET(_GO_TOOL_MODE lib)
  705. SET(MODULE_TYPE LIBRARY)
  706. SET(PEERDIR_TAGS GO GO_PROTO GO_FBS __EMPTY__ PACKAGE_UNION)
  707. MODULE_SUFFIX=.a
  708. }
  709. # tag:go-specific
  710. ### @usage: GO_PROGRAM([name])
  711. ###
  712. ### Go program module definition.
  713. ### Compile and link Go module to an executable program.
  714. ### Will select Go implementation on PEERDIR to PROTO_LIBRARY.
  715. module GO_PROGRAM: _GO_BASE_UNIT {
  716. .CMD=GO_LINK_EXE
  717. .NODE_TYPE=Program
  718. .PROXY=yes
  719. .SYMLINK_POLICY=EXE
  720. .ALLOWED=INDUCED_DEPS
  721. .FINAL_TARGET=yes
  722. SET(MODULE_TAG GO_PROGRAM)
  723. SET(_GO_TOOL_MODE exe)
  724. SET(MODULE_TYPE PROGRAM)
  725. SET(GO_VET_OUTPUT_INFO)
  726. ALLOCATOR($_GO_DEFAULT_ALLOCATOR)
  727. _USE_LINKER()
  728. ENABLE(COMMON_LINK_SETTINGS)
  729. when ($MUSL == "yes") {
  730. PEERDIR += contrib/libs/musl/full
  731. }
  732. when ($RACE == "yes") {
  733. PEERDIR += contrib/libs/cxxsupp/builtins
  734. }
  735. when ($MSVC == "yes" || $CYGWIN == "yes") {
  736. MODULE_SUFFIX=.exe
  737. }
  738. PEERDIR(${GOSTD}/runtime library/go/core/buildinfo)
  739. when ($RACE == "yes") {
  740. PEERDIR += ${GOSTD}/runtime/cgo
  741. PEERDIR += ${GOSTD}/runtime/race
  742. }
  743. when ($MUSL == "yes") {
  744. GO_WITH_MUSL = ++musl
  745. }
  746. when ($HARDENING == "yes") {
  747. _GO_BUILDMODE=++buildmode=pie
  748. }
  749. when ($NEED_PROFILE_RUNTIME == "yes") {
  750. when ($CLANG16 == "yes") {
  751. LDFLAGS+=-resource-dir=contrib/libs/clang-rt
  752. PEERDIR+=contrib/libs/clang16-rt/lib/profile
  753. }
  754. otherwise {
  755. LDFLAGS+=-resource-dir=contrib/libs/clang-rt
  756. PEERDIR+=contrib/libs/clang14-rt/lib/profile
  757. }
  758. }
  759. when ($OPENSOURCE == "yes" && $AUTOCHECK == "yes") {
  760. # FIXME: Replace AUTOCHECK == yes with _not a host platform_ check after YMAKE-218
  761. MODULE_LICENSES_RESTRICTION_TYPES = ALLOW_ONLY
  762. MODULE_LICENSES_RESTRICTIONS = SERVICE REQUIRE_CITATION
  763. }
  764. when ($OS_IOS == "yes" || $OS_ANDROID == "yes" || $MAPSMOBI_BUILD_TARGET == "yes") {
  765. MODULE_LICENSES_RESTRICTION_TYPES = ALLOW_ONLY
  766. MODULE_LICENSES_RESTRICTIONS = SERVICE REQUIRE_CITATION
  767. }
  768. }
  769. # tag:go-specific
  770. module _GO_DLL_BASE_UNIT: GO_PROGRAM {
  771. .CMD=GO_LINK_DLL
  772. .SYMLINK_POLICY=SO
  773. .ALLOWED=WHOLE_ARCHIVE
  774. .ARGS_PARSER=DLL
  775. .NODE_TYPE=Library
  776. .PROXY=yes
  777. SET(_GO_TOOL_MODE dll)
  778. SET(MODULE_TYPE DLL)
  779. GO_PACKAGE_NAME(main)
  780. when ($MSVC == "yes" || $CYGWIN == "yes") {
  781. MODULE_SUFFIX=.dll
  782. }
  783. elsewhen ($DARWIN == "yes" || $OS_IOS == "yes") {
  784. MODULE_PREFIX=lib
  785. MODULE_SUFFIX=.dylib$MODULE_VERSION
  786. }
  787. otherwise {
  788. MODULE_PREFIX=lib
  789. MODULE_SUFFIX=.so$MODULE_VERSION
  790. }
  791. when ($OS_DARWIN) {
  792. _GO_SONAME=-Wl,-install_name,$SONAME
  793. }
  794. elsewhen ($OS_LINUX) {
  795. _GO_SONAME=-Wl,-soname,$SONAME
  796. }
  797. when ($MODULE_VERSION) {
  798. when ($OS_LINUX || $OS_DARWIN) {
  799. _GO_LINK_EXE_EXT_CMD+= && $LINK_OR_COPY_CMD $TARGET ${output;nopath;noext:SONAME}
  800. }
  801. }
  802. }
  803. # tag:go-specific
  804. ### @usage: GO_DLL(name major_ver [minor_ver] [PREFIX prefix])
  805. ###
  806. ### Go ishared object module definition.
  807. ### Compile and link Go module to a shared object.
  808. ### Will select Go implementation on PEERDIR to PROTO_LIBRARY.
  809. module GO_DLL: _GO_DLL_BASE_UNIT {
  810. }
  811. # tag:go-specific tag:test
  812. ### @usage: GO_BENCH_TIMEOUT(x)
  813. ###
  814. ### Sets timeout in seconds for 1 Benchmark in go benchmark suite
  815. ###
  816. ### Documentation about the system test: https://wiki.yandex-team.ru/yatool/test/
  817. macro GO_BENCH_TIMEOUT(bench_timeout) {
  818. SET(GO_BENCH_TIMEOUT $bench_timeout)
  819. }
  820. # tag:go-specific tag:test
  821. ### @usage: GO_TEST([name])
  822. ###
  823. ### Go test module definition.
  824. ### Compile and link Go module as a test suitable for running with Arcadia testing support.
  825. ### All usual testing support macros like DATA, DEPENDS, SIZE, REQUIREMENTS etc. are supported.
  826. ### Will select Go implementation on PEERDIR to PROTO_LIBRARY.
  827. module GO_TEST: GO_PROGRAM {
  828. .CMD=GO_LINK_TEST
  829. .ALIASES=GO_TEST_SRCS=GO_TEST_SRCS GO_XTEST_SRCS=GO_XTEST_SRCS GO_TEST_EMBED_PATTERN=GO_TEST_EMBED_PATTERN GO_XTEST_EMBED_PATTERN=GO_XTEST_EMBED_PATTERN GO_TEST_EMBED_DIR=GO_TEST_EMBED_DIR GO_XTEST_EMBED_DIR=GO_XTEST_EMBED_DIR GO_TEST_EMBED_BINDIR=GO_TEST_EMBED_BINDIR GO_XTEST_EMBED_BINDIR=GO_XTEST_EMBED_BINDIR
  830. .ALLOWED=GO_SKIP_TESTS YT_SPEC
  831. .FINAL_TARGET=no
  832. SET(MODULE_TAG GO_TEST)
  833. SET(PEERDIR_TAGS GO GO_PROGRAM GO_PROTO GO_FBS __EMPTY__)
  834. SET(_GO_TOOL_MODE test)
  835. SET(MODULE_TYPE PROGRAM)
  836. ENABLE(GO_TEST_MODULE)
  837. SET(GO_COVER_INFO_VALUE)
  838. # We have to add uncoditionaly PEERDIR to ${GOSTD}/os here thouth it is really
  839. # needed when TestMain is defined in the source code of the test
  840. PEERDIR(${GOSTD}/os)
  841. PEERDIR(${GOSTD}/testing/internal/testdeps)
  842. PEERDIR(${GOSTD}/testing)
  843. PEERDIR(library/go/test/yatest)
  844. ADD_YTEST($MODULE_PREFIX$REALPRJNAME go.test)
  845. ADD_YTEST($MODULE_PREFIX$REALPRJNAME go.bench)
  846. SET_APPEND(_MAKEFILE_INCLUDE_LIKE_DEPS canondata/result.json)
  847. }
  848. # tag:go-specific
  849. macro GO_MOCKGEN_FROM(Path) {
  850. SET(MOCKGEN_FROM ${Path})
  851. }
  852. # tag:go-specific
  853. macro GO_MOCKGEN_TYPES(Types...) {
  854. SET(MOCKGEN_TYPES ${join=\\${__COMMA__}:Types})
  855. }
  856. # tag:go-specific
  857. macro GO_MOCKGEN_REFLECT() {
  858. PEERDIR(${GOSTD}/encoding/gob)
  859. PEERDIR(${GOSTD}/flag)
  860. PEERDIR(${GOSTD}/fmt)
  861. PEERDIR(${GOSTD}/os)
  862. PEERDIR(${GOSTD}/path)
  863. PEERDIR(${GOSTD}/reflect)
  864. PEERDIR(vendor/go.uber.org/mock/mockgen/model)
  865. PEERDIR(${MOCKGEN_FROM})
  866. RUN_PROGRAM(vendor/go.uber.org/mock/mockgen -prog_only ${GO_ARCADIA_PROJECT_PREFIX}${MOCKGEN_FROM} $MOCKGEN_TYPES STDOUT main.go)
  867. }
  868. # tag:internal
  869. macro _TOOL(TOOL) {
  870. .CMD=${tool:TOOL}
  871. }
  872. # tag:go-specific
  873. macro GO_MOCKGEN_MOCKS() {
  874. PEERDIR(${GOSTD}/reflect)
  875. PEERDIR(vendor/go.uber.org/mock/gomock)
  876. .CMD=${tool:"vendor/go.uber.org/mock/mockgen"} -package mocks -exec_only $_TOOL($MODDIR/gen) ${GO_ARCADIA_PROJECT_PREFIX}${MOCKGEN_FROM} $MOCKGEN_TYPES ${output;stdout:"main.go"}
  877. }