cmake_minimum_required(VERSION 3.9 FATAL_ERROR)

if(POLICY CMP0042)
   CMAKE_POLICY(SET CMP0042 NEW)
endif()
if(POLICY CMP0020)
   CMAKE_POLICY(SET CMP0020 NEW)
endif()
if(POLICY CMP0028)
   CMAKE_POLICY(SET CMP0028 NEW)
endif()
if(POLICY CMP0037)
   CMAKE_POLICY(SET CMP0037 NEW)
endif()
if(POLICY CMP0047)
   CMAKE_POLICY(SET CMP0047 NEW)
endif()
if(POLICY CMP0053)
   CMAKE_POLICY(SET CMP0053 NEW)
endif()
if(POLICY CMP0054)
   CMAKE_POLICY(SET CMP0054 NEW)
endif()


if(APPLE)
  set(CMAKE_CXX_STANDARD 11)
endif()

#############################################################
###                     ENVIRONMENT                       ###
#############################################################
set(cmakeMacroPath "CMakeMacros")
include(${cmakeMacroPath}/Environment/environment.cmake)

#############################################################
###                   GENERAL MACROS                      ###
#############################################################
include(${CMAKE_SOURCE_DIR}/${cmakeMacroPath}/general/BuildTarget.cmake)
include(${CMAKE_SOURCE_DIR}/${cmakeMacroPath}/general/BuildTargetUtilities.cmake)
include(${CMAKE_SOURCE_DIR}/${cmakeMacroPath}/general/EndingsToCollect.cmake)
include(${CMAKE_SOURCE_DIR}/${cmakeMacroPath}/general/FileUtilities.cmake)

#############################################################
###                   PROJECT SETTINGS                    ###
#############################################################
project(HULC)

set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
set(CMAKE_INCLUDE_CURRENT_DIR ON)
include_directories(${CMAKE_BINARY_DIR})

set_property(GLOBAL PROPERTY USE_FOLDERS ON)
set_property(GLOBAL PROPERTY PREDEFINED_TARGETS_FOLDER ".cmake")
set(libraryFolder "libs")
set(testFolder "tests")
set(appFolder "apps")
set(thirdPartyFolder "3rdParty")

IF(MSVC)
   ADD_DEFINITIONS ( "-DNOMINMAX" )                # Disable Min/Max-Macros
   ADD_DEFINITIONS ( "-D_CRT_SECURE_NO_WARNINGS" ) # disable warnings promoting Microsoft's security enhanced CRT
   ADD_DEFINITIONS ( "-D_SCL_SECURE_NO_WARNINGS" ) # disable warnings triggered by Microsoft's checked iterators
   SET( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -MP" ) # enable multi-threaded compiling
   SET( CMAKE_CXX_FLAGS  "${CMAKE_CXX_FLAGS} /bigobj" ) # enable big object files (fatal error C1128)
ENDIF(MSVC)

#############################################################
###                         OPTIONS                       ###
#############################################################
option(BUILD_SHARED_LIBS "Build shared libraries" ON)
option(HULC.BUILD_VirtualFluids "Builds virtual Fluids" OFF)
option(HULC.BUILD_dem_coupling "Builds dem coupling " ON)
option(HULC.BUILD_GPU_CODE "Build gpu VirtualFluids" ON)
option(HULC.BUILD_JSONCPP "Builds json cpp " ON)
option(HULC.BUILD_TESTS "Build shared libraries" ON)

option(VF_DOUBLE_ACCURACY "Build shared libraries" ON)

if(HULC.BUILD_GPU_CODE)
  #SET(CMAKE_CUDA_COMPILER $ENV{CUDA_PATH_V9_0}/bin/nvcc.exe)
  enable_language(CUDA)
endif()
sharedLibs()

include(${CMAKE_SOURCE_DIR}/${cmakeMacroPath}/general/FindCompiler.cmake)
configure_file(src/VirtualFluidsDefinitions.in.h VirtualFluidsDefinitions.h)

#############################################################
###                  Virtual Fluids                       ###
#############################################################
IF (HULC.BUILD_VirtualFluids)
  add_definitions(-DVF_METIS)
  add_definitions(-DVF_MPI)
  
  add_subdirectory(3rdParty/MuParser)
  add_subdirectory(targets/libs/VirtualFluids)
ELSE()
  MESSAGE( STATUS "exclude Virtual Fluids." )
ENDIF()


#############################################################
###                dem_coupling                           ###
#############################################################
IF (HULC.BUILD_dem_coupling AND HULC.BUILD_VirtualFluids)
  link_directories("${PE_BINARY_DIR}/src/pe" "${PE_BINARY_DIR}/src/core" "${PE_BINARY_DIR}/src/blockforest" "${PE_BINARY_DIR}/src/domain_decomposition" )
IF(MSVC)
   SET( CMAKE_CXX_FLAGS "/FI ${PE_BINARY_DIR}/src/pe/extern/libccd/ccd/config.h ${CMAKE_CXX_FLAGS}" )
ELSE(MSVC)
   SET( CMAKE_CXX_FLAGS "-include ${PE_BINARY_DIR}/src/pe/extern/libccd/ccd/config.h ${CMAKE_CXX_FLAGS}" )
ENDIF(MSVC)
   
   add_subdirectory(targets/libs/dem_coupling)
ELSE()
  MESSAGE(STATUS "exclude dem-coupling." )
ENDIF()

#############################################################
###                  Virtual Fluids GPU                   ###
#############################################################
IF (HULC.BUILD_GPU_CODE)
 add_subdirectory(targets/libs/VirtualFluids_GPU)
 add_subdirectory(targets/libs/GridGenerator)
ELSE()
  MESSAGE( STATUS "exclude Virtual Fluids GPU." )
ENDIF()

#############################################################
###                     JSONCPP                           ###
#############################################################
IF (NOT HULC.BUILD_JSONCPP)
   MESSAGE( STATUS "Build Input Project without JsonCpp." )
ELSE()
   add_subdirectory(3rdParty/jsoncpp)
   add_definitions(-DBUILD_JSONCPP)
ENDIF()

#############################################################
###                   SUBDIRECTORIES                      ###
#############################################################

add_subdirectory(targets/apps/HULC)
add_subdirectory(targets/libs/VirtualFluidsBasics)
add_subdirectory(targets/libs/core)

if(HULC.BUILD_GPU_CODE OR HULC.BUILD_VirtualFluids)
 add_subdirectory(3rdParty/metis/metis-5.1.0)
endif()


if(HULC.BUILD_TESTS)
  if(VF_DOUBLE_ACCURACY)
    add_definitions("-DRealEq=testing::DoubleEq")
  else()
    add_definitions("-DRealEq=testing::FloatEq")
  endif()

  add_subdirectory(3rdParty/googletest)
  if (HULC.BUILD_GPU_CODE)
    add_subdirectory(targets/tests/GridGeneratorTest)
	add_subdirectory(targets/tests/VirtualFluids_GPUTest)
  endif()
  
  if (HULC.BUILD_VirtualFluids)
    add_subdirectory(targets/tests/VirtualFluidsTest)
  endif()
  
  add_subdirectory(targets/tests/coreTest)
  add_subdirectory(targets/tests/VirtualFluidsBasicsTest)
endif()