ResInsight/CMakeLists.txt
2020-10-20 11:05:10 +02:00

561 lines
20 KiB
CMake

cmake_minimum_required (VERSION 3.12)
include (CheckCSourceCompiles)
project (ResInsight)
set (VIZ_MODULES_FOLDER_NAME Fwk/VizFwk)
cmake_policy(SET CMP0020 NEW)
set_property(GLOBAL PROPERTY USE_FOLDERS ON)
SET(BUILD_SHARED_LIBS OFF CACHE BOOL "ERT: Build shared libraries")
list(APPEND CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake")
# Use CMake to enforce C++17
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)
################################################################################
# Setup the main platform defines
################################################################################
if (${CMAKE_SYSTEM_NAME} MATCHES "Linux")
add_definitions(-DCVF_LINUX)
elseif (${CMAKE_SYSTEM_NAME} MATCHES "Darwin")
add_definitions(-DCVF_OSX)
elseif(MSVC)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /MP")
set(_HAS_STD_BYTE 0)
endif()
if (${CMAKE_SYSTEM_NAME} MATCHES "Linux")
set(CMAKE_CXX_FLAGS "-DCVF_LINUX -pipe -Wextra -Woverloaded-virtual -Wformat -Wno-unused-parameter")
set(CMAKE_CXX_FLAGS_DEBUG "-ggdb -g3 -O0 -DDEBUG -D_DEBUG")
set(CMAKE_CXX_FLAGS_RELEASE "-O2 -DNO_DEBUG")
endif()
################################################################################
# OpenMP
################################################################################
option (RESINSIGHT_USE_OPENMP "Enable OpenMP parallellization in the code" ON)
if (RESINSIGHT_USE_OPENMP)
find_package(OpenMP)
if(OPENMP_FOUND)
message(STATUS "Enabling OpenMP support")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${OpenMP_C_FLAGS}")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OpenMP_CXX_FLAGS} -DUSE_OPENMP")
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${OpenMP_EXE_LINKER_FLAGS}")
else()
message(STATUS "Disabling OpenMP support")
endif()
endif()
################################################################################
# Version number
################################################################################
include (ResInsightVersion.cmake)
################################################################################
# Octave
################################################################################
find_package(Octave)
################################################################################
# Unity Build
################################################################################
# CMAKE_UNITY_BUILD was introduced in CMake 3.16.2
option(RESINSIGHT_ENABLE_UNITY_BUILD "Experimental speedup of compilation using CMake Unity Build" OFF)
mark_as_advanced(FORCE RESINSIGHT_ENABLE_UNITY_BUILD)
if(RESINSIGHT_ENABLE_UNITY_BUILD)
set(CAF_ENABLE_UNITY_BUILD true)
set(CVF_ENABLE_UNITY_BUILD true)
endif()
################################################################################
# ERT
################################################################################
# Use of CMAKE_CXX_COMPILER_LAUNCHER is not working with libecl. Disable by temporarily setting
# compiler launcher to nothing
set(TEMP_CMAKE_CXX_COMPILER_LAUNCHER ${CMAKE_CXX_COMPILER_LAUNCHER})
set(CMAKE_CXX_COMPILER_LAUNCHER)
if (NOT MSVC)
# Linux: Optional configuration of externally installed ERT, requires path to libraries and includes
set(RESINSIGHT_ERT_EXTERNAL_LIB_ROOT "" CACHE PATH "Path to installed ERT libraries")
set(RESINSIGHT_ERT_EXTERNAL_INCLUDE_ROOT "" CACHE PATH "Path to installed ERT includes")
endif()
if (RESINSIGHT_ERT_EXTERNAL_LIB_ROOT OR RESINSIGHT_ERT_EXTERNAL_INCLUDE_ROOT)
if (NOT(RESINSIGHT_ERT_EXTERNAL_LIB_ROOT AND RESINSIGHT_ERT_EXTERNAL_INCLUDE_ROOT))
message(FATAL_ERROR "Both RESINSIGHT_ERT_EXTERNAL_LIB_ROOT and RESINSIGHT_ERT_EXTERNAL_INCLUDE_ROOT must be defined")
endif()
message(FATAL_ERROR "TODO: Building using and external system installed ERT is broken.")
list(APPEND ERT_INCLUDE_DIRS
${RESINSIGHT_ERT_EXTERNAL_INCLUDE_ROOT}
)
list(APPEND ERT_LIBRARIES
${RESINSIGHT_ERT_EXTERNAL_LIB_ROOT}/libecl.so
)
else()
# Disable install of ERT libs and headers, as Ert code is compiled and linked directly
SET(INSTALL_ERT OFF CACHE BOOL "ERT: Install library")
SET(ERT_USE_OPENMP ${OPENMP_FOUND} CACHE BOOL "ERT: Compile using OpenMP")
# Remember original state
set(ORIGINAL_BUILD_SHARED_LIBS ${BUILD_SHARED_LIBS})
if (MSVC)
# Force static linking on Windows
set(BUILD_SHARED_LIBS OFF)
set(ERT_HAVE_UNISTD OFF) #If anyone has mingw installed
else ()
set(RESINSIGHT_ERT_EXTERNAL_SOURCE_ROOT "" CACHE STRING "Path to ERT CMakeList.txt (source path)")
# Force dynamic linking on other platforms
# Copy of libraries into install folder of ResInsight is done a bit further down in this file
set(BUILD_SHARED_LIBS ON)
endif()
if (RESINSIGHT_ERT_EXTERNAL_SOURCE_ROOT)
add_subdirectory(${RESINSIGHT_ERT_EXTERNAL_SOURCE_ROOT} ${CMAKE_BINARY_DIR}/ThirdParty/Ert)
else()
add_subdirectory(ThirdParty/Ert)
endif ()
if (MSVC)
# libecl : Disable some warnings
set_target_properties(ecl PROPERTIES COMPILE_FLAGS "/wd4244 /wd4267 /wd4013 /wd4190 /wd4018 /wd4477 /wd4098 /wd4293 /wd4305 /wd4020 /wd4028 /wd4715")
else()
set_target_properties(ecl PROPERTIES COMPILE_FLAGS "-Wno-deprecated -Wno-deprecated-declarations -Wno-clobbered")
endif()
list(APPEND THIRD_PARTY_LIBRARIES
ecl
)
set_property(TARGET
catch2
PROPERTY FOLDER "Thirdparty"
)
# Restore original state
set(BUILD_SHARED_LIBS ${ORIGINAL_BUILD_SHARED_LIBS})
endif(RESINSIGHT_ERT_EXTERNAL_LIB_ROOT OR RESINSIGHT_ERT_EXTERNAL_INCLUDE_ROOT)
# restore buildcache when libecl has been configured
set(CMAKE_CXX_COMPILER_LAUNCHER ${TEMP_CMAKE_CXX_COMPILER_LAUNCHER})
######################################
# Go through required git submodules #
######################################
list(APPEND THIRD_PARTY_SUBMODULES qwt)
###############################################
# Init GIT submodules if they haven't already #
###############################################
find_package(Git QUIET)
if(GIT_FOUND AND EXISTS "${PROJECT_SOURCE_DIR}/.git")
# Update submodules as needed
option(GIT_SUBMODULE "Check submodules during build" ON)
if(GIT_SUBMODULE)
foreach (SUBMODULE ${THIRD_PARTY_SUBMODULES})
set (SUBDIR "${PROJECT_SOURCE_DIR}/ThirdParty/${SUBMODULE}")
message(STATUS "Initializing GIT submodules")
execute_process(COMMAND ${GIT_EXECUTABLE} submodule update --init --recursive -- ${SUBDIR}
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
RESULT_VARIABLE GIT_SUBMOD_RESULT)
if(NOT GIT_SUBMOD_RESULT EQUAL "0")
message(FATAL_ERROR "git submodule update --init failed for ${SUBMODULE} with ${GIT_SUBMOD_RESULT}, please checkout submodules")
endif()
endforeach()
endif()
endif()
################################################################################
# buildcache
#
# buildcache will be used if found in path
# It is required to use compiler flag /Zi to be able to use buildcache
# See https://docs.microsoft.com/en-us/cpp/build/reference/z7-zi-zi-debug-information-format?view=vs-2019
# The adjustments of build flags must also be placed after libecl, as the adjustments
# cause compiler issues for libecl
################################################################################
find_program(buildcache_program buildcache)
if(buildcache_program)
set(CMAKE_CXX_COMPILER_LAUNCHER "${buildcache_program}")
message( STATUS "Found buildcache from : ${buildcache_program}" )
if (MSVC)
string(REGEX REPLACE "/Zi" "" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
if(CMAKE_CXX_FLAGS_DEBUG MATCHES "/Zi")
message(STATUS "Clearing pdb setting")
string(REGEX REPLACE "/Zi" "" CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG}")
endif()
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /Z7")
endif()
else()
message( STATUS "No buildcache found" )
endif()
################################################################################
# HDF5
################################################################################
if(MSVC)
set(RESINSIGHT_HDF5_DIR "" CACHE PATH "Windows Only: Optional path to HDF5 libraries on Windows")
endif()
if(MSVC)
if(NOT ${RESINSIGHT_HDF5_DIR} EQUAL "")
list(APPEND EXTERNAL_LINK_LIBRARIES
${RESINSIGHT_HDF5_DIR}/lib/hdf5.lib
${RESINSIGHT_HDF5_DIR}/lib/hdf5_cpp.lib
)
set(RESINSIGHT_FOUND_HDF5 1)
message( STATUS "Using HDF5 from : ${RESINSIGHT_HDF5_DIR}" )
else()
message( WARNING "Use of HDF5 is enabled, but RESINSIGHT_HDF5_DIR is empty. Specify RESINSIGHT_HDF5_DIR to be able to use HDF5" )
endif()
else()
find_package(HDF5 COMPONENTS CXX)
if (HDF5_FOUND)
list(APPEND EXTERNAL_LINK_LIBRARIES
${HDF5_LIBRARIES}
)
set(RESINSIGHT_FOUND_HDF5 1)
message( STATUS "Using HDF5 libraries : ${HDF5_LIBRARIES}" )
option (RESINSIGHT_HDF5_BUNDLE_LIBRARIES "Bundle HDF5 libraries" OFF)
mark_as_advanced(FORCE RESINSIGHT_HDF5_BUNDLE_LIBRARIES)
if (RESINSIGHT_HDF5_BUNDLE_LIBRARIES)
message( STATUS "Bundling of HDF5 libraries is enabled" )
endif() # RESINSIGHT_HDF5_BUNDLE_LIBRARIES
else()
message( WARNING "Use of HDF5 is enabled, but no HDF5 is found." )
endif() # HDF5_FOUND
endif() # MSVC
################################################################################
# Subset of Boost, used by NRLib and flow diagnostics application
################################################################################
if(MSVC)
# stop MSVC from trying to auto-link libs
add_definitions("-DBOOST_ALL_NO_LIB")
endif()
add_subdirectory(ThirdParty/boost-Subset)
list(APPEND THIRD_PARTY_LIBRARIES
boost-Subset
)
################################################################################
# Opm
################################################################################
add_subdirectory(ThirdParty/custom-opm-flowdiagnostics)
add_subdirectory(ThirdParty/custom-opm-flowdiag-app)
list(APPEND OPM_LIBRARIES
custom-opm-flowdiagnostics
custom-opm-flowdiag-app
)
set_property(TARGET
${OPM_LIBRARIES}
PROPERTY FOLDER "Thirdparty/OPM"
)
################################################################################
# NRLib
################################################################################
add_subdirectory(ThirdParty/NRLib)
list(APPEND THIRD_PARTY_LIBRARIES
NRLib
)
################################################################################
# Qt
################################################################################
find_package(Qt5 COMPONENTS REQUIRED Core Gui OpenGL Network Script ScriptTools Widgets)
# Open GL
find_package( OpenGL )
################################################################################
# Qwt
################################################################################
add_subdirectory(ThirdParty/qwt)
if(RESINSIGHT_ENABLE_UNITY_BUILD)
message("Cmake Unity build is enabled on : qwt")
set_property(TARGET qwt PROPERTY UNITY_BUILD true)
set_property(TARGET custom-opm-flowdiagnostics PROPERTY UNITY_BUILD true)
endif()
list(APPEND THIRD_PARTY_LIBRARIES
qwt
)
################################################################################
# Nightcharts
################################################################################
add_subdirectory(ThirdParty/nightcharts)
list(APPEND THIRD_PARTY_LIBRARIES
nightcharts
)
################################################################################
# C++ Mathematical Expression Parsing And Evaluation Library
################################################################################
add_subdirectory(ThirdParty/expressionparser)
list(APPEND THIRD_PARTY_LIBRARIES
expressionparser
)
################################################################################
# clipper
################################################################################
add_subdirectory(ThirdParty/clipper)
list(APPEND THIRD_PARTY_LIBRARIES
clipper
)
################################################################################
# Thirdparty libraries are put in ThirdParty solution folder
################################################################################
set_property(TARGET
${THIRD_PARTY_LIBRARIES}
PROPERTY FOLDER "Thirdparty"
)
################################################################################
# Vizualization Framework
################################################################################
# Allow use of non-threadsafe reference counter in cvf::Object on systems with no atomics support
if (CMAKE_COMPILER_IS_GNUCC)
if (NOT DEFINED HAVE_GCC_SYNC_FUNCTIONS)
check_c_source_compiles("int main(int argc, char **argv) {
int a;
__sync_add_and_fetch(&a, 1);
__sync_fetch_and_add(&a, 1);
__sync_sub_and_fetch(&a, 1);
__sync_fetch_and_sub(&a, 1); }" HAVE_GCC_SYNC_FUNCTIONS)
endif()
if (HAVE_GCC_SYNC_FUNCTIONS)
message(STATUS "GCC synchronization functions detected")
else()
message(STATUS "GCC synchronization functions NOT detected, fallback to non threadsafe reference counting")
add_definitions(-DCVF_USE_NON_THREADSAFE_REFERENCE_COUNT)
endif()
endif()
add_subdirectory(${VIZ_MODULES_FOLDER_NAME}/LibCore)
add_subdirectory(${VIZ_MODULES_FOLDER_NAME}/LibGeometry)
add_subdirectory(${VIZ_MODULES_FOLDER_NAME}/LibRender)
add_subdirectory(${VIZ_MODULES_FOLDER_NAME}/LibViewing)
add_subdirectory(${VIZ_MODULES_FOLDER_NAME}/LibGuiQt)
list(APPEND VIZ_FWK_LIBRARIES
LibGuiQt
LibViewing
LibRender
LibGeometry
LibCore
)
set_property(TARGET
${VIZ_FWK_LIBRARIES}
PROPERTY FOLDER "VizFwk"
)
################################################################################
# Application Framework
################################################################################
add_subdirectory(Fwk/AppFwk/cafAnimControl)
add_subdirectory(Fwk/AppFwk/cafViewer)
add_subdirectory(Fwk/AppFwk/cafProjectDataModel/cafPdmCore)
add_subdirectory(Fwk/AppFwk/cafProjectDataModel/cafPdmUiCore)
add_subdirectory(Fwk/AppFwk/cafProjectDataModel/cafPdmXml)
add_subdirectory(Fwk/AppFwk/cafProjectDataModel)
add_subdirectory(Fwk/AppFwk/cafCommand)
add_subdirectory(Fwk/AppFwk/cafUserInterface)
add_subdirectory(Fwk/AppFwk/cafPdmCvf)
add_subdirectory(Fwk/AppFwk/CommonCode)
add_subdirectory(Fwk/AppFwk/cafVizExtensions)
option(CAF_CVF_SCRIPTING "" ON)
add_subdirectory(Fwk/AppFwk/cafPdmScripting)
set_property(TARGET cafPdmScripting PROPERTY FOLDER "AppFwk")
add_subdirectory(Fwk/AppFwk/cafCommandFeatures)
set_property(TARGET cafCommandFeatures PROPERTY FOLDER "AppFwk")
add_subdirectory(Fwk/AppFwk/cafTensor)
add_subdirectory(Fwk/AppFwk/cafHexInterpolator)
list(APPEND APP_FWK_LIBRARIES
cafPdmCore
cafPdmUiCore
cafPdmXml
cafProjectDataModel
cafUserInterface
cafViewer
cafAnimControl
cafCommand
cafPdmCvf
cafTensor
CommonCode
cafVizExtensions
cafPdmScripting
)
set_property(TARGET
${APP_FWK_LIBRARIES}
cafHexInterpolator
PROPERTY FOLDER "AppFwk"
)
option (RESINSIGHT_INCLUDE_APPFWK_TESTS "Enable AppFwk Tests" OFF)
mark_as_advanced(FORCE RESINSIGHT_INCLUDE_APPFWK_TESTS)
if (RESINSIGHT_INCLUDE_APPFWK_TESTS)
# Unit Tests
add_subdirectory(Fwk/AppFwk/cafProjectDataModel/cafProjectDataModel_UnitTests)
set_property(TARGET cafProjectDataModel_UnitTests PROPERTY FOLDER "AppFwkTests")
add_subdirectory(Fwk/AppFwk/cafProjectDataModel/cafPdmCore/cafPdmCore_UnitTests)
set_property(TARGET cafPdmCore_UnitTests PROPERTY FOLDER "AppFwkTests")
add_subdirectory(Fwk/AppFwk/cafProjectDataModel/cafPdmXml/cafPdmXml_UnitTests)
set_property(TARGET cafPdmXml_UnitTests PROPERTY FOLDER "AppFwkTests")
add_subdirectory(Fwk/AppFwk/cafPdmScripting/cafPdmScripting_UnitTests)
set_property(TARGET cafPdmScripting_UnitTests PROPERTY FOLDER "AppFwkTests")
# Executables
add_subdirectory(Fwk/AppFwk/cafTests/cafTestApplication)
set_property(TARGET cafTestApplication PROPERTY FOLDER "AppFwkTests")
add_subdirectory(Fwk/AppFwk/cafTests/cafTestCvfApplication)
set_property(TARGET cafTestCvfApplication PROPERTY FOLDER "AppFwkTests")
endif()
################################################################################
# Installation settings
################################################################################
set (RESINSIGHT_INSTALL_FOLDER ".")
# override system install prefix if private installation chosen
option (RESINSIGHT_PRIVATE_INSTALL "Linux only: Install the libecl shared libraries along the executable" ON)
mark_as_advanced(FORCE RESINSIGHT_PRIVATE_INSTALL)
if (RESINSIGHT_PRIVATE_INSTALL)
################################################################################
# ERT shared library files
# Install procedure will copy so-files from ERT into same install folder as ResInsight
################################################################################
if (${CMAKE_SYSTEM_NAME} MATCHES "Linux")
set(ERT_SHARED_LIB_FILES
${CMAKE_BINARY_DIR}/ThirdParty/Ert/${CMAKE_INSTALL_LIBDIR}/libecl.so
${CMAKE_BINARY_DIR}/ThirdParty/Ert/${CMAKE_INSTALL_LIBDIR}/libecl.so.2
${CMAKE_BINARY_DIR}/ThirdParty/Ert/${CMAKE_INSTALL_LIBDIR}/libecl.so.2.4
)
install(FILES ${ERT_SHARED_LIB_FILES} DESTINATION ${RESINSIGHT_INSTALL_FOLDER} )
endif()
endif (RESINSIGHT_PRIVATE_INSTALL)
if (RESINSIGHT_HDF5_BUNDLE_LIBRARIES)
if (${CMAKE_SYSTEM_NAME} MATCHES "Linux")
# find all file names with text hdf5
# use file globbing to also copy the symlinks to make sure the dependencies from ResInsight runtime is correct
foreach (FILE_TO_COPY ${HDF5_LIBRARIES})
STRING( FIND ${FILE_TO_COPY} "hdf5" POS_IN_STRING )
if(${POS_IN_STRING} GREATER -1)
file(GLOB FILE_AND_SYMLINKS ${FILE_TO_COPY}*)
install(FILES ${FILE_AND_SYMLINKS} DESTINATION ${RESINSIGHT_INSTALL_FOLDER} )
endif()
endforeach()
endif()
endif (RESINSIGHT_HDF5_BUNDLE_LIBRARIES)
################################################################################
# Application
################################################################################
add_subdirectory(ApplicationCode)
if (OCTAVE_MKOCTFILE)
message (STATUS "Adding OctavePlugin library")
add_subdirectory(OctavePlugin)
else (OCTAVE_MKOCTFILE)
message (STATUS "Could not find OCTAVE_MKOCTFILE, skipping OctavePlugin library")
endif(OCTAVE_MKOCTFILE)
################################################################################
# Code documentation using Doxygen
################################################################################
option(RESINSIGHT_BUILD_DOCUMENTATION "Use Doxygen to create the HTML based API documentation" OFF)
if(RESINSIGHT_BUILD_DOCUMENTATION)
FIND_PACKAGE(Doxygen)
if (NOT DOXYGEN_FOUND)
message(FATAL_ERROR
"Doxygen is needed to build the documentation. Please install it correctly")
endif()
#-- Configure the Template Doxyfile for our specific project
configure_file(Doxyfile.in
${PROJECT_BINARY_DIR}/Doxyfile @ONLY IMMEDIATE)
#-- Add a custom target to run Doxygen when ever the project is built
add_custom_target (Docs
COMMAND ${DOXYGEN_EXECUTABLE} ${PROJECT_BINARY_DIR}/Doxyfile
SOURCES ${PROJECT_BINARY_DIR}/Doxyfile)
# IF you do NOT want the documentation to be generated EVERY time you build the project
# then leave out the 'ALL' keyword from the above command.
endif(RESINSIGHT_BUILD_DOCUMENTATION)