diff --git a/CMakeLists.txt b/CMakeLists.txt index 7d6257e..e34b67a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,4 +1,4 @@ -cmake_minimum_required(VERSION 3.23) +cmake_minimum_required(VERSION 3.9) # Make sure the user doesn't play dirty with symlinks get_filename_component(srcdir "${CMAKE_SOURCE_DIR}" REALPATH) @@ -14,87 +14,18 @@ if(${srcdir} STREQUAL ${bindir}) endif() project(odm CXX) - -if(NOT CMAKE_BUILD_TYPE) - set(CMAKE_BUILD_TYPE Release CACHE STRING "Choose the type of build, options are: Debug Release RelWithDebInfo MinSizeRel" FORCE) -endif() - -set(CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake/modules/" CACHE INTERNAL "Location of our custom CMake modules." FORCE) +set(CMAKE_CXX_STANDARD 20) +set(CMAKE_CXX_STANDARD_REQUIRED ON) +set(CMAKE_INTERPROCEDURAL_OPTIMIZATION ON) include_directories(include) +add_compile_options(-Wall) -# Checking compiler options -set(default_options -Wall) -set(linker_options -Wall) -include(CheckCXXCompilerFlag) -set(saved_CMAKE_REQUIRED_FLAGS ${CMAKE_REQUIRED_FLAGS}) -# C++20 is required -CHECK_CXX_COMPILER_FLAG(-std=c++20 COMPILER_SUPPORTS_CXX20) -if(COMPILER_SUPPORTS_CXX20) - set(default_options ${default_options} -std=c++20) -else() - message(FATAL_ERROR "The compiler ${CMAKE_CXX_COMPILER} has no C++20 support. Please use a different C++ compiler.") -endif() -# OpenMP is required -CHECK_CXX_COMPILER_FLAG(-fopenmp COMPILER_SUPPORTS_OPENMP) -if(COMPILER_SUPPORTS_OPENMP) - set(default_options ${default_options} -fopenmp) - set(linker_options ${linker_options} -fopenmp) -else() - message(FATAL_ERROR "The compiler ${CMAKE_CXX_COMPILER} has no OpenMP support. Please use a different C++ compiler.") -endif() -# Link time optimization check -set(CMAKE_REQUIRED_FLAGS -flto=auto) -CHECK_CXX_COMPILER_FLAG(-flto=auto COMPILER_SUPPORTS_FLTO) -if(COMPILER_SUPPORTS_FLTO AND NOT CMAKE_BUILD_TYPE STREQUAL "Debug") - set(default_options ${default_options} -flto=auto) - set(linker_options ${linker_options} -flto=auto) -endif() -unset(CMAKE_REQUIRED_FLAGS) -# Clang can use lto only with gold linker -if(NOT COMPILER_SUPPORTS_FLTO) - set(CMAKE_REQUIRED_FLAGS -flto\ -fuse-ld=gold) - CHECK_CXX_COMPILER_FLAG(-flto\ -fuse-ld=gold COMPILER_SUPPORTS_FLTO_GOLD) - if(COMPILER_SUPPORTS_FLTO_GOLD AND NOT CMAKE_BUILD_TYPE STREQUAL "Debug") - set(default_options ${default_options} -flto) - set(linker_options ${linker_options} -flto\ -fuse-ld=gold) - endif() - unset(CMAKE_REQUIRED_FLAGS) -endif() # Dwarf-4 support check -set(CMAKE_REQUIRED_FLAGS -gdwarf-4) +include(CheckCXXCompilerFlag) CHECK_CXX_COMPILER_FLAG(-gdwarf-4 COMPILER_SUPPORTS_DWARF4) if(COMPILER_SUPPORTS_DWARF4 AND (CMAKE_BUILD_TYPE STREQUAL "Debug" OR CMAKE_BUILD_TYPE STREQUAL "RelWithDebInfo")) - set(default_options ${default_options} -gdwarf-4) - set(linker_options ${linker_options} -gdwarf-4) -endif() -unset(CMAKE_REQUIRED_FLAGS) -# -ipo flag check (Intel compiler link time optimization) -set(CMAKE_REQUIRED_FLAGS -ipo) -CHECK_CXX_COMPILER_FLAG(-ipo COMPILER_SUPPORTS_IPO) -if(COMPILER_SUPPORTS_IPO AND NOT CMAKE_BUILD_TYPE STREQUAL "Debug") - set(default_options ${default_options} -ipo) - set(linker_options ${linker_options} -ipo) -endif() -unset(CMAKE_REQUIRED_FLAGS) -# Default hidden visibility check -set(CMAKE_REQUIRED_FLAGS -fvisibility=hidden) -CHECK_CXX_COMPILER_FLAG(-fvisibility=hidden COMPILER_SUPPORTS_HIDDEN) -if(COMPILER_SUPPORTS_HIDDEN) - set(default_options ${default_options} -fvisibility=hidden) - set(linker_options ${linker_options} -fvisibility=hidden) -endif() -unset(CMAKE_REQUIRED_FLAGS) -# Export dynamic. Required as modules mast call functions from main programm -set(CMAKE_REQUIRED_FLAGS -Wl,--export-dynamic) -CHECK_CXX_COMPILER_FLAG(-Wl,--export-dynamic COMPILER_SUPPORTS_EXPORTDYNAMIC) -if(COMPILER_SUPPORTS_EXPORTDYNAMIC) - set(linker_options ${linker_options} -Wl,--export-dynamic) -else() - message(FATAL_ERROR "The compiler ${CMAKE_CXX_COMPILER} has no support of --export-dynamic. Please use a different C++ compiler.") + add_compile_options(-gdwarf-4) endif() -unset(CMAKE_REQUIRED_FLAGS) -add_compile_options(${default_options}) -set(CMAKE_REQUIRED_FLAGS ${saved_CMAKE_REQUIRED_FLAGS}) add_subdirectory(src) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index d0bd852..aa6a96d 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -1,11 +1,13 @@ set(EXENAME odm) find_library(netcdf netcdf REQUIRED) +find_package(OpenMP REQUIRED) +set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OpenMP_CXX_FLAGS}") include_directories(../michlib/michlib) file(GLOB srcs *.cpp) add_executable(${EXENAME} ${srcs}) -target_link_libraries(${EXENAME} ${linker_options} ${netcdf}) +target_link_libraries(${EXENAME} ${linker_options} ${netcdf} OpenMP::OpenMP_CXX) set_target_properties(${EXENAME} PROPERTIES POSITION_INDEPENDENT_CODE ON) install(TARGETS ${EXENAME})