msvc_linker.conf 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277
  1. LINK_EXE_CMD=${_WINE_LINK_PREFIX} ${_MSVC_LINK}
  2. LINK_LIB_CMD=${_WINE_LIB_PREFIX} ${_MSVC_LIB}
  3. _MSVC_ARCH=
  4. when ($ARCH_I386 == "yes" || $ARCH_I686 == "yes") {
  5. _MSVC_ARCH=x86
  6. }
  7. elsewhen ($ARCH_X86_64 == "yes") {
  8. _MSVC_ARCH=x64
  9. }
  10. elsewhen ($ARCH_ARM == "yes") {
  11. _MSVC_ARCH=arm
  12. }
  13. _FLAGS_MACHINE=/MACHINE:${toupper:_MSVC_ARCH}
  14. _FLAGS_IGNORE=/IGNORE:4221
  15. _FLAGS_COMMON_INCREMENTAL=/INCREMENTAL:NO
  16. # TODO(nslus): DEVTOOLS-1868 remove restriction.
  17. _FLAGS_DEBUG_ONLY_DEBUG=
  18. _FLAGS_RELEASE_ONLY_DEBUG=
  19. _FLAGS_COMMON_DEBUG=
  20. when (!$NO_DEBUGINFO || $NO_DEBUGINFO == "no" || $NO_DEBUGINFO == "0") {
  21. _FLAGS_COMMON_DEBUG=/DEBUG
  22. }
  23. _FLAGS_COMMON_LIBPATHS=\
  24. /LIBPATH:\""${_MSVC_TC_KIT_LIBS}/um/$_MSVC_ARCH"\" \
  25. /LIBPATH:\""${_MSVC_TC_KIT_LIBS}/ucrt/$_MSVC_ARCH"\" \
  26. /LIBPATH:\""${_MSVC_TC_VC_ROOT}/lib/$_MSVC_ARCH"\"
  27. _FLAGS_COMMON =/NOLOGO /ERRORREPORT:PROMPT /SUBSYSTEM:CONSOLE /TLBID:1 $MSVC_DYNAMICBASE /NXCOMPAT
  28. _FLAGS_COMMON+=$_FLAGS_IGNORE
  29. _FLAGS_COMMON+=$_FLAGS_MACHINE
  30. _FLAGS_COMMON+=$_FLAGS_COMMON_INCREMENTAL
  31. _FLAGS_COMMON+=$_FLAGS_COMMON_DEBUG
  32. _FLAGS_COMMON+=$_FLAGS_COMMON_LIBPATHS
  33. _FLAGS_DEBUG_ONLY_CLANG_CL=
  34. when ($CLANG_CL == "yes") {
  35. _FLAGS_DEBUG_ONLY_CLANG_CL=/STACK:4194304
  36. }
  37. _FLAGS_DEBUG_ONLY =$_FLAGS_DEBUG_ONLY_CLANG_CL
  38. _FLAGS_DEBUG_ONLY+=$_FLAGS_DEBUG_ONLY_DEBUG
  39. _FLAGS_RELEASE_ONLY =$_FLAGS_RELEASE_ONLY_DEBUG
  40. LINK_EXE_FLAGS_DEBUG =$_FLAGS_COMMON
  41. LINK_EXE_FLAGS_DEBUG+=$_FLAGS_DEBUG_ONLY
  42. LINK_EXE_FLAGS_RELEASE =$_FLAGS_COMMON
  43. LINK_EXE_FLAGS_RELEASE+=$_FLAGS_RELEASE_ONLY
  44. LINK_LIB_FLAGS=$_FLAGS_IGNORE $_FLAGS_MACHINE
  45. LINK_STDLIBS=\
  46. advapi32.lib \
  47. comdlg32.lib \
  48. crypt32.lib \
  49. dnsapi.lib \
  50. gdi32.lib \
  51. iphlpapi.lib \
  52. kernel32.lib \
  53. mswsock.lib \
  54. ole32.lib \
  55. oleaut32.lib \
  56. psapi.lib \
  57. rpcrt4.lib \
  58. secur32.lib \
  59. shell32.lib \
  60. shlwapi.lib \
  61. user32.lib \
  62. userenv.lib \
  63. uuid.lib \
  64. version.lib \
  65. winmm.lib \
  66. winspool.lib \
  67. ws2_32.lib
  68. LINK_EXE_FLAGS=$LINK_EXE_FLAGS_PER_TYPE
  69. LINK_EXE_VFS_FLAGS=
  70. when ($_UNDER_WINE_LINK != "yes" && $USE_MSVC_LINKER != "yes") {
  71. LINK_EXE_VFS_FLAGS=/vfsoverlay:${BINDIR}/vfsoverlay.yaml
  72. }
  73. LINK_EXE_FLAGS+=${LINK_EXE_VFS_FLAGS}
  74. GENERATE_COMMON_LIB_VFS_CMD=\
  75. ${YMAKE_PYTHON3} ${input:"build/scripts/generate_win_vfs.py"} \
  76. ${BINDIR} \
  77. ${_FLAGS_COMMON_LIBPATHS}
  78. GENERATE_COMMON_LIB_VFS=
  79. when ($_UNDER_WINE_LINK != "yes" && $USE_MSVC_LINKER != "yes") {
  80. GENERATE_COMMON_LIB_VFS=${GENERATE_COMMON_LIB_VFS_CMD}
  81. }
  82. LINK_IMPLIB=/IMPLIB:${rootrel;output;pre=$MODULE_PREFIX;suf=.lib;noext:REALPRJNAME}
  83. _LINK_EXTRA_OUTPUT=
  84. when (!$NO_DEBUGINFO || $NO_DEBUGINFO == "no" || $NO_DEBUGINFO == "0") {
  85. _LINK_EXTRA_OUTPUT=/PDB:${rootrel;output;pre=$MODULE_PREFIX;suf=.pdb;noext:REALPRJNAME}
  86. }
  87. LINK_EXTRA_OUTPUT=$_LINK_EXTRA_OUTPUT
  88. LIB_WRAPPER=${FIX_MSVC_OUTPUT} lib
  89. LINK_WRAPPER=${FIX_MSVC_OUTPUT} link
  90. when ($_UNDER_WINE_LINK == "yes") {
  91. LINK_WRAPPER=
  92. }
  93. when ($_UNDER_WINE_LIB == "yes") {
  94. LIB_WRAPPER=
  95. }
  96. LINK_WRAPPER_DYNLIB=\
  97. ${YMAKE_PYTHON} ${input:"build/scripts/link_dyn_lib.py"} \
  98. --arch WINDOWS \
  99. --target $TARGET
  100. EXPORTS_VALUE=
  101. LINK_IMPLIB_VALUE=
  102. when ($EXPORTS_FILE) {
  103. LINK_IMPLIB_VALUE=$LINK_IMPLIB
  104. EXPORTS_VALUE=/DEF:${input:EXPORTS_FILE}
  105. }
  106. GENERATE_MF_CMD=\
  107. $YMAKE_PYTHON ${input:"build/scripts/generate_mf.py"} ${hide;input:"build/scripts/process_command_files.py"} \
  108. --build-root $ARCADIA_BUILD_ROOT \
  109. --module-name $REALPRJNAME \
  110. -o ${rootrel;output;pre=$MODULE_PREFIX;suf=$MODULE_SUFFIX.mf:REALPRJNAME} \
  111. -t $MODULE_TYPE \
  112. --ya-start-command-file \
  113. -Ya,lics $LICENSE_NAMES \
  114. -Ya,peers ${rootrel:PEERS} \
  115. -Ya,credits ${input:CREDITS_TEXTS_FILE} $CREDITS_FLAGS \
  116. --ya-end-command-file
  117. _EXTRA_OBJS=
  118. _GENERATE_EXTRA_OBJS=
  119. # we split srcs_global into two groups: libs and objs
  120. # # each group can be in its own command file
  121. # first group need /WHOLEARCHIVE: prefix which will be added in fix_msvc_output.py or run_msvc_wine.py
  122. # the tail of link commands will be added in the third command file
  123. _MSVC_SRCS_GLOBALS=\
  124. --start-plugins ${ext=.pyplugin:SRCS_GLOBAL} --end-plugins \
  125. --start-wa --ya-start-command-file ${qe;rootrel;ext=.lib:SRCS_GLOBAL} --ya-end-command-file --end-wa \
  126. --ya-start-command-file ${qe;rootrel;ext=.obj:SRCS_GLOBAL} --ya-end-command-file
  127. REAL_LINK_DYN_LIB_CMDLINE=\
  128. ${GENERATE_COMMON_LIB_VFS} && \
  129. ${TOOLCHAIN_ENV} \
  130. ${cwd:ARCADIA_BUILD_ROOT} \
  131. ${LINK_WRAPPER} \
  132. ${LINK_WRAPPER_DYNLIB} \
  133. ${LINK_EXE_CMD} \
  134. ${LINK_IMPLIB_VALUE} \
  135. /DLL \
  136. /OUT:${qe;rootrel:TARGET} \
  137. ${LINK_EXTRA_OUTPUT} \
  138. ${EXPORTS_VALUE} \
  139. ${pre=--whole-archive-peers :WHOLE_ARCHIVE_PEERS} \
  140. ${pre=--whole-archive-libs :_WHOLE_ARCHIVE_LIBS_VALUE_GLOBAL} \
  141. $_MSVC_SRCS_GLOBALS \
  142. --ya-start-command-file \
  143. ${VCS_C_OBJ_RR} \
  144. ${qe;rootrel:AUTO_INPUT} \
  145. ${qe;rootrel;ext=.lib;tags_cut:PEERS} ${qe;rootrel;ext=.dll;noext;suf=.lib;tags_cut:PEERS} \
  146. $LINK_EXE_FLAGS \
  147. $LINK_STDLIBS $LDFLAGS \
  148. $LDFLAGS_GLOBAL \
  149. $OBJADDE \
  150. --ya-end-command-file
  151. REAL_LINK_DYN_LIB=$REAL_LINK_DYN_LIB_IMPL($_WHOLE_ARCHIVE_PEERS_VALUE)
  152. _MSVC_HEAD_LINK_LIB=${TOOLCHAIN_ENV} ${cwd:ARCADIA_BUILD_ROOT} ${LIB_WRAPPER} ${LINK_LIB_CMD}
  153. _MSVC_TAIL_LINK_LIB=\
  154. --ya-start-command-file \
  155. ${qe;rootrel:AUTO_INPUT} \
  156. $LINK_LIB_FLAGS \
  157. --ya-end-command-file \
  158. ${hide;kv:"soe"} ${hide;kv:"p AR"} ${hide;kv:"pc light-red"}
  159. LINK_LIB=${GENERATE_MF} && $_MSVC_HEAD_LINK_LIB /OUT:${qe;rootrel:TARGET} $_MSVC_TAIL_LINK_LIB
  160. GLOBAL_LINK_LIB=$_MSVC_HEAD_LINK_LIB /OUT:${qe;rootrel:GLOBAL_TARGET} $_MSVC_TAIL_LINK_LIB
  161. LINK_EXE_CMDLINE=\
  162. ${GENERATE_MF} && \
  163. ${_GENERATE_EXTRA_OBJS} && \
  164. $GENERATE_VCS_C_INFO_NODEP && \
  165. ${GENERATE_COMMON_LIB_VFS} && \
  166. ${TOOLCHAIN_ENV} \
  167. ${cwd:ARCADIA_BUILD_ROOT} \
  168. ${LINK_WRAPPER} \
  169. ${LINK_EXE_CMD} \
  170. /OUT:${qe;rootrel:TARGET} \
  171. ${pre=--whole-archive-peers :WHOLE_ARCHIVE_PEERS} \
  172. ${pre=--whole-archive-libs :_WHOLE_ARCHIVE_LIBS_VALUE_GLOBAL} \
  173. ${LINK_EXTRA_OUTPUT} \
  174. $_MSVC_SRCS_GLOBALS \
  175. --ya-start-command-file \
  176. ${VCS_C_OBJ_RR} \
  177. ${_EXTRA_OBJS} \
  178. ${qe;rootrel:AUTO_INPUT} \
  179. $LINK_EXE_FLAGS \
  180. $LINK_STDLIBS \
  181. $LDFLAGS \
  182. $LDFLAGS_GLOBAL \
  183. $OBJADDE \
  184. ${qe;rootrel;ext=.lib;tags_cut:PEERS} ${qe;rootrel;suf=.lib;noext;ext=.dll;tags_cut:PEERS} \
  185. --ya-end-command-file \
  186. ${hide;kv:"soe"} ${hide;kv:"p LD"} ${hide;kv:"pc blue"}
  187. LINK_EXE=$LINK_EXE_IMPL($_WHOLE_ARCHIVE_PEERS_VALUE)
  188. 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"}
  189. LINK_EXEC_DYN_LIB_CMDLINE=\
  190. ${GENERATE_MF} && \
  191. $GENERATE_VCS_C_INFO_NODEP && \
  192. ${GENERATE_COMMON_LIB_VFS} && \
  193. ${TOOLCHAIN_ENV} \
  194. ${cwd:ARCADIA_BUILD_ROOT} \
  195. ${LINK_WRAPPER} \
  196. ${LINK_WRAPPER_DYNLIB} \
  197. ${LINK_EXE_CMD} \
  198. /OUT:${qe;rootrel:TARGET} \
  199. ${LINK_EXTRA_OUTPUT} \
  200. ${EXPORTS_VALUE} \
  201. ${pre=--whole-archive-peers :WHOLE_ARCHIVE_PEERS} \
  202. ${pre=--whole-archive-libs :_WHOLE_ARCHIVE_LIBS_VALUE_GLOBAL} \
  203. $_MSVC_SRCS_GLOBALS \
  204. '--ya-start-command-file \
  205. ${VCS_C_OBJ_RR} \
  206. ${qe;rootrel:AUTO_INPUT} \
  207. ${qe;rootrel;ext=.lib;tags_cut:PEERS} ${qe;rootrel;ext=.dll;noext;suf=.lib;tags_cut:PEERS} \
  208. $LINK_EXE_FLAGS \
  209. $LINK_STDLIBS \
  210. $LDFLAGS $LDFLAGS_GLOBAL \
  211. $OBJADDE \
  212. --ya-end-command-file \
  213. ${hide;kv:"soe"} ${hide;kv:"p LD"} ${hide;kv:"pc blue"}
  214. LINK_EXEC_DYN_LIB=$LINK_EXEC_DYN_LIB_IMPL($_WHOLE_ARCHIVE_PEERS_VALUE)
  215. LINK_GLOBAL_FAT_OBJECT=\
  216. ${TOOLCHAIN_ENV} \
  217. ${cwd:ARCADIA_BUILD_ROOT} \
  218. ${LIB_WRAPPER} \
  219. ${LINK_LIB_CMD} \
  220. /OUT:${qe;rootrel;output;suf=.global.lib:REALPRJNAME} \
  221. --ya-start-command-file \
  222. ${qe;rootrel;ext=.lib:SRCS_GLOBAL} \
  223. ${qe;rootrel;ext=.obj:SRCS_GLOBAL} \
  224. ${qe;rootrel:AUTO_INPUT} \
  225. $LINK_LIB_FLAGS \
  226. --ya-end-command-file
  227. LINK_PEERS_FAT_OBJECT=\
  228. ${TOOLCHAIN_ENV} \
  229. ${cwd:ARCADIA_BUILD_ROOT} \
  230. ${LIB_WRAPPER} \
  231. ${LINK_LIB_CMD} \
  232. /OUT:${qe;rootrel:TARGET} \
  233. --ya-start-command-file \
  234. ${qe;rootrel:PEERS} \
  235. $LINK_LIB_FLAGS \
  236. --ya-end-command-file
  237. LINK_FAT_OBJECT=\
  238. ${GENERATE_MF} && \
  239. $GENERATE_VCS_C_INFO_NODEP && \
  240. $LINK_GLOBAL_FAT_OBJECT && \
  241. $LINK_PEERS_FAT_OBJECT \
  242. ${hide;kv:"p LD"} ${hide;kv:"pc light-blue"} ${hide;kv:"show_out"}