diff --git a/CMakeLists.txt b/CMakeLists.txt index 7da86d6e8..a0f754b61 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -2,6 +2,9 @@ # CMAKE for build the Material subroutine for BVP solution ######################################################################################## cmake_minimum_required (VERSION 2.8.0 FATAL_ERROR) +# PROJECT DEFINITION HAS TO BE ON TOP +# //The rest of the script relies on it to figure out relative position +project (DAMASK Fortran C) #--------------------------------------------------------------------------------------- # Find PETSc because the entire build will rely on it @@ -14,8 +17,10 @@ endif (NOT DEFINED PETSC_DIR) # https://github.com/jedbrown/cmake-modules/blob/master/FindPETSc.cmake set(petsc_conf_variables "${PETSC_DIR}/lib/petsc/conf/variables") set(petsc_conf_rules "${PETSC_DIR}/lib/petsc/conf/rules" ) -# A temporary makefile to probe the PETSc configuration -set (petsc_config_makefile "/home/m/DAMASK/build/Makefile.petsc") #MD: don't know how get the path here +# Generate a temporary makerfile to probe the PETSc configuration +# This file will be deleted once the setting from PETSc is parsed +# into CMake +set (petsc_config_makefile "${PROJECT_SOURCE_DIR}/Makefile.petsc") file (WRITE "${petsc_config_makefile}" "## This file was auto generated by CMake # PETSC_DIR = ${PETSC_DIR} @@ -23,10 +28,11 @@ file (WRITE "${petsc_config_makefile}" SHELL = /bin/sh include ${petsc_conf_rules} include ${petsc_conf_variables} -INCLUDE_DIRS := \${PETSC_FC_INCLUDES} -LIBRARIES := \${PETSC_WITH_EXTERNAL_LIB} -COMPILERNAME ?= \${FC} -LINKERNAME ?= \${FLINKER} +INCLUDE_DIRS := \${PETSC_FC_INCLUDES} +LIBRARIES := \${PETSC_WITH_EXTERNAL_LIB} +COMPILERF ?= \${FC} +LINKERNAME ?= \${FLINKER} +COMPILERC ?= \${CC} includes: \t@echo \${INCLUDE_DIRS} @@ -34,16 +40,84 @@ includes: extlibs: \t@echo \${LIBRARIES} -compiler: -\t@echo \${COMPILERNAME} +compilerf: +\t@echo \${COMPILERF} + +compilerc: +\t@echo \${COMPILERC} linker: -\t@echo \${LINKERNAME} +\t@echo \${LINKERNAME}") -") -# https://cmake.org/Wiki/CMake_FAQ#How_do_I_use_a_different_compiler.3F -set(CMAKE_Fortran_COMPILER "/opt/petsc/gfortran/bin/mpif90") #MD: https://github.com/jedbrown/cmake-modules/blob/master/FindPETSc.cmake might help -set(CMAKE_C_COMPILER "/opt/petsc/gfortran/bin/mpicc") #MD: https://github.com/jedbrown/cmake-modules/blob/master/FindPETSc.cmake might help +# CMake will execute each target in the ${petsc_config_makefile} +# to acquire corresponding PETSc Variables. +# The include path and linking libraries in PETSc usually contains +# duplicated entries, which is cleaned up later using CMake list. +find_program (MAKE_EXECUTABLE NAMES make gmake) +# Find the PETSc includes directory settings +execute_process(COMMAND ${MAKE_EXECUTABLE} -f ${petsc_config_makefile} "includes" + RESULT_VARIABLE PETSC_INCLUDES_RETURN + OUTPUT_VARIABLE petsc_includes + OUTPUT_STRIP_TRAILING_WHITESPACE) +# Find the PETSc external linking directory settings +# //required for final linking, must be appended after the executable +execute_process(COMMAND ${MAKE_EXECUTABLE} -f ${petsc_config_makefile} "extlibs" + RESULT_VARIABLE PETSC_EXTERNAL_LIB_RETURN + OUTPUT_VARIABLE petsc_external_lib + OUTPUT_STRIP_TRAILING_WHITESPACE) +# The MPI compiler specified in PETSc +# //its version information is used to identify whether it is INTEL FORTRAN +# //or GNU FORTRAN, +# //e.g. for PETSc configured with INTEL FORTRAN compiler +# // >>${MPIEXEC} -v +# // ifort version 14.0.3 --> This line is captured and parsed by CMake +execute_process(COMMAND ${MAKE_EXECUTABLE} -f ${petsc_config_makefile} "compilerf" + RESULT_VARIABLE MPIEXEC_RETURN + OUTPUT_VARIABLE MPIEXEC + OUTPUT_STRIP_TRAILING_WHITESPACE) +# The option OUTPUT_QUIET sometimes fails to suppress the output from +# ${MPIEXEC} -v, thus the MPIF90 version information may show up in the terminal. +execute_process(COMMAND ${MPIEXEC} --version OUTPUT_QUIET + RESULT_VARIABLE MPINAME_RETURN + OUTPUT_VARIABLE MPINAME + OUTPUT_STRIP_TRAILING_WHITESPACE) +# PETSc specified linker (MPIF90 + PETSc linking flags) +execute_process(COMMAND ${MAKE_EXECUTABLE} -f ${petsc_config_makefile} "linker" + RESULT_VARIABLE PETSC_LINKER_RETURN + OUTPUT_VARIABLE PETSC_LINKER + OUTPUT_STRIP_TRAILING_WHITESPACE) +# Get MPI C compiler name from PETSc +execute_process(COMMAND ${MAKE_EXECUTABLE} -f ${petsc_config_makefile} "compilerc" + RESULT_VARIABLE CMPIEXEC_RETURN + OUTPUT_VARIABLE CMPIEXEC + OUTPUT_STRIP_TRAILING_WHITESPACE) +# Remove temporary makefile, no need to keep it anymore. +file (REMOVE ${petsc_config_makefile}) + +# REMOVE DUPLICATE FLAGS FOR COMPILER AND LINKING +string( REGEX MATCHALL "-I([^\" ]+)" TMP_LIST "${petsc_includes}") +list(REMOVE_DUPLICATES TMP_LIST) +foreach (dir ${TMP_LIST}) + set(PETSC_INCLUDES "${PETSC_INCLUDES} ${dir}") +endforeach(dir) +string( REGEX MATCHALL "-[lLW]([^\" ]+)" TMP_LIST "${petsc_external_lib}") +list(REMOVE_DUPLICATES TMP_LIST) +foreach (exlib ${TMP_LIST}) + set(PETSC_EXTERNAL_LIB "${PETSC_EXTERNAL_LIB} ${exlib}") +endforeach(exlib) + +message("***Found PETSC_DIR:\n${PETSC_DIR}\n" ) +message("***Found PETSC_INCLUDES:\n${PETSC_INCLUDES}\n" ) +message("***Found PETSC_EXTERNAL_LIB:\n${PETSC_EXTERNAL_LIB}\n") +message("***Found PETSC_LINKER:\n${PETSC_LINKER}\n" ) +message("***Found FORTRAN MPI COMPILER:\n${MPIEXEC}\n" ) +message("***Found C MPI COMPILER:\n${CMPIEXEC}\n" ) + +set (CMAKE_Fortran_COMPILER "${MPIEXEC}" ) +set (CMAKE_C_COMPILER "${CMPIEXEC}") +# # https://cmake.org/Wiki/CMake_FAQ#How_do_I_use_a_different_compiler.3F +# set(CMAKE_Fortran_COMPILER "/opt/petsc/gfortran/bin/mpif90") #MD: https://github.com/jedbrown/cmake-modules/blob/master/FindPETSc.cmake might help +# set(CMAKE_C_COMPILER "/opt/petsc/gfortran/bin/mpicc") #MD: https://github.com/jedbrown/cmake-modules/blob/master/FindPETSc.cmake might help #--------------------------------------------------------------------------------------- # Now start to care about DAMASK @@ -51,8 +125,6 @@ set(CMAKE_C_COMPILER "/opt/petsc/gfortran/bin/mpicc") #MD: set (DAMASK_VERSION_MAJOR 1) set (DAMASK_VERSION_MINOR ${DAMASK_V}) -project (DAMASK Fortran C) - # COMPILE VARIABLES add_definitions(-DDAMASKVERSION="${DAMASK_V}") add_definitions(-DPETSc) @@ -80,50 +152,6 @@ if ("${DAMASK_DRIVER}" STREQUAL "FEM") add_definitions(-DFEM) endif("${DAMASK_DRIVER}" STREQUAL "FEM") - -find_program (MAKE_EXECUTABLE NAMES make gmake) -execute_process(COMMAND ${MAKE_EXECUTABLE} -f ${petsc_config_makefile} "includes" - RESULT_VARIABLE PETSC_INCLUDES_RETURN - OUTPUT_VARIABLE petsc_includes - OUTPUT_STRIP_TRAILING_WHITESPACE) -execute_process(COMMAND ${MAKE_EXECUTABLE} -f ${petsc_config_makefile} "extlibs" - RESULT_VARIABLE PETSC_EXTERNAL_LIB_RETURN - OUTPUT_VARIABLE petsc_external_lib - OUTPUT_STRIP_TRAILING_WHITESPACE) -execute_process(COMMAND ${MAKE_EXECUTABLE} -f ${petsc_config_makefile} "linker" - RESULT_VARIABLE PETSC_LINKER_RETURN - OUTPUT_VARIABLE PETSC_LINKER - OUTPUT_STRIP_TRAILING_WHITESPACE) -execute_process(COMMAND ${MAKE_EXECUTABLE} -f ${petsc_config_makefile} "compiler" - RESULT_VARIABLE MPIEXEC_RETURN - OUTPUT_VARIABLE MPIEXEC - OUTPUT_STRIP_TRAILING_WHITESPACE) -execute_process(COMMAND ${MPIEXEC} -v OUTPUT_QUIET - RESULT_VARIABLE MPINAME_RETURN - OUTPUT_VARIABLE MPINAME - OUTPUT_STRIP_TRAILING_WHITESPACE) -file (REMOVE ${petsc_config_makefile}) - -# REMOVE DUPLICATE FLAGS FOR COMPILER AND LINKING -string( REGEX MATCHALL "-I([^\" ]+)" TMP_LIST "${petsc_includes}") -list(REMOVE_DUPLICATES TMP_LIST) -foreach (dir ${TMP_LIST}) - set(PETSC_INCLUDES "${PETSC_INCLUDES} ${dir}") -endforeach(dir) -string( REGEX MATCHALL "-[lLW]([^\" ]+)" TMP_LIST "${petsc_external_lib}") -list(REMOVE_DUPLICATES TMP_LIST) -foreach (exlib ${TMP_LIST}) - set(PETSC_EXTERNAL_LIB "${PETSC_EXTERNAL_LIB} ${exlib}") -endforeach(exlib) - - -message("***Found PETSC_DIR:\n${PETSC_DIR}\n") -message("***Found PETSC_INCLUDES:\n${PETSC_INCLUDES}\n") -message("***Found PETSC_EXTERNAL_LIB:\n${PETSC_EXTERNAL_LIB}\n") -message("***Found PETSC_LINKER:\n${PETSC_LINKER}\n") -message("***Found PETSC_MPIEXEC:\n${MPIEXEC}\n") - - set (DAMASK_INCLUDE_FLAGS "${DAMASK_INCLUDE_FLAGS} ${PETSC_INCLUDES}" ) set (DAMASK_INCLUDE_FLAGS "${DAMASK_INCLUDE_FLAGS} -I${PROJECT_SOURCE_DIR}/lib") @@ -386,7 +414,7 @@ if (MPINAME MATCHES "(^ifort)*") set (CMAKE_EXE_LINKER_FLAGS_DEBUG "${CMAKE_EXE_LINKER_FLAGS_RELEASE} ${DEBUG_OPTIONS_ifort}" ) # -elseif (MPINAME MATCHES "(^gfortran)*") +elseif (MPINAME MATCHES "(^GNU)*") message("GNU fortran used for MPIF90\n") set (GNU_FORTRAN ON) # for RELEASE @@ -413,7 +441,6 @@ else (MPINAME MATCHES "(^ifort)*") endif (MPINAME MATCHES "(^ifort)*") # Finalizing -set (CMAKE_Fortran_COMPILER "${MPIEXEC}") set (CMAKE_Fortran_FLAGS_RELEASE "${CMAKE_Fortran_FLAGS_RELEASE} ${DAMASK_INCLUDE_FLAGS}") set (CMAKE_Fortran_FLAGS_DEBUG "${CMAKE_Fortran_FLAGS_DEBUG} ${DAMASK_INCLUDE_FLAGS}") set (CMAKE_LINKER "${PETSC_LINKER}")