Skip to content
Snippets Groups Projects
CMakeLists.txt 5.09 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

数学の武士'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 
数学の武士's avatar
数学の武士 committed
    srcF/sfx_io.f90
数学の武士's avatar
数学の武士 committed
    srcF/sfx_data.f90
    srcF/sfx_common.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_main.f90
    srcF/sfx_phys_const.f90
    srcF/sfx_surface.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
数学の武士'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 
数学の武士's avatar
数学の武士 committed
        srcC/sfx_call_cxx.c
数学の武士's avatar
数学の武士 committed
    )

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

数学の武士's avatar
数学の武士 committed
    set(SOURCES_CXX 
数学の武士's avatar
数学の武士 committed
            srcCXX/model_base.cpp
数学の武士's avatar
.  
数学の武士 committed
            srcCXX/sfx_esm.cpp
            srcCXX/sfx_sheba.cpp
数学の武士's avatar
数学の武士 committed
            srcCXX/sfx_call_class_func.cpp
数学の武士's avatar
数学の武士 committed
    )
    set(HEADERS_CXX 
数学の武士's avatar
数学の武士 committed
            includeCU/sfx_surface.cuh
            includeCU/sfx_math.cuh
数学の武士's avatar
数学の武士 committed
            includeCU/sfx_model_compute_subfunc.cuh
数学の武士's avatar
数学の武士 committed

            includeCXX/model_base.h
数学の武士's avatar
.  
数学の武士 committed
            includeCXX/sfx_esm.h
            includeCXX/sfx_sheba.h
数学の武士's avatar
数学の武士 committed
            includeCXX/sfx_call_class_func.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 
数学の武士's avatar
数学の武士 committed
        srcCU/sfx_esm.cu
数学の武士's avatar
数学の武士 committed
        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
数学の武士's avatar
数学の武士 committed
        srcCXX/sfx_memory_processing.cpp
数学の武士's avatar
.  
数学の武士 committed
    )
数学の武士's avatar
数学の武士 committed
    set(MEMPROC_HEADERS_CXX
数学の武士's avatar
数学の武士 committed
        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
数学の武士's avatar
数学の武士 committed
            srcCU/sfx_memory_processing.cu
数学の武士's avatar
.  
数学の武士 committed
        )
        set(MEMPROC_HEADERS_CU
数学の武士's avatar
数学の武士 committed
            includeCU/sfx_memory_processing.cuh
数学の武士's avatar
.  
数学の武士 committed
        )
    endif(INCLUDE_CUDA)
数学の武士's avatar
数学の武士 committed
endif(USE_CXX OR INCLUDE_CUDA)
数学の武士's avatar
数学の武士 committed

数学の武士'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})
数学の武士's avatar
.  
数学の武士 committed

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

add_executable(sfx ${SOURCES})
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})
    target_link_libraries(sfx config_parser_F config_parser_CXX)
数学の武士's avatar
数学の武士 committed

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 >)
    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)