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         #flags are added in reverse order and -Wno* need to appear after -Wall
34         if(NOT GMX_OPENMP)
35             GMX_TEST_CFLAG(CFLAGS_PRAGMA "-Wno-unknown-pragmas" GMXC_CFLAGS)
36         endif()
37         GMX_TEST_CFLAG(CFLAGS_WARN "-Wall -Wno-unused -Wunused-value" GMXC_CFLAGS)
38         GMX_TEST_CFLAG(CFLAGS_WARN_EXTRA "-Wextra -Wno-missing-field-initializers -Wno-sign-compare" GMXC_CFLAGS)
39         # new in gcc 4.5
40         GMX_TEST_CFLAG(CFLAGS_EXCESS_PREC "-fexcess-precision=fast" GMXC_CFLAGS_RELEASE)
41         GMX_TEST_CFLAG(CFLAGS_COPT "-fomit-frame-pointer -funroll-all-loops"
42                        GMXC_CFLAGS_RELEASE)
43         GMX_TEST_CFLAG(CFLAGS_NOINLINE "-fno-inline" GMXC_CFLAGS_DEBUG)
44     endif()
45     # g++
46     if(CMAKE_COMPILER_IS_GNUCXX)
47         if(NOT GMX_OPENMP)
48             GMX_TEST_CXXFLAG(CXXFLAGS_PRAGMA "-Wno-unknown-pragmas" GMXC_CXXFLAGS)
49         endif()
50         GMX_TEST_CXXFLAG(CXXFLAGS_WARN "-Wall -Wno-unused -Wunused-value" GMXC_CXXFLAGS)
51         GMX_TEST_CXXFLAG(CXXFLAGS_WARN_EFFCXX "-Wnon-virtual-dtor" GMXC_CXXFLAGS)
52         GMX_TEST_CXXFLAG(CXXFLAGS_WARN_EXTRA "-Wextra -Wno-missing-field-initializers" GMXC_CXXFLAGS)
53       # new in gcc 4.5
54         GMX_TEST_CXXFLAG(CXXFLAGS_EXCESS_PREC "-fexcess-precision=fast" GMXC_CXXFLAGS_RELEASE)
55         GMX_TEST_CXXFLAG(CXXFLAGS_COPT "-fomit-frame-pointer -funroll-all-loops"
56                          GMXC_CXXFLAGS_RELEASE)
57         GMX_TEST_CXXFLAG(CXXFLAGS_NOINLINE "-fno-inline" GMXC_CXXFLAGS_DEBUG)
58     endif()
59
60     # icc
61     if (CMAKE_C_COMPILER_ID MATCHES "Intel")
62         if (NOT WIN32) 
63             if(NOT GMX_OPENMP)
64                 GMX_TEST_CFLAG(CFLAGS_PRAGMA "-Wno-unknown-pragmas" GMXC_CFLAGS)
65             endif()
66             GMX_TEST_CFLAG(CFLAGS_WARN "-Wall" GMXC_CFLAGS)
67             GMX_TEST_CFLAG(CFLAGS_STDGNU "-std=gnu99" GMXC_CFLAGS)
68             GMX_TEST_CFLAG(CFLAGS_OPT "-ip -funroll-all-loops" GMXC_CFLAGS_RELEASE)
69             GMX_TEST_CFLAG(CFLAGS_X86 "-mtune=core2" GMXC_CFLAGS_RELEASE)
70             GMX_TEST_CFLAG(CFLAGS_IA64 "-mtune=itanium2" GMXC_CFLAGS_RELEASE)
71         else()
72             GMX_TEST_CFLAG(CFLAGS_WARN "/W2" GMXC_CFLAGS)
73             GMX_TEST_CFLAG(CFLAGS_X86 "/Qip" GMXC_CFLAGS_RELEASE)
74         endif()
75     endif()
76
77     if (CMAKE_CXX_COMPILER_ID MATCHES "Intel")
78         if (NOT WIN32) 
79             if(NOT GMX_OPENMP)
80                 GMX_TEST_CXXFLAG(CXXFLAGS_PRAGMA "-Wno-unknown-pragmas" GMXC_CXXFLAGS)
81             endif()
82             GMX_TEST_CXXFLAG(CXXFLAGS_WARN "-Wall" GMXC_CXXFLAGS)
83             GMX_TEST_CXXFLAG(CXXFLAGS_OPT "-ip -funroll-all-loops" GMXC_CXXFLAGS_RELEASE)
84             GMX_TEST_CXXFLAG(CXXFLAGS_X86 "-mtune=core2" GMXC_CXXFLAGS_RELEASE)
85             GMX_TEST_CXXFLAG(CXXFLAGS_IA64 "-mtune=itanium2" 
86                               GMXC_CXXFLAGS_RELEASE)
87         else()
88             GMX_TEST_CXXFLAG(CXXFLAGS_WARN "/W2" GMXC_CXXFLAGS)
89             GMX_TEST_CXXFLAG(CXXFLAGS_X86 "/Qip" GMXC_CXXFLAGS_RELEASE)
90         endif()
91     endif()
92
93     # pgi
94     if (CMAKE_C_COMPILER_ID MATCHES "PGI")
95         GMX_TEST_CFLAG(CFLAGS_OPT "-fastsse" GMXC_CFLAGS_RELEASE)
96     endif()
97     if (CMAKE_CXX_COMPILER_ID MATCHES "PGI")
98         GMX_TEST_CXXFLAG(CXXFLAGS_OPT "-fastsse" GMXC_CXXFLAGS_RELEASE)
99     endif()
100
101     # Pathscale
102     if (CMAKE_C_COMPILER_ID MATCHES "PathScale")
103         if(NOT GMX_OPENMP)
104             GMX_TEST_CFLAG(CFLAGS_PRAGMA "-Wno-unknown-pragmas" GMXC_CFLAGS)
105         endif()
106         GMX_TEST_CFLAG(CFLAGS_WARN "-Wall -Wno-unused -Wunused-value" GMXC_CFLAGS)
107         GMX_TEST_CFLAG(CFLAGS_OPT "-OPT:Ofast -fno-math-errno -ffast-math" 
108                          GMXC_CFLAGS_RELEASE)
109         GMX_TEST_CFLAG(CFLAGS_LANG "-std=gnu99" GMXC_CFLAGS)
110     endif()
111     if (CMAKE_CXX_COMPILER_ID MATCHES "PathScale")
112         if(NOT GMX_OPENMP)
113             GMX_TEST_CXXFLAG(CXXFLAGS_PRAGMA "-Wno-unknown-pragmas" GMXC_CXXFLAGS)
114         endif()
115         GMX_TEST_CXXFLAG(CXXFLAGS_WARN "-Wall -Wno-unused -Wunused-value" GMXC_CXXFLAGS)
116         GMX_TEST_CXXFLAG(CXXFLAGS_OPT "-OPT:Ofast -fno-math-errno -ffast-math" 
117                          GMXC_CXXFLAGS_RELEASE)
118     endif()
119
120     # xlc
121     if (CMAKE_C_COMPILER_ID MATCHES "XL")
122         GMX_TEST_CFLAG(CFLAGS_OPT "-qarch=auto -qtune=auto" GMXC_CFLAGS)
123         GMX_TEST_CFLAG(CFLAGS_LANG "-qlanglvl=extc99" GMXC_CFLAGS)
124     endif()
125     if (CMAKE_CXX_COMPILER_ID MATCHES "XL")
126         GMX_TEST_CXXFLAG(CXXFLAGS_OPT "-qarch=auto -qtune=auto" GMXC_CXXFLAGS)
127     endif()
128
129     # msvc
130     if (MSVC)
131         # disable warnings for: 
132         #      forcing value to bool
133         #      "this" in initializer list
134         #      deprecated (posix, secure) functions
135         GMX_TEST_CFLAG(CFLAGS_WARN "/wd4800 /wd4355 /wd4996" GMXC_CFLAGS)
136         GMX_TEST_CXXFLAG(CXXFLAGS_WARN "/wd4800 /wd4355 /wd4996" GMXC_CXXFLAGS)
137     endif()
138
139     if (CMAKE_C_COMPILER_ID MATCHES "Clang")
140         if(NOT GMX_OPENMP)
141             GMX_TEST_CFLAG(CFLAGS_PRAGMA "-Wno-unknown-pragmas" GMXC_CFLAGS)
142         endif()
143         GMX_TEST_CFLAG(CFLAGS_WARN "-Wall -Wno-unused" GMXC_CFLAGS)
144     endif()
145
146     if (CMAKE_C_COMPILER_ID MATCHES "Clang")
147         if(NOT GMX_OPENMP)
148             GMX_TEST_CFLAG(CXXFLAGS_PRAGMA "-Wno-unknown-pragmas" GMXC_CXXFLAGS)
149         endif()
150         GMX_TEST_CXXFLAG(CXXFLAGS_WARN "-Wall -Wno-unused-function" GMXC_CXXFLAGS)
151     endif()
152       
153     if (CMAKE_C_COMPILER_ID MATCHES "Clang")
154         if(NOT GMX_OPENMP)
155             GMX_TEST_CFLAG(CFLAGS_PRAGMA "-Wno-unknown-pragmas" GMXC_CFLAGS)
156         endif()
157         GMX_TEST_CFLAG(CFLAGS_WARN "-Wall -Wno-unused -Wunused-value" GMXC_CFLAGS)
158     endif()
159
160     if (CMAKE_CXX_COMPILER_ID MATCHES "Clang")
161         if(NOT GMX_OPENMP)
162             GMX_TEST_CXXFLAG(CXXFLAGS_PRAGMA "-Wno-unknown-pragmas" GMXC_CXXFLAGS)
163         endif()
164         GMX_TEST_CXXFLAG(CXXFLAGS_WARN "-Wall -Wno-unused -Wunused-value" GMXC_CXXFLAGS)
165     endif()
166
167     # now actually set the flags:
168     # C
169     if ( NOT GMX_SKIP_DEFAULT_CFLAGS )
170         set(CMAKE_C_FLAGS "${GMXC_CFLAGS} ${CMAKE_C_FLAGS}")
171         set(CMAKE_C_FLAGS_RELEASE "${GMXC_CFLAGS_RELEASE} ${CMAKE_C_FLAGS_RELEASE}")
172         set(CMAKE_C_FLAGS_DEBUG "${GMXC_CFLAGS_DEBUG} ${CMAKE_C_FLAGS_DEBUG}")
173     endif()
174
175     # C++
176     if ( NOT GMX_SKIP_DEFAULT_CFLAGS)
177         set(CMAKE_CXX_FLAGS "${GMXC_CXXFLAGS} ${CMAKE_CXX_FLAGS}")
178         set(CMAKE_CXX_FLAGS_RELEASE 
179             "${GMXC_CXXFLAGS_RELEASE} ${CMAKE_CXX_FLAGS_RELEASE}")
180         set(CMAKE_CXX_FLAGS_DEBUG 
181             "${GMXC_CXXFLAGS_DEBUG} ${CMAKE_CXX_FLAGS_DEBUG}")
182     endif()
183 ENDMACRO(gmx_c_flags)
184