diff --git a/CMakeLists.txt b/CMakeLists.txt index 3d34337f7c4b84fa5d50a652bcf7d9492faefb17..b3e61d4f6c181492860857613e081e5b2270cbd2 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -8,6 +8,9 @@ cmake_minimum_required(VERSION 3.1) # Set CMake policies cmake_policy(SET CMP0011 NEW) cmake_policy(SET CMP0054 NEW) +if(${CMAKE_VERSION} VERSION_GREATER 3.9.6) + cmake_policy(SET CMP0071 NEW) +endif() if(WIN32 AND NOT ${CMAKE_GENERATOR} STREQUAL Ninja AND diff --git a/scripts/cmake/ConanSetup.cmake b/scripts/cmake/ConanSetup.cmake index 2baaac99654cb26727bc8633307ba9ce97e4ca4d..ef08a8478204e27cee18a9f769a87de92fb871aa 100644 --- a/scripts/cmake/ConanSetup.cmake +++ b/scripts/cmake/ConanSetup.cmake @@ -56,7 +56,7 @@ endif() execute_process(COMMAND ${CONAN_CMD} --version OUTPUT_VARIABLE CONAN_VERSION_OUTPUT) string(REGEX MATCH ".*Conan version ([0-9]+\.[0-9]+\.[0-9]+)" FOO "${CONAN_VERSION_OUTPUT}") -set(CONAN_VERSION_REQUIRED 0.26.0) +set(CONAN_VERSION_REQUIRED 1.0.0) if(${CMAKE_MATCH_1} VERSION_LESS ${CONAN_VERSION_REQUIRED}) message(FATAL_ERROR "Conan outdated. Installed: ${CONAN_VERSION}, \ required: ${CONAN_VERSION_REQUIRED}. Consider updating via 'pip \ diff --git a/scripts/cmake/conan/conan.cmake b/scripts/cmake/conan/conan.cmake index 2a51d3ffb6c4ad98d9806aed51bc11c28102db40..e7b07f422682e0cf52acc96d9f8904d733e5d6cd 100644 --- a/scripts/cmake/conan/conan.cmake +++ b/scripts/cmake/conan/conan.cmake @@ -2,30 +2,22 @@ include(CMakeParseArguments) function(_get_msvc_ide_version result) set(${result} "" PARENT_SCOPE) - if(${CMAKE_GENERATOR} STREQUAL "Ninja") - string(REGEX MATCHALL "[0-9]+" output "$ENV{VisualStudioVersion}") - list(GET output 0 _msvc_version) - set(${result} ${_msvc_version} PARENT_SCOPE) + if(NOT MSVC_VERSION VERSION_LESS 1400 AND MSVC_VERSION VERSION_LESS 1500) + set(${result} 8 PARENT_SCOPE) + elseif(NOT MSVC_VERSION VERSION_LESS 1500 AND MSVC_VERSION VERSION_LESS 1600) + set(${result} 9 PARENT_SCOPE) + elseif(NOT MSVC_VERSION VERSION_LESS 1600 AND MSVC_VERSION VERSION_LESS 1700) + set(${result} 10 PARENT_SCOPE) + elseif(NOT MSVC_VERSION VERSION_LESS 1700 AND MSVC_VERSION VERSION_LESS 1800) + set(${result} 11 PARENT_SCOPE) + elseif(NOT MSVC_VERSION VERSION_LESS 1800 AND MSVC_VERSION VERSION_LESS 1900) + set(${result} 12 PARENT_SCOPE) + elseif(NOT MSVC_VERSION VERSION_LESS 1900 AND MSVC_VERSION VERSION_LESS 1910) + set(${result} 14 PARENT_SCOPE) + elseif(NOT MSVC_VERSION VERSION_LESS 1910 AND MSVC_VERSION VERSION_LESS 1920) + set(${result} 15 PARENT_SCOPE) else() - if(CMAKE_VS_PLATFORM_TOOLSET) - string(REGEX MATCHALL "[0-9]+" output "${CMAKE_VS_PLATFORM_TOOLSET}") - list(GET output 0 _toolset_version) - if(_toolset_version LESS 142) - if ("${_toolset_version}" EQUAL "141") - set(_msvc_version "15") - else() - string(SUBSTRING ${_toolset_version} 0 2 _msvc_version) - endif() - set(${result} ${_msvc_version} PARENT_SCOPE) - return() - else() - message(STATUS "Conan **WARNING** : Unknown MSVC toolset ${_toolset_version}") - endif() - endif() - - string(REGEX MATCHALL "[0-9]+" output "${CMAKE_GENERATOR}") - list(GET output 0 _msvc_version) - set(${result} ${_msvc_version} PARENT_SCOPE) + message(FATAL_ERROR "Conan: Unknown MSVC compiler version [${MSVC_VERSION}]") endif() endfunction() @@ -48,9 +40,6 @@ function(conan_cmake_settings result) set(_SETTINGS -g cmake) endif() if(CMAKE_BUILD_TYPE) - if(CMAKE_BUILD_TYPE STREQUAL "MinSizeRel" OR CMAKE_BUILD_TYPE STREQUAL "RelWithDebInfo") - set(CMAKE_BUILD_TYPE "Release") - endif() set(_SETTINGS ${_SETTINGS} -s build_type=${CMAKE_BUILD_TYPE}) else() message(FATAL_ERROR "Please specify in command line CMAKE_BUILD_TYPE (-DCMAKE_BUILD_TYPE=Release)") @@ -58,7 +47,7 @@ function(conan_cmake_settings result) #handle -s os setting if(CMAKE_SYSTEM_NAME) - #use default conan os setting if CMAKE_SYSTEM_NAME is not defined + #use default conan os setting if CMAKE_SYSTEM_NAME is not defined set(CONAN_SYSTEM_NAME ${CMAKE_SYSTEM_NAME}) if(${CMAKE_SYSTEM_NAME} STREQUAL "Darwin") set(CONAN_SYSTEM_NAME Macos) @@ -73,68 +62,81 @@ function(conan_cmake_settings result) endif() endif() - if (${CMAKE_CXX_COMPILER_ID} STREQUAL GNU) + get_property(_languages GLOBAL PROPERTY ENABLED_LANGUAGES) + if (";${_languages};" MATCHES ";CXX;") + set(LANGUAGE CXX) + set(USING_CXX 1) + elseif (";${_languages};" MATCHES ";C;") + set(LANGUAGE C) + set(USING_CXX 0) + else () + message(FATAL_ERROR "Conan: Neither C or C++ was detected as a language for the project. Unabled to detect compiler version.") + endif() + + if (${CMAKE_${LANGUAGE}_COMPILER_ID} STREQUAL GNU) # using GCC # TODO: Handle other params - string(REPLACE "." ";" VERSION_LIST ${CMAKE_CXX_COMPILER_VERSION}) + string(REPLACE "." ";" VERSION_LIST ${CMAKE_${LANGUAGE}_COMPILER_VERSION}) list(GET VERSION_LIST 0 MAJOR) list(GET VERSION_LIST 1 MINOR) set(COMPILER_VERSION ${MAJOR}.${MINOR}) if(${MAJOR} GREATER 4) set(COMPILER_VERSION ${MAJOR}) endif() - - conan_cmake_detect_gnu_libcxx(_LIBCXX) - - set(_SETTINGS ${_SETTINGS} -s compiler=gcc -s compiler.version=${COMPILER_VERSION} -s compiler.libcxx=${_LIBCXX}) - elseif (${CMAKE_CXX_COMPILER_ID} STREQUAL AppleClang) + set(_SETTINGS ${_SETTINGS} -s compiler=gcc -s compiler.version=${COMPILER_VERSION}) + if (USING_CXX) + conan_cmake_detect_gnu_libcxx(_LIBCXX) + set(_SETTINGS ${_SETTINGS} -s compiler.libcxx=${_LIBCXX}) + endif () + elseif (${CMAKE_${LANGUAGE}_COMPILER_ID} STREQUAL AppleClang) # using AppleClang - string(REPLACE "." ";" VERSION_LIST ${CMAKE_CXX_COMPILER_VERSION}) + string(REPLACE "." ";" VERSION_LIST ${CMAKE_${LANGUAGE}_COMPILER_VERSION}) list(GET VERSION_LIST 0 MAJOR) list(GET VERSION_LIST 1 MINOR) - set(_SETTINGS ${_SETTINGS} -s compiler=apple-clang -s compiler.version=${MAJOR}.${MINOR} -s compiler.libcxx=libc++) - elseif (${CMAKE_CXX_COMPILER_ID} STREQUAL Clang) - string(REPLACE "." ";" VERSION_LIST ${CMAKE_CXX_COMPILER_VERSION}) + set(_SETTINGS ${_SETTINGS} -s compiler=apple-clang -s compiler.version=${MAJOR}.${MINOR}) + if (USING_CXX) + set(_SETTINGS ${_SETTINGS} -s compiler.libcxx=libc++) + endif () + elseif (${CMAKE_${LANGUAGE}_COMPILER_ID} STREQUAL Clang) + string(REPLACE "." ";" VERSION_LIST ${CMAKE_${LANGUAGE}_COMPILER_VERSION}) list(GET VERSION_LIST 0 MAJOR) list(GET VERSION_LIST 1 MINOR) if(APPLE) cmake_policy(GET CMP0025 APPLE_CLANG_POLICY_ENABLED) if(NOT APPLE_CLANG_POLICY_ENABLED) message(STATUS "Conan: APPLE and Clang detected. Assuming apple-clang compiler. Set CMP0025 to avoid it") - set(_SETTINGS ${_SETTINGS} -s compiler=apple-clang -s compiler.version=${MAJOR}.${MINOR} -s compiler.libcxx=libc++) + set(_SETTINGS ${_SETTINGS} -s compiler=apple-clang -s compiler.version=${MAJOR}.${MINOR}) else() - set(_SETTINGS ${_SETTINGS} -s compiler=clang -s compiler.version=${MAJOR}.${MINOR} -s compiler.libcxx=libstdc++) + set(_SETTINGS ${_SETTINGS} -s compiler=clang -s compiler.version=${MAJOR}.${MINOR}) endif() + if (USING_CXX) + set(_SETTINGS ${_SETTINGS} -s compiler.libcxx=libc++) + endif () else() - set(_SETTINGS ${_SETTINGS} -s compiler=clang -s compiler.version=${MAJOR}.${MINOR} -s compiler.libcxx=libstdc++) + set(_SETTINGS ${_SETTINGS} -s compiler=clang -s compiler.version=${MAJOR}.${MINOR}) + if (USING_CXX) + conan_cmake_detect_gnu_libcxx(_LIBCXX) + set(_SETTINGS ${_SETTINGS} -s compiler.libcxx=${_LIBCXX}) + endif () endif() - elseif(${CMAKE_CXX_COMPILER_ID} STREQUAL MSVC) + elseif(${CMAKE_${LANGUAGE}_COMPILER_ID} STREQUAL MSVC) set(_VISUAL "Visual Studio") _get_msvc_ide_version(_VISUAL_VERSION) if("${_VISUAL_VERSION}" STREQUAL "") - message(FATAL_ERROR "Visual Studio not recognized") + message(FATAL_ERROR "Conan: Visual Studio not recognized") else() set(_SETTINGS ${_SETTINGS} -s compiler=${_VISUAL} -s compiler.version=${_VISUAL_VERSION}) endif() - if(${CMAKE_GENERATOR} STREQUAL "Ninja") - if($ENV{Platform} STREQUAL "X64" OR MSVC_CXX_ARCHITECTURE_ID MATCHES "64") - set(_SETTINGS ${_SETTINGS} -s arch=x86_64) - elseif($ENV{Platform} STREQUAL "ARM") - message(STATUS "Conan: Using default ARM architecture from MSVC") - set(_SETTINGS ${_SETTINGS} -s arch=armv6) - else() - set(_SETTINGS ${_SETTINGS} -s arch=x86) - endif() - else() - if(${CMAKE_GENERATOR} MATCHES "Win64") - set(_SETTINGS ${_SETTINGS} -s arch=x86_64) - elseif (${CMAKE_GENERATOR} MATCHES "ARM") - message(STATUS "Conan: Using default ARM architecture from MSVC") - set(_SETTINGS ${_SETTINGS} -s arch=armv6) - else() - set(_SETTINGS ${_SETTINGS} -s arch=x86) - endif() + if (MSVC_${LANGUAGE}_ARCHITECTURE_ID MATCHES "64") + set(_SETTINGS ${_SETTINGS} -s arch=x86_64) + elseif (MSVC_${LANGUAGE}_ARCHITECTURE_ID MATCHES "^ARM") + message(STATUS "Conan: Using default ARM architecture from MSVC") + set(_SETTINGS ${_SETTINGS} -s arch=armv6) + elseif (MSVC_${LANGUAGE}_ARCHITECTURE_ID MATCHES "86") + set(_SETTINGS ${_SETTINGS} -s arch=x86) + else () + message(FATAL_ERROR "Conan: Unknown MSVC architecture [${MSVC_${LANGUAGE}_ARCHITECTURE_ID}]") endif() conan_cmake_detect_vs_runtime(_vs_runtime) @@ -201,14 +203,15 @@ endfunction() macro(parse_arguments) set(options BASIC_SETUP CMAKE_TARGETS UPDATE KEEP_RPATHS) - set(oneValueArgs CONANFILE) + set(oneValueArgs CONANFILE DEBUG_PROFILE RELEASE_PROFILE PROFILE) set(multiValueArgs REQUIRES OPTIONS IMPORTS BUILD CONAN_COMMAND) cmake_parse_arguments(ARGUMENTS "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN} ) endmacro() function(conan_cmake_install) # Calls "conan install" - # Argument BUILD is equivalant to --build={missing, PkgName,...} + # Argument BUILD is equivalant to --build={missing, PkgName,...} or + # --build when argument is 'BUILD all' (which builds all packages from source) # Argument CONAN_COMMAND, to specify the conan path, e.g. in case of running from source # cmake does not identify conan as command, even if it is +x and it is in the path parse_arguments(${ARGV}) @@ -227,13 +230,29 @@ function(conan_cmake_install) else() set(conan_command conan) endif() + set(CONAN_OPTIONS "") if(ARGUMENTS_CONANFILE) - set(CONANFILE -f=${CMAKE_CURRENT_SOURCE_DIR}/${ARGUMENTS_CONANFILE}) + set(CONANFILE ${CMAKE_CURRENT_SOURCE_DIR}/${ARGUMENTS_CONANFILE}) + # A conan file has been specified - apply specified options as well if provided + foreach(ARG ${ARGUMENTS_OPTIONS}) + set(CONAN_OPTIONS ${CONAN_OPTIONS} -o ${ARG}) + endforeach() + else() + set(CONANFILE ".") + endif() + if(CMAKE_BUILD_TYPE STREQUAL "Debug" AND ARGUMENTS_DEBUG_PROFILE) + set(settings -pr ${ARGUMENTS_DEBUG_PROFILE}) + endif() + if(CMAKE_BUILD_TYPE STREQUAL "Release" AND ARGUMENTS_RELEASE_PROFILE) + set(settings -pr ${ARGUMENTS_RELEASE_PROFILE}) + endif() + if(ARGUMENTS_PROFILE) + set(settings -pr ${ARGUMENTS_PROFILE}) endif() if(ARGUMENTS_UPDATE) set(CONAN_INSTALL_UPDATE --update) endif() - set(conan_args install ${CONANFILE} ${settings} ${CONAN_BUILD_POLICY} ${CONAN_INSTALL_UPDATE}) + set(conan_args install ${CONANFILE} ${settings} ${CONAN_BUILD_POLICY} ${CONAN_INSTALL_UPDATE} ${CONAN_OPTIONS}) string (REPLACE ";" " " _conan_args "${conan_args}") message(STATUS "Conan executing: ${conan_command} ${_conan_args}") @@ -263,7 +282,7 @@ endfunction() function(conan_cmake_generate_conanfile) # Generate, writing in disk a conanfile.txt with the requires, options, and imports # specified as arguments - # This will be considered as temporary file, generated in CMAKE_CURRENT_BINARY_DIR + # This will be considered as temporary file, generated in CMAKE_CURRENT_BINARY_DIR) parse_arguments(${ARGV}) set(_FN "${CMAKE_CURRENT_BINARY_DIR}/conanfile.txt") diff --git a/scripts/docker/Dockerfile.clang.minimal b/scripts/docker/Dockerfile.clang.minimal index 63b9d0a3f354777613a3964756eb5b296353ef8f..4cf5a8dc52c9460109cfd7ac658c64bd2aea4377 100644 --- a/scripts/docker/Dockerfile.clang.minimal +++ b/scripts/docker/Dockerfile.clang.minimal @@ -14,7 +14,7 @@ RUN apt-get update && apt-get install -y software-properties-common curl \ xz-utils RUN python -m pip install --upgrade pip \ - && python -m pip install cmake conan + && python -m pip install cmake conan>=1.0.0 # Ninja RUN curl -L -o ninja-linux.zip https://github.com/ninja-build/ninja/releases/download/v1.8.2/ninja-linux.zip \ diff --git a/scripts/docker/Dockerfile.gcc.full b/scripts/docker/Dockerfile.gcc.full index ab95673d4cc55d74c71deb9bb9dd0f33aaacb70e..e49359c53dcc5083774ddbe48b2ff904e1076fb6 100644 --- a/scripts/docker/Dockerfile.gcc.full +++ b/scripts/docker/Dockerfile.gcc.full @@ -16,7 +16,7 @@ ENV CC=gcc-4.9 ENV CXX=g++-4.9 RUN python -m pip install --upgrade pip \ - && python -m pip install cmake conan + && python -m pip install cmake conan>=1.0.0 # Ninja RUN curl -L -o ninja-linux.zip https://github.com/ninja-build/ninja/releases/download/v1.8.2/ninja-linux.zip \ diff --git a/scripts/docker/Dockerfile.gcc.minimal b/scripts/docker/Dockerfile.gcc.minimal index 3b14b97d0cc0ae910a8e9221a684c54148f9f7ac..5c0147cbd5fece24d778ba0e21cf3713e74d48c3 100644 --- a/scripts/docker/Dockerfile.gcc.minimal +++ b/scripts/docker/Dockerfile.gcc.minimal @@ -16,7 +16,7 @@ ENV CC=gcc-4.9 ENV CXX=g++-4.9 RUN python -m pip install --upgrade pip \ - && python -m pip install cmake conan + && python -m pip install cmake conan>=1.0.0 # Ninja RUN curl -L -o ninja-linux.zip https://github.com/ninja-build/ninja/releases/download/v1.8.2/ninja-linux.zip \