DAMASK_EICMD/CMakeLists.txt

165 lines
6.5 KiB
CMake
Raw Normal View History

cmake_minimum_required (VERSION 3.10.0)
include (FindPkgConfig REQUIRED)
# Dummy project to determine compiler names and version
project (Prerequisites LANGUAGES)
set(ENV{PKG_CONFIG_PATH} "$ENV{PETSC_DIR}/$ENV{PETSC_ARCH}/lib/pkgconfig")
pkg_check_modules (PETSC REQUIRED PETSc>=3.12.0 PETSc<3.16.0)
pkg_get_variable (CMAKE_Fortran_COMPILER PETSc fcompiler)
pkg_get_variable (CMAKE_C_COMPILER PETSc ccompiler)
find_program (CAT_EXECUTABLE NAMES cat)
execute_process (COMMAND ${CAT_EXECUTABLE} ${PROJECT_SOURCE_DIR}/VERSION
RESULT_VARIABLE DAMASK_VERSION_RETURN
OUTPUT_VARIABLE DAMASK_VERSION
OUTPUT_STRIP_TRAILING_WHITESPACE)
#---------------------------------------------------------------------------------------
# Find PETSc from system environment
2016-04-19 04:02:08 +05:30
set(PETSC_DIR $ENV{PETSC_DIR})
if (PETSC_DIR STREQUAL "")
2020-01-30 03:14:42 +05:30
message (FATAL_ERROR "PETSc location (PETSC_DIR) is not defined")
2017-03-16 03:35:58 +05:30
endif ()
2017-03-16 03:10:44 +05:30
set (petsc_conf_variables "${PETSC_DIR}/lib/petsc/conf/variables")
set (petsc_conf_rules "${PETSC_DIR}/lib/petsc/conf/rules" )
2016-04-19 04:02:08 +05:30
# Use existing variables from PETSc
# https://github.com/jedbrown/cmake-modules/blob/master/FindPETSc.cmake
2016-05-18 12:24:16 +05:30
# Generate a temporary makefile to probe the PETSc configuration
2020-01-26 19:40:27 +05:30
# This file will be deleted once the settings from PETSc are parsed into CMake
2017-03-16 03:10:44 +05:30
exec_program (mktemp ARGS -d OUTPUT_VARIABLE TEMPDIR)
set (petsc_config_makefile "${TEMPDIR}/Makefile.petsc")
2016-05-18 12:24:16 +05:30
file (WRITE
"${petsc_config_makefile}"
2016-03-03 02:09:31 +05:30
"## This file was auto generated by CMake
# PETSC_DIR = ${PETSC_DIR}
2016-03-01 23:53:47 +05:30
SHELL = /bin/sh
include ${petsc_conf_rules}
include ${petsc_conf_variables}
INCLUDE_DIRS := \${PETSC_FC_INCLUDES}
LIBRARIES := \${PETSC_WITH_EXTERNAL_LIB}
2016-03-01 23:53:47 +05:30
includes:
\t@echo \${INCLUDE_DIRS}
extlibs:
\t@echo \${LIBRARIES}
2016-05-18 12:24:16 +05:30
")
2016-03-06 04:05:34 +05:30
# CMake will execute each target in the ${petsc_config_makefile}
# to acquire corresponding PETSc Variables.
find_program (MAKE_EXECUTABLE NAMES gmake make)
# Find the PETSc includes directory settings
2017-03-16 03:10:44 +05:30
execute_process (COMMAND ${MAKE_EXECUTABLE} --no-print-directory -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
2017-03-16 03:10:44 +05:30
execute_process (COMMAND ${MAKE_EXECUTABLE} --no-print-directory -f ${petsc_config_makefile} "extlibs"
RESULT_VARIABLE PETSC_EXTERNAL_LIB_RETURN
OUTPUT_VARIABLE petsc_external_lib
OUTPUT_STRIP_TRAILING_WHITESPACE)
# Remove temporary makefile, no need to keep it anymore.
2017-03-16 03:10:44 +05:30
file (REMOVE_RECURSE ${TEMPDIR})
# Remove duplicate compiler and linker flags
2017-03-16 03:10:44 +05:30
string (REGEX MATCHALL "-I([^\" ]+)" TMP_LIST "${petsc_includes}")
list (REMOVE_DUPLICATES TMP_LIST)
foreach (dir ${TMP_LIST})
2017-03-16 03:10:44 +05:30
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})
2017-03-16 03:10:44 +05:30
set (PETSC_EXTERNAL_LIB "${PETSC_EXTERNAL_LIB} ${exlib}")
endforeach (exlib)
2017-03-16 03:10:44 +05:30
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")
#---------------------------------------------------------------------------------------
# Now start to care about DAMASK
2017-03-16 03:10:44 +05:30
# DAMASK solver defines project to build
string(TOLOWER ${DAMASK_SOLVER} DAMASK_SOLVER)
if (DAMASK_SOLVER STREQUAL "grid")
project (damask-grid HOMEPAGE_URL https://damask.mpie.de LANGUAGES Fortran C)
2019-03-23 13:57:58 +05:30
add_definitions (-DGrid)
elseif (DAMASK_SOLVER STREQUAL "mesh")
project (damask-mesh HOMEPAGE_URL https://damask.mpie.de LANGUAGES Fortran C)
2020-04-28 14:05:43 +05:30
add_definitions (-DMesh)
2018-05-23 23:21:11 +05:30
else ()
2018-05-24 11:27:10 +05:30
message (FATAL_ERROR "Build target (DAMASK_SOLVER) is not defined")
2017-03-16 03:35:58 +05:30
endif ()
add_definitions (-DDAMASKVERSION="${DAMASK_VERSION}")
add_definitions (-DPETSc)
message ("\nBuilding ${CMAKE_PROJECT_NAME}\n")
if (CMAKE_BUILD_TYPE STREQUAL "")
2020-01-30 03:14:42 +05:30
set (CMAKE_BUILD_TYPE "RELEASE")
endif ()
2017-02-04 05:31:42 +05:30
# Predefined sets for OPTIMIZATION/OPENMP based on BUILD_TYPE
if (CMAKE_BUILD_TYPE STREQUAL "DEBUG" OR CMAKE_BUILD_TYPE STREQUAL "SYNTAXONLY")
set (DEBUG_FLAGS "${DEBUG_FLAGS} -DDEBUG")
2017-02-04 05:31:42 +05:30
set (PARALLEL "OFF")
set (OPTI "OFF")
elseif (CMAKE_BUILD_TYPE STREQUAL "RELEASE")
2017-02-04 05:31:42 +05:30
set (PARALLEL "ON")
set (OPTI "DEFENSIVE")
elseif (CMAKE_BUILD_TYPE STREQUAL "PERFORMANCE")
2017-02-04 05:31:42 +05:30
set (PARALLEL "ON")
set (OPTI "AGGRESSIVE")
2017-03-16 03:35:58 +05:30
endif ()
2017-03-16 03:10:44 +05:30
# $OPTIMIZATION takes precedence over $BUILD_TYPE defaults
if (OPTIMIZATION STREQUAL "" OR NOT DEFINED OPTIMIZATION)
2017-03-16 03:10:44 +05:30
set (OPTIMIZATION "${OPTI}")
2017-03-16 03:35:58 +05:30
else ()
2017-03-16 03:10:44 +05:30
set (OPTIMIZATION "${OPTIMIZATION}")
2017-03-16 03:35:58 +05:30
endif ()
2017-03-16 03:10:44 +05:30
# $OPENMP takes precedence over $BUILD_TYPE defaults
if (OPENMP STREQUAL "" OR NOT DEFINED OPENMP)
2017-03-16 03:10:44 +05:30
set (OPENMP "${PARALLEL}")
2017-03-16 03:35:58 +05:30
else ()
2017-02-04 05:31:42 +05:30
set(OPENMP "${OPENMP}")
2017-03-16 03:35:58 +05:30
endif ()
2017-04-18 10:44:55 +05:30
2020-03-29 22:36:17 +05:30
# syntax check only (mainly for pre-receive hook)
if (CMAKE_BUILD_TYPE STREQUAL "SYNTAXONLY")
2017-04-18 10:44:55 +05:30
set (BUILDCMD_POST "${BUILDCMD_POST} -fsyntax-only")
endif ()
2017-02-04 05:31:42 +05:30
list(APPEND CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake)
2020-01-26 19:40:27 +05:30
if (CMAKE_Fortran_COMPILER_ID STREQUAL "Intel")
2020-01-30 03:14:42 +05:30
include (Compiler-Intel)
elseif(CMAKE_Fortran_COMPILER_ID STREQUAL "GNU")
2020-01-30 03:14:42 +05:30
include (Compiler-GNU)
elseif(CMAKE_Fortran_COMPILER_ID STREQUAL "PGI")
2020-01-30 03:14:42 +05:30
include (Compiler-PGI)
2018-05-24 11:27:10 +05:30
else ()
2020-01-30 03:14:42 +05:30
message (FATAL_ERROR "Compiler type (CMAKE_Fortran_COMPILER_ID) not recognized")
2017-03-16 03:35:58 +05:30
endif ()
2016-03-08 04:30:12 +05:30
2017-04-26 13:10:45 +05:30
set (CMAKE_Fortran_FLAGS_${CMAKE_BUILD_TYPE} "${BUILDCMD_PRE} ${OPENMP_FLAGS} ${STANDARD_CHECK} ${OPTIMIZATION_FLAGS} ${COMPILE_FLAGS} ${PRECISION_FLAGS}")
set (CMAKE_Fortran_LINK_EXECUTABLE "${BUILDCMD_PRE} ${CMAKE_Fortran_COMPILER} ${OPENMP_FLAGS} ${OPTIMIZATION_FLAGS} ${LINKER_FLAGS}")
if (CMAKE_BUILD_TYPE STREQUAL "DEBUG")
2020-01-30 03:14:42 +05:30
set (CMAKE_Fortran_FLAGS_${CMAKE_BUILD_TYPE} "${CMAKE_Fortran_FLAGS_${CMAKE_BUILD_TYPE}} ${DEBUG_FLAGS}")
set (CMAKE_Fortran_LINK_EXECUTABLE "${CMAKE_Fortran_LINK_EXECUTABLE} ${DEBUG_FLAGS}")
2017-03-16 03:35:58 +05:30
endif ()
2020-01-04 19:07:09 +05:30
set (CMAKE_Fortran_FLAGS_${CMAKE_BUILD_TYPE} "${CMAKE_Fortran_FLAGS_${CMAKE_BUILD_TYPE}} ${PETSC_INCLUDES} ${BUILDCMD_POST}")
set (CMAKE_Fortran_LINK_EXECUTABLE "${CMAKE_Fortran_LINK_EXECUTABLE} <OBJECTS> -o <TARGET> <LINK_LIBRARIES> ${PETSC_EXTERNAL_LIB} -lz ${BUILDCMD_POST}")
2016-03-02 20:07:12 +05:30
2017-04-26 13:10:45 +05:30
message ("Fortran Compiler Flags:\n${CMAKE_Fortran_FLAGS_${CMAKE_BUILD_TYPE}}\n")
message ("C Compiler Flags:\n${CMAKE_C_FLAGS_${CMAKE_BUILD_TYPE}}\n")
message ("Fortran Linker Command:\n${CMAKE_Fortran_LINK_EXECUTABLE}\n")
# location of code
2017-03-16 03:10:44 +05:30
add_subdirectory (src)