msvc_compiler.conf 9.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289
  1. _MSVC_MACRO=_WIN32_WINNT
  2. _MSVC_WINDOWS7=0x0601
  3. _MSVC_WINDOWS8=0x0602
  4. _MSVC_WARNS_ENABLED=
  5. # 'expression' : signed/unsigned mismatch
  6. _MSVC_WARNS_ENABLED+=/w14018
  7. # 'class' : class has virtual functions, but destructor is not virtual
  8. _MSVC_WARNS_ENABLED+=/w14265
  9. # 'operator' : expression is always false
  10. _MSVC_WARNS_ENABLED+=/w14296
  11. # missing type specifier - int assumed
  12. _MSVC_WARNS_ENABLED+=/w14431
  13. _MSVC_WARNS_AS_ERRORS=
  14. # 'function' undefined; assuming extern returning int
  15. _MSVC_WARNS_AS_ERRORS+=/we4013
  16. _MSVC_WARNS_DISABLED=
  17. # conditional expression is constant
  18. _MSVC_WARNS_DISABLED+=/wd4127
  19. # nonstandard extension used : zero-sized array in struct/union
  20. _MSVC_WARNS_DISABLED+=/wd4200
  21. # nonstandard extension used : nameless struct/union
  22. _MSVC_WARNS_DISABLED+=/wd4201
  23. # elements of array will be default initialized
  24. _MSVC_WARNS_DISABLED+=/wd4351
  25. # 'this' : used in base member initializer list
  26. _MSVC_WARNS_DISABLED+=/wd4355
  27. # decorated name length exceeded, name was truncated
  28. _MSVC_WARNS_DISABLED+=/wd4503
  29. # default constructor could not be generated
  30. _MSVC_WARNS_DISABLED+=/wd4510
  31. # copy constructor could not be generated
  32. _MSVC_WARNS_DISABLED+=/wd4511
  33. # assignment operator could not be generated
  34. _MSVC_WARNS_DISABLED+=/wd4512
  35. # check operator precedence for possible error; use parentheses to clarify precedence
  36. _MSVC_WARNS_DISABLED+=/wd4554
  37. # 'object' can never be instantiated - user defined constructor required
  38. _MSVC_WARNS_DISABLED+=/wd4610
  39. # assignment within conditional expression
  40. _MSVC_WARNS_DISABLED+=/wd4706
  41. # forcing value to bool 'true' or 'false' (performance warning)
  42. _MSVC_WARNS_DISABLED+=/wd4800
  43. # The POSIX name for this item is deprecated
  44. _MSVC_WARNS_DISABLED+=/wd4996
  45. # function marked as __forceinline not inlined
  46. _MSVC_WARNS_DISABLED+=/wd4714
  47. # 'TAtomic' : top-level volatile in cast is ignored
  48. _MSVC_WARNS_DISABLED+=/wd4197
  49. # 'initializing' : conversion from 'int' to 'ui32', signed/unsigned mismatch
  50. _MSVC_WARNS_DISABLED+=/wd4245
  51. # 'ystd::function<void (uint8_t *)>': structure was padded due to alignment specifier
  52. _MSVC_WARNS_DISABLED+=/wd4324
  53. # 'register' is no longer a supported storage class
  54. _MSVC_WARNS_DISABLED+=/wd5033
  55. _C_WARNINGS_CLANG_CL=
  56. _CXX_WARNINGS_CLANG_CL=
  57. _CXX_WARNINGS_CLANG_CL_2019=
  58. _CXX_WARNINGS_CLANG_CL_2019_IDE_MSVS=
  59. when ($CLANG_CL == "yes") {
  60. _C_WARNINGS_CLANG_CL=\
  61. -Wno-bitwise-op-parentheses \
  62. -Wno-dll-attribute-on-redeclaration \
  63. -Wno-extern-initializer \
  64. -Wno-format \
  65. -Wno-inconsistent-dllimport \
  66. -Wno-int-conversion \
  67. -Wno-logical-op-parentheses \
  68. -Wno-macro-redefined \
  69. -Wno-parentheses \
  70. -Wno-pragma-pack \
  71. -Wno-unknown-argument \
  72. -Wno-unknown-warning-option
  73. _CXX_WARNINGS_CLANG_CL=\
  74. -Woverloaded-virtual \
  75. -Wimport-preprocessor-directive-pedantic \
  76. -Wno-undefined-var-template
  77. when ($_TC_VERSION_AT_LEAST_2019 == "yes") {
  78. _CXX_WARNINGS_CLANG_CL_2019=\
  79. -Wno-deprecated-volatile \
  80. -Wno-deprecated-anon-enum-enum-conversion \
  81. -Wno-defaulted-function-deleted \
  82. -Wno-deprecated-enum-enum-conversion \
  83. -Wno-ambiguous-reversed-operator \
  84. -Wno-deprecated-enum-float-conversion
  85. }
  86. when ($IDE_MSVS == "yes") {
  87. _CXX_WARNINGS_CLANG_CL_2019_IDE_MSVS=-Wno-unused-command-line-argument
  88. }
  89. }
  90. _C_WARNINGS =$_MSVC_WARNS_AS_ERRORS
  91. _C_WARNINGS+=$_MSVC_WARNS_ENABLED
  92. _C_WARNINGS+=$_MSVC_WARNS_DISABLED
  93. _C_WARNINGS+=$_C_WARNINGS_CLANG_CL
  94. _CXX_WARNINGS =
  95. _CXX_WARNINGS+=$_CXX_WARNINGS_CLANG_CL
  96. _CXX_WARNINGS+=$_CXX_WARNINGS_CLANG_CL_2019
  97. _CXX_WARNINGS+=$_CXX_WARNINGS_CLANG_CL_2019_IDE_MSVS
  98. _WINAPI_UNICODE=no
  99. _DEFINES_ARCH=
  100. when ($ARCH_X86_64 == "yes") {
  101. _DEFINES_ARCH=/D_WIN64 /DWIN64
  102. }
  103. elsewhen ($ARCH_ARMV7 == "yes") {
  104. _DEFINES_ARCH=/D_ARM_WINAPI_PARTITION_DESKTOP_SDK_AVAILABLE /D__arm__
  105. }
  106. _DEFINES_WIN32_WINNT=/D$_MSVC_MACRO=$_MSVC_WINDOWS7
  107. when ($_WINAPI_UNICODE == "yes") {
  108. _DEFINES_UNICODE=/DUNICODE /D_UNICODE
  109. }
  110. otherwise {
  111. _DEFINES_UNICODE=/D_MBCS
  112. }
  113. _C_DEFINES=\
  114. /DARCADIA_ROOT=${ARCADIA_ROOT} \
  115. /DARCADIA_BUILD_ROOT=${ARCADIA_BUILD_ROOT} \
  116. /DFAKEID=$CPP_FAKEID \
  117. /DWIN32 \
  118. /D_WIN32 \
  119. /D_WINDOWS \
  120. /D_CRT_SECURE_NO_WARNINGS \
  121. /D_CRT_NONSTDC_NO_WARNINGS \
  122. /D_USE_MATH_DEFINES \
  123. /D__STDC_CONSTANT_MACROS \
  124. /D__STDC_FORMAT_MACROS \
  125. /D_USING_V110_SDK71_ \
  126. /D_LIBCPP_ENABLE_CXX17_REMOVED_FEATURES \
  127. /DNOMINMAX \
  128. /DWIN32_LEAN_AND_MEAN
  129. _C_DEFINES+=$_DEFINES_ARCH
  130. _C_DEFINES+=$_DEFINES_WIN32_WINNT
  131. _C_DEFINES+=$_DEFINES_UNICODE
  132. C_DEFINES+=$_C_DEFINES
  133. _MSVC_FLAGS_CLANG=
  134. _MSVC_FLAGS_CLANG_ARCH=
  135. _MSVC_FLAGS_CLANG_EQ_2019=
  136. when ($CLANG_CL == "yes") {
  137. # -fcase-insensitive-paths
  138. # Allow <windows.h> to be included via <Windows.h> in case-sensitive file-systems.
  139. #
  140. # -fno-common
  141. # Enable standard-conforming behavior and generate duplicate symbol error in case of duplicated global constants.
  142. # See: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=85678#c0
  143. _MSVC_FLAGS_CLANG=-fcase-insensitive-paths -fno-common
  144. when ($ARCH_X86_64 == "yes") {
  145. _MSVC_FLAGS_CLANG_ARCH=-m64
  146. }
  147. elsewhen ($ARCH_I386 == "yes") {
  148. _MSVC_FLAGS_CLANG_ARCH=-m32
  149. }
  150. otherwise {
  151. _MSVC_FLAGS_CLANG_ARCH=
  152. }
  153. when ($_TC_VERSION_EXACTLY_2019 == "yes") {
  154. # heretic: на момент коммита в нашей конфигурации указано, что тулчейн clang11-windows - аналог msvc 2019
  155. # https://a.yandex-team.ru/arc/trunk/arcadia/build/ya.conf.json?rev=r7910792#L2185
  156. # сам clang11 по дефолту представляется msvc2017 (#define _MSC_VER 1911
  157. # https://a.yandex-team.ru/arc/trunk/arcadia/contrib/libs/clang11/lib/Driver/ToolChains/MSVC.cpp?rev=r7913127#L1352
  158. # вручную заставляем его представляться msvc2019 (#define _MSC_VER 1921)
  159. # значение версии взято вот отсюда:
  160. # https://a.yandex-team.ru/arc/trunk/arcadia/contrib/libs/llvm11/include/llvm/Support/Compiler.h?blame=true&rev=r7913127#L89
  161. _MSVC_FLAGS_CLANG_EQ_2019=-fms-compatibility-version=19.21
  162. }
  163. }
  164. _MSVC_FLAGS=/nologo /Zm500 /GR /bigobj /FC /EHs /errorReport:prompt $MSVC_INLINE_FLAG /utf-8
  165. # enable standard conforming mode
  166. _MSVC_FLAGS+=/permissive-
  167. _MSVC_FLAGS+=$_MSVC_FLAGS_ARCH_OPT
  168. _MSVC_FLAGS+=$_MSVC_FLAGS_CLANG
  169. _MSVC_FLAGS+=$_MSVC_FLAGS_CLANG_ARCH
  170. _MSVC_FLAGS+=$_MSVC_FLAGS_CLANG_EQ_2019
  171. _MSVC_FLAGS+=$_MSVC_FLAGS_INCLUDE
  172. MSVC_INLINE_OPTIMIZED=yes
  173. when ($MSVC_INLINE_OPTIMIZED == "yes") {
  174. MSVC_INLINE_FLAG=/Zc:inline
  175. }
  176. when ($MSVC_INLINE_OPTIMIZED == "no") {
  177. MSVC_INLINE_FLAG=/Zc:inline-
  178. }
  179. # Use builtin offsetof implementation
  180. # instead of a crutcy macro defined in ucrt/stddef.h.
  181. # The latter can not be used in constexpr statements.
  182. _CXX_DEFINES=/D_CRT_USE_BUILTIN_OFFSETOF
  183. _FLAGS_C_ONLY=
  184. # Provide proper __cplusplus value
  185. # https://devblogs.microsoft.com/cppblog/msvc-now-correctly-reports-__cplusplus/
  186. _CXX_FLAGS=/Zc:__cplusplus
  187. _FLAGS_MSVS_ONLY=
  188. DEBUG_INFO_FLAGS=/Z7
  189. when ($IDE_MSVS == "yes") {
  190. when ($CLANG_CL != "yes") {
  191. _FLAGS_MSVS_ONLY=/FD /MP
  192. }
  193. DEBUG_INFO_FLAGS=/Zi /FS
  194. }
  195. C_WARNING_OPTS=$_C_WARNINGS
  196. CXX_WARNING_OPTS=$_CXX_WARNINGS
  197. # https://msdn.microsoft.com/en-us/library/abx4dbyh.aspx
  198. when ($DLL_RUNTIME == "yes") {
  199. _FLAGS_DEBUG_RUNTIME=/MDd
  200. _FLAGS_RELEASE_RUNTIME=/MD
  201. }
  202. otherwise {
  203. _FLAGS_DEBUG_RUNTIME=/MTd
  204. _FLAGS_RELEASE_RUNTIME=/MT
  205. }
  206. CFLAGS_DEBUG=/Ob0 /Od /D_DEBUG $_FLAGS_DEBUG_RUNTIME
  207. CFLAGS_RELEASE=/Ox /Ob2 /Oi /DNDEBUG $_FLAGS_RELEASE_RUNTIME
  208. MASMFLAGS=
  209. _MASM_IO=/nologo /c /Fo${output;suf=${OBJECT_SUF}:SRC} ${input;msvs_source:SRC}
  210. when ($ARCH_ARMV7) {
  211. _MASM_IO=-o ${output;suf=${OBJECT_SUF}:SRC} ${input;msvs_source:SRC}
  212. }
  213. OBJ_CROSS_SUF=$OBJ_SUF
  214. OBJECT_SUF=$OBJ_SUF.obj
  215. CFLAGS+=$_MSVC_FLAGS $_FLAGS_MSVS_ONLY $CFLAGS_PER_TYPE $DEBUG_INFO_FLAGS $C_WARNING_OPTS $C_DEFINES $USER_CFLAGS $USER_CFLAGS_GLOBAL
  216. CXXFLAGS+=$CFLAGS $_STD_CXX $_CXX_FLAGS $_CXX_DEFINES $CXX_WARNING_OPTS $USER_CXXFLAGS $USER_CXXFLAGS_GLOBAL
  217. CONLYFLAGS+=$_FLAGS_C_ONLY $USER_CONLYFLAGS $USER_CONLYFLAGS_GLOBAL
  218. BC_CFLAGS+=$CFLAGS
  219. BC_CXXFLAGS+=$BC_CFLAGS $CXXFLAGS
  220. CFLAGS+=$_CFLAGS_UCRT_VC_INCLUDES
  221. when ($NO_WSHADOW == "yes") {
  222. C_WARNING_OPTS+=/wd4456 /wd4457
  223. }
  224. when ($NO_COMPILER_WARNINGS == "yes") {
  225. C_WARNING_OPTS=/w
  226. when ($CLANG_CL == "yes") {
  227. # Though /w is intended to switch off all the warnings,
  228. # it does not switch at least -Wregister and -Wreserved-user-defined-literal under clang-cl.
  229. #
  230. # Use -Wno-everything to force warning suppression.
  231. CXX_WARNING_OPTS=-Wno-everything
  232. }
  233. otherwise {
  234. CXX_WARNING_OPTS=
  235. }
  236. }
  237. when ($NO_OPTIMIZE == "yes") {
  238. OPTIMIZE=/Od
  239. }
  240. SFDL_FLAG=/E /C /P /TP /Fi$SFDL_TMP_OUT
  241. WERROR_FLAG=/WX
  242. CL_WRAPPER=${YMAKE_PYTHON} ${input:"build/scripts/fix_msvc_output.py"} cl
  243. ML_WRAPPER=${YMAKE_PYTHON} ${input:"build/scripts/fix_msvc_output.py"} ml
  244. when ($_UNDER_WINE == "yes") {
  245. CL_WRAPPER=
  246. ML_WRAPPER=
  247. }
  248. _SRC_C_NODEPS_CMD=${TOOLCHAIN_ENV} ${CL_WRAPPER} ${C_COMPILER} /c /Fo${OUTFILE} ${SRC} ${EXTRA_C_FLAGS} ${pre=/I :INC} ${CFLAGS} ${requirements;hide:CC_REQUIREMENTS} ${hide;kv:"soe"} ${hide;kv:"p CC"} ${hide;kv:"pc yellow"}
  249. _SRC_CPP_CMD=${TOOLCHAIN_ENV} ${CL_WRAPPER} ${CXX_COMPILER} /c /Fo$_COMPILE_OUTPUTS ${input;msvs_source:SRC} ${EXTRA_C_FLAGS} ${pre=/I :_C__INCLUDE} ${CXXFLAGS} ${SRCFLAGS} ${_LANG_CFLAGS_VALUE} ${requirements;hide:CC_REQUIREMENTS} ${hide;kv:"soe"} ${hide;kv:"p CC"} ${hide;kv:"pc yellow"}
  250. _SRC_C_CMD=${TOOLCHAIN_ENV} ${CL_WRAPPER} ${C_COMPILER} /c /Fo$_COMPILE_OUTPUTS ${input;msvs_source:SRC} ${EXTRA_C_FLAGS} ${pre=/I :_C__INCLUDE} ${CFLAGS} ${CONLYFLAGS} ${SRCFLAGS} ${requirements;hide:CC_REQUIREMENTS} ${hide;kv:"soe"} ${hide;kv:"p CC"} ${hide;kv:"pc yellow"}
  251. _SRC_M_CMD=$_EMPTY_CMD
  252. _SRC_MASM_CMD=${cwd:ARCADIA_BUILD_ROOT} ${TOOLCHAIN_ENV} ${ML_WRAPPER} ${MASM_COMPILER} ${MASMFLAGS} ${SRCFLAGS} $_MASM_IO ${requirements;hide:CC_REQUIREMENTS} ${kv;hide:"p AS"} ${kv;hide:"pc yellow"}