Merge release-4-6 into master
[alexxy/gromacs.git] / cmake / gmxCFlags.cmake
1
2 # Test C flags FLAGS, and set VARIABLE to true if the work. Also add the
3 # flags to CFLAGSVAR.
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})
8     IF (${VARIABLE})
9         SET (${CFLAGSVAR} "${FLAGS} ${${CFLAGSVAR}}")
10     ENDIF (${VARIABLE})
11 ENDMACRO(GMX_TEST_CFLAG VARIABLE FLAGS CFLAGSVAR)
12
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})
19     IF (${VARIABLE})
20         SET (${CXXFLAGSVAR} "${FLAGS} ${${CXXFLAGSVAR}}")
21     ENDIF (${VARIABLE})
22 ENDMACRO(GMX_TEST_CXXFLAG VARIABLE FLAGS CXXFLAGSVAR)
23
24
25 # This is the actual exported function to be called 
26 MACRO(gmx_c_flags)
27
28     include(CheckCCompilerFlag)
29     include(CheckCXXCompilerFlag)
30
31     # gcc
32     if(CMAKE_COMPILER_IS_GNUCC)
33
34         #Fix for LLVM OpenMP bug (redmine 900). Needs to run before OpenMP flags are set below.
35         if(GMX_OPENMP)
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)
41             endif()
42         endif()
43
44         #flags are added in reverse order and -Wno* need to appear after -Wall
45         if(NOT GMX_OPENMP)
46             GMX_TEST_CFLAG(CFLAGS_PRAGMA "-Wno-unknown-pragmas" GMXC_CFLAGS)
47         endif()
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)
50         # new in gcc 4.5
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"
53                        GMXC_CFLAGS_RELEASE)
54         GMX_TEST_CFLAG(CFLAGS_NOINLINE "-fno-inline" GMXC_CFLAGS_DEBUG)
55     endif()
56     # g++
57     if(CMAKE_COMPILER_IS_GNUCXX)
58         if(NOT GMX_OPENMP)
59             GMX_TEST_CXXFLAG(CXXFLAGS_PRAGMA "-Wno-unknown-pragmas" GMXC_CXXFLAGS)
60         endif()
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)
64       # new in gcc 4.5
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)
69     endif()
70
71     # icc
72     if (CMAKE_C_COMPILER_ID MATCHES "Intel")
73         if (NOT WIN32) 
74             if(NOT GMX_OPENMP)
75                 GMX_TEST_CFLAG(CFLAGS_PRAGMA "-Wno-unknown-pragmas" GMXC_CFLAGS)
76             endif()
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)
83         else()
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)
87         endif()
88     endif()
89
90     if (CMAKE_CXX_COMPILER_ID MATCHES "Intel")
91         if (NOT WIN32) 
92             if(NOT GMX_OPENMP)
93                 GMX_TEST_CXXFLAG(CXXFLAGS_PRAGMA "-Wno-unknown-pragmas" GMXC_CXXFLAGS)
94             endif()
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)
101         else()
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)
105         endif()
106     endif()
107
108     # pgi
109     if (CMAKE_C_COMPILER_ID MATCHES "PGI")
110         GMX_TEST_CFLAG(CFLAGS_OPT "-fastsse" GMXC_CFLAGS_RELEASE)
111     endif()
112     if (CMAKE_CXX_COMPILER_ID MATCHES "PGI")
113         GMX_TEST_CXXFLAG(CXXFLAGS_OPT "-fastsse" GMXC_CXXFLAGS_RELEASE)
114     endif()
115
116     # Pathscale
117     if (CMAKE_C_COMPILER_ID MATCHES "PathScale")
118         if(NOT GMX_OPENMP)
119             GMX_TEST_CFLAG(CFLAGS_PRAGMA "-Wno-unknown-pragmas" GMXC_CFLAGS)
120         endif()
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" 
123                          GMXC_CFLAGS_RELEASE)
124         GMX_TEST_CFLAG(CFLAGS_LANG "-std=gnu99" GMXC_CFLAGS)
125     endif()
126     if (CMAKE_CXX_COMPILER_ID MATCHES "PathScale")
127         if(NOT GMX_OPENMP)
128             GMX_TEST_CXXFLAG(CXXFLAGS_PRAGMA "-Wno-unknown-pragmas" GMXC_CXXFLAGS)
129         endif()
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)
133     endif()
134
135     # xlc
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)
139     endif()
140     if (CMAKE_CXX_COMPILER_ID MATCHES "XL")
141         GMX_TEST_CXXFLAG(CXXFLAGS_OPT "-qarch=auto -qtune=auto" GMXC_CXXFLAGS)
142     endif()
143
144     # msvc
145     if (MSVC)
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)
152     endif()
153
154     if (CMAKE_C_COMPILER_ID MATCHES "Clang")
155         if(NOT GMX_OPENMP)
156             GMX_TEST_CFLAG(CFLAGS_PRAGMA "-Wno-unknown-pragmas" GMXC_CFLAGS)
157         endif()
158         GMX_TEST_CFLAG(CFLAGS_WARN "-Wall -Wno-unused" GMXC_CFLAGS)
159     endif()
160
161     if (CMAKE_C_COMPILER_ID MATCHES "Clang")
162         if(NOT GMX_OPENMP)
163             GMX_TEST_CFLAG(CXXFLAGS_PRAGMA "-Wno-unknown-pragmas" GMXC_CXXFLAGS)
164         endif()
165         GMX_TEST_CXXFLAG(CXXFLAGS_WARN "-Wall -Wno-unused-function" GMXC_CXXFLAGS)
166     endif()
167       
168     if (CMAKE_C_COMPILER_ID MATCHES "Clang")
169         if(NOT GMX_OPENMP)
170             GMX_TEST_CFLAG(CFLAGS_PRAGMA "-Wno-unknown-pragmas" GMXC_CFLAGS)
171         endif()
172         GMX_TEST_CFLAG(CFLAGS_WARN "-Wall -Wno-unused -Wunused-value" GMXC_CFLAGS)
173     endif()
174
175     if (CMAKE_CXX_COMPILER_ID MATCHES "Clang")
176         if(NOT GMX_OPENMP)
177             GMX_TEST_CXXFLAG(CXXFLAGS_PRAGMA "-Wno-unknown-pragmas" GMXC_CXXFLAGS)
178         endif()
179         GMX_TEST_CXXFLAG(CXXFLAGS_WARN "-Wall -Wno-unused -Wunused-value" GMXC_CXXFLAGS)
180     endif()
181
182     # now actually set the flags:
183     # C
184     if ( NOT DEFINED GMXCFLAGS_SET AND NOT DEFINED ENV{CFLAGS} )
185         set(GMXCFLAGS_SET true CACHE INTERNAL "Whether to reset the C flags" 
186             FORCE)
187         
188         set(CMAKE_C_FLAGS "${GMXC_CFLAGS} ${CMAKE_C_FLAGS}" 
189             CACHE STRING "Flags used by the compiler during all build types." 
190             FORCE)
191         set(CMAKE_C_FLAGS_RELEASE "${GMXC_CFLAGS_RELEASE} ${CMAKE_C_FLAGS_RELEASE}" 
192             CACHE STRING "Flags used by the compiler during release builds." 
193             FORCE)
194         set(CMAKE_C_FLAGS_DEBUG "${GMXC_CFLAGS_DEBUG} ${CMAKE_C_FLAGS_DEBUG}" 
195             CACHE STRING "Flags used by the compiler during debug builds." 
196             FORCE)
197     endif()
198
199     # C++
200     if ( NOT DEFINED GMXCXXFLAGS_SET AND NOT DEFINED ENV{CXXFLAGS} )
201         set(GMXCXXFLAGS_SET true CACHE INTERNAL "Whether to reset the C++ flags" 
202             FORCE)
203         set(CMAKE_CXX_FLAGS "${GMXC_CXXFLAGS} ${CMAKE_CXX_FLAGS}" 
204             CACHE STRING "Flags used by the compiler during all build types." 
205             FORCE)
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." 
209             FORCE)
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." 
213             FORCE)
214     endif()
215 ENDMACRO(gmx_c_flags)
216