Merge "Improved the accuracy of the sd1 integrator" into release-4-6
[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         IF (${VARIABLE})
8             SET (${CFLAGSVAR} "${FLAGS} ${${CFLAGSVAR}}")
9         ENDIF (${VARIABLE}) 
10     ENDIF(NOT DEFINED ${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         IF (${VARIABLE})
19             SET (${CXXFLAGSVAR} "${FLAGS} ${${CXXFLAGSVAR}}")
20         ENDIF (${VARIABLE}) 
21     ENDIF(NOT DEFINED ${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" GMXC_CFLAGS)
38         # new in gcc 4.5
39         GMX_TEST_CFLAG(CFLAGS_EXCESS_PREC "-fexcess-precision=fast" GMXC_CFLAGS)
40         GMX_TEST_CFLAG(CFLAGS_COPT "-fomit-frame-pointer -finline-functions -funroll-all-loops" 
41                        GMXC_CFLAGS_RELEASE)
42         GMX_TEST_CFLAG(CFLAGS_NOINLINE "-fno-inline" GMXC_CFLAGS_DEBUG)
43     endif()
44     # g++
45     if(CMAKE_COMPILER_IS_GNUCXX)
46         if(NOT GMX_OPENMP)
47             GMX_TEST_CFLAG(CXXFLAGS_PRAGMA "-Wno-unknown-pragmas" GMXC_CXXFLAGS)
48         endif()
49         GMX_TEST_CXXFLAG(CXXFLAGS_WARN "-Wall -Wno-unused" GMXC_CXXFLAGS)
50       # new in gcc 4.5
51         GMX_TEST_CXXFLAG(CXXFLAGS_EXCESS_PREC "-fexcess-precision=fast" 
52                           GMXC_CXXFLAGS)
53         GMX_TEST_CXXFLAG(CXXFLAGS_COPT "-fomit-frame-pointer -finline-functions -funroll-all-loops" 
54                          GMXC_CXXFLAGS_RELEASE)
55         GMX_TEST_CXXFLAG(CXXFLAGS_NOINLINE "-fno-inline" GMXC_CXXFLAGS_DEBUG)
56     endif()
57
58     # icc
59     if (CMAKE_C_COMPILER_ID MATCHES "Intel")
60         if (NOT WIN32) 
61             GMX_TEST_CFLAG(CFLAGS_OPT "-ip -funroll-all-loops -std=gnu99" 
62                             GMXC_CFLAGS)
63             GMX_TEST_CFLAG(CFLAGS_SSE2 "-msse2" GMXC_CFLAGS)
64             GMX_TEST_CFLAG(CFLAGS_X86 "-mtune=core2" GMXC_CFLAGS_RELEASE)
65             GMX_TEST_CFLAG(CFLAGS_IA64 "-mtune=itanium2" GMXC_CFLAGS_RELEASE)
66             if(NOT GMX_OPENMP)
67                 GMX_TEST_CFLAG(CFLAGS_PRAGMA "-Wno-unknown-pragmas" GMXC_CFLAGS)
68             endif()
69         else()
70             GMX_TEST_CFLAG(CFLAGS_SSE2 "/arch:SSE2" GMXC_CFLAGS)
71             GMX_TEST_CFLAG(CFLAGS_X86 "/Qip" GMXC_CFLAGS_RELEASE)
72         endif()
73     endif()
74
75     if (CMAKE_CXX_COMPILER_ID MATCHES "Intel")
76         if (NOT WIN32) 
77             GMX_TEST_CXXFLAG(CXXFLAGS_OPT 
78                              "-ip -funroll-all-loops -std=gnu99" 
79                              GMXC_CXXFLAGS)
80             GMX_TEST_CXXFLAG(CXXFLAGS_SSE2 "-msse2" GMXC_CXXFLAGS)
81             GMX_TEST_CXXFLAG(CXXFLAGS_X86 "-mtune=core2" GMXC_CXXFLAGS_RELEASE)
82             GMX_TEST_CXXFLAG(CXXFLAGS_IA64 "-mtune=itanium2" 
83                               GMXC_CXXFLAGS_RELEASE)
84             if(NOT GMX_OPENMP)
85                 GMX_TEST_CFLAG(CXXFLAGS_PRAGMA "-Wno-unknown-pragmas" GMXC_CXXFLAGS)
86             endif()
87         else()
88             GMX_TEST_CXXFLAG(CXXFLAGS_SSE2 "/arch:SSE2" 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         GMX_TEST_CFLAG(CFLAGS_OPT "-OPT:Ofast -fno-math-errno -ffast-math" 
104                          GMXC_CFLAGS_RELEASE)
105         GMX_TEST_CFLAG(CFLAGS_LANG "-std=gnu99" GMXC_CFLAGS)
106     endif()
107     if (CMAKE_CXX_COMPILER_ID MATCHES "PathScale")
108         GMX_TEST_CXXFLAG(CXXFLAGS_OPT "-OPT:Ofast -fno-math-errno -ffast-math" 
109                          GMXC_CXXFLAGS_RELEASE)
110     endif()
111
112     # xlc
113     if (CMAKE_C_COMPILER_ID MATCHES "XL")
114         GMX_TEST_CFLAG(CFLAGS_OPT "-qarch=auto -qtune=auto" GMXC_CFLAGS)
115         GMX_TEST_CFLAG(CFLAGS_LANG "-qlanglvl=extc99" GMXC_CFLAGS)
116     endif()
117     if (CMAKE_CXX_COMPILER_ID MATCHES "XL")
118         GMX_TEST_CXXFLAG(CFLAGS_OPT "-qarch=auto -qtune=auto" GMXC_CXXFLAGS)
119     endif()
120
121     #msvc
122     if (MSVC)
123         # disable warnings for: 
124         #      inconsistent dll linkage
125         GMX_TEST_CFLAG(CFLAGS_WARN "/wd4273" GMXC_CFLAGS)
126         GMX_TEST_CFLAG(CXXFLAGS_WARN "/wd4273" GMXC_CXXFLAGS)
127     endif()
128
129
130     # now actually set the flags:
131     # C
132     if ( NOT DEFINED GMXCFLAGS_SET AND NOT DEFINED ENV{CFLAGS} )
133         set(GMXCFLAGS_SET true CACHE INTERNAL "Whether to reset the C flags" 
134             FORCE)
135         
136         set(CMAKE_C_FLAGS "${GMXC_CFLAGS} ${CMAKE_C_FLAGS}" 
137             CACHE STRING "Flags used by the compiler during all build types." 
138             FORCE)
139         set(CMAKE_C_FLAGS_RELEASE "${GMXC_CFLAGS_RELEASE} ${CMAKE_C_FLAGS_RELEASE}" 
140             CACHE STRING "Flags used by the compiler during release builds." 
141             FORCE)
142         set(CMAKE_C_FLAGS_DEBUG "${GMXC_CFLAGS_DEBUG} ${CMAKE_C_FLAGS_DEBUG}" 
143             CACHE STRING "Flags used by the compiler during debug builds." 
144             FORCE)
145     endif()
146
147     # C++
148     if ( NOT DEFINED GMXCXXFLAGS_SET AND NOT DEFINED ENV{CXXFLAGS} )
149         set(GMXCXXFLAGS_SET true CACHE INTERNAL "Whether to reset the C++ flags" 
150             FORCE)
151         set(CMAKE_CXX_FLAGS "${GMXC_CXXFLAGS} ${CMAKE_CXX_FLAGS}" 
152             CACHE STRING "Flags used by the compiler during all build types." 
153             FORCE)
154         set(CMAKE_CXX_FLAGS_RELEASE 
155             "${GMXC_CXXFLAGS_RELEASE} ${CMAKE_CXX_FLAGS_RELEASE}" 
156             CACHE STRING "Flags used by the compiler during release builds." 
157             FORCE)
158         set(CMAKE_CXX_FLAGS_DEBUG 
159             "${GMXC_CXXFLAGS_DEBUG} ${CMAKE_CXX_FLAGS_DEBUG}" 
160             CACHE STRING "Flags used by the compiler during debug builds." 
161             FORCE)
162     endif()
163 ENDMACRO(gmx_c_flags)
164