2 if("${CMAKE_SYSTEM_NAME}" STREQUAL "FreeBSD")
6 if("${CMAKE_SYSTEM_NAME}" STREQUAL "Linux")
10 if("${CMAKE_SYSTEM_NAME}" STREQUAL "Darwin")
14 if("${CMAKE_SYSTEM_NAME}" STREQUAL "Windows")
18 # Do this until cmake has a define for ARMv8
19 INCLUDE(CheckCXXSourceCompiles)
20 CHECK_CXX_SOURCE_COMPILES("
24 int main() { return 0; }" IS_X64)
26 CHECK_CXX_SOURCE_COMPILES("
30 int main() { return 0; }" IS_AARCH64)
33 if (${CMAKE_CXX_COMPILER_ID} STREQUAL "Clang" OR ${CMAKE_CXX_COMPILER_ID} STREQUAL "GNU")
34 # Warnings to disable by name, -Wno-${name}
35 set(DISABLED_NAMED_WARNINGS)
36 list(APPEND DISABLED_NAMED_WARNINGS
46 "unused-local-typedefs"
51 # Warnings to disable by name when building C code.
52 set(DISABLED_C_NAMED_WARNINGS)
53 list(APPEND DISABLED_C_NAMED_WARNINGS
54 "missing-field-initializers"
58 # General options to pass to both C & C++ compilers
61 # General options to pass to the C++ compiler
62 set(GENERAL_CXX_OPTIONS)
63 list(APPEND GENERAL_CXX_OPTIONS
65 "fno-omit-frame-pointer"
69 "Werror=format-security"
72 # Options to pass for debug mode to the C++ compiler
73 set(DEBUG_CXX_OPTIONS)
75 # Options to pass for release mode to the C++ compiler
76 set(RELEASE_CXX_OPTIONS)
78 # Suboption of -g in debug mode
81 # Enable GCC/LLVM stack-smashing protection
83 list(APPEND GENERAL_OPTIONS
84 # This needs two dashes in the name, so put one here.
85 "-param=ssp-buffer-size=4"
91 if (${CMAKE_CXX_COMPILER_ID} STREQUAL "Clang" OR ${CMAKE_CXX_COMPILER_ID} STREQUAL "AppleClang") # using Clang
93 list(APPEND GENERAL_OPTIONS
94 # For unclear reasons, our detection for what crc32 intrinsics you have
95 # will cause clang to ICE. Specifying a baseline here works around the
96 # issue. (SSE4.2 has been available on processors for quite some time now.)
99 # Also need to pass the right option to ASM files to avoid inconsistencies
100 # in CRC hash function handling
101 set(CMAKE_ASM_FLAGS "${CMAKE_ASM_FLAGS} -msse4.2")
104 list(APPEND GENERAL_CXX_OPTIONS
107 list(APPEND DISABLED_C_NAMED_WARNINGS
108 "unused-command-line-argument"
110 list(APPEND DISABLED_NAMED_WARNINGS
111 "return-type-c-linkage"
112 "unknown-warning-option"
113 "unused-command-line-argument"
116 # Enabled GCC/LLVM stack-smashing protection
118 if(CMAKE_CXX_COMPILER_VERSION VERSION_GREATER 3.6 OR
119 CMAKE_CXX_COMPILER_VERSION VERSION_EQUAL 3.6)
120 list(APPEND GENERAL_OPTIONS "fstack-protector-strong")
122 list(APPEND GENERAL_OPTIONS "fstack-protector")
126 if(CLANG_FORCE_LIBSTDCXX)
127 list(APPEND GENERAL_CXX_OPTIONS "stdlib=libstdc++")
129 list(APPEND GENERAL_CXX_OPTIONS "stdlib=libc++")
132 list(APPEND DISABLED_NAMED_WARNINGS
133 "deprecated-declarations"
134 "maybe-uninitialized"
136 list(APPEND DISABLED_C_NAMED_WARNINGS
137 "maybe-uninitialized"
138 "old-style-declaration"
140 list(APPEND GENERAL_OPTIONS
143 list(APPEND GENERAL_CXX_OPTIONS
146 "fno-canonical-system-headers"
149 list(APPEND RELEASE_CXX_OPTIONS
150 "-param max-inline-insns-auto=100"
151 "-param early-inlining-insns=200"
152 "-param max-early-inliner-iterations=50"
153 "-param=inline-unit-growth=200"
154 "-param=large-unit-insns=10000"
157 # Fix problem with GCC 4.9, https://kb.isc.org/article/AA-01167
158 if(CMAKE_CXX_COMPILER_VERSION VERSION_GREATER 4.9 OR
159 CMAKE_CXX_COMPILER_VERSION VERSION_EQUAL 4.9)
160 list(APPEND GENERAL_OPTIONS "fno-delete-null-pointer-checks")
162 message(FATAL_ERROR "${PROJECT_NAME} requires g++ 4.9 or greater.")
165 # Warn about a GCC 4.9 bug leading to an incorrect refcounting issue
166 # https://github.com/facebook/hhvm/issues/8011
167 if(CMAKE_CXX_COMPILER_VERSION VERSION_LESS 7.4)
168 message(WARNING "HHVM is primarily tested on GCC 7.4-10.3. Using other versions may produce unexpected results, or may not even build at all.")
171 if(CMAKE_CXX_COMPILER_VERSION VERSION_GREATER 10.3 OR
172 CMAKE_CXX_COMPILER_VERSION VERSION_EQUAL 10.3)
173 message(WARNING "HHVM is primarily tested on GCC 7.4-10.3. Using other versions may produce unexpected results, or may not even build at all.")
176 if(CMAKE_CXX_COMPILER_VERSION VERSION_GREATER 5.1 OR
177 CMAKE_CXX_COMPILER_VERSION VERSION_EQUAL 5.1)
178 list(APPEND DISABLED_NAMED_WARNINGS "bool-compare")
179 list(APPEND GENERAL_OPTIONS "DFOLLY_HAVE_MALLOC_H")
182 if(CMAKE_CXX_COMPILER_VERSION VERSION_GREATER 6.0 OR
183 CMAKE_CXX_COMPILER_VERSION VERSION_EQUAL 6.0)
184 list(APPEND GENERAL_CXX_OPTIONS "Wno-misleading-indentation")
187 # Enabled GCC/LLVM stack-smashing protection
189 if(CMAKE_CXX_COMPILER_VERSION VERSION_GREATER 4.8 OR
190 CMAKE_CXX_COMPILER_VERSION VERSION_EQUAL 4.8)
192 # https://isisblogs.poly.edu/2011/06/01/relro-relocation-read-only/
193 list(APPEND GENERAL_OPTIONS "Wl,-z,relro,-z,now")
195 if(CMAKE_CXX_COMPILER_VERSION VERSION_GREATER 4.9 OR
196 CMAKE_CXX_COMPILER_VERSION VERSION_EQUAL 4.9)
197 list(APPEND GENERAL_OPTIONS "fstack-protector-strong")
200 list(APPEND GENERAL_OPTIONS "fstack-protector")
206 list(APPEND GENERAL_CXX_OPTIONS "mcrc32")
208 list(APPEND GENERAL_CXX_OPTIONS
209 # SSE4.2 has been available on processors for quite some time now. This
210 # allows enabling CRC hash function code
213 # Also pass the right option to ASM files to avoid inconsistencies
214 # in CRC hash function handling
215 set(CMAKE_ASM_FLAGS "${CMAKE_ASM_FLAGS} -msse4.2")
221 # Force char type to be signed, which is not the case on aarch64.
222 list(APPEND GENERAL_OPTIONS "fsigned-char")
224 # If a CPU was specified, build a -mcpu option for the compiler.
225 set(AARCH64_TARGET_CPU "" CACHE STRING "CPU to tell gcc to optimize for (-mcpu)")
226 if(AARCH64_TARGET_CPU)
227 list(APPEND GENERAL_OPTIONS "mcpu=${AARCH64_TARGET_CPU}")
228 set(CMAKE_ASM_FLAGS "${CMAKE_ASM_FLAGS} -mcpu=${AARCH64_TARGET_CPU}")
230 # Make sure GCC is not using the fix for errata 843419. This change
231 # interferes with the gold linker. Note that GCC applies this fix
232 # even if you specify an mcpu other than cortex-a53, which is why
233 # it's explicitly being disabled here for any cpu other than
234 # cortex-a53. If you're running a newer pass of the cortex-a53, then
235 # you can likely disable this fix with the following flag too. YMMV
236 if(NOT ${AARCH64_TARGET_CPU} STREQUAL "cortex-a53")
237 list(APPEND GENERAL_OPTIONS "mno-fix-cortex-a53-843419")
243 set(CMAKE_EXE_LINKER_FLAGS "-static-libgcc -static-libstdc++")
246 if (ENABLE_SPLIT_DWARF)
247 set(GDB_SUBOPTION "split-dwarf")
251 # No optimizations for debug builds.
252 # -Og enables some optimizations, but makes debugging harder by optimizing
253 # away some functions and locals. -O0 is more debuggable.
254 # -O0-ggdb was reputed to cause gdb to crash (github #4450)
255 set(CMAKE_C_FLAGS_DEBUG "-O0 -g${GDB_SUBOPTION}")
256 set(CMAKE_CXX_FLAGS_DEBUG "-O0 -g${GDB_SUBOPTION}")
257 set(CMAKE_C_FLAGS_DEBUGOPT "-O2 -g${GDB_SUBOPTION}")
258 set(CMAKE_CXX_FLAGS_DEBUGOPT "-O2 -g${GDB_SUBOPTION}")
259 set(CMAKE_C_FLAGS_MINSIZEREL "-Os -DNDEBUG")
260 set(CMAKE_CXX_FLAGS_MINSIZEREL "-Os -DNDEBUG")
261 set(CMAKE_C_FLAGS_RELEASE "-O3 -DNDEBUG")
262 set(CMAKE_CXX_FLAGS_RELEASE "-O3 -DNDEBUG")
263 set(CMAKE_C_FLAGS_RELWITHDEBINFO "-O2 -g${GDB_SUBOPTION} -DNDEBUG")
264 set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "-O2 -g${GDB_SUBOPTION} -DNDEBUG")
265 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -W -Werror=implicit-function-declaration")
267 mark_as_advanced(CMAKE_C_FLAGS_DEBUGOPT CMAKE_CXX_FLAGS_DEBUGOPT)
269 foreach(opt ${DISABLED_NAMED_WARNINGS})
270 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-${opt}")
273 foreach(opt ${DISABLED_C_NAMED_WARNINGS})
274 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-${opt}")
277 foreach(opt ${GENERAL_OPTIONS})
278 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -${opt}")
279 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -${opt}")
282 foreach(opt ${GENERAL_CXX_OPTIONS})
283 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -${opt}")
286 foreach(opt ${DEBUG_CXX_OPTIONS})
287 set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -${opt}")
290 foreach(opt ${RELEASE_CXX_OPTIONS})
291 set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -${opt}")
294 # The ASM part of this makes it more effort than it's worth
295 # to add these to the general flags system.
297 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -mavx2 -march=core-avx2")
298 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mavx2 -march=core-avx2")
299 set(CMAKE_ASM_FLAGS "${CMAKE_ASM_FLAGS} -mavx2 -march=core-avx2")
302 elseif (${CMAKE_CXX_COMPILER_ID} STREQUAL "Intel")
303 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -no-ipo -fp-model precise -wd584 -wd1418 -wd1918 -wd383 -wd869 -wd981 -wd424 -wd1419 -wd444 -wd271 -wd2259 -wd1572 -wd1599 -wd82 -wd177 -wd593 -w")
304 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -no-ipo -fp-model precise -wd584 -wd1418 -wd1918 -wd383 -wd869 -wd981 -wd424 -wd1419 -wd444 -wd271 -wd2259 -wd1572 -wd1599 -wd82 -wd177 -wd593 -fno-omit-frame-pointer -Wall -Woverloaded-virtual -Wno-deprecated -w1 -Wno-strict-aliasing -Wno-write-strings -Wno-invalid-offsetof -fno-operator-names")
305 # using Visual Studio C++
306 elseif (${CMAKE_CXX_COMPILER_ID} STREQUAL "MSVC")
307 message(WARNING "MSVC support is VERY experimental. It will likely not compile, and is intended for the utterly insane.")
309 ############################################################
310 # First we setup and account for the option sets.
311 ############################################################
313 set(MSVC_GENERAL_OPTIONS)
314 set(MSVC_DISABLED_WARNINGS)
315 set(MSVC_WARNINGS_AS_ERRORS)
316 set(MSVC_ADDITIONAL_DEFINES)
317 set(MSVC_EXE_LINKER_OPTIONS)
318 set(MSVC_DEBUG_OPTIONS)
319 set(MSVC_RELEASE_OPTIONS)
320 set(MSVC_RELEASE_LINKER_OPTIONS)
321 set(MSVC_DEBUG_EXE_LINKER_OPTIONS)
322 set(MSVC_RELEASE_EXE_LINKER_OPTIONS)
324 # Some additional configuration options.
325 set(MSVC_ENABLE_ALL_WARNINGS ON CACHE BOOL "If enabled, pass /Wall to the compiler.")
326 set(MSVC_ENABLE_DEBUG_INLINING ON CACHE BOOL "If enabled, enable inlining in the debug configuration. This allows /Zc:inline to be far more effective, resulting in hphp_runtime_static being ~450mb smaller.")
327 set(MSVC_ENABLE_LTCG OFF CACHE BOOL "If enabled, use Link Time Code Generation for Release builds.")
328 set(MSVC_ENABLE_PARALLEL_BUILD ON CACHE BOOL "If enabled, build multiple source files in parallel.")
329 set(MSVC_ENABLE_PCH ON CACHE BOOL "If enabled, use precompiled headers to speed up the build.")
330 set(MSVC_ENABLE_STATIC_ANALYSIS OFF CACHE BOOL "If enabled, do more complex static analysis and generate warnings appropriately.")
331 set(MSVC_FAVORED_ARCHITECTURE "blend" CACHE STRING "One of 'blend', 'AMD64', 'INTEL64', or 'ATOM'. This tells the compiler to generate code optimized to run best on the specified architecture.")
333 # The general options passed:
334 list(APPEND MSVC_GENERAL_OPTIONS
335 "bigobj" # Support objects with > 65k sections. Needed for folly due to templates.
336 "fp:precise" # Precise floating point model used in every other build, use it here as well.
337 "EHa" # Enable both SEH and C++ Exceptions.
338 "Oy-" # Disable elimination of stack frames.
339 "Zc:inline" # Have the compiler eliminate unreferenced COMDAT functions and data before emitting the object file. This produces significantly less input to the linker, resulting in MUCH faster linking.
340 "Zo" # Enable enhanced optimized debugging. Produces slightly larger pdb files, but the resulting optimized code is much much easier to debug.
343 # Enable all warnings if requested.
344 if (MSVC_ENABLE_ALL_WARNINGS)
345 list(APPEND MSVC_GENERAL_OPTIONS "Wall")
348 # Enable static analysis if requested.
349 if (MSVC_ENABLE_STATIC_ANALYSIS)
350 list(APPEND MSVC_GENERAL_OPTIONS "analyze")
353 # Enable multi-processor compilation if requested.
354 if (MSVC_ENABLE_PARALLEL_BUILD)
355 list(APPEND MSVC_GENERAL_OPTIONS "MP")
358 # Enable AVX2 codegen if available and requested.
360 list(APPEND MSVC_GENERAL_OPTIONS "arch:AVX2")
363 # Validate, and then add the favored architecture.
364 if (NOT MSVC_FAVORED_ARCHITECTURE STREQUAL "blend" AND NOT MSVC_FAVORED_ARCHITECTURE STREQUAL "AMD64" AND NOT MSVC_FAVORED_ARCHITECTURE STREQUAL "INTEL64" AND NOT MSVC_FAVORED_ARCHITECTURE STREQUAL "ATOM")
365 message(FATAL_ERROR "MSVC_FAVORED_ARCHITECTURE must be set to one of exactly, 'blend', 'AMD64', 'INTEL64', or 'ATOM'! Got '${MSVC_FAVORED_ARCHITECTURE}' instead!")
367 list(APPEND MSVC_GENERAL_OPTIONS "favor:${MSVC_FAVORED_ARCHITECTURE}")
369 # The warnings that are disabled:
370 list(APPEND MSVC_DISABLED_WARNINGS
371 "4068" # Unknown pragma.
372 "4091" # 'typedef' ignored on left of '' when no variable is declared.
373 "4101" # Unused variables
374 "4103" # Alignment changed after including header. This is needed because boost includes an ABI header that does some #pragma pack push/pop stuff, and we've passed our own packing
375 "4146" # Unary minus applied to unsigned type, result still unsigned.
376 "4250" # Function was inherited via dominance.
377 "4800" # Values being forced to bool, this happens many places, and is a "performance warning".
380 if (MSVC_ENABLE_ALL_WARNINGS)
381 # These warnings are disabled because we've
382 # enabled all warnings. If all warnings are
383 # not enabled, then these don't need to be
385 list(APPEND MSVC_DISABLED_WARNINGS
386 "4061" # Enum value not handled by a case in a switch on an enum. This isn't very helpful because it is produced even if a default statement is present.
387 "4100" # Unreferenced formal parameter.
388 "4127" # Conditional expression is constant.
389 "4131" # Old style declarator used. This is triggered by ext_bc's backend code.
390 "4189" # Local variable is initialized but not referenced.
391 "4191" # Unsafe type cast.
392 "4200" # Non-standard extension, zero sized array.
393 "4201" # Non-standard extension used: nameless struct/union.
394 "4232" # Non-standard extension used: 'pCurrent': address of dllimport.
395 "4245" # Implicit change from signed/unsigned when initializing.
396 "4255" # Implicitly converting function prototype from `()` to `(void)`.
397 "4265" # Class has virtual functions, but destructor is not virtual.
398 "4287" # Unsigned/negative constant mismatch.
399 "4296" # '<' Expression is always false.
400 "4315" # 'this' pointer for member may not be aligned to 8 bytes as expected by the constructor.
401 "4324" # Structure was padded due to alignment specifier.
402 "4355" # 'this' used in base member initializer list.
403 "4365" # Signed/unsigned mismatch.
404 "4371" # Layout of class may have changed due to fixes in packing.
405 "4388" # Signed/unsigned mismatch on relative comparison operator.
406 "4389" # Signed/unsigned mismatch on equality comparison operator.
407 "4435" # Object layout under /vd2 will change due to virtual base.
408 "4456" # Declaration of local hides previous definition of local by the same name.
409 "4457" # Declaration of local hides function parameter.
410 "4458" # Declaration of parameter hides class member.
411 "4459" # Declaration of parameter hides global declaration.
412 "4464" # Relative include path contains "..". This is triggered by the TBB headers.
413 "4505" # Unreferenced local function has been removed. This is mostly the result of things not being needed under MSVC.
414 "4514" # Unreferenced inline function has been removed. (caused by /Zc:inline)
415 "4548" # Expression before comma has no effect. I wouldn't disable this normally, but malloc.h triggers this warning.
416 "4555" # Expression has no effect; expected expression with side-effect. This is triggered by boost/variant.hpp.
417 "4574" # ifdef'd macro was defined to 0.
418 "4582" # Constructor is not implicitly called.
419 "4583" # Destructor is not implicitly called.
420 "4608" # Member has already been initialized by another union member initializer.
421 "4619" # Invalid warning number used in #pragma warning.
422 "4623" # Default constructor was implicitly defined as deleted.
423 "4625" # Copy constructor was implicitly defined as deleted.
424 "4626" # Assignment operator was implicitly defined as deleted.
425 "4647" # __is_pod() has a different value in pervious versions of MSVC.
426 "4668" # Macro was not defined, replacing with 0.
427 "4701" # Potentially uninitialized local variable used.
428 "4702" # Unreachable code.
429 "4706" # Assignment within conditional expression.
430 "4709" # Comma operator within array index expression. This currently just produces false-positives.
431 "4710" # Function was not inlined.
432 "4711" # Function was selected for automated inlining. This produces tens of thousands of warnings in release mode if you leave it enabled, which will completely break Visual Studio, so don't enable it.
433 "4714" # Function marked as __forceinline not inlined.
434 "4774" # Format string expected in argument is not a string literal.
435 "4820" # Padding added after data member.
436 "4917" # A GUID can only be associated with a class. This is triggered by some standard windows headers.
437 "4946" # reinterpret_cast used between related types.
438 "5026" # Move constructor was implicitly defined as deleted.
439 "5027" # Move assignment operator was implicitly defined as deleted.
440 "5031" # #pragma warning(pop): likely mismatch, popping warning state pushed in different file. This is needed because of how boost does things.
444 if (MSVC_ENABLE_STATIC_ANALYSIS)
445 # Warnings disabled for /analyze
446 list(APPEND MSVC_DISABLED_WARNINGS
447 "6001" # Using uninitialized memory. This is disabled because it is wrong 99% of the time.
448 "6011" # Dereferencing potentially NULL pointer.
449 "6031" # Return value ignored.
450 "6235" # (<non-zero constant> || <expression>) is always a non-zero constant.
451 "6237" # (<zero> && <expression>) is always zero. <expression> is never evaluated and may have side effects.
452 "6239" # (<non-zero constant> && <expression>) always evaluates to the result of <expression>.
453 "6240" # (<expression> && <non-zero constant>) always evaluates to the result of <expression>.
454 "6246" # Local declaration hides declaration of same name in outer scope.
455 "6248" # Setting a SECURITY_DESCRIPTOR's DACL to NULL will result in an unprotected object. This is done by one of the boost headers.
456 "6255" # _alloca indicates failure by raising a stack overflow exception.
457 "6262" # Function uses more than x bytes of stack space.
458 "6271" # Extra parameter passed to format function. The analysis pass doesn't recognize %j or %z, even though the runtime does.
459 "6285" # (<non-zero constant> || <non-zero constant>) is always true.
460 "6297" # 32-bit value is shifted then cast to 64-bits. The places this occurs never use more than 32 bits.
461 "6308" # Realloc might return null pointer: assigning null pointer to '<name>', which is passed as an argument to 'realloc', will cause the original memory to leak.
462 "6326" # Potential comparison of a constant with another constant.
463 "6330" # Unsigned/signed mismatch when passed as a parameter.
464 "6340" # Mismatch on sign when passed as format string value.
465 "6387" # '<value>' could be '0': This does not adhere to the specification for a function.
466 "28182" # Dereferencing NULL pointer. '<value>' contains the same NULL value as '<expression>'.
467 "28251" # Inconsistent annotation for function. This is because we only annotate the declaration and not the definition.
468 "28278" # Function appears with no prototype in scope.
472 # Warnings disabled to keep it quiet for now,
473 # most of these should be reviewed and re-enabled:
474 list(APPEND MSVC_DISABLED_WARNINGS
475 "4005" # Macro redefinition
476 "4018" # Signed/unsigned mismatch.
477 "4242" # Possible loss of data when returning a value.
478 "4244" # Implicit truncation of data.
479 "4267" # Implicit truncation of data. This really shouldn't be disabled.
480 "4291" # No matching destructor found.
481 "4302" # Pointer casting size difference
482 "4311" # Pointer casting size difference
483 "4312" # Pointer casting size difference
484 "4477" # Parameter to a formatting function isn't the same type as was passed in the format string.
485 "4624" # Destructor was implicitly undefined.
486 "4804" # Unsafe use of type 'bool' in operation. (comparing if bool is <=> scalar)
487 "4805" # Unsafe mix of scalar type and type 'bool' in operation. (comparing if bool is == scalar)
490 # Warnings to treat as errors:
491 list(APPEND MSVC_WARNINGS_AS_ERRORS
492 "4099" # Mixed use of struct and class on same type names. This was absolutely everywhere, and can cause errors at link-time if not fixed.
493 "4129" # Unknown escape sequence. This is usually caused by incorrect escaping.
494 "4566" # Character cannot be represented in current charset. This is remedied by prefixing string with "u8".
497 # And the extra defines:
498 list(APPEND MSVC_ADDITIONAL_DEFINES
499 "NOMINMAX" # This is needed because, for some absurd reason, one of the windows headers tries to define "min" and "max" as macros, which messes up most uses of std::numeric_limits.
500 "_CRT_NONSTDC_NO_WARNINGS" # Don't deprecate posix names of functions.
501 "_CRT_SECURE_NO_WARNINGS" # Don't deprecate the non _s versions of various standard library functions, because safety is for chumps.
502 "_SCL_SECURE_NO_WARNINGS" # Don't deprecate the non _s versions of various standard library functions, because safety is for chumps.
503 "_WINSOCK_DEPRECATED_NO_WARNINGS" # Don't deprecate pieces of winsock
504 "YY_NO_UNISTD_H" # Because MSVC doesn't have unistd.h, which is requested by the YACC generated code.
507 # The options passed to the linker for EXE targets:
508 list(APPEND MSVC_EXE_LINKER_OPTIONS
509 "BASE:0x10000" # Base the program at just over 64k in memory, to play nice with the JIT.
510 "DYNAMICBASE:NO" # Don't randomize the base address.
511 "FIXED" # The program can only be loaded at its preferred base address.
512 "STACK:8388608,8388608" # Set the stack reserve,commit to 8mb. Reserve should probably be higher.
513 "time" # Output some timing information about the link.
516 # The options to pass to the compiler for debug builds:
517 list(APPEND MSVC_DEBUG_OPTIONS
518 "Gy-" # Disable function level linking.
519 "GF-" # Disable string pooling.
522 # Add /Ob2 if allowing inlining in debug mode:
523 if (MSVC_ENABLE_DEBUG_INLINING)
524 list(APPEND MSVC_DEBUG_OPTIONS "Ob2")
527 # The options to pass to the compiler for release builds:
528 list(APPEND MSVC_RELEASE_OPTIONS
529 "GF" # Enable string pooling. (this is enabled by default by the optimization level, but we enable it here for clarity)
530 "Gw" # Optimize global data. (-fdata-sections)
531 "Gy" # Enable function level linking. (-ffunction-sections)
532 "Qpar" # Enable parallel code generation. HHVM itself doesn't currently use this, but it's dependencies, TBB for instance, might, so enable it.
533 "Oi" # Enable intrinsic functions.
534 "Ot" # Favor fast code.
537 # Add /GL to the compiler, and /LTCG to the linker
538 # if link time code generation is enabled.
539 if (MSVC_ENABLE_LTCG)
540 list(APPEND MSVC_RELEASE_OPTIONS "GL")
541 list(APPEND MSVC_RELEASE_LINKER_OPTIONS "LTCG")
544 # The options to pass to the linker for debug builds for EXE targets:
545 list(APPEND MSVC_DEBUG_EXE_LINKER_OPTIONS
546 "OPT:NOREF" # No unreferenced data elimination. (well, mostly)
547 "OPT:NOICF" # No Identical COMDAT folding.
550 # The options to pass to the linker for release builds for EXE targets:
551 list(APPEND MSVC_RELEASE_EXE_LINKER_OPTIONS
552 "OPT:REF" # Remove unreferenced functions and data.
553 "OPT:ICF" # Identical COMDAT folding.
556 ############################################################
557 # Now we need to adjust a couple of the default option sets.
558 ############################################################
560 # We need the static runtime.
562 CMAKE_C_FLAGS CMAKE_C_FLAGS_DEBUG CMAKE_C_FLAGS_RELEASE
563 CMAKE_C_FLAGS_MINSIZEREL CMAKE_C_FLAGS_RELWITHDEBINFO
564 CMAKE_CXX_FLAGS CMAKE_CXX_FLAGS_DEBUG CMAKE_CXX_FLAGS_RELEASE
565 CMAKE_CXX_FLAGS_MINSIZEREL CMAKE_CXX_FLAGS_RELWITHDEBINFO)
566 if (${flag_var} MATCHES "/MD")
567 string(REGEX REPLACE "/MD" "/MT" ${flag_var} "${${flag_var}}")
571 # In order for /Zc:inline, which speeds up the build significantly, to work
572 # we need to remove the /Ob0 parameter that CMake adds by default, because that
573 # would normally disable all inlining.
574 foreach(flag_var CMAKE_C_FLAGS_DEBUG CMAKE_CXX_FLAGS_DEBUG)
575 if (${flag_var} MATCHES "/Ob0")
576 string(REGEX REPLACE "/Ob0" "" ${flag_var} "${${flag_var}}")
580 # Ignore a warning about an object file not defining any symbols,
581 # these are known, and we don't care.
582 set(CMAKE_STATIC_LINKER_FLAGS "${CMAKE_STATIC_LINKER_FLAGS} /ignore:4221")
584 ############################################################
585 # And finally, we can set all the flags we've built up.
586 ############################################################
588 foreach(opt ${MSVC_GENERAL_OPTIONS})
589 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /${opt}")
590 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /${opt}")
593 foreach(opt ${MSVC_DISABLED_WARNINGS})
594 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /wd${opt}")
595 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /wd${opt}")
598 foreach(opt ${MSVC_WARNINGS_AS_ERRORS})
599 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /we${opt}")
600 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /we${opt}")
603 foreach(opt ${MSVC_ADDITIONAL_DEFINES})
604 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /D ${opt}")
605 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /D ${opt}")
608 foreach(opt ${MSVC_EXE_LINKER_OPTIONS})
609 set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /${opt}")
612 foreach(opt ${MSVC_RELEASE_LINKER_OPTIONS})
614 CMAKE_EXE_LINKER_FLAGS_RELEASE CMAKE_EXE_LINKER_FLAGS_MINSIZEREL CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO
615 CMAKE_SHARED_LINKER_FLAGS_RELEASE CMAKE_SHARED_LINKER_FLAGS_MINSIZEREL CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO
616 CMAKE_STATIC_LINKER_FLAGS_RELEASE CMAKE_STATIC_LINKER_FLAGS_MINSIZEREL CMAKE_STATIC_LINKER_FLAGS_RELWITHDEBINFO)
617 set(${flag_var} "${${flag_var}} /${opt}")
621 foreach(opt ${MSVC_DEBUG_OPTIONS})
622 set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} /${opt}")
623 set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /${opt}")
626 foreach(opt ${MSVC_RELEASE_OPTIONS})
628 CMAKE_C_FLAGS_RELEASE CMAKE_C_FLAGS_MINSIZEREL CMAKE_C_FLAGS_RELWITHDEBINFO
629 CMAKE_CXX_FLAGS_RELEASE CMAKE_CXX_FLAGS_MINSIZEREL CMAKE_CXX_FLAGS_RELWITHDEBINFO)
630 set(${flag_var} "${${flag_var}} /${opt}")
634 foreach(opt ${MSVC_DEBUG_EXE_LINKER_OPTIONS})
635 set(CMAKE_EXE_LINKER_FLAGS_DEBUG "${CMAKE_EXE_LINKER_FLAGS_DEBUG} /${opt}")
638 foreach(opt ${MSVC_RELEASE_EXE_LINKER_OPTIONS})
639 set(CMAKE_EXE_LINKER_FLAGS_RELEASE "${CMAKE_EXE_LINKER_FLAGS_RELEASE} /${opt}")
640 set(CMAKE_EXE_LINKER_FLAGS_MINSIZEREL "${CMAKE_EXE_LINKER_FLAGS_MINSIZEREL} /${opt}")
641 set(CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO "${CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO} /${opt}")
644 message("Warning: unknown/unsupported compiler, things may go wrong")
647 include(ThinArchives)