go.conf 36 KB

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