From b5c630141def6f78be32779fe98124ca61de55bf Mon Sep 17 00:00:00 2001 From: zhangc43 Date: Thu, 25 Feb 2016 16:33:21 -0500 Subject: [PATCH] converting compiler flag settings to CMake --- CMakeLists.txt | 348 ++++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 302 insertions(+), 46 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 2b9eba77b..d2fa52e9a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,66 +1,322 @@ -# INITIAL ATTEMPT OF USING CMAKE TO BUILD THE SPECTRAL SOLVER -# CMAKE SHOULD BE ABLE TO TAKE CARE OF THE DEPENDENCE BY ITSELF. -# +######################################################################################## +# CMAKE for build the Material subroutine for BVP solution +######################################################################################## +# OPTIONS = standard (alternative): meaning +#------------------------------------------------------------- +# F90 = ifort (gfortran): compiler type, choose Intel or GNU +# COMPILERNAME = name of the compiler executable (if not the same as the ype), e.g. using mpich-g90 instead of ifort +# PORTABLE = TRUE (FALSE): decision, if executable is optimized for the machine on which it was built. +# OPTIMIZATION = DEFENSIVE (OFF,AGGRESSIVE,ULTRA): Optimization mode: O2, O0, O3 + further options for most files, O3 + further options for all files +# OPENMP = TRUE (FALSE): OpenMP multiprocessor support +# PREFIX = arbitrary prefix (before compilername) +# OPTION = arbitrary option (just before file to compile) +# SUFFIX = arbitrary suffix (after file to compile) +# STANDARD_CHECK = checking for Fortran 2008, compiler dependend +######################################################################################## cmake_minimum_required (VERSION 3.1.0) -project (DAMASKSpectral Fortran) - - -# make sure that the default is a RELEASE -if (NOT CMAKE_BUILD_TYPE) - set (CMAKE_BUILD_TYPE RELEASE CACHE STRING - "Choose the type of build, options are: None Debug Release." - FORCE) -endif (NOT CMAKE_BUILD_TYPE) - +project (DAMASK Fortran) # The version number. -set (DAMASKSpectral_VERSION_MAJOR 1) -set (DAMASKSpectral_VERSION_MINOR 0) +set (DAMASK_VERSION_MAJOR 1) +set (DAMASK_VERSION_MINOR ${DAMASK_V}) -# Set up build directory -set (CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/build) -set (CMAKE_LIBRARY_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/lib) -set (CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/lib) +## +# find_package() might not work on customized system. +# it is recommended for the user to specify the location +# of PETSc and HDF5 library +if (defined PETSC_DIR) + set (PETSC ${PETSC_DIR}) +else (defined PETSC_DIR) + find_package(PETSC) +endif (defined PETSC_DIR) +if (defined HDF5_DIR) + set (HDF5 ${HDF5_DIR}) +else (defined HDF5_DIR) + find_package(HDF5) +endif (defined HDF5_DIR) -# setup modules -find_package(petsc) -find_package(hdf5) +## +# set system include directories +include_directories( + ${PETSC}/lib/petsc/conf/variables + ${PETSC}/lib/petsc/conf/rules + ../lib + ${HDF5}/include + ) -# FFLAGS depend on the compiler -# need extra time to work on these +## +# set compile and debug flags +if (OPENMP MATCHES 'ON') + set (OPENMP_FLAG_ifort "-openmp -openmp-report0 -parallel") + set (OPENMP_FLAG_gfortran "-fopenmp") +else (OPENMP MATCHES 'ON') + message("No openmp support specified") + set (OPENMP_FLAG_ifort "") + set (OPENMP_FLAG_gfortran "") +endif (OPENMP MATCHES 'ON') + +if (OPTIMIZATION MATCHES "OFF") + set (OPTIMIZATION_ifort "-O0 -no-ip") + set (OPTIMIZATION_gfortran "-O0") +elseif (OPTIMIZATION MATCHES "DEFENSIVE") + set (OPTIMIZATION_ifort "-O2") + set (OPTIMIZATION_gfortran "-O2") +elseif (OPTIMIZATION MATCHES "AGGRESSIVE") + set (OPTIMIZATION_ifort "-ipo -O3 -no-prec-div -fp-model fast=2 -xHost") #-fast = -ipo, -O3, -no-prec-div, -static, -fp-model fast=2, and -xHost" + set (OPTIMIZATION_gfortran "-O3 -ffast-math -funroll-loops -ftree-vectorize") +elseif (OPTIMIZATION MATCHES "ULTRA") + set (OPTIMIZATION_ifort "-ipo -O3 -no-prec-div -fp-model fast=2 -xHost") #-fast = -ipo, -O3, -no-prec-div, -static, -fp-model fast=2, and -xHost" + set (OPTIMIZATION_gfortran "-O3 -ffast-math -funroll-loops -ftree-vectorize") +else (OPTIMIZATION MATCHES "OFF") + set (OPTIMIZATION_ifort "-O2") + set (OPTIMIZATION_gfortran "-O2") +endif (OPTIMIZATION MATCHES "OFF") + +set (STANDARD_CHECK_ifort "-stand f08 -standard-semantics") +set (STANDARD_CHECK_gfortran "-std=f2008ts -pedantic-errors" ) + +################################################################################################### +# COMPILE SWITCHES +# -shared-intel: Link against shared Intel libraries instead of static ones +# -fpp: preprocessor +# -ftz: flush unterflow to zero, automatically set if O<0,1,2,3> >0 +# -assume byterecl record length is given in bytes (also set by -standard-semantics) +# fpe_summary print list of floating point exceptions occured during execution +# -fimplicit-none: assume "implicit-none" even if not present in source +# -diag-disable: disables warnings, where +# warning ID 5268: the text exceeds right hand column allowed on the line (we have only comments there) +# -warn: enables warnings, where +# declarations: any undeclared names (alternative name: -implicitnone) +# general: warning messages and informational messages are issued by the compiler +# usage: questionable programming practices +# interfaces: checks the interfaces of all SUBROUTINEs called and FUNCTIONs invoked in your compilation against an external set of interface blocks +# ignore_loc: %LOC is stripped from an actual argument +# alignments: data that is not naturally aligned +# unused: declared variables that are never used +# stderrors: warnings about Fortran standard violations are changed to errors (STANDARD_CHECK) +# +################################################################################################### +# MORE OPTIONS FOR DEBUGGING DURING COMPILATION +# -warn: enables warnings, where +# truncated_source: Determines whether warnings occur when source exceeds the maximum column width in fixed-format files. (too many warnings because we have comments beyond character 132) +# uncalled: Determines whether warnings occur when a statement function is never called +# all: +# -name as_is: case sensitive Fortran! +################################################################################################### +set (COMPILE_OPTIONS_ifort "-DDAMASKVERSION=${DAMASK_V}" + "-fpp" + "-ftz" + "-assume byterecl,fpe_summary" + "-diag-disable 5268" + "-warn declarations" + "-warn general" + "-warn usage" + "-warn interfaces" + "-warn ignore_loc" + "-warn alignments" + "-warn unused" + ) + +################################################################################################### +# COMPILE SWITCHES FOR RUNTIME DEBUGGING +# -g: Generate symbolic debugging information in the object file +# -traceback: Generate extra information in the object file to provide source file traceback information when a severe error occurs at run time. +# -gen-interfaces: Generate an interface block for each routine. http://software.intel.com/en-us/blogs/2012/01/05/doctor-fortran-gets-explicit-again/ +# -fp-stack-check: Generate extra code after every function call to ensure that the floating-point (FP) stack is in the expected state. +# -ftrapuv Trap uninitalized variables +# -check: checks at runtime, where +# bounds: check if an array index is too small (<1) or too large! +# format: Checking for the data type of an item being formatted for output. +# output_conversion: Checking for the fit of data items within a designated format descriptor field. +# pointers: Checking for certain disassociated or uninitialized pointers or unallocated allocatable objects. +# uninit: Checking for uninitialized variables. +# -fpe-all0 capture all floating-point exceptions, sets -ftz automatically +# -warn: enables warnings, where +# errors: warnings are changed to errors +# stderrors: warnings about Fortran standard violations are changed to errors +# information on http://software.intel.com/en-us/articles/determining-root-cause-of-sigsegv-or-sigbus-errors/ +################################################################################################### +# MORE OPTIONS FOR RUNTIME DEBUGGING +# -heap-arrays: should not be done for OpenMP, but set "ulimit -s unlimited" on shell. Probably it helps also to unlimit other limits +# -check: checks at runtime, where +# arg_temp_created: will cause a lot of warnings because we create a bunch of temporary arrays (performance?) +# stack: +################################################################################################### +set (DEBUG_OPTIONS_ifort "-g" + "-traceback" + "-gen-interfaces" + "-fp-stack-check" + "-fp-model strict" + "-check bounds,format,output_conversion,pointers,uninit" + "-ftrapuv" + "-fpe-all0" + "-warn errors" + "-warn stderrors" + "-debug-parameters all" + ) + +set (LINK_OPTIONS_ifort "-shared-intel") + +################################################################################################### +# COMPILE SWITCHES +# -shared +# -Wl,-undefined,dynamic_lookup:ensure to link against dynamic libraries +# -xf95-cpp-input: preprocessor +# -ffree-line-length-132: restrict line length to the standard 132 characters +# -ffpe-summary: print summary of floating point exeptions (‘invalid’, ‘zero’, ‘overflow’, ‘underflow’, ‘inexact’ and ‘denormal’) +# -fimplicit-none: assume "implicit-none" even if not present in source +# -fmodule-private: assume "private" even if not present in source +# -Wcharacter-truncation: warn if character expressions (strings) are truncated +# -Wunderflow: produce a warning when numerical constant expressions are encountered, which yield an UNDERFLOW during compilation +# -Wsuggest-attribute=pure: +# -Wsuggest-attribute=noreturn: +# -Wconversion-extra +# -Wimplicit-procedure +# -Wall: sets the following Fortran options: +# -Waliasing: warn about possible aliasing of dummy arguments. Specifically, it warns if the same actual argument is associated with a dummy argument with "INTENT(IN)" and a dummy argument with "INTENT(OUT)" in a call with an explicit interface. +# -Wampersand: checks if a character expression is continued proberly by an ampersand at the end of the line and at the beginning of the new line +# -Warray-bounds: checks if array reference is out of bounds at compile time. use -fcheck-bounds to also check during runtime +# -Wconversion: warn about implicit conversions between different type +# -Wsurprising: warn when "suspicious" code constructs are encountered. While technically legal these usually indicate that an error has been made. +# -Wc-binding-type: +# -Wintrinsics-std: only standard intrisics are available, e.g. "call flush(6)" will cause an error +# -Wno-tabs: do not allow tabs in source +# -Wintrinsic-shadow: warn if a user-defined procedure or module procedure has the same name as an intrinsic +# -Wline-truncation: +# -Wtarget-lifetime: +# -Wreal-q-constant: warn about real-literal-constants with 'q' exponent-letter +# -Wunused: a number of unused-xxx warnings +# these are general (non -Fortran options) implied by -Wall +# -Waddress +# -Warray-bounds (only with -O2) +# -Wc++11-compat +# -Wchar-subscripts +# -Wcomment +# -Wformat +# -Wmaybe-uninitialized +# -Wnonnull +# -Wparentheses +# -Wpointer-sign +# -Wreorder +# -Wreturn-type +# -Wsequence-point +# -Wstrict-aliasing +# -Wstrict-overflow=1 +# -Wswitch +# -Wtrigraphs +# -Wuninitialized +# -Wunknown-pragmas +# -Wunused-function +# -Wunused-label +# -Wunused-value +# -Wunused-variable +# -Wvolatile-register-var +# -Wextra: sets the following Fortran options: +# -Wunuses-parameter: +# -Wcompare-reals: +# these are general (non -Fortran options) implied by -Wextra +# -Wclobbered +# -Wempty-body +# -Wignored-qualifiers +# -Wmissing-field-initializers +# -Woverride-init +# -Wsign-compare +# -Wtype-limits +# -Wuninitialized +# -Wunused-but-set-parameter (only with -Wunused or -Wall) +# -Wno-globals +# -ffpe-summary=all only for newer gfortran +################################################################################################### +# MORE OPTIONS FOR DEBUGGING DURING COMPILATION +# -Warray-temporarieswarnings: because we have many temporary arrays (performance issue?): +# -Wimplicit-interface: no interfaces for lapack routines +# -Wunsafe-loop-optimizations: warn if the loop cannot be optimized due to nontrivial assumptions. +# -Wstrict-overflow: +################################################################################################### +set (COMPILE_OPTIONS_gfortran "-DDAMASKVERSION=${DAMASKVERSION}" + "-xf95-cpp-input" + "-ffree-line-length-132" + "-fimplicit-none" + "-fmodule-private" + "-Wall" + "-Wextra" + "-Wcharacter-truncation" + "-Wunderflow" + "-Wsuggest-attribute=pure" + "-Wsuggest-attribute=noreturn" + "-Wconversion-extra" + "-Wimplicit-procedure" + "-Wno-unused-parameter" + ) + +################################################################################################### +# COMPILE SWITCHES FOR RUNTIME DEBUGGING +# -ffpe-trap=invalid,\ stop execution if floating point exception is detected (NaN is silent) +# zero,\ +# overflow +# -fcheck=all: sets the following Fortran options: +# array-temps +# bounds +# do +# mem +# pointer +# recursion +################################################################################################### +# MORE OPTIONS FOR RUNTIME DEBUGGING +# -ffpe-trap=precision,\ +# denormal, \ +# underflow +################################################################################################### +set (DEBUG_OPTIONS_gfortran "-g" + "-fbacktrace" + "-fdump-core" + "-fcheck=all" + "-ffpe-trap=invalid,zero,overflow" + ) + +set (LINK_OPTIONS_gfortran "-Wl,-undefined,dynamic_lookup") + +# set FLAGS get_filename_component (Fortran_COMPILER_NAME ${CMAKE_Fortran_COMPILER} NAME) -if (Fortran_COMPILER_NAME MATCHES "gfortran.*") - # gfortran - set (CMAKE_Fortran_FLAGS_RELEASE "-funroll-all-loops -fno-f2c -O3") - set (CMAKE_Fortran_FLAGS_DEBUG "-fno-f2c -O0 -g") -elseif (Fortran_COMPILER_NAME MATCHES "ifort.*") - # ifort (untested) - set (CMAKE_Fortran_FLAGS_RELEASE "-f77rtl -O3") - set (CMAKE_Fortran_FLAGS_DEBUG "-f77rtl -O0 -g") +if (Fortran_COMPILER_NAME MATCHES "ifort.*") + # for RELEASE + set (CMAKE_Fortran_FLAGS_RELEASE ${COMPILE_OPTIONS_ifort}) + set (CMAKE_EXE_LINKER_FLAGS_RELEASE ${LINK_OPTIONS_ifort} + ${OPTIMIZATION_ifort} ) + # for DEBUG + set (CMAKE_Fortran_FLAGS_DEBUG ${COMPILE_OPTIONS_ifort} + ${DEBUG_OPTIONS_ifort} ) + set (CMAKE_EXE_LINKER_FLAGS_DEBUG ${LINK_OPTIONS_ifort} + ${DEBUG_OPTIONS_ifort} ) + # +elseif (Fortran_COMPILER_NAME MATCHES "gfortran.*") + # for RELEASE + set (CMAKE_Fortran_FLAGS_RELEASE ${COMPILE_OPTIONS_gfortran}) + set (CMAKE_EXE_LINKER_FLAGS_RELEASE ${LINK_OPTIONS_gfortran} + ${OPTIMIZATION_gfortran} ) + # for DEBUG + set (CMAKE_Fortran_FLAGS_DEBUG ${COMPILE_OPTIONS_gfortran} + ${DEBUG_OPTIONS_gfortran} ) + set (CMAKE_EXE_LINKER_FLAGS_DEBUG ${LINK_OPTIONS_gfortran} + ${DEBUG_OPTIONS_gfortran} ) + # elseif (Fortran_COMPILER_NAME MATCHES "g77") - # g77 - set (CMAKE_Fortran_FLAGS_RELEASE "-funroll-all-loops -fno-f2c -O3 -m32") - set (CMAKE_Fortran_FLAGS_DEBUG "-fno-f2c -O0 -g -m32") -else (Fortran_COMPILER_NAME MATCHES "gfortran.*") - message ("CMAKE_Fortran_COMPILER full path: " ${CMAKE_Fortran_COMPILER}) - message ("Fortran compiler: " ${Fortran_COMPILER_NAME}) - message ("No optimized Fortran compiler flags are known, we just try -O2...") - set (CMAKE_Fortran_FLAGS_RELEASE "-O2") - set (CMAKE_Fortran_FLAGS_DEBUG "-O0 -g") -endif (Fortran_COMPILER_NAME MATCHES "gfortran.*") - + message (FATAL_ERROR "Fortran 77 is not supported.") +else (Fortran_COMPILER_NAME MATCHES "ifort.*") + message (FATAL_ERROR "Require Fortran90 from GNU or Intel.") +endif (Fortran_COMPILER_NAME MATCHES "ifort.*") +## # ADD CODE(SOURCE) DIRECTORY add_subdirectory(code) - +## # ADD TESTING CASES add_test (SmokeTestRun DAMASK_spectral.exe -g test/test1.geom -l test/test.load) - # Enable Dashboard scripting # include (CTest) -# set (CTEST_PROJECT_NAME "DAMASK") +# set (CTEST_PROJECT_NAME "DAMASK") \ No newline at end of file