2 # This file is part of the GROMACS molecular simulation package.
4 # Copyright (c) 2009,2010,2011,2012,2013 by the GROMACS development team.
5 # Copyright (c) 2014,2015,2016,2017,2018 by the GROMACS development team.
6 # Copyright (c) 2019,2020,2021, by the GROMACS development team, led by
7 # Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
8 # and including many others, as listed in the AUTHORS file in the
9 # top-level source directory and at http://www.gromacs.org.
11 # GROMACS is free software; you can redistribute it and/or
12 # modify it under the terms of the GNU Lesser General Public License
13 # as published by the Free Software Foundation; either version 2.1
14 # of the License, or (at your option) any later version.
16 # GROMACS is distributed in the hope that it will be useful,
17 # but WITHOUT ANY WARRANTY; without even the implied warranty of
18 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
19 # Lesser General Public License for more details.
21 # You should have received a copy of the GNU Lesser General Public
22 # License along with GROMACS; if not, see
23 # http://www.gnu.org/licenses, or write to the Free Software Foundation,
24 # Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
26 # If you want to redistribute modifications to GROMACS, please
27 # consider that scientific software is very special. Version
28 # control is crucial - bugs must be traceable. We will be happy to
29 # consider code for inclusion in the official distribution, but
30 # derived work must not be called official GROMACS. Details are found
31 # in the README & COPYING files - if they are missing, get the
32 # official version at http://www.gromacs.org.
34 # To help us fund GROMACS development, we humbly ask that you cite
35 # the research papers on the package. Check out http://www.gromacs.org.
37 include(CheckCCompilerFlag)
38 include(CheckCXXCompilerFlag)
40 # Test C flags FLAGS, and set VARIABLE to true if the work. Also add the
42 MACRO(GMX_TEST_CFLAG VARIABLE FLAGS CFLAGSVAR)
43 IF(NOT DEFINED ${VARIABLE})
44 CHECK_C_COMPILER_FLAG("${FLAGS}" ${VARIABLE})
47 list(APPEND ${CFLAGSVAR} "${FLAGS}")
49 ENDMACRO(GMX_TEST_CFLAG VARIABLE FLAGS CFLAGSVAR)
51 # Test C++ flags FLAGS, and set VARIABLE to true if the work. Also add the
52 # flags to CXXFLAGSVAR.
53 MACRO(GMX_TEST_CXXFLAG VARIABLE FLAGS CXXFLAGSVAR)
54 IF(NOT DEFINED ${VARIABLE})
55 CHECK_CXX_COMPILER_FLAG("${FLAGS}" ${VARIABLE})
58 list(APPEND ${CXXFLAGSVAR} "${FLAGS}")
60 ENDMACRO(GMX_TEST_CXXFLAG VARIABLE FLAGS CXXFLAGSVAR)
62 # Prepare some local variables so CUDA and non-CUDA code in targets
64 function(gmx_target_compile_options_inner)
65 set (CFLAGS "${SIMD_C_FLAGS};${MPI_COMPILE_FLAGS};${EXTRA_C_FLAGS};${GMXC_CFLAGS}" PARENT_SCOPE)
66 # When SYCL support has been enabled (so the flag is non-empty), we still *disable* things
67 # by default to avoid running each file three passes through the compiler. Then we'll explicitly
68 # enable SYCL for the few files using it, as well as the linker.
69 set (CXXFLAGS "${SIMD_CXX_FLAGS};${MPI_COMPILE_FLAGS};${DISABLE_SYCL_CXX_FLAGS};${EXTRA_CXX_FLAGS};${GMXC_CXXFLAGS}" PARENT_SCOPE)
72 # Implementation function to add compiler flags expected for all
73 # GROMACS build configurations, and those expected for the current
74 # CMake build type (e.g. Release) to TARGET. Other GROMACS CMake code
75 # is expected to use either gmx_target_compile_options(name_of_target)
76 # or gmx_cuda_target_compile_options(name_of_variable) because CUDA
77 # compilation has special requirements.
79 # Most targets (ie. libraries, executables) need compiler flags that
80 # are characteristic of the build configuration. This function
81 # provides a central point for adding such flags. This approach is
82 # more flexible than e.g. setting CMAKE_CXX_FLAGS globally, because
83 # that setting will apply globally, which means it applies also to
84 # "external" code that the build of GROMACS might also build.
85 function(gmx_target_compile_options TARGET)
86 if (GMX_SKIP_DEFAULT_CFLAGS)
90 # Prepare the generic compiler options
91 gmx_target_compile_options_inner()
92 target_compile_options(${TARGET}
94 $<$<COMPILE_LANGUAGE:C>:${CFLAGS}>
95 $<$<COMPILE_LANGUAGE:CXX>:${CXXFLAGS}>
97 # Add compiler options for the build types
98 foreach(build_type ${build_types_with_explicit_flags})
99 target_compile_options(${TARGET}
101 $<$<AND:$<COMPILE_LANGUAGE:C>,$<CONFIG:${build_type}>>:${GMXC_CFLAGS_${build_type}}>
102 $<$<AND:$<COMPILE_LANGUAGE:CXX>,$<CONFIG:${build_type}>>:${GMXC_CXXFLAGS_${build_type}}>
105 # Add the release-configuration compiler options to build
106 # configurations that derive from it.
107 foreach(build_type RELWITHDEBINFO RELWITHASSERT MINSIZEREL PROFILE)
108 target_compile_options(${TARGET}
110 $<$<AND:$<COMPILE_LANGUAGE:C>,$<CONFIG:${build_type}>>:${GMXC_CFLAGS_RELEASE}>
111 $<$<AND:$<COMPILE_LANGUAGE:CXX>,$<CONFIG:${build_type}>>:${GMXC_CXXFLAGS_RELEASE}>
114 # Add those flags that we only want in the proper release build
116 target_compile_options(${TARGET}
118 $<$<AND:$<COMPILE_LANGUAGE:C>,$<CONFIG:RELEASE>>:${GMXC_CFLAGS_RELEASE_ONLY}>
119 $<$<AND:$<COMPILE_LANGUAGE:CXX>,$<CONFIG:RELEASE>>:${GMXC_CXXFLAGS_RELEASE_ONLY}>
123 # The approach taken by FindCUDA.cmake is to require that the compiler
124 # flags are known and present in a variable before creating the target
125 # for the library. (Those get embedded in files that are generated at
126 # the point of calling cuda_add_library, which does not create a
127 # target that one could later call target_compile_options upon.) So,
128 # this function instead returns appropriate content in
129 # ${VARIABLE_NAME}, along with other such variables that are
130 # specialized for the various build_types. Hopefully this will improve
131 # when we use native CUDA language support in our CMake.
132 function(gmx_cuda_target_compile_options VARIABLE_NAME)
133 if (GMX_SKIP_DEFAULT_CFLAGS)
136 # Prepare the generic compiler options
137 gmx_target_compile_options_inner()
138 # CUDA headers issue lots of warnings when compiled with
139 # -Wundef because they use old-style #ifdef a lot. We'd prefer
140 # to have FindCUDA.cmake treat CUDA internal headers with
141 # -isystem so that these warnings are naturally suppressed,
142 # but there's no way to do that without bundling a modified
143 # form of FindCUDA.cmake. That creates its own problems,
144 # because people either don't know we do that, or don't
145 # remember that we don't do that in user tarballs.
147 # We have make check-source ensuring that we have included
148 # config.h any time we use such symbols in commits in a merge
149 # request. Local development could run that too. So, we can
150 # tolerate any remaining risk from accidentally using
151 # e.g. #ifdef GMX_MPI rather than #if GMX_MPI in CUDA source
154 # So we disable -Wundef by the simple hack of appending
155 # -Wno-undef after it. That's more maintainable than having
156 # logic to avoid adding -Wundef to GMXC_CXXFLAGS, given the
157 # current approach to adding them. Hopefully this will improve
158 # if/when we have more CMake object libraries, and/or native
160 GMX_TEST_CXXFLAG(CXXFLAGS_WARN_NOUNDEF "-Wno-undef" CXXFLAGS)
163 # Only C++ compilation is supported with CUDA code in GROMACS
164 set(${VARIABLE_NAME} ${CXXFLAGS} PARENT_SCOPE)
166 # Now organize the flags for different build
167 # configurations. First, the debug configuration.
168 set(${VARIABLE_NAME}_DEBUG "${GMXC_CXXFLAGS_DEBUG}" PARENT_SCOPE)
169 # Add those flags that we only want in the proper release build
171 set(${VARIABLE_NAME}_RELEASE "${GMXC_CXXFLAGS_RELEASE};${GMXC_CXXFLAGS_RELEASE_ONLY}" PARENT_SCOPE)
172 # Add the release flags to build configurations that derive from it
173 foreach(build_type RELWITHDEBINFO RELWITHASSERT MINSIZEREL PROFILE)
174 set(${VARIABLE_NAME}_${build_type} "${GMXC_CXXFLAGS_RELEASE};${GMXC_CXXFLAGS_${build_type}}" PARENT_SCOPE)
178 # Add the WARNING_FLAG to the compile options for TARGET if the
179 # compiler supports that flag. VARNAME is used to cache the result of
180 # the check whether the compiler supports that flag, as multiple
181 # targets may use the same suppression.
183 # This is generally used to suppress warnings judged not worth fixing
184 # in code external to, or generated by, GROMACS, or code that is
185 # more efficient to work around and later replace, rather than fix.
186 function(gmx_target_warning_suppression TARGET WARNING_FLAG VARNAME)
187 check_cxx_compiler_flag(${WARNING_FLAG} ${VARNAME})
189 target_compile_options(${TARGET} PRIVATE $<$<COMPILE_LANGUAGE:CXX>:${WARNING_FLAG}>)
193 # Add the WARNING_FLAG to the compile flags for SOURCE_FILE if the
194 # compiler supports that flag. VARNAME is used to cache the result of
195 # the check whether the compiler supports that flag, as multiple
196 # targets may use the same suppression.
198 # This is generally used to suppress warnings judged not worth fixing
199 # in code external to, or generated by, GROMACS, or code that is
200 # more efficient to work around and later replace, rather than fix.
201 function(gmx_source_file_warning_suppression SOURCE_FILE WARNING_FLAG VARNAME)
202 check_cxx_compiler_flag(${WARNING_FLAG} ${VARNAME})
204 set_source_files_properties(${SOURCE_FILE} PROPERTIES COMPILE_FLAGS ${WARNING_FLAG})
208 # This is the actual exported function to be called
211 include(CheckCCompilerFlag)
212 include(CheckCXXCompilerFlag)
215 if(CMAKE_COMPILER_IS_GNUCC)
216 #flags are added in reverse order and -Wno* need to appear after -Wall
218 GMX_TEST_CFLAG(CFLAGS_PRAGMA "-Wno-unknown-pragmas" GMXC_CFLAGS)
220 if (GMX_COMPILER_WARNINGS)
221 GMX_TEST_CFLAG(CFLAGS_WARN "-Wall;-Wno-unused;-Wunused-value;-Wunused-parameter" GMXC_CFLAGS)
222 GMX_TEST_CFLAG(CFLAGS_WARN_EXTRA "-Wextra;-Wno-sign-compare;-Wpointer-arith" GMXC_CFLAGS)
223 GMX_TEST_CFLAG(CFLAGS_WARN_UNDEF "-Wundef" GMXC_CFLAGS)
224 GMX_TEST_CFLAG(CFLAGS_WARN_REL "-Wno-array-bounds" GMXC_CFLAGS_RELEASE_ONLY)
226 GMX_TEST_CFLAG(CFLAGS_WARN_SUBSCRIPT "-Wno-char-subscripts" GMXC_CFLAGS)
228 GMX_TEST_CFLAG(CFLAGS_STRINGOP_TRUNCATION "-Werror=stringop-truncation" GMXC_CFLAGS)
230 GMX_TEST_CFLAG(CFLAGS_WARN_NO_MISSING_FIELD_INITIALIZERS "-Wno-missing-field-initializers" GMXC_CFLAGS)
232 GMX_TEST_CFLAG(CFLAGS_EXCESS_PREC "-fexcess-precision=fast" GMXC_CFLAGS_RELEASE)
233 GMX_TEST_CFLAG(CFLAGS_COPT "-funroll-all-loops"
235 GMX_TEST_CFLAG(CFLAGS_NOINLINE "-fno-inline" GMXC_CFLAGS_DEBUG)
238 if(CMAKE_COMPILER_IS_GNUCXX)
240 GMX_TEST_CXXFLAG(CXXFLAGS_PRAGMA "-Wno-unknown-pragmas" GMXC_CXXFLAGS)
242 if (GMX_COMPILER_WARNINGS)
243 GMX_TEST_CXXFLAG(CXXFLAGS_WARN "-Wall" GMXC_CXXFLAGS)
244 # Problematic with CUDA
245 # GMX_TEST_CXXFLAG(CXXFLAGS_WARN_EFFCXX "-Wnon-virtual-dtor" GMXC_CXXFLAGS)
246 GMX_TEST_CXXFLAG(CXXFLAGS_WARN_EXTRA "-Wextra;-Wpointer-arith;-Wmissing-declarations" GMXC_CXXFLAGS)
247 GMX_TEST_CXXFLAG(CXXFLAGS_WARN_UNDEF "-Wundef" GMXC_CXXFLAGS)
248 GMX_TEST_CFLAG(CXXFLAGS_WARN_REL "-Wno-array-bounds" GMXC_CXXFLAGS_RELEASE_ONLY)
249 GMX_TEST_CXXFLAG(CXXFLAGS_STRINGOP_TRUNCATION "-Wstringop-truncation" GMXC_CXXFLAGS)
250 if (CXXFLAGS_STRINGOP_TRUNCATION)
251 set(CXXFLAGS_NO_STRINGOP_TRUNCATION "-Wno-stringop-truncation")
254 GMX_TEST_CXXFLAG(CXXFLAGS_WARN_NO_MISSING_FIELD_INITIALIZERS "-Wno-missing-field-initializers" GMXC_CXXFLAGS)
256 GMX_TEST_CXXFLAG(CXXFLAGS_EXCESS_PREC "-fexcess-precision=fast" GMXC_CXXFLAGS_RELEASE)
257 GMX_TEST_CXXFLAG(CXXFLAGS_COPT "-funroll-all-loops"
258 GMXC_CXXFLAGS_RELEASE)
259 GMX_TEST_CXXFLAG(CXXFLAGS_NOINLINE "-fno-inline" GMXC_CXXFLAGS_DEBUG)
263 # Inter-procedural analysis causes pgcc/pgc++ to crash when linking the library with PGI release 15.7.
264 if (CMAKE_C_COMPILER_ID MATCHES "PGI")
265 GMX_TEST_CFLAG(CFLAGS_OPT "-Mnoipa" GMXC_CFLAGS_RELEASE)
267 if (CMAKE_CXX_COMPILER_ID MATCHES "PGI")
268 # Using ipa exposes internal PGI-15.7 compiler bugs at compile time
269 GMX_TEST_CXXFLAG(CXXFLAGS_OPT "-Mnoipa" GMXC_CXXFLAGS_RELEASE)
270 # PGI identifies itself as GCC, but does not understand the GCC
271 # pragmas that occur in parser.cpp. Since that file is generated
272 # we cannot add a define there, but supress the warning instead.
273 GMX_TEST_CXXFLAG(CXXFLAGS_WARN "--diag_suppress=1675" GMXC_CXXFLAGS)
277 if (CMAKE_C_COMPILER_ID MATCHES "PathScale")
279 GMX_TEST_CFLAG(CFLAGS_PRAGMA "-Wno-unknown-pragmas" GMXC_CFLAGS)
281 if (GMX_COMPILER_WARNINGS)
282 GMX_TEST_CFLAG(CFLAGS_WARN "-Wall;-Wno-unused;-Wunused-value" GMXC_CFLAGS)
284 GMX_TEST_CFLAG(CFLAGS_OPT "-OPT:Ofast;-fno-math-errno;-ffast-math"
286 GMX_TEST_CFLAG(CFLAGS_LANG "-std=gnu99" GMXC_CFLAGS)
288 if (CMAKE_CXX_COMPILER_ID MATCHES "PathScale")
290 GMX_TEST_CXXFLAG(CXXFLAGS_PRAGMA "-Wno-unknown-pragmas" GMXC_CXXFLAGS)
292 if (GMX_COMPILER_WARNINGS)
293 GMX_TEST_CXXFLAG(CXXFLAGS_WARN "-Wall;-Wno-unused;-Wunused-value" GMXC_CXXFLAGS)
295 GMX_TEST_CXXFLAG(CXXFLAGS_OPT "-OPT:Ofast;-fno-math-errno;-ffast-math"
296 GMXC_CXXFLAGS_RELEASE)
300 # The suppressions below stop
301 # 1500-036: (I) about -O3 causing non-strict IEEE compliance that changes the semantics of the program (duh)
302 # 1500-010: (W) about correct PBC-related use of maximum array indices of DIM-sized C arrays
303 # 1500-030: (I) Additional optimization may be attained by recompiling and specifying MAXMEM option with a value greater than 8192.
304 if (CMAKE_C_COMPILER_ID MATCHES "XL")
305 GMX_TEST_CFLAG(CFLAGS_ARCH "-qarch=auto;-qtune=auto" GMXC_CFLAGS)
306 GMX_TEST_CFLAG(CFLAGS_OPT "-O3" GMXC_CFLAGS_RELEASE)
307 GMX_TEST_CFLAG(CFLAGS_LANG "-qlanglvl=extc99" GMXC_CFLAGS)
308 GMX_TEST_CFLAG(CFLAGS_LANG "-qsuppress=1500-036;-qsuppress=1500-010;-qsuppress=1500-030" GMXC_CFLAGS)
310 if (CMAKE_CXX_COMPILER_ID MATCHES "XL")
311 GMX_TEST_CXXFLAG(CXXFLAGS_ARCH "-qarch=auto;-qtune=auto" GMXC_CXXFLAGS)
312 GMX_TEST_CXXFLAG(CXXFLAGS_OPT "-O3" GMXC_CXXFLAGS_RELEASE)
313 GMX_TEST_CXXFLAG(CXXFLAGS_LANG "-qsuppress=1500-036;-qsuppress=1500-010;-qsuppress=1500-030" GMXC_CXXFLAGS)
318 # disable warnings for:
319 # forcing value to bool
320 # "this" in initializer list
321 # deprecated (posix, secure) functions
322 # C4305: truncation (double -> float)
323 # C4244: conversion from '.*' to '.*', possible loss of data
324 # unreferenced local variable (only C)
325 # C4267: conversion from 'size_t' to 'int', possible loss of data
326 # conversion from 'const char*' to 'void*', different 'const' qualifiers (only C)
327 # unknown pragma (4068)
328 # remark #280: selector expression is constant
329 if(NOT CMAKE_CONFIGURATION_TYPES)
330 GMX_TEST_CFLAG(CFLAGS_WARN "/wd4800;/wd4355;/wd4996;/wd4305;/wd4244;/wd4101;/wd4267;/wd4090;/wd4068;" GMXC_CFLAGS)
331 GMX_TEST_CXXFLAG(CXXFLAGS_WARN "/wd4800;/wd4355;/wd4996;/wd4305;/wd4244;/wd4267;/wd4068;" GMXC_CXXFLAGS)
332 else() # MSVC projects only use the C++ flags
333 GMX_TEST_CXXFLAG(CXXFLAGS_WARN "/wd4800;/wd4355;/wd4996;/wd4305;/wd4244;/wd4101;/wd4267;/wd4090;/wd4068;" GMXC_CXXFLAGS)
335 GMX_TEST_CXXFLAG(CXXFLAGS_LANG "/permissive-" GMXC_CXXFLAGS)
338 if (CMAKE_C_COMPILER_ID MATCHES "Clang" OR CMAKE_C_COMPILER_ID MATCHES "IntelLLVM")
340 GMX_TEST_CFLAG(CFLAGS_PRAGMA "-Wno-unknown-pragmas" GMXC_CFLAGS)
342 if (GMX_COMPILER_WARNINGS)
343 GMX_TEST_CFLAG(CFLAGS_WARN "-Wall;-Wno-unused;-Wunused-value;-Wunused-parameter" GMXC_CFLAGS)
344 GMX_TEST_CFLAG(CFLAGS_WARN_EXTRA "-Wpointer-arith" GMXC_CFLAGS_EXTRA)
346 GMX_TEST_CFLAG(CFLAGS_WARN_NO_MISSING_FIELD_INITIALIZERS "-Wno-missing-field-initializers" GMXC_CFLAGS)
349 if (CMAKE_CXX_COMPILER_ID MATCHES "Clang" OR CMAKE_CXX_COMPILER_ID MATCHES "IntelLLVM")
350 if (GMX_COMPILER_WARNINGS)
351 # If used, -Wall should precede other options that silence warnings it enables
352 GMX_TEST_CXXFLAG(CXXFLAGS_WARN "-Wall" GMXC_CXXFLAGS)
353 if(CMAKE_CXX_COMPILER_VERSION VERSION_LESS "6.0") #LLVM BUG #21629
354 GMX_TEST_CXXFLAG(CXXFLAGS_WARN_NO_BRACES "-Wno-missing-braces" GMXC_CXXFLAGS)
356 GMX_TEST_CXXFLAG(CXXFLAGS_WARN_EXTRA "-Wextra;-Wpointer-arith;-Wmissing-prototypes" GMXC_CXXFLAGS)
357 GMX_TEST_CXXFLAG(CXXFLAGS_DEPRECATED "-Wdeprecated" GMXC_CXXFLAGS)
358 # Functions placed in headers for inlining are not always
359 # used in every translation unit that includes the files,
360 # so we must disable the warning that there are such
361 # functions that are unused.
362 GMX_TEST_CXXFLAG(CXXFLAGS_NO_UNUSED_FUNCTION "-Wno-unused-function" GMXC_CXXFLAGS)
365 GMX_TEST_CXXFLAG(CXXFLAGS_PRAGMA "-Wno-unknown-pragmas" GMXC_CXXFLAGS)
367 GMX_TEST_CXXFLAG(CXXFLAGS_WARN_NO_RESERVED_IDENTIFIER "-Wno-reserved-identifier" GMXC_CXXFLAGS) # LLVM BUG #50644
368 GMX_TEST_CXXFLAG(CXXFLAGS_WARN_NO_MISSING_FIELD_INITIALIZERS "-Wno-missing-field-initializers" GMXC_CXXFLAGS)
369 # Intel LLVM 2021.2 defaults to no-finite-math which isn't OK for GROMACS
370 if(GMX_INTEL_LLVM AND GMX_INTEL_LLVM_VERSION GREATER_EQUAL 2021020)
371 GMX_TEST_CXXFLAG(CXXFLAGS_FINITE_MATH "-fno-finite-math-only" GMXC_CXXFLAGS)
373 # Some versions of Intel ICPX compiler (at least 2021.1.1 to 2021.3.0) fail to unroll a loop
374 # in sycl::accessor::__init, and emit -Wpass-failed=transform-warning. This is a useful
375 # warning, but mostly noise right now. Probably related to using shared memory accessors.
376 # Note: not a typo: ICPX 2021.1.1 has GMX_INTEL_LLVM_VERSION 202110; 2021.2.0 has 20210200.
377 if(GMX_INTEL_LLVM AND GMX_INTEL_LLVM_VERSION GREATER_EQUAL 202110)
378 GMX_TEST_CXXFLAG(CXXFLAGS_NO_UNROLL_WARNING "-Wno-pass-failed" GMXC_CXXFLAGS)
382 # Apple bastardized version of Clang
383 if(${CMAKE_C_COMPILER_ID} MATCHES "AppleClang")
384 if(${CMAKE_C_COMPILER_VERSION} VERSION_GREATER 11.0)
385 # Mac OS Catalina ships with a horribly broken compiler (version 11.0.0.11000033)
386 # that checks stack alignment by default, but their own C library
387 # does not align the stack properly. Embarrassing, Apple...
388 GMX_TEST_CFLAG(CFLAG_NO_STACK_CHECK "-fno-stack-check" GMXC_CFLAGS)
392 if(${CMAKE_CXX_COMPILER_ID} MATCHES "AppleClang")
393 if(${CMAKE_CXX_COMPILER_VERSION} VERSION_GREATER 11.0)
394 # Mac OS Catalina ships with a horribly broken compiler (version 11.0.0.11000033)
395 # that checks stack alignment by default, but their own C library
396 # does not align the stack properly. Embarrassing, Apple...
397 GMX_TEST_CXXFLAG(CXXFLAG_NO_STACK_CHECK "-fno-stack-check" GMXC_CXXFLAGS)
401 # Apple bastardized version of Clang
402 if(${CMAKE_C_COMPILER_ID} MATCHES "AppleClang")
403 if(${CMAKE_C_COMPILER_VERSION} VERSION_GREATER 11.0)
404 # Mac OS Catalina ships with a horribly broken compiler (version 11.0.0.11000033)
405 # that checks stack alignment by default, but their own C library
406 # does not align the stack properly. Embarrassing, Apple...
407 GMX_TEST_CFLAG(CFLAG_NO_STACK_CHECK "-fno-stack-check" GMXC_CFLAGS)
411 if(${CMAKE_CXX_COMPILER_ID} MATCHES "AppleClang")
412 if(${CMAKE_CXX_COMPILER_VERSION} VERSION_GREATER 11.0)
413 # Mac OS Catalina ships with a horribly broken compiler (version 11.0.0.11000033)
414 # that checks stack alignment by default, but their own C library
415 # does not align the stack properly. Embarrassing, Apple...
416 GMX_TEST_CXXFLAG(CXXFLAG_NO_STACK_CHECK "-fno-stack-check" GMXC_CXXFLAGS)
422 # Make sure we generate warnings (and hopefully fix) "everything"
423 # reported by compilers that support that (ie recent clang and its
425 function(gmx_warn_on_everything target)
427 # If the compiler suports warning on "everything" then we'll turn
428 # it on. Note that all warnings become errors for developer
429 # builds, but not for user builds.
430 gmx_target_warning_suppression(${target} "-Weverything" HAS_WARNING_EVERYTHING)
432 if (NOT HAS_WARNING_EVERYTHING)
433 # There's no need to suppress aspects of "-Weverything" if
434 # that warning is not supported.
438 # We don't actually fix everything, so list the exceptions that we
439 # choose to make. We may be able to eliminate some of these over
442 # We check whether the flag is accepted first, so that we suppress
443 # such warnings also with compilers that don't directly identify
444 # as e.g. clang despite being based on it (e.g. most vendor
445 # compilers), and also don't fail to compile GROMACS when future
446 # versions of any such compiler changes how the warnings
449 # We have no intention of C++98 compability
450 gmx_target_warning_suppression(${target} "-Wno-c++98-compat" HAS_WARNING_NO_CPLUSPLUS98_COMPAT)
451 gmx_target_warning_suppression(${target} "-Wno-c++98-compat-pedantic" HAS_WARNING_NO_CPLUSPLUS98_COMPAT_PEDANTIC)
453 # Don't warn for use of OpenMP pragmas in no-omp build
454 gmx_target_warning_suppression(${target} "-Wno-source-uses-openmp" HAS_WARNING_NO_SOURCE_USED_OPENMP)
456 # Allowed in attributes (compilers are required to ignore unknown attributes)
457 gmx_target_warning_suppression(${target} "-Wno-c++17-extensions" HAS_WARNING_NO_CPLUSPLUS17_EXTENSIONS)
459 # Custom Doxygen commands are used
460 gmx_target_warning_suppression(${target} "-Wno-documentation-unknown-command" HAS_WARNING_NO_DOCUMENTATION_UNKNOWN_COMMAND)
462 # We need to use default labels in switch statements, because GCC gives
463 # maybe-uninitialized without default label and checks for illegal enum values.
464 gmx_target_warning_suppression(${target} "-Wno-covered-switch-default" HAS_WARNING_NO_COVERED_SWITCH_DEFAULT)
466 # Default statement for enum is OK.
467 # It's OK to not have branches for Count members of enum classes
468 gmx_target_warning_suppression(${target} "-Wno-switch-enum" HAS_WARNING_NO_SWITCH_ENUM)
470 # We need to use macros like
471 # GMX_CATCH_ALL_AND_EXIT_WITH_FATAL_ERROR and
472 # CLANG_DIAGNOSTIC_IGNORE. Those will look strange if they don't
473 # have a semicolon after them, and might confuse tools like IDEs
475 gmx_target_warning_suppression(${target} "-Wno-extra-semi-stmt" HAS_WARNING_NO_EXTRA_SEMI_STMT)
477 # We intend to use fully inline classes with virtual methods
478 gmx_target_warning_suppression(${target} "-Wno-weak-vtables" HAS_WARNING_NO_WEAK_VTABLES)
480 # We intend to use constructor arguments that shadow member variables
481 gmx_target_warning_suppression(${target} "-Wno-shadow" HAS_WARNING_NO_SHADOW)
483 # Padding of structs is routine, we don't need to hear about it
484 gmx_target_warning_suppression(${target} "-Wno-padded" HAS_WARNING_NO_PADDED)
486 # Our uses of double underscores in macro names are OK
487 gmx_target_warning_suppression(${target} "-Wno-reserved-id-macro" HAS_WARNING_NO_RESERVED_ID_MACRO)
489 # Implicit conversion of float to double is fine
490 gmx_target_warning_suppression(${target} "-Wno-double-promotion" HAS_WARNING_NO_DOUBLE_PROMOTION)
492 # No resources in static variables need exit-time destructors
493 gmx_target_warning_suppression(${target} "-Wno-exit-time-destructors" HAS_WARNING_NO_EXIT_TIME_DESTRUCTORS)
495 # Global constructors are not needed
496 gmx_target_warning_suppression(${target} "-Wno-global-constructors" HAS_WARNING_NO_GLOBAL_CONSTRUCTORS)
498 # False positives are emitted
499 gmx_target_warning_suppression(${target} "-Wno-documentation" HAS_WARNING_NO_DOCUMENTATION)
501 # We intend to use format strings that we construct, even though that is a security risk
502 gmx_target_warning_suppression(${target} "-Wno-format-nonliteral" HAS_WARNING_NO_FORMAT_NONLITERAL)
504 # We do a lot of conditional compilation that sometimes uses a symbol and sometimes does not
505 gmx_target_warning_suppression(${target} "-Wno-used-but-marked-unused" HAS_WARNING_NO_USED_BUT_MARKED_UNUSED)
507 # It's only risky to compare floats for equality when they are the
508 # result of computation. Unfortunately it's hard to tell the
509 # difference and there's no good way to suppress this on a
510 # case-by-base basis.
511 gmx_target_warning_suppression(${target} "-Wno-float-equal" HAS_WARNING_NO_FLOAT_EQUAL)
514 # Exceptions we should consider fixing
517 # Much code in gmxana uses complex logic that may or may not be valid
518 gmx_target_warning_suppression(${target} "-Wno-conditional-uninitialized" HAS_WARNING_CONDITIONAL_UNINITIALIZED)
520 # We have many places implicit conversions still occur, most of which need fixing
521 gmx_target_warning_suppression(${target} "-Wno-conversion" HAS_WARNING_NO_CONVERSION)
523 # We use the Linux signal handlers in the intended way, but it triggers this warning.
524 # It would be better to localize this exception.
525 gmx_target_warning_suppression(${target} "-Wno-disabled-macro-expansion" HAS_WARNING_NO_DISABLED_MACRO_EXPANSION)
527 # The NBNXM simd kernels define lots of macros that are not used
528 # It would be better to localize this exception.
529 gmx_target_warning_suppression(${target} "-Wno-unused-macros" HAS_WARNING_NO_UNUSED_MACROS)