# # This file is part of the GROMACS molecular simulation package. # # Copyright (c) 2009,2010,2011,2012,2013, by the GROMACS development team, led by # Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl, # and including many others, as listed in the AUTHORS file in the # top-level source directory and at http://www.gromacs.org. # # GROMACS is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public License # as published by the Free Software Foundation; either version 2.1 # of the License, or (at your option) any later version. # # GROMACS is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public # License along with GROMACS; if not, see # http://www.gnu.org/licenses, or write to the Free Software Foundation, # Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. # # If you want to redistribute modifications to GROMACS, please # consider that scientific software is very special. Version # control is crucial - bugs must be traceable. We will be happy to # consider code for inclusion in the official distribution, but # derived work must not be called official GROMACS. Details are found # in the README & COPYING files - if they are missing, get the # official version at http://www.gromacs.org. # # To help us fund GROMACS development, we humbly ask that you cite # the research papers on the package. Check out http://www.gromacs.org. # Test C flags FLAGS, and set VARIABLE to true if the work. Also add the # flags to CFLAGSVAR. MACRO(GMX_TEST_CFLAG VARIABLE FLAGS CFLAGSVAR) IF(NOT DEFINED ${VARIABLE}) CHECK_C_COMPILER_FLAG("${FLAGS}" ${VARIABLE}) ENDIF(NOT DEFINED ${VARIABLE}) IF (${VARIABLE}) SET (${CFLAGSVAR} "${FLAGS} ${${CFLAGSVAR}}") ENDIF (${VARIABLE}) ENDMACRO(GMX_TEST_CFLAG VARIABLE FLAGS CFLAGSVAR) # Test C++ flags FLAGS, and set VARIABLE to true if the work. Also add the # flags to CXXFLAGSVAR. MACRO(GMX_TEST_CXXFLAG VARIABLE FLAGS CXXFLAGSVAR) IF(NOT DEFINED ${VARIABLE}) CHECK_CXX_COMPILER_FLAG("${FLAGS}" ${VARIABLE}) ENDIF(NOT DEFINED ${VARIABLE}) IF (${VARIABLE}) SET (${CXXFLAGSVAR} "${FLAGS} ${${CXXFLAGSVAR}}") ENDIF (${VARIABLE}) ENDMACRO(GMX_TEST_CXXFLAG VARIABLE FLAGS CXXFLAGSVAR) # This is the actual exported function to be called MACRO(gmx_c_flags) include(CheckCCompilerFlag) include(CheckCXXCompilerFlag) # gcc if(CMAKE_COMPILER_IS_GNUCC) #flags are added in reverse order and -Wno* need to appear after -Wall if(NOT GMX_OPENMP) GMX_TEST_CFLAG(CFLAGS_PRAGMA "-Wno-unknown-pragmas" GMXC_CFLAGS) endif() GMX_TEST_CFLAG(CFLAGS_WARN "-Wall -Wno-unused -Wunused-value" GMXC_CFLAGS) GMX_TEST_CFLAG(CFLAGS_WARN_EXTRA "-Wextra -Wno-missing-field-initializers -Wno-sign-compare" GMXC_CFLAGS) # new in gcc 4.5 GMX_TEST_CFLAG(CFLAGS_EXCESS_PREC "-fexcess-precision=fast" GMXC_CFLAGS_RELEASE) GMX_TEST_CFLAG(CFLAGS_COPT "-fomit-frame-pointer -funroll-all-loops" GMXC_CFLAGS_RELEASE) GMX_TEST_CFLAG(CFLAGS_NOINLINE "-fno-inline" GMXC_CFLAGS_DEBUG) endif() # g++ if(CMAKE_COMPILER_IS_GNUCXX) if(NOT GMX_OPENMP) GMX_TEST_CXXFLAG(CXXFLAGS_PRAGMA "-Wno-unknown-pragmas" GMXC_CXXFLAGS) endif() GMX_TEST_CXXFLAG(CXXFLAGS_WARN "-Wall -Wno-unused-function" GMXC_CXXFLAGS) GMX_TEST_CXXFLAG(CXXFLAGS_WARN_EFFCXX "-Wnon-virtual-dtor" GMXC_CXXFLAGS) GMX_TEST_CXXFLAG(CXXFLAGS_WARN_EXTRA "-Wextra -Wno-missing-field-initializers" GMXC_CXXFLAGS) # new in gcc 4.5 GMX_TEST_CXXFLAG(CXXFLAGS_EXCESS_PREC "-fexcess-precision=fast" GMXC_CXXFLAGS_RELEASE) GMX_TEST_CXXFLAG(CXXFLAGS_COPT "-fomit-frame-pointer -funroll-all-loops" GMXC_CXXFLAGS_RELEASE) GMX_TEST_CXXFLAG(CXXFLAGS_NOINLINE "-fno-inline" GMXC_CXXFLAGS_DEBUG) endif() # icc if (CMAKE_C_COMPILER_ID MATCHES "Intel") if (NOT WIN32) if(NOT GMX_OPENMP) GMX_TEST_CFLAG(CFLAGS_PRAGMA "-Wno-unknown-pragmas" GMXC_CFLAGS) endif() GMX_TEST_CFLAG(CFLAGS_WARN "-Wall" GMXC_CFLAGS) GMX_TEST_CFLAG(CFLAGS_STDGNU "-std=gnu99" GMXC_CFLAGS) GMX_TEST_CFLAG(CFLAGS_OPT "-ip -funroll-all-loops" GMXC_CFLAGS_RELEASE) else() GMX_TEST_CFLAG(CFLAGS_WARN "/W2" GMXC_CFLAGS) GMX_TEST_CFLAG(CFLAGS_X86 "/Qip" GMXC_CFLAGS_RELEASE) endif() endif() if (CMAKE_CXX_COMPILER_ID MATCHES "Intel") if (NOT WIN32) if(NOT GMX_OPENMP) GMX_TEST_CXXFLAG(CXXFLAGS_PRAGMA "-Wno-unknown-pragmas" GMXC_CXXFLAGS) endif() GMX_TEST_CXXFLAG(CXXFLAGS_WARN "-Wall" GMXC_CXXFLAGS) GMX_TEST_CXXFLAG(CXXFLAGS_OPT "-ip -funroll-all-loops" GMXC_CXXFLAGS_RELEASE) else() GMX_TEST_CXXFLAG(CXXFLAGS_WARN "/W2" GMXC_CXXFLAGS) GMX_TEST_CXXFLAG(CXXFLAGS_X86 "/Qip" GMXC_CXXFLAGS_RELEASE) endif() endif() # pgi if (CMAKE_C_COMPILER_ID MATCHES "PGI") GMX_TEST_CFLAG(CFLAGS_OPT "-fastsse" GMXC_CFLAGS_RELEASE) endif() if (CMAKE_CXX_COMPILER_ID MATCHES "PGI") GMX_TEST_CXXFLAG(CXXFLAGS_OPT "-fastsse" GMXC_CXXFLAGS_RELEASE) endif() # Pathscale if (CMAKE_C_COMPILER_ID MATCHES "PathScale") if(NOT GMX_OPENMP) GMX_TEST_CFLAG(CFLAGS_PRAGMA "-Wno-unknown-pragmas" GMXC_CFLAGS) endif() GMX_TEST_CFLAG(CFLAGS_WARN "-Wall -Wno-unused -Wunused-value" GMXC_CFLAGS) GMX_TEST_CFLAG(CFLAGS_OPT "-OPT:Ofast -fno-math-errno -ffast-math" GMXC_CFLAGS_RELEASE) GMX_TEST_CFLAG(CFLAGS_LANG "-std=gnu99" GMXC_CFLAGS) endif() if (CMAKE_CXX_COMPILER_ID MATCHES "PathScale") if(NOT GMX_OPENMP) GMX_TEST_CXXFLAG(CXXFLAGS_PRAGMA "-Wno-unknown-pragmas" GMXC_CXXFLAGS) endif() GMX_TEST_CXXFLAG(CXXFLAGS_WARN "-Wall -Wno-unused -Wunused-value" GMXC_CXXFLAGS) GMX_TEST_CXXFLAG(CXXFLAGS_OPT "-OPT:Ofast -fno-math-errno -ffast-math" GMXC_CXXFLAGS_RELEASE) endif() # xlc if (CMAKE_C_COMPILER_ID MATCHES "XL") GMX_TEST_CFLAG(CFLAGS_OPT "-qarch=auto -qtune=auto" GMXC_CFLAGS) GMX_TEST_CFLAG(CFLAGS_LANG "-qlanglvl=extc99" GMXC_CFLAGS) endif() if (CMAKE_CXX_COMPILER_ID MATCHES "XL") GMX_TEST_CXXFLAG(CXXFLAGS_OPT "-qarch=auto -qtune=auto" GMXC_CXXFLAGS) endif() # msvc if (MSVC) # disable warnings for: # forcing value to bool # "this" in initializer list # deprecated (posix, secure) functions GMX_TEST_CFLAG(CFLAGS_WARN "/wd4800 /wd4355 /wd4996" GMXC_CFLAGS) GMX_TEST_CXXFLAG(CXXFLAGS_WARN "/wd4800 /wd4355 /wd4996" GMXC_CXXFLAGS) endif() if (CMAKE_C_COMPILER_ID MATCHES "Clang") if(NOT GMX_OPENMP) GMX_TEST_CFLAG(CFLAGS_PRAGMA "-Wno-unknown-pragmas" GMXC_CFLAGS) endif() GMX_TEST_CFLAG(CFLAGS_WARN "-Wall -Wno-unused -Wunused-value" GMXC_CFLAGS) endif() if (CMAKE_CXX_COMPILER_ID MATCHES "Clang") if(NOT GMX_OPENMP) GMX_TEST_CXXFLAG(CXXFLAGS_PRAGMA "-Wno-unknown-pragmas" GMXC_CXXFLAGS) endif() GMX_TEST_CXXFLAG(CXXFLAGS_WARN "-Wall -Wno-unused-function" GMXC_CXXFLAGS) GMX_TEST_CXXFLAG(CXXFLAGS_WARN_EXTRA "-Wextra -Wno-missing-field-initializers" GMXC_CXXFLAGS) endif() # now actually set the flags: # C if ( NOT GMX_SKIP_DEFAULT_CFLAGS ) set(CMAKE_C_FLAGS "${GMXC_CFLAGS} ${CMAKE_C_FLAGS}") set(CMAKE_C_FLAGS_RELEASE "${GMXC_CFLAGS_RELEASE} ${CMAKE_C_FLAGS_RELEASE}") set(CMAKE_C_FLAGS_DEBUG "${GMXC_CFLAGS_DEBUG} ${CMAKE_C_FLAGS_DEBUG}") endif() # C++ if ( NOT GMX_SKIP_DEFAULT_CFLAGS) set(CMAKE_CXX_FLAGS "${GMXC_CXXFLAGS} ${CMAKE_CXX_FLAGS}") set(CMAKE_CXX_FLAGS_RELEASE "${GMXC_CXXFLAGS_RELEASE} ${CMAKE_CXX_FLAGS_RELEASE}") set(CMAKE_CXX_FLAGS_DEBUG "${GMXC_CXXFLAGS_DEBUG} ${CMAKE_CXX_FLAGS_DEBUG}") endif() ENDMACRO(gmx_c_flags)