msvc_compiler.conf 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292
  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-ignored-pragma-optimize \
  66. -Wno-inconsistent-dllimport \
  67. -Wno-int-conversion \
  68. -Wno-invalid-noreturn \
  69. -Wno-logical-op-parentheses \
  70. -Wno-macro-redefined \
  71. -Wno-parentheses \
  72. -Wno-pragma-pack \
  73. -Wno-tautological-constant-out-of-range-compare \
  74. -Wno-unknown-argument \
  75. -Wno-unknown-warning-option
  76. _CXX_WARNINGS_CLANG_CL=\
  77. -Woverloaded-virtual \
  78. -Wimport-preprocessor-directive-pedantic \
  79. -Wno-undefined-var-template
  80. when ($_TC_VERSION_AT_LEAST_2019 == "yes") {
  81. _CXX_WARNINGS_CLANG_CL_2019=\
  82. -Wno-deprecated-volatile \
  83. -Wno-deprecated-anon-enum-enum-conversion \
  84. -Wno-defaulted-function-deleted \
  85. -Wno-deprecated-enum-enum-conversion \
  86. -Wno-ambiguous-reversed-operator \
  87. -Wno-deprecated-enum-float-conversion
  88. }
  89. when ($IDE_MSVS == "yes") {
  90. _CXX_WARNINGS_CLANG_CL_2019_IDE_MSVS=-Wno-unused-command-line-argument
  91. }
  92. }
  93. _C_WARNINGS =$_MSVC_WARNS_AS_ERRORS
  94. _C_WARNINGS+=$_MSVC_WARNS_ENABLED
  95. _C_WARNINGS+=$_MSVC_WARNS_DISABLED
  96. _C_WARNINGS+=$_C_WARNINGS_CLANG_CL
  97. _CXX_WARNINGS =
  98. _CXX_WARNINGS+=$_CXX_WARNINGS_CLANG_CL
  99. _CXX_WARNINGS+=$_CXX_WARNINGS_CLANG_CL_2019
  100. _CXX_WARNINGS+=$_CXX_WARNINGS_CLANG_CL_2019_IDE_MSVS
  101. _WINAPI_UNICODE=no
  102. _DEFINES_ARCH=
  103. when ($ARCH_X86_64 == "yes") {
  104. _DEFINES_ARCH=/D_WIN64 /DWIN64
  105. }
  106. elsewhen ($ARCH_ARMV7 == "yes") {
  107. _DEFINES_ARCH=/D_ARM_WINAPI_PARTITION_DESKTOP_SDK_AVAILABLE /D__arm__
  108. }
  109. _DEFINES_WIN32_WINNT=/D$_MSVC_MACRO=$_MSVC_WINDOWS7
  110. when ($_WINAPI_UNICODE == "yes") {
  111. _DEFINES_UNICODE=/DUNICODE /D_UNICODE
  112. }
  113. otherwise {
  114. _DEFINES_UNICODE=/D_MBCS
  115. }
  116. _C_DEFINES=\
  117. /DARCADIA_ROOT=${ARCADIA_ROOT} \
  118. /DARCADIA_BUILD_ROOT=${ARCADIA_BUILD_ROOT} \
  119. /DFAKEID=$CPP_FAKEID \
  120. /DWIN32 \
  121. /D_WIN32 \
  122. /D_WINDOWS \
  123. /D_CRT_SECURE_NO_WARNINGS \
  124. /D_CRT_NONSTDC_NO_WARNINGS \
  125. /D_USE_MATH_DEFINES \
  126. /D__STDC_CONSTANT_MACROS \
  127. /D__STDC_FORMAT_MACROS \
  128. /D_USING_V110_SDK71_ \
  129. /D_LIBCPP_ENABLE_CXX17_REMOVED_FEATURES \
  130. /DNOMINMAX \
  131. /DWIN32_LEAN_AND_MEAN
  132. _C_DEFINES+=$_DEFINES_ARCH
  133. _C_DEFINES+=$_DEFINES_WIN32_WINNT
  134. _C_DEFINES+=$_DEFINES_UNICODE
  135. C_DEFINES+=$_C_DEFINES
  136. _MSVC_FLAGS_CLANG=
  137. _MSVC_FLAGS_CLANG_ARCH=
  138. _MSVC_FLAGS_CLANG_EQ_2019=
  139. when ($CLANG_CL == "yes") {
  140. # -fcase-insensitive-paths
  141. # Allow <windows.h> to be included via <Windows.h> in case-sensitive file-systems.
  142. #
  143. # -fno-common
  144. # Enable standard-conforming behavior and generate duplicate symbol error in case of duplicated global constants.
  145. # See: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=85678#c0
  146. _MSVC_FLAGS_CLANG=-fcase-insensitive-paths -fno-common
  147. when ($ARCH_X86_64 == "yes") {
  148. _MSVC_FLAGS_CLANG_ARCH=-m64
  149. }
  150. elsewhen ($ARCH_I386 == "yes") {
  151. _MSVC_FLAGS_CLANG_ARCH=-m32
  152. }
  153. otherwise {
  154. _MSVC_FLAGS_CLANG_ARCH=
  155. }
  156. when ($_TC_VERSION_EXACTLY_2019 == "yes") {
  157. # heretic: на момент коммита в нашей конфигурации указано, что тулчейн clang11-windows - аналог msvc 2019
  158. # https://a.yandex-team.ru/arc/trunk/arcadia/build/ya.conf.json?rev=r7910792#L2185
  159. # сам clang11 по дефолту представляется msvc2017 (#define _MSC_VER 1911
  160. # https://a.yandex-team.ru/arc/trunk/arcadia/contrib/libs/clang11/lib/Driver/ToolChains/MSVC.cpp?rev=r7913127#L1352
  161. # вручную заставляем его представляться msvc2019 (#define _MSC_VER 1921)
  162. # значение версии взято вот отсюда:
  163. # https://a.yandex-team.ru/arc/trunk/arcadia/contrib/libs/llvm11/include/llvm/Support/Compiler.h?blame=true&rev=r7913127#L89
  164. _MSVC_FLAGS_CLANG_EQ_2019=-fms-compatibility-version=19.21
  165. }
  166. }
  167. _MSVC_FLAGS=/nologo /Zm500 /GR /bigobj /FC /EHs /errorReport:prompt $MSVC_INLINE_FLAG /utf-8
  168. # enable standard conforming mode
  169. _MSVC_FLAGS+=/permissive-
  170. _MSVC_FLAGS+=$_MSVC_FLAGS_ARCH_OPT
  171. _MSVC_FLAGS+=$_MSVC_FLAGS_CLANG
  172. _MSVC_FLAGS+=$_MSVC_FLAGS_CLANG_ARCH
  173. _MSVC_FLAGS+=$_MSVC_FLAGS_CLANG_EQ_2019
  174. _MSVC_FLAGS+=$_MSVC_FLAGS_INCLUDE
  175. MSVC_INLINE_OPTIMIZED=yes
  176. when ($MSVC_INLINE_OPTIMIZED == "yes") {
  177. MSVC_INLINE_FLAG=/Zc:inline
  178. }
  179. when ($MSVC_INLINE_OPTIMIZED == "no") {
  180. MSVC_INLINE_FLAG=/Zc:inline-
  181. }
  182. # Use builtin offsetof implementation
  183. # instead of a crutcy macro defined in ucrt/stddef.h.
  184. # The latter can not be used in constexpr statements.
  185. _CXX_DEFINES=/D_CRT_USE_BUILTIN_OFFSETOF
  186. _FLAGS_C_ONLY=
  187. # Provide proper __cplusplus value
  188. # https://devblogs.microsoft.com/cppblog/msvc-now-correctly-reports-__cplusplus/
  189. _CXX_FLAGS=/Zc:__cplusplus
  190. _FLAGS_MSVS_ONLY=
  191. DEBUG_INFO_FLAGS=/Z7
  192. when ($IDE_MSVS == "yes") {
  193. when ($CLANG_CL != "yes") {
  194. _FLAGS_MSVS_ONLY=/FD /MP
  195. }
  196. DEBUG_INFO_FLAGS=/Zi /FS
  197. }
  198. C_WARNING_OPTS=$_C_WARNINGS
  199. CXX_WARNING_OPTS=$_CXX_WARNINGS
  200. # https://msdn.microsoft.com/en-us/library/abx4dbyh.aspx
  201. when ($DLL_RUNTIME == "yes") {
  202. _FLAGS_DEBUG_RUNTIME=/MDd
  203. _FLAGS_RELEASE_RUNTIME=/MD
  204. }
  205. otherwise {
  206. _FLAGS_DEBUG_RUNTIME=/MTd
  207. _FLAGS_RELEASE_RUNTIME=/MT
  208. }
  209. CFLAGS_DEBUG=/Ob0 /Od /D_DEBUG $_FLAGS_DEBUG_RUNTIME
  210. CFLAGS_RELEASE=/Ox /Ob2 /Oi /DNDEBUG $_FLAGS_RELEASE_RUNTIME
  211. MASMFLAGS=
  212. _MASM_IO=/nologo /c /Fo${output;suf=${OBJECT_SUF}:SRC} ${input;msvs_source:SRC}
  213. when ($ARCH_ARMV7) {
  214. _MASM_IO=-o ${output;suf=${OBJECT_SUF}:SRC} ${input;msvs_source:SRC}
  215. }
  216. OBJ_CROSS_SUF=$OBJ_SUF
  217. OBJECT_SUF=$OBJ_SUF.obj
  218. CFLAGS+=$_MSVC_FLAGS $_FLAGS_MSVS_ONLY $CFLAGS_PER_TYPE $DEBUG_INFO_FLAGS $C_WARNING_OPTS $C_DEFINES $USER_CFLAGS $USER_CFLAGS_GLOBAL
  219. CXXFLAGS+=$CFLAGS $_STD_CXX $_CXX_FLAGS $_CXX_DEFINES $CXX_WARNING_OPTS $USER_CXXFLAGS $USER_CXXFLAGS_GLOBAL
  220. CONLYFLAGS+=$_FLAGS_C_ONLY $USER_CONLYFLAGS $USER_CONLYFLAGS_GLOBAL
  221. BC_CFLAGS+=$CFLAGS
  222. BC_CXXFLAGS+=$BC_CFLAGS $CXXFLAGS
  223. CFLAGS+=$_CFLAGS_UCRT_VC_INCLUDES
  224. when ($NO_WSHADOW == "yes") {
  225. C_WARNING_OPTS+=/wd4456 /wd4457
  226. }
  227. when ($NO_COMPILER_WARNINGS == "yes") {
  228. C_WARNING_OPTS=/w
  229. when ($CLANG_CL == "yes") {
  230. # Though /w is intended to switch off all the warnings,
  231. # it does not switch at least -Wregister and -Wreserved-user-defined-literal under clang-cl.
  232. #
  233. # Use -Wno-everything to force warning suppression.
  234. CXX_WARNING_OPTS=-Wno-everything
  235. }
  236. otherwise {
  237. CXX_WARNING_OPTS=
  238. }
  239. }
  240. when ($NO_OPTIMIZE == "yes") {
  241. OPTIMIZE=/Od
  242. }
  243. SFDL_FLAG=/E /C /P /TP /Fi$SFDL_TMP_OUT
  244. WERROR_FLAG=/WX
  245. CL_WRAPPER=${YMAKE_PYTHON} ${input:"build/scripts/fix_msvc_output.py"} cl
  246. ML_WRAPPER=${YMAKE_PYTHON} ${input:"build/scripts/fix_msvc_output.py"} ml
  247. when ($_UNDER_WINE == "yes") {
  248. CL_WRAPPER=
  249. ML_WRAPPER=
  250. }
  251. _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"}
  252. _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"}
  253. _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"}
  254. _SRC_M_CMD=$_EMPTY_CMD
  255. _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"}