Skip to content
Snippets Groups Projects
CMakeLists.txt 61.8 KiB
Newer Older
set(CMAKE_EXE_LINKER_FLAGS_DEBUGOPTIMIZED ${CMAKE_EXE_LINKER_FLAGS_DEBUGOPTIMIZED} CACHE STRING
    "Flags used by the linker for executables during DebugOptimized builds")
set(CMAKE_SHARED_LINKER_FLAGS_DEBUGOPTIMIZED ${CMAKE_SHARED_LINKER_FLAGS_DEBUGOPTIMIZED} CACHE STRING
    "Flags used by the linker for shared libraries during DebugOptimized builds")
set(CMAKE_MODULE_LINKER_FLAGS_DEBUGOPTIMIZED ${CMAKE_MODULE_LINKER_FLAGS_DEBUGOPTIMIZED} CACHE STRING
    "Flags used by the linker for loadable modules during DebugOptimized builds")

mark_as_advanced(
    CMAKE_C_FLAGS_DEBUGOPTIMIZED
    CMAKE_CXX_FLAGS_DEBUGOPTIMIZED
    CMAKE_EXE_LINKER_FLAGS_DEBUGOPTIMIZED
    CMAKE_SHARED_LINKER_FLAGS_DEBUGOPTIMIZED
    CMAKE_MODULE_LINKER_FLAGS_DEBUGOPTIMIZED
)

# This variable is only set for multi-config IDE generators like VC
if( CMAKE_CONFIGURATION_TYPES )
    list( APPEND CMAKE_CONFIGURATION_TYPES DebugOptimized )
    list( REMOVE_DUPLICATES CMAKE_CONFIGURATION_TYPES )
    set ( CMAKE_CONFIGURATION_TYPES "${CMAKE_CONFIGURATION_TYPES}"
          CACHE STRING "Semicolon separated list of supported types
                      [Debug|Release|MinSizeRel|RelWithDebInfo|ReleaseNoOutfiles|DebugOptimized]" FORCE )
endif()
############################################################################################################################




############################################################################################################################
##
## OpenMP
##
############################################################################################################################

option ( WALBERLA_THREAD_SAFE_LOGGING "Enables/Disables thread-safe logging" ON )

if ( WALBERLA_BUILD_WITH_OPENMP )
    if ( WALBERLA_CXX_COMPILER_IS_INTEL AND "${CMAKE_CXX_COMPILER_VERSION}" VERSION_LESS "16.0.3" )
       add_flag ( CMAKE_C_FLAGS   "-openmp" )
       add_flag ( CMAKE_CXX_FLAGS "-openmp" )
    elseif ( WALBERLA_CXX_COMPILER_IS_NEC )
       add_flag ( CMAKE_C_FLAGS   "-Popenmp" )
       add_flag ( CMAKE_CXX_FLAGS "-Popenmp" )
       find_package( OpenMP )
       add_flag ( CMAKE_C_FLAGS   "${OpenMP_C_FLAGS}" )
       add_flag ( CMAKE_CXX_FLAGS "${OpenMP_CXX_FLAGS}" )
       list ( APPEND SERVICE_LIBS ${OpenMP_CXX_LIBRARIES} )
    endif()
else()
    if ( WALBERLA_CXX_COMPILER_IS_CRAY )
       add_flag ( CMAKE_C_FLAGS   "-h noomp" )
       add_flag ( CMAKE_CXX_FLAGS "-h noomp" )
    endif()
endif()
############################################################################################################################



Martin Bauer's avatar
Martin Bauer committed
############################################################################################################################
##
## CUDA
##
############################################################################################################################
if ( WALBERLA_BUILD_WITH_CUDA )

    get_directory_property(COMPILE_DEFINITIONS_SAVED_STATE DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} COMPILE_DEFINITIONS)
    # cleanup compile definitions for CUDA (remove generator expression and empty elements which lead to warnings)
    set(CLEANED_COMPILE_DEFINITIONS )
    foreach( element ${COMPILE_DEFINITIONS_SAVED_STATE})
        if(NOT ${element} MATCHES "^\\$")
            list(APPEND CLEANED_COMPILE_DEFINITIONS ${element})
        endif()
    endforeach()
    set_directory_properties(PROPERTIES COMPILE_DEFINITIONS CLEANED_COMPILE_DEFINITIONS)

Martin Bauer's avatar
Martin Bauer committed
    #   set ( BUILD_SHARED_LIBS                      ON )
    set ( CUDA_ATTACH_VS_BUILD_RULE_TO_CUDA_FILE ON )
    if( NOT WALBERLA_CXX_COMPILER_IS_MSVC )
        set ( CUDA_PROPAGATE_HOST_FLAGS OFF CACHE BOOL "" )
    endif()
Martin Bauer's avatar
Martin Bauer committed

    if ( (NOT DEFINED CUDA_HOST_COMPILER) AND (${CMAKE_C_COMPILER} MATCHES "ccache") )
        string ( STRIP "${CMAKE_C_COMPILER_ARG1}" stripped_compiler_string )
        find_program ( CUDA_HOST_COMPILER ${stripped_compiler_string} )
    endif ()

    find_package ( CUDA REQUIRED )

    if ( CUDA_FOUND )
        include_directories ( ${CUDA_INCLUDE_DIRS} )
        list ( APPEND SERVICE_LIBS ${CUDA_LIBRARIES} )

        list( APPEND CUDA_NVCC_FLAGS "-Wno-deprecated-gpu-targets")
Martin Bauer's avatar
Martin Bauer committed
        find_library( NVTX_LIBRARY nvToolsExt PATHS ${CUDA_TOOLKIT_ROOT_DIR} PATH_SUFFIXES lib lib64 )
        if( NVTX_LIBRARY )
            set( WALBERLA_CUDA_NVTX_AVAILABLE 1)
            list ( APPEND SERVICE_LIBS ${NVTX_LIBRARY} )
        endif()

        if ( NOT "${CUDA_NVCC_FLAGS}" MATCHES "-std=" AND NOT WALBERLA_CXX_COMPILER_IS_MSVC )
            list ( APPEND CUDA_NVCC_FLAGS "-std=c++14" )
Martin Bauer's avatar
Martin Bauer committed
        endif ()

Martin Bauer's avatar
Martin Bauer committed
        if(CMAKE_BUILD_TYPE MATCHES Debug)
            list ( APPEND CUDA_NVCC_FLAGS "-g -G" )
        endif()

        if( WALBERLA_BUILD_WITH_FASTMATH )
           list ( APPEND CUDA_NVCC_FLAGS "-use_fast_math" )
        endif()
Martin Bauer's avatar
Martin Bauer committed

Martin Bauer's avatar
Martin Bauer committed
        # Bug with gcc5 and cuda7.5:
        #list( APPEND CUDA_NVCC_FLAGS  "-D_MWAITXINTRIN_H_INCLUDED -D_FORCE_INLINES  -D__STRICT_ANSI__")

        # NOTICE: exisiting cuda flags are overwritten
        #set ( CUDA_NVCC_FLAGS "--compiler-bindir=/usr/bin/g++-4.3" )
        #set ( CUDA_NVCC_FLAGS "-arch sm_20" )
    else()
        set ( WALBERLA_BUILD_WITH_CUDA FALSE )
    endif ( )
    set_directory_properties(PROPERTIES COMPILE_DEFINITIONS "${COMPILE_DEFINITIONS_SAVED_STATE}" )
Martin Bauer's avatar
Martin Bauer committed
endif ( )
############################################################################################################################



############################################################################################################################
##
##  Testing Coverage
##
############################################################################################################################
if (WALBERLA_BUILD_WITH_GCOV AND CMAKE_COMPILER_IS_GNUCXX  )
    add_flag ( CMAKE_CXX_FLAGS_DEBUG "-fprofile-arcs -ftest-coverage" )
    add_flag ( LD_FLAGS              "-fprofile-arcs -ftest-coverage" )
endif()
############################################################################################################################



############################################################################################################################
##
##  Profiling with gprof
##
############################################################################################################################

if ( WALBERLA_BUILD_WITH_GPROF )
    if ( WALBERLA_CXX_COMPILER_IS_INTEL )
        add_flag ( CMAKE_CXX_FLAGS        "-pg" )
        add_flag ( CMAKE_EXE_LINKER_FLAGS "-pg" )
    elseif ( WALBERLA_CXX_COMPILER_IS_GNU OR WALBERLA_CXX_COMPILER_IS_CLANG )
        add_flag ( CMAKE_CXX_FLAGS        "-pg" )
    endif()
endif()
############################################################################################################################


############################################################################################################################
##
##  Likwid Marker API
##
############################################################################################################################


if ( WALBERLA_BUILD_WITH_LIKWID_MARKERS )
    find_library( LIKWID_LIB likwid HINTS $ENV{LIKWID_LIBDIR} $ENV{LIKWID_ROOT}/lib )
    find_path( LIKWID_INCLUDE_DIR likwid.h HINTS $ENV{LIKWID_INCDIR} $ENV{LIKWID_ROOT}/include )
    if ( LIKWID_LIB AND LIKWID_INCLUDE_DIR)
        include_directories( ${LIKWID_INCLUDE_DIR})
        list ( APPEND SERVICE_LIBS ${LIKWID_LIB} )
    else()
        message(WARNING "likwid marker library not found. Set environment variable LIKWID_ROOT")
        set ( WALBERLA_BUILD_WITH_LIKWID_MARKERS OFF CACHE BOOL "Compile in markers for likwid-perfctr" FORCE )
    endif()
endif()



############################################################################################################################
##
##  Link time optimizations
##
############################################################################################################################
if ( WALBERLA_BUILD_WITH_LTO  )
   if( WALBERLA_CXX_COMPILER_IS_INTEL )
      add_flag( CMAKE_CXX_FLAGS_RELEASE "-ip -ipo3" )
      add_flag( CMAKE_C_FLAGS_RELEASE   "-ip -ipo3" )
   endif()

   if ( CMAKE_COMPILER_IS_GNUCXX )
      add_flag ( CMAKE_C_FLAGS_RELEASE     "-flto=3" )
      add_flag ( CMAKE_CXX_FLAGS_RELEASE   "-flto=3" )
      add_flag ( CMAKE_EXE_LINKER_FLAGS    "-fuse-linker-plugin" )
   endif ( )
   if( WALBERLA_CXX_COMPILER_IS_MSVC )
      add_flag ( CMAKE_CXX_FLAGS_RELEASE           "/GL"   )
      add_flag ( CMAKE_EXE_LINKER_FLAGS_RELEASE    "/LTCG" )
      add_flag ( CMAKE_SHARED_LINKER_FLAGS_RELEASE "/LTCG" )
      add_flag ( CMAKE_MODULE_LINKER_FLAGS_RELEASE "/LTCG" )
   endif ( )
   if( WALBERLA_CXX_COMPILER_IS_IBM )
      add_flag ( CMAKE_C_FLAGS_RELEASE     "-qipa" )
      add_flag ( CMAKE_CXX_FLAGS_RELEASE   "-qipa" )
      add_flag ( CMAKE_EXE_LINKER_FLAGS    "-qipa" )
Michael Kuron's avatar
Michael Kuron committed

############################################################################################################################
##
##  Some more compiler flags that need to happen after any try_compile (e.g. inside FindMPI)
##
############################################################################################################################

Michael Kuron's avatar
Michael Kuron committed
# Treat warnings as errors
if ( WARNING_ERROR )
   if( WALBERLA_CXX_COMPILER_IS_GNU OR WALBERLA_CXX_COMPILER_IS_INTEL OR WALBERLA_CXX_COMPILER_IS_CLANG )
      add_flag ( CMAKE_CXX_FLAGS "-pedantic-errors -Werror" )
   elseif( WALBERLA_CXX_COMPILER_IS_MSVC )
      add_flag ( CMAKE_CXX_FLAGS "/WX" )
   elseif ( WALBERLA_CXX_COMPILER_IS_CRAY )
      add_flag ( CMAKE_CXX_FLAGS "-h error_on_warning" )
   endif()
endif ( )

############################################################################################################################
##
##  Sanitizer
##
############################################################################################################################
if ( WALBERLA_SANITIZE_ADDRESS )
    if ( WALBERLA_CXX_COMPILER_IS_GNU OR WALBERLA_CXX_COMPILER_IS_CLANG )
        add_flag( CMAKE_CXX_FLAGS "-fsanitize=address")
    endif()
endif()
if ( WALBERLA_SANITIZE_UNDEFINED )
    if ( WALBERLA_CXX_COMPILER_IS_GNU OR WALBERLA_CXX_COMPILER_IS_CLANG )
        add_flag( CMAKE_CXX_FLAGS "-fsanitize=undefined")
    endif()
endif()

############################################################################################################################
# Documentation Generation
#
if (WALBERLA_BUILD_DOC)
  # Build documentation using Doxygen (www.doxygen.org)
  ############################################################################################################################
  find_package ( Doxygen  )
  find_package ( HTMLHelp )
  
  if ( HTML_HELP_COMPILER EQUAL "" )
     set ( HTML_HELP_FOUND "NO" )
  else ( )
     set ( HTML_HELP_FOUND "YES" )
  endif ( )
  
  if ( DOXYGEN_FOUND )
     set ( DOXYGEN_HTML_HEADER ${walberla_SOURCE_DIR}/doc/header.html )
     set ( DOXYGEN_HTML_FOOTER ${walberla_SOURCE_DIR}/doc/footer.html )
     set ( DOXYGEN_HTML_OUTPUT "html" )
  
     configure_file ( ${walberla_SOURCE_DIR}/doc/doxygen.in ${walberla_BINARY_DIR}/doc/doxygen.cfg @ONLY )

     add_custom_target ( doc   ${DOXYGEN_EXECUTABLE} ${walberla_BINARY_DIR}/doc/doxygen.cfg
                            COMMENT "Generating API documentation with Doxygen" VERBATIM )

  endif ( )
endif()
############################################################################################################################





############################################################################################################################
#
# Fix compiler bugs
#
############################################################################################################################

# The NEC SX has a few issues in its standard library headers
if( WALBERLA_CXX_COMPILER_IS_NEC )
   file( WRITE ${walberla_BINARY_DIR}/CMakeFiles/src/math.h         "#include_next <math.h>\n#undef fpclassify\n#undef signbit\n#undef isfinite\n#undef isinf\n#undef isnan\n#undef isnormal\n#undef isgreater\n#undef isgreaterequal\n#undef isless\n#undef islessequal\n#undef islessgreater\n#undef isunordered\n")
   file( WRITE ${walberla_BINARY_DIR}/CMakeFiles/src/sys/types.h    "#define uint_t SX_UINT_T\n#include \"/SX/usr/include/sys/types.h\"   \n#undef uint_t\n")
   file( WRITE ${walberla_BINARY_DIR}/CMakeFiles/src/sys/acl.h      "#define uint_t SX_UINT_T\n#include \"/SX/usr/include/sys/acl.h\"     \n#undef uint_t\n")
   file( WRITE ${walberla_BINARY_DIR}/CMakeFiles/src/sys/if_ehcpl.h "#define uint_t SX_UINT_T\n#include \"/SX/usr/include/sys/if_ehcpl.h\"\n#undef uint_t\n")
   file( WRITE ${walberla_BINARY_DIR}/CMakeFiles/src/sys/ptms.h     "#define uint_t SX_UINT_T\n#include \"/SX/usr/include/sys/ptms.h\"    \n#undef uint_t\n")
   file( WRITE ${walberla_BINARY_DIR}/CMakeFiles/src/sys/stream.h   "#define uint_t SX_UINT_T\n#include \"/SX/usr/include/sys/stream.h\"  \n#undef uint_t\n")
   file( WRITE ${walberla_BINARY_DIR}/CMakeFiles/src/sys/strsubr.h  "#define uint_t SX_UINT_T\n#include \"/SX/usr/include/sys/strsubr.h\" \n#undef uint_t\n")
   configure_file ( ${walberla_BINARY_DIR}/CMakeFiles/src/math.h         ${walberla_BINARY_DIR}/src/math.h COPYONLY )
   configure_file ( ${walberla_BINARY_DIR}/CMakeFiles/src/sys/types.h    ${walberla_BINARY_DIR}/src/sys/types.h    COPYONLY )
   configure_file ( ${walberla_BINARY_DIR}/CMakeFiles/src/sys/acl.h      ${walberla_BINARY_DIR}/src/sys/acl.h      COPYONLY )
   configure_file ( ${walberla_BINARY_DIR}/CMakeFiles/src/sys/if_ehcpl.h ${walberla_BINARY_DIR}/src/sys/if_ehcpl.h COPYONLY )
   configure_file ( ${walberla_BINARY_DIR}/CMakeFiles/src/sys/ptms.h     ${walberla_BINARY_DIR}/src/sys/ptms.h     COPYONLY )
   configure_file ( ${walberla_BINARY_DIR}/CMakeFiles/src/sys/stream.h   ${walberla_BINARY_DIR}/src/sys/stream.h   COPYONLY )
   configure_file ( ${walberla_BINARY_DIR}/CMakeFiles/src/sys/strsubr.h  ${walberla_BINARY_DIR}/src/sys/strsubr.h  COPYONLY )
endif()



############################################################################################################################
#
# Subdirectories
#
############################################################################################################################

# Add binary dir for generated headers
include_directories ( ${CMAKE_CURRENT_BINARY_DIR}/src )
# All include paths are specified relative to src/ directory
include_directories ( ${CMAKE_CURRENT_SOURCE_DIR}/src )


# Generate file with compile options, and add install rule for it
configure_file ( src/waLBerlaDefinitions.in.h
install( FILES ${walberla_BINARY_DIR}/src/waLBerlaDefinitions.h DESTINATION walberla/ )

# sources
add_subdirectory ( src )

# test
if ( WALBERLA_BUILD_TESTS )
    add_subdirectory ( tests )
else()
    add_subdirectory( tests EXCLUDE_FROM_ALL )
endif()


add_subdirectory ( apps )

waLBerla_export()

############################################################################################################################

############################################################################################################################
##
## clang-tidy
##
############################################################################################################################

waLBerla_link_files_to_builddir( .clang-tidy )
add_subdirectory( utilities )