Skip to content
Snippets Groups Projects
CMakeLists.txt 6.83 KiB
Newer Older
cmake_minimum_required(VERSION 3.19)
数学の武士's avatar
数学の武士 committed

option(INCLUDE_CUDA "GPU build in mode"    OFF)
数学の武士's avatar
数学の武士 committed
option(USE_CXX  "CXX build in mode"    OFF)
数学の武士's avatar
数学の武士 committed
option(BUILD_DOC    "Build documentation"    OFF)
数学の武士's avatar
数学の武士 committed
option(SFX_CHECK_NAN    "Build documentation"    OFF)
option(USE_CONFIG_PARSER "Build config parser"    ON)
数学の武士's avatar
数学の武士 committed
option(VTUNE_FLAGS " "    OFF)
数学の武士's avatar
数学の武士 committed

include(FetchContent)

数学の武士's avatar
数学の武士 committed
project(INMCM_sfx)
enable_language(Fortran)
数学の武士's avatar
数学の武士 committed

数学の武士's avatar
数学の武士 committed
if(BUILD_DOC)
数学の武士's avatar
数学の武士 committed
    find_package(Doxygen)
    if (DOXYGEN_FOUND)
        set(DOXYGEN_IN ../doxygen/config)    # doxygen config file

        # option ALL allows to build the docs together with the code
        add_custom_target( doc_doxygen ALL
            COMMAND ${DOXYGEN_EXECUTABLE} ${DOXYGEN_IN}
            WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} ) # WORKING_DIRECTORY: Execute the command with the given current working directory. If it is a relative path it will be interpreted relative to the build tree directory corresponding to the current source directory.
    else()
    message("Doxygen need to be installed to generate the doxygen documentation")
    endif (DOXYGEN_FOUND)
数学の武士's avatar
数学の武士 committed
endif(BUILD_DOC)

if (SFX_CHECK_NAN)
    add_definitions(-DSFX_CHECK_NAN)
endif ()
数学の武士's avatar
数学の武士 committed

set(CMAKE_Fortran_MODULE_DIRECTORY ${CMAKE_BINARY_DIR}/modules)

if(USE_CONFIG_PARSER)
    add_subdirectory(config-parser/)
数学の武士's avatar
数学の武士 committed
    add_definitions(-DUSE_CONFIG_PARSER)
数学の武士's avatar
数学の武士 committed
if(INCLUDE_CUDA)
数学の武士's avatar
数学の武士 committed
    if(NOT DEFINED CMAKE_CUDA_ARCHITECTURES)
    message(FATAL_ERROR "
                    CMake will not pass any architecture flags to the compiler 
                    because the CUDA architecture is not set. You should specify 
                    an architecture: set -DCMAKE_CUDA_ARCHITECTURES=<N>.")
    endif(NOT DEFINED CMAKE_CUDA_ARCHITECTURES)

数学の武士's avatar
数学の武士 committed
    enable_language(CUDA)
数学の武士's avatar
数学の武士 committed
    include_directories(${CMAKE_CUDA_TOOLKIT_INCLUDE_DIRECTORIES})
    add_definitions(-DINCLUDE_CUDA)
    set(USE_CXX ON)
数学の武士's avatar
数学の武士 committed
endif(INCLUDE_CUDA)

数学の武士's avatar
数学の武士 committed
if(USE_CXX)
数学の武士's avatar
数学の武士 committed
    enable_language(C)
    enable_language(CXX)
    set(CMAKE_CXX_STANDARD 11)
数学の武士's avatar
数学の武士 committed
    add_definitions(-DINCLUDE_CXX)
endif(USE_CXX)
数学の武士's avatar
数学の武士 committed

set(SOURCES_F 
    srcF/sfx_data.f90
    srcF/sfx_common.f90
数学の武士's avatar
数学の武士 committed
    srcF/sfx_io.f90
数学の武士's avatar
数学の武士 committed
    srcF/sfx_esm.f90 
    srcF/sfx_esm_param.f90
    srcF/sfx_log.f90
    srcF/sfx_log_param.f90
数学の武士's avatar
数学の武士 committed
    srcF/sfx_phys_const.f90
    srcF/sfx_surface.f90
    srcF/sfx_thermal_roughness.f90
数学の武士's avatar
数学の武士 committed
    srcF/sfx_most.f90
    srcF/sfx_most_param.f90
    srcF/sfx_sheba.f90
    srcF/sfx_sheba_param.f90
数学の武士's avatar
数学の武士 committed
    srcF/sfx_fc_wrapper.F90
    srcF/sfx_api_inmcm.f90
    srcF/sfx_api_term.f90
数学の武士's avatar
数学の武士 committed
)
set(MAIN_F
        srcF/sfx_main.f90)
数学の武士's avatar
数学の武士 committed

数学の武士's avatar
数学の武士 committed
set(HEADERS_F
数学の武士's avatar
.  
数学の武士 committed
    includeF/sfx_def.fi
)

数学の武士's avatar
数学の武士 committed
if(USE_CXX)
数学の武士's avatar
数学の武士 committed
    set(SOURCES_C 
        srcC/c-sfx-model-compute-flux.c
数学の武士's avatar
数学の武士 committed
    )

数学の武士's avatar
数学の武士 committed
    set(HEADERS_C
        includeC/sfx-data.h
数学の武士's avatar
数学の武士 committed
    )
数学の武士's avatar
数学の武士 committed
    list(APPEND HEADERS_DIRS includeC/)
数学の武士's avatar
数学の武士 committed

数学の武士's avatar
数学の武士 committed
    set(SOURCES_CXX 
            srcCXX/model-base.cpp
            srcCXX/sfx-esm.cpp
            srcCXX/sfx-sheba.cpp
            srcCXX/cxx-sfx-model-compute-flux.cpp
数学の武士's avatar
数学の武士 committed
    )
    set(HEADERS_CXX 
            includeCU/sfx-surface.cuh
            includeCU/sfx-math.cuh
            includeCU/sfx-model-compute-subfunc.cuh

            includeCXX/model-base.h
            includeCXX/sfx-esm.h
            includeCXX/sfx-sheba.h
            includeCXX/cxx-sfx-model-compute-flux.h
数学の武士's avatar
数学の武士 committed
        )
数学の武士's avatar
数学の武士 committed
    list(APPEND HEADERS_DIRS includeCU/)
    list(APPEND HEADERS_DIRS includeCXX/)
数学の武士's avatar
数学の武士 committed
endif(USE_CXX)
数学の武士's avatar
数学の武士 committed

if(INCLUDE_CUDA)
    set(SOURCES_CU 
        srcCU/sfx-esm.cu
        srcCU/sfx-sheba.cu
数学の武士's avatar
数学の武士 committed
    )
    set(HEADERS_CU
数学の武士's avatar
数学の武士 committed
    )
endif(INCLUDE_CUDA)

数学の武士's avatar
数学の武士 committed
if(USE_CXX OR INCLUDE_CUDA)
数学の武士's avatar
数学の武士 committed
    set(MEMPROC_SOURCES_CXX
        srcCXX/sfx-memory-processing.cpp
数学の武士's avatar
.  
数学の武士 committed
    )
数学の武士's avatar
数学の武士 committed
    set(MEMPROC_HEADERS_CXX
        includeCXX/sfx-memory-processing.h
        includeCXX/sfx-template-parameters.h
数学の武士's avatar
.  
数学の武士 committed
    )
数学の武士's avatar
数学の武士 committed

数学の武士's avatar
.  
数学の武士 committed
    if(INCLUDE_CUDA)
数学の武士's avatar
数学の武士 committed
        set(MEMPROC_SOURCES_CU
            srcCU/sfx-memory-processing.cu
数学の武士's avatar
.  
数学の武士 committed
        )
        set(MEMPROC_HEADERS_CU
            includeCU/sfx-memory-processing.cuh
数学の武士's avatar
.  
数学の武士 committed
        )
    endif(INCLUDE_CUDA)
数学の武士's avatar
数学の武士 committed
endif(USE_CXX OR INCLUDE_CUDA)
数学の武士's avatar
数学の武士 committed

set(SOURCES 
    ${MEMPROC_HEADERS_CU} ${MEMPROC_SOURCES_CU} ${MEMPROC_HEADERS_CXX} ${MEMPROC_SOURCES_CXX} 
    ${HEADERS_CU} ${SOURCES_CU} ${HEADERS_C} ${HEADERS_CXX} ${SOURCES_CXX} ${SOURCES_C} 
    ${HEADERS_F} ${SOURCES_F} ${MAIN_F})
set(SOURCES_LIB 
    ${MEMPROC_HEADERS_CU} ${MEMPROC_SOURCES_CU} ${MEMPROC_HEADERS_CXX} ${MEMPROC_SOURCES_CXX} 
    ${HEADERS_CU} ${SOURCES_CU} ${HEADERS_CXX} 
    ${SOURCES_CXX} ${SOURCES_C} ${HEADERS_F} ${SOURCES_F})
数学の武士's avatar
.  
数学の武士 committed

set(CMAKE_Fortran_FLAGS " -cpp ")
数学の武士's avatar
.  
数学の武士 committed

add_executable(sfx ${SOURCES})
add_library(sfx_lib ${SOURCES_LIB})
set_property(TARGET sfx PROPERTY LINKER_LANGUAGE Fortran)
target_include_directories(sfx PUBLIC ${CMAKE_BINARY_DIR}/modules/)
数学の武士's avatar
数学の武士 committed
target_include_directories(sfx PUBLIC ${HEADERS_DIRS})
数学の武士's avatar
数学の武士 committed
target_include_directories(sfx_lib PUBLIC ${HEADERS_DIRS})
    target_link_libraries(sfx config_parser_F config_parser_CXX)
    target_link_libraries(sfx_lib config_parser_F config_parser_CXX)
数学の武士's avatar
数学の武士 committed

set_property(TARGET sfx_lib PROPERTY LINKER_LANGUAGE Fortran)
数学の武士's avatar
数学の武士 committed
if("${CMAKE_SYSTEM_NAME}" STREQUAL "Darwin")
    SET(CMAKE_C_ARCHIVE_CREATE   "<CMAKE_AR> Scr <TARGET> <LINK_FLAGS> <OBJECTS>")
    SET(CMAKE_CXX_ARCHIVE_CREATE "<CMAKE_AR> Scr <TARGET> <LINK_FLAGS> <OBJECTS>")
    SET(CMAKE_C_ARCHIVE_FINISH   "<CMAKE_RANLIB> -no_warning_for_no_symbols -c <TARGET>")
    SET(CMAKE_CXX_ARCHIVE_FINISH "<CMAKE_RANLIB> -no_warning_for_no_symbols -c <TARGET>")
endif("${CMAKE_SYSTEM_NAME}" STREQUAL "Darwin")
# set(CMAKE_Fortran_ARCHIVE_FINISH  "$<CMAKE_RANLIB> -no_warning_for_no_symbols -c $<TARGET>")
target_include_directories(sfx_lib PUBLIC ${CMAKE_BINARY_DIR}/modules/)

数学の武士's avatar
数学の武士 committed
if(VTUNE_FLAGS)
    target_compile_options(sfx
        PUBLIC $<$<COMPILE_LANGUAGE:C>: -g -O2 -Xsprofile>
        PUBLIC $<$<COMPILE_LANGUAGE:CXX>: -g -O2 -Xsprofile>
        PUBLIC $<$<COMPILE_LANGUAGE:Fortran>: -g -O2>)
endif(VTUNE_FLAGS)
set(CMAKE_BUILD_TYPE Release)

if ("${CMAKE_BUILD_TYPE}" STREQUAL "Debug")
    target_compile_options(sfx
        PUBLIC $<$<COMPILE_LANGUAGE:C>: -g >)
	target_compile_options(sfx
        PUBLIC $<$<COMPILE_LANGUAGE:CXX>: -g >)
    target_compile_options(sfx
        PUBLIC $<$<COMPILE_LANGUAGE:CUDA>: -g >)
数学の武士's avatar
数学の武士 committed
    if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Intel")
        target_compile_options(sfx
            PUBLIC $<$<COMPILE_LANGUAGE:Fortran>: -g -traceback -check all -ftrapuv -debug all >)
    elseif ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU")
        target_compile_options(sfx-
            PUBLIC $<$<COMPILE_LANGUAGE:Fortran>: -g -fbacktrace -ffpe-trap=zero,overflow,underflow >)
    endif()
# copy data & configs on post build
数学の武士's avatar
数学の武士 committed
add_custom_command(
        TARGET sfx POST_BUILD
数学の武士's avatar
数学の武士 committed
        COMMAND ${CMAKE_COMMAND} -E copy_directory
        ${CMAKE_SOURCE_DIR}/data
        ${CMAKE_CURRENT_BINARY_DIR}/data)
add_custom_command(
        TARGET sfx POST_BUILD
        COMMAND ${CMAKE_COMMAND} -E copy_directory
        ${CMAKE_SOURCE_DIR}/config-ex
        ${CMAKE_CURRENT_BINARY_DIR}/config-ex)