msvc_compiler.conf 9.9 KB

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