diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 748533c4..e3dd4b57 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -26,6 +26,7 @@ jobs: - name: Install ubuntu dependencies if: matrix.os == 'ubuntu-20.04' run: > + sudo apt-get update && sudo apt-get install clang-10 g++-10 diff --git a/CMakeLists.txt b/CMakeLists.txt index 970a6481..752d0750 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -19,8 +19,8 @@ # # ############################################################################## -cmake_minimum_required(VERSION 3.3.2 FATAL_ERROR) -cmake_policy(VERSION 3.3.2) +cmake_minimum_required(VERSION 3.9.6 FATAL_ERROR) +cmake_policy(VERSION 3.9.6) if(POLICY CMP0074) cmake_policy(SET CMP0074 NEW) endif() @@ -58,13 +58,12 @@ if(NOT IS_SUBPROJECT) endif() set(${PROJECT_NAME}_BINARY_DIR ${PROJECT_BINARY_DIR} CACHE STRING "Binary directory of the ${PROJECT_NAME} Project") - -# ############ -# Options - # Make additional Find Modules available list(APPEND CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/share/cmake/Modules) +# ############ +# CMake Options + # Default to Release build type if(NOT CMAKE_BUILD_TYPE) set(CMAKE_BUILD_TYPE Release CACHE STRING "Type of build" FORCE) @@ -88,13 +87,32 @@ if(Build_Tests) enable_testing() endif() +# Build static libraries by default +option(BUILD_SHARED_LIBS "Enable compilation of shared libraries" OFF) + +# ############ +# Global Compilation Settings + # Export the list of compile-commands into compile_commands.json set(CMAKE_EXPORT_COMPILE_COMMANDS ON) -# Global compiler options -option(BUILD_SHARED_LIBS "Enable compilation of shared libraries" OFF) +# Disable compiler extensions +set(CMAKE_CXX_EXTENSIONS OFF) + +# Provide additional debugging information for Debug builds add_compile_options($<$:-ggdb3>) +# Enable Linktime optimizations when available +cmake_policy(SET CMP0069 NEW) +include(CheckIPOSupported) +check_ipo_supported(RESULT ipo_supported) +if(NOT ipo_supported) + message(STATUS "Linktime optimizations could not be enabled!") +else() + message(STATUS "Linktime optimizations enabled!") + set(CMAKE_INTERPROCEDURAL_OPTIMIZATION TRUE) +endif() + # Create an Interface target for compiler warnings add_library(${PROJECT_NAME}_warnings INTERFACE) target_compile_options(${PROJECT_NAME}_warnings @@ -110,10 +128,12 @@ target_compile_options(${PROJECT_NAME}_warnings $<$:-Wno-unknown-warning-option> $<$:-Wshadow> $<$:-Wno-gcc-compat> + $<$:-Wno-c++20-extensions> $<$:-Wno-deprecated-comma-subscript> $<$:-Wno-unknown-warning-option> $<$:-Wshadow> $<$:-Wno-gcc-compat> + $<$:-Wno-c++20-extensions> ) # ############# diff --git a/deps/CMakeLists.txt b/deps/CMakeLists.txt index dad295fd..fac8fd08 100644 --- a/deps/CMakeLists.txt +++ b/deps/CMakeLists.txt @@ -61,7 +61,7 @@ endif() # -- GTest -- external_dependency(GTest GIT_REPO https://github.com/google/googletest - GIT_TAG release-1.10.0 + GIT_TAG master BUILD_ALWAYS EXCLUDE_FROM_ALL ) diff --git a/python/triqs_dft_tools/CMakeLists.txt b/python/triqs_dft_tools/CMakeLists.txt index df7b79c3..753f3145 100644 --- a/python/triqs_dft_tools/CMakeLists.txt +++ b/python/triqs_dft_tools/CMakeLists.txt @@ -20,6 +20,7 @@ foreach(gen ${wrap_generators}) get_filename_component(module_name ${gen} NAME_WE) get_filename_component(module_dir ${gen} DIRECTORY) add_cpp2py_module(NAME ${module_name} DIRECTORY ${module_dir}) + add_library(${PROJECT_NAME}::${module_name} ALIAS ${module_name}) target_link_libraries(${module_name} ${PROJECT_NAME}_c triqs_py) install(TARGETS ${module_name} DESTINATION ${PYTHON_LIB_DEST}/${module_dir}) endforeach() diff --git a/share/cmake/extract_flags.cmake b/share/cmake/extract_flags.cmake index ed5b6c1f..60e4b453 100644 --- a/share/cmake/extract_flags.cmake +++ b/share/cmake/extract_flags.cmake @@ -12,7 +12,7 @@ # # You may obtain a copy of the License at # https://www.gnu.org/licenses/gpl-3.0.txt - +# Author: Nils Wentzell # Recursively fetch all targets that the interface of a target depends upon macro(get_all_interface_targets name target) @@ -59,6 +59,13 @@ macro(extract_flags) set(${target}_CXXFLAGS "${${target}_CXXFLAGS} ${opt}") endforeach() + get_property_recursive(cxx_features TARGET ${target} PROPERTY INTERFACE_COMPILE_FEATURES) + if(cxx_std_20 IN_LIST cxx_features) + set(${target}_CXXFLAGS "${${target}_CXXFLAGS} -std=c++20") + elseif(cxx_std_17 IN_LIST cxx_features) + set(${target}_CXXFLAGS "${${target}_CXXFLAGS} -std=c++17") + endif() + get_property_recursive(defs TARGET ${target} PROPERTY INTERFACE_COMPILE_DEFINITIONS) foreach(def ${defs}) set(${target}_CXXFLAGS "${${target}_CXXFLAGS} -D${def}")