2 # Test C flags FLAGS, and set VARIABLE to true if the work. Also add the
4 MACRO(GMX_TEST_CFLAG VARIABLE FLAGS CFLAGSVAR)
5 IF(NOT DEFINED ${VARIABLE})
6 CHECK_C_COMPILER_FLAG("${FLAGS}" ${VARIABLE})
7 ENDIF(NOT DEFINED ${VARIABLE})
9 SET (${CFLAGSVAR} "${FLAGS} ${${CFLAGSVAR}}")
11 ENDMACRO(GMX_TEST_CFLAG VARIABLE FLAGS CFLAGSVAR)
13 # Test C++ flags FLAGS, and set VARIABLE to true if the work. Also add the
14 # flags to CXXFLAGSVAR.
15 MACRO(GMX_TEST_CXXFLAG VARIABLE FLAGS CXXFLAGSVAR)
16 IF(NOT DEFINED ${VARIABLE})
17 CHECK_CXX_COMPILER_FLAG("${FLAGS}" ${VARIABLE})
18 ENDIF(NOT DEFINED ${VARIABLE})
20 SET (${CXXFLAGSVAR} "${FLAGS} ${${CXXFLAGSVAR}}")
22 ENDMACRO(GMX_TEST_CXXFLAG VARIABLE FLAGS CXXFLAGSVAR)
25 # This is the actual exported function to be called
28 include(CheckCCompilerFlag)
29 include(CheckCXXCompilerFlag)
32 if(CMAKE_COMPILER_IS_GNUCC)
34 #Fix for LLVM OpenMP bug (redmine 900). Needs to run before OpenMP flags are set below.
36 exec_program(${CMAKE_C_COMPILER} ARGS --version OUTPUT_VARIABLE _compiler_output)
37 if(_compiler_output MATCHES "llvm.*4\\.2")
38 message(STATUS "OpenMP multithreading not supported with llvm-gcc 4.2, disabled")
39 set(GMX_OPENMP OFF CACHE BOOL
40 "OpenMP multithreading not not supported with llvm-gcc 4.2, disabled!" FORCE)
44 #flags are added in reverse order and -Wno* need to appear after -Wall
46 GMX_TEST_CFLAG(CFLAGS_PRAGMA "-Wno-unknown-pragmas" GMXC_CFLAGS)
48 GMX_TEST_CFLAG(CFLAGS_WARN "-Wall -Wno-unused -Wunused-value" GMXC_CFLAGS)
49 GMX_TEST_CFLAG(CFLAGS_WARN_EXTRA "-Wextra -Wno-missing-field-initializers -Wno-sign-compare" GMXC_CFLAGS)
51 GMX_TEST_CFLAG(CFLAGS_EXCESS_PREC "-fexcess-precision=fast" GMXC_CFLAGS_RELEASE)
52 GMX_TEST_CFLAG(CFLAGS_COPT "-fomit-frame-pointer -funroll-all-loops"
54 GMX_TEST_CFLAG(CFLAGS_NOINLINE "-fno-inline" GMXC_CFLAGS_DEBUG)
57 if(CMAKE_COMPILER_IS_GNUCXX)
59 GMX_TEST_CXXFLAG(CXXFLAGS_PRAGMA "-Wno-unknown-pragmas" GMXC_CXXFLAGS)
61 GMX_TEST_CXXFLAG(CXXFLAGS_WARN "-Wall -Wno-unused -Wunused-value" GMXC_CXXFLAGS)
62 GMX_TEST_CXXFLAG(CXXFLAGS_WARN_EFFCXX "-Wnon-virtual-dtor" GMXC_CXXFLAGS)
63 GMX_TEST_CXXFLAG(CXXFLAGS_WARN_EXTRA "-Wextra -Wno-missing-field-initializers" GMXC_CXXFLAGS)
65 GMX_TEST_CXXFLAG(CXXFLAGS_EXCESS_PREC "-fexcess-precision=fast" GMXC_CXXFLAGS_RELEASE)
66 GMX_TEST_CXXFLAG(CXXFLAGS_COPT "-fomit-frame-pointer -funroll-all-loops"
67 GMXC_CXXFLAGS_RELEASE)
68 GMX_TEST_CXXFLAG(CXXFLAGS_NOINLINE "-fno-inline" GMXC_CXXFLAGS_DEBUG)
72 if (CMAKE_C_COMPILER_ID MATCHES "Intel")
75 GMX_TEST_CFLAG(CFLAGS_PRAGMA "-Wno-unknown-pragmas" GMXC_CFLAGS)
77 GMX_TEST_CFLAG(CFLAGS_WARN "-Wall" GMXC_CFLAGS)
78 GMX_TEST_CFLAG(CFLAGS_STDGNU "-std=gnu99" GMXC_CFLAGS)
79 GMX_TEST_CFLAG(CFLAGS_OPT "-ip -funroll-all-loops" GMXC_CFLAGS_RELEASE)
80 GMX_TEST_CFLAG(CFLAGS_SSE2 "-msse2" GMXC_CFLAGS_RELEASE)
81 GMX_TEST_CFLAG(CFLAGS_X86 "-mtune=core2" GMXC_CFLAGS_RELEASE)
82 GMX_TEST_CFLAG(CFLAGS_IA64 "-mtune=itanium2" GMXC_CFLAGS_RELEASE)
84 GMX_TEST_CFLAG(CFLAGS_WARN "/W2" GMXC_CFLAGS)
85 GMX_TEST_CFLAG(CFLAGS_SSE2 "/arch:SSE2" GMXC_CFLAGS_RELEASE)
86 GMX_TEST_CFLAG(CFLAGS_X86 "/Qip" GMXC_CFLAGS_RELEASE)
90 if (CMAKE_CXX_COMPILER_ID MATCHES "Intel")
93 GMX_TEST_CXXFLAG(CXXFLAGS_PRAGMA "-Wno-unknown-pragmas" GMXC_CXXFLAGS)
95 GMX_TEST_CXXFLAG(CXXFLAGS_WARN "-Wall" GMXC_CXXFLAGS)
96 GMX_TEST_CXXFLAG(CXXFLAGS_OPT "-ip -funroll-all-loops" GMXC_CXXFLAGS_RELEASE)
97 GMX_TEST_CXXFLAG(CXXFLAGS_SSE2 "-msse2" GMXC_CXXFLAGS_RELEASE)
98 GMX_TEST_CXXFLAG(CXXFLAGS_X86 "-mtune=core2" GMXC_CXXFLAGS_RELEASE)
99 GMX_TEST_CXXFLAG(CXXFLAGS_IA64 "-mtune=itanium2"
100 GMXC_CXXFLAGS_RELEASE)
102 GMX_TEST_CXXFLAG(CXXFLAGS_WARN "/W2" GMXC_CXXFLAGS)
103 GMX_TEST_CXXFLAG(CXXFLAGS_SSE2 "/arch:SSE2" GMXC_CXXFLAGS_RELEASE)
104 GMX_TEST_CXXFLAG(CXXFLAGS_X86 "/Qip" GMXC_CXXFLAGS_RELEASE)
109 if (CMAKE_C_COMPILER_ID MATCHES "PGI")
110 GMX_TEST_CFLAG(CFLAGS_OPT "-fastsse" GMXC_CFLAGS_RELEASE)
112 if (CMAKE_CXX_COMPILER_ID MATCHES "PGI")
113 GMX_TEST_CXXFLAG(CXXFLAGS_OPT "-fastsse" GMXC_CXXFLAGS_RELEASE)
117 if (CMAKE_C_COMPILER_ID MATCHES "PathScale")
119 GMX_TEST_CFLAG(CFLAGS_PRAGMA "-Wno-unknown-pragmas" GMXC_CFLAGS)
121 GMX_TEST_CFLAG(CFLAGS_WARN "-Wall -Wno-unused -Wunused-value" GMXC_CFLAGS)
122 GMX_TEST_CFLAG(CFLAGS_OPT "-OPT:Ofast -fno-math-errno -ffast-math"
124 GMX_TEST_CFLAG(CFLAGS_LANG "-std=gnu99" GMXC_CFLAGS)
126 if (CMAKE_CXX_COMPILER_ID MATCHES "PathScale")
128 GMX_TEST_CXXFLAG(CXXFLAGS_PRAGMA "-Wno-unknown-pragmas" GMXC_CXXFLAGS)
130 GMX_TEST_CXXFLAG(CXXFLAGS_WARN "-Wall -Wno-unused -Wunused-value" GMXC_CXXFLAGS)
131 GMX_TEST_CXXFLAG(CXXFLAGS_OPT "-OPT:Ofast -fno-math-errno -ffast-math"
132 GMXC_CXXFLAGS_RELEASE)
136 if (CMAKE_C_COMPILER_ID MATCHES "XL")
137 GMX_TEST_CFLAG(CFLAGS_OPT "-qarch=auto -qtune=auto" GMXC_CFLAGS)
138 GMX_TEST_CFLAG(CFLAGS_LANG "-qlanglvl=extc99" GMXC_CFLAGS)
140 if (CMAKE_CXX_COMPILER_ID MATCHES "XL")
141 GMX_TEST_CXXFLAG(CXXFLAGS_OPT "-qarch=auto -qtune=auto" GMXC_CXXFLAGS)
146 # disable warnings for:
147 # forcing value to bool
148 # "this" in initializer list
149 # deprecated (posix, secure) functions
150 GMX_TEST_CFLAG(CFLAGS_WARN "/wd4800 /wd4355 /wd4996" GMXC_CFLAGS)
151 GMX_TEST_CXXFLAG(CXXFLAGS_WARN "/wd4800 /wd4355 /wd4996" GMXC_CXXFLAGS)
154 if (CMAKE_C_COMPILER_ID MATCHES "Clang")
156 GMX_TEST_CFLAG(CFLAGS_PRAGMA "-Wno-unknown-pragmas" GMXC_CFLAGS)
158 GMX_TEST_CFLAG(CFLAGS_WARN "-Wall -Wno-unused" GMXC_CFLAGS)
161 if (CMAKE_C_COMPILER_ID MATCHES "Clang")
163 GMX_TEST_CFLAG(CXXFLAGS_PRAGMA "-Wno-unknown-pragmas" GMXC_CXXFLAGS)
165 GMX_TEST_CXXFLAG(CXXFLAGS_WARN "-Wall -Wno-unused-function" GMXC_CXXFLAGS)
168 if (CMAKE_C_COMPILER_ID MATCHES "Clang")
170 GMX_TEST_CFLAG(CFLAGS_PRAGMA "-Wno-unknown-pragmas" GMXC_CFLAGS)
172 GMX_TEST_CFLAG(CFLAGS_WARN "-Wall -Wno-unused -Wunused-value" GMXC_CFLAGS)
175 if (CMAKE_CXX_COMPILER_ID MATCHES "Clang")
177 GMX_TEST_CXXFLAG(CXXFLAGS_PRAGMA "-Wno-unknown-pragmas" GMXC_CXXFLAGS)
179 GMX_TEST_CXXFLAG(CXXFLAGS_WARN "-Wall -Wno-unused -Wunused-value" GMXC_CXXFLAGS)
182 # now actually set the flags:
184 if ( NOT DEFINED GMXCFLAGS_SET AND NOT DEFINED ENV{CFLAGS} )
185 set(GMXCFLAGS_SET true CACHE INTERNAL "Whether to reset the C flags"
188 set(CMAKE_C_FLAGS "${GMXC_CFLAGS} ${CMAKE_C_FLAGS}"
189 CACHE STRING "Flags used by the compiler during all build types."
191 set(CMAKE_C_FLAGS_RELEASE "${GMXC_CFLAGS_RELEASE} ${CMAKE_C_FLAGS_RELEASE}"
192 CACHE STRING "Flags used by the compiler during release builds."
194 set(CMAKE_C_FLAGS_DEBUG "${GMXC_CFLAGS_DEBUG} ${CMAKE_C_FLAGS_DEBUG}"
195 CACHE STRING "Flags used by the compiler during debug builds."
200 if ( NOT DEFINED GMXCXXFLAGS_SET AND NOT DEFINED ENV{CXXFLAGS} )
201 set(GMXCXXFLAGS_SET true CACHE INTERNAL "Whether to reset the C++ flags"
203 set(CMAKE_CXX_FLAGS "${GMXC_CXXFLAGS} ${CMAKE_CXX_FLAGS}"
204 CACHE STRING "Flags used by the compiler during all build types."
206 set(CMAKE_CXX_FLAGS_RELEASE
207 "${GMXC_CXXFLAGS_RELEASE} ${CMAKE_CXX_FLAGS_RELEASE}"
208 CACHE STRING "Flags used by the compiler during release builds."
210 set(CMAKE_CXX_FLAGS_DEBUG
211 "${GMXC_CXXFLAGS_DEBUG} ${CMAKE_CXX_FLAGS_DEBUG}"
212 CACHE STRING "Flags used by the compiler during debug builds."
215 ENDMACRO(gmx_c_flags)