Skip to content

Commit e4f50b4

Browse files
committed
chore: update conan.cmake support the latest MSVC
Signed-off-by: Dylan <2894220@gmail.com>
1 parent d4df754 commit e4f50b4

File tree

1 file changed

+162
-42
lines changed

1 file changed

+162
-42
lines changed

.cmake/conan.cmake

Lines changed: 162 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@
3333
# but it is only necessary on the end-user side. It is not necessary to create conan
3434
# packages, in fact it shouldn't be use for that. Check the project documentation.
3535

36-
# version: 0.18.1
36+
# version: 0.19.0-dev
3737

3838
include(CMakeParseArguments)
3939

@@ -55,7 +55,7 @@ function(_get_msvc_ide_version result)
5555
set(${result} 15 PARENT_SCOPE)
5656
elseif(NOT MSVC_VERSION VERSION_LESS 1920 AND MSVC_VERSION VERSION_LESS 1930)
5757
set(${result} 16 PARENT_SCOPE)
58-
elseif(NOT MSVC_VERSION VERSION_LESS 1930 AND MSVC_VERSION VERSION_LESS 1942)
58+
elseif(NOT MSVC_VERSION VERSION_LESS 1930 AND MSVC_VERSION VERSION_LESS 1950)
5959
set(${result} 17 PARENT_SCOPE)
6060
else()
6161
message(FATAL_ERROR "Conan: Unknown MSVC compiler version [${MSVC_VERSION}]")
@@ -132,18 +132,28 @@ macro(_conan_detect_compiler)
132132
set(_CONAN_SETTING_COMPILER_CPPSTD ${CMAKE_CXX_STANDARD})
133133
endif()
134134

135-
if (${CMAKE_${LANGUAGE}_COMPILER_ID} STREQUAL GNU)
136-
# using GCC
135+
if (${CMAKE_${LANGUAGE}_COMPILER_ID} STREQUAL GNU OR ${CMAKE_${LANGUAGE}_COMPILER_ID} STREQUAL QCC)
136+
# using GCC or QCC
137137
# TODO: Handle other params
138138
string(REPLACE "." ";" VERSION_LIST ${CMAKE_${LANGUAGE}_COMPILER_VERSION})
139139
list(GET VERSION_LIST 0 MAJOR)
140140
list(GET VERSION_LIST 1 MINOR)
141-
set(COMPILER_VERSION ${MAJOR}.${MINOR})
142-
if(${MAJOR} GREATER 4)
143-
set(COMPILER_VERSION ${MAJOR})
144-
endif()
145-
set(_CONAN_SETTING_COMPILER gcc)
141+
142+
if (${CMAKE_${LANGUAGE}_COMPILER_ID} STREQUAL GNU)
143+
set(_CONAN_SETTING_COMPILER gcc)
144+
# mimic Conan client autodetection
145+
if (${MAJOR} GREATER_EQUAL 5)
146+
set(COMPILER_VERSION ${MAJOR})
147+
else()
148+
set(COMPILER_VERSION ${MAJOR}.${MINOR})
149+
endif()
150+
elseif (${CMAKE_${LANGUAGE}_COMPILER_ID} STREQUAL QCC)
151+
set(_CONAN_SETTING_COMPILER qcc)
152+
set(COMPILER_VERSION ${MAJOR}.${MINOR})
153+
endif ()
154+
146155
set(_CONAN_SETTING_COMPILER_VERSION ${COMPILER_VERSION})
156+
147157
if (USING_CXX)
148158
conan_cmake_detect_unix_libcxx(_LIBCXX)
149159
set(_CONAN_SETTING_COMPILER_LIBCXX ${_LIBCXX})
@@ -152,7 +162,7 @@ macro(_conan_detect_compiler)
152162
string(REPLACE "." ";" VERSION_LIST ${CMAKE_${LANGUAGE}_COMPILER_VERSION})
153163
list(GET VERSION_LIST 0 MAJOR)
154164
list(GET VERSION_LIST 1 MINOR)
155-
set(COMPILER_VERSION ${MAJOR}.${MINOR})
165+
set(COMPILER_VERSION ${MAJOR})
156166
set(_CONAN_SETTING_COMPILER intel)
157167
set(_CONAN_SETTING_COMPILER_VERSION ${COMPILER_VERSION})
158168
if (USING_CXX)
@@ -164,8 +174,17 @@ macro(_conan_detect_compiler)
164174
string(REPLACE "." ";" VERSION_LIST ${CMAKE_${LANGUAGE}_COMPILER_VERSION})
165175
list(GET VERSION_LIST 0 MAJOR)
166176
list(GET VERSION_LIST 1 MINOR)
177+
178+
# mimic Conan client autodetection
179+
if (${MAJOR} GREATER_EQUAL 13)
180+
set(COMPILER_VERSION ${MAJOR})
181+
else()
182+
set(COMPILER_VERSION ${MAJOR}.${MINOR})
183+
endif()
184+
185+
set(_CONAN_SETTING_COMPILER_VERSION ${COMPILER_VERSION})
186+
167187
set(_CONAN_SETTING_COMPILER apple-clang)
168-
set(_CONAN_SETTING_COMPILER_VERSION ${MAJOR}.${MINOR})
169188
if (USING_CXX)
170189
conan_cmake_detect_unix_libcxx(_LIBCXX)
171190
set(_CONAN_SETTING_COMPILER_LIBCXX ${_LIBCXX})
@@ -178,17 +197,23 @@ macro(_conan_detect_compiler)
178197
list(GET VERSION_LIST 0 MAJOR)
179198
list(GET VERSION_LIST 1 MINOR)
180199
set(_CONAN_SETTING_COMPILER clang)
181-
set(_CONAN_SETTING_COMPILER_VERSION ${MAJOR}.${MINOR})
200+
201+
# mimic Conan client autodetection
202+
if (${MAJOR} GREATER_EQUAL 8)
203+
set(COMPILER_VERSION ${MAJOR})
204+
else()
205+
set(COMPILER_VERSION ${MAJOR}.${MINOR})
206+
endif()
207+
208+
set(_CONAN_SETTING_COMPILER_VERSION ${COMPILER_VERSION})
209+
182210
if(APPLE)
183211
cmake_policy(GET CMP0025 APPLE_CLANG_POLICY)
184212
if(NOT APPLE_CLANG_POLICY STREQUAL NEW)
185213
message(STATUS "Conan: APPLE and Clang detected. Assuming apple-clang compiler. Set CMP0025 to avoid it")
186214
set(_CONAN_SETTING_COMPILER apple-clang)
187215
endif()
188216
endif()
189-
if(${_CONAN_SETTING_COMPILER} STREQUAL clang AND ${MAJOR} GREATER 7)
190-
set(_CONAN_SETTING_COMPILER_VERSION ${MAJOR})
191-
endif()
192217
if (USING_CXX)
193218
conan_cmake_detect_unix_libcxx(_LIBCXX)
194219
set(_CONAN_SETTING_COMPILER_LIBCXX ${_LIBCXX})
@@ -280,7 +305,7 @@ function(conan_cmake_settings result)
280305

281306
if(NOT _SETTINGS OR ARGUMENTS_PROFILE_AUTO STREQUAL "ALL")
282307
set(ARGUMENTS_PROFILE_AUTO arch build_type compiler compiler.version
283-
compiler.runtime compiler.libcxx compiler.toolset)
308+
compiler.runtime compiler.libcxx compiler.toolset os)
284309
endif()
285310

286311
# remove any manually specified settings from the autodetected settings
@@ -429,7 +454,7 @@ endfunction()
429454
function(_collect_settings result)
430455
set(ARGUMENTS_PROFILE_AUTO arch build_type compiler compiler.version
431456
compiler.runtime compiler.libcxx compiler.toolset
432-
compiler.cppstd)
457+
compiler.cppstd os)
433458
foreach(ARG ${ARGUMENTS_PROFILE_AUTO})
434459
string(TOUPPER ${ARG} _arg_name)
435460
string(REPLACE "." "_" _arg_name ${_arg_name})
@@ -450,17 +475,18 @@ function(conan_cmake_autodetect detected_settings)
450475
endfunction()
451476

452477
macro(conan_parse_arguments)
453-
set(options BASIC_SETUP CMAKE_TARGETS UPDATE KEEP_RPATHS NO_LOAD NO_OUTPUT_DIRS OUTPUT_QUIET NO_IMPORTS SKIP_STD)
454-
set(oneValueArgs CONANFILE ARCH BUILD_TYPE INSTALL_FOLDER OUTPUT_FOLDER CONAN_COMMAND)
455-
set(multiValueArgs DEBUG_PROFILE RELEASE_PROFILE RELWITHDEBINFO_PROFILE MINSIZEREL_PROFILE
456-
PROFILE REQUIRES OPTIONS IMPORTS SETTINGS BUILD ENV GENERATORS PROFILE_AUTO
457-
INSTALL_ARGS CONFIGURATION_TYPES PROFILE_BUILD BUILD_REQUIRES)
458-
cmake_parse_arguments(ARGUMENTS "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
478+
set(options BASIC_SETUP CMAKE_TARGETS UPDATE KEEP_RPATHS NO_LOAD NO_OUTPUT_DIRS
479+
OUTPUT_QUIET NO_IMPORTS SKIP_STD)
480+
set(oneValueArgs CONANFILE ARCH BUILD_TYPE INSTALL_FOLDER OUTPUT_FOLDER CONAN_COMMAND)
481+
set(multiValueArgs DEBUG_PROFILE RELEASE_PROFILE RELWITHDEBINFO_PROFILE MINSIZEREL_PROFILE
482+
PROFILE REQUIRES OPTIONS IMPORTS SETTINGS BUILD ENV GENERATORS PROFILE_AUTO
483+
INSTALL_ARGS CONFIGURATION_TYPES PROFILE_BUILD BUILD_REQUIRES)
484+
cmake_parse_arguments(ARGUMENTS "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
459485
endmacro()
460486

461487
function(old_conan_cmake_install)
462488
# Calls "conan install"
463-
# Argument BUILD is equivalant to --build={missing, PkgName,...} or
489+
# Argument BUILD is equivalent to --build={missing, PkgName,...} or
464490
# --build when argument is 'BUILD all' (which builds all packages from source)
465491
# Argument CONAN_COMMAND, to specify the conan path, e.g. in case of running from source
466492
# cmake does not identify conan as command, even if it is +x and it is in the path
@@ -552,7 +578,7 @@ function(conan_cmake_install)
552578
set(installOptions UPDATE NO_IMPORTS OUTPUT_QUIET ERROR_QUIET)
553579
set(installOneValueArgs PATH_OR_REFERENCE REFERENCE REMOTE LOCKFILE LOCKFILE_OUT LOCKFILE_NODE_ID INSTALL_FOLDER OUTPUT_FOLDER)
554580
set(installMultiValueArgs GENERATOR BUILD ENV ENV_HOST ENV_BUILD OPTIONS_HOST OPTIONS OPTIONS_BUILD PROFILE
555-
PROFILE_HOST PROFILE_BUILD SETTINGS SETTINGS_HOST SETTINGS_BUILD)
581+
PROFILE_HOST PROFILE_BUILD SETTINGS SETTINGS_HOST SETTINGS_BUILD CONF CONF_HOST CONF_BUILD)
556582
cmake_parse_arguments(ARGS "${installOptions}" "${installOneValueArgs}" "${installMultiValueArgs}" ${ARGN})
557583
foreach(arg ${installOptions})
558584
if(ARGS_${arg})
@@ -607,6 +633,12 @@ function(conan_cmake_install)
607633
set(flag "--settings:host")
608634
elseif("${arg}" STREQUAL "SETTINGS_BUILD")
609635
set(flag "--settings:build")
636+
elseif("${arg}" STREQUAL "CONF")
637+
set(flag "--conf")
638+
elseif("${arg}" STREQUAL "CONF_HOST")
639+
set(flag "--conf:host")
640+
elseif("${arg}" STREQUAL "CONF_BUILD")
641+
set(flag "--conf:build")
610642
endif()
611643
list(LENGTH ARGS_${arg} numargs)
612644
foreach(item ${ARGS_${arg}})
@@ -624,9 +656,12 @@ function(conan_cmake_install)
624656
if(DEFINED NO_IMPORTS)
625657
set(NO_IMPORTS --no-imports)
626658
endif()
627-
set(install_args install ${PATH_OR_REFERENCE} ${REFERENCE} ${UPDATE} ${NO_IMPORTS} ${REMOTE} ${LOCKFILE} ${LOCKFILE_OUT} ${LOCKFILE_NODE_ID} ${INSTALL_FOLDER} ${OUTPUT_FOLDER}
628-
${GENERATOR} ${BUILD} ${ENV} ${ENV_HOST} ${ENV_BUILD} ${OPTIONS} ${OPTIONS_HOST} ${OPTIONS_BUILD}
629-
${PROFILE} ${PROFILE_HOST} ${PROFILE_BUILD} ${SETTINGS} ${SETTINGS_HOST} ${SETTINGS_BUILD})
659+
set(install_args install ${PATH_OR_REFERENCE} ${REFERENCE} ${UPDATE} ${NO_IMPORTS} ${REMOTE}
660+
${LOCKFILE} ${LOCKFILE_OUT} ${LOCKFILE_NODE_ID} ${INSTALL_FOLDER}
661+
${OUTPUT_FOLDER} ${GENERATOR} ${BUILD} ${ENV} ${ENV_HOST} ${ENV_BUILD}
662+
${OPTIONS} ${OPTIONS_HOST} ${OPTIONS_BUILD} ${PROFILE} ${PROFILE_HOST}
663+
${PROFILE_BUILD} ${SETTINGS} ${SETTINGS_HOST} ${SETTINGS_BUILD}
664+
${CONF} ${CONF_HOST} ${CONF_BUILD})
630665

631666
string(REPLACE ";" " " _install_args "${install_args}")
632667
message(STATUS "Conan executing: ${CONAN_CMD} ${_install_args}")
@@ -901,6 +936,30 @@ macro(conan_cmake_run)
901936
endif()
902937
endmacro()
903938

939+
function(conan_version result)
940+
set(${result} "" PARENT_SCOPE)
941+
942+
if(NOT CONAN_CMD)
943+
find_program(CONAN_CMD conan)
944+
if(NOT CONAN_CMD AND CONAN_REQUIRED)
945+
message(FATAL_ERROR "Conan executable not found! Please install conan.")
946+
endif()
947+
endif()
948+
949+
execute_process(COMMAND ${CONAN_CMD} --version
950+
RESULT_VARIABLE return_code
951+
OUTPUT_VARIABLE CONAN_VERSION_OUTPUT
952+
ERROR_VARIABLE CONAN_VERSION_OUTPUT)
953+
954+
if(NOT "${return_code}" STREQUAL "0")
955+
message(FATAL_ERROR "Conan --version failed='${return_code}'")
956+
endif()
957+
958+
string(REGEX MATCH ".*Conan version ([0-9]+\\.[0-9]+\\.[0-9]+)" FOO "${CONAN_VERSION_OUTPUT}")
959+
960+
set(${result} ${CMAKE_MATCH_1} PARENT_SCOPE)
961+
endfunction()
962+
904963
macro(conan_check)
905964
# Checks conan availability in PATH
906965
# Arguments REQUIRED, DETECT_QUIET and VERSION are optional
@@ -920,25 +979,16 @@ macro(conan_check)
920979
if(NOT CONAN_DETECT_QUIET)
921980
message(STATUS "Conan: Found program ${CONAN_CMD}")
922981
endif()
923-
execute_process(COMMAND ${CONAN_CMD} --version
924-
RESULT_VARIABLE return_code
925-
OUTPUT_VARIABLE CONAN_VERSION_OUTPUT
926-
ERROR_VARIABLE CONAN_VERSION_OUTPUT)
927982

928-
if(NOT "${return_code}" STREQUAL "0")
929-
message(FATAL_ERROR "Conan --version failed='${return_code}'")
930-
endif()
983+
conan_version(CONAN_DETECTED_VERSION)
931984

932985
if(NOT CONAN_DETECT_QUIET)
933-
string(STRIP "${CONAN_VERSION_OUTPUT}" _CONAN_VERSION_OUTPUT)
934-
message(STATUS "Conan: Version found ${_CONAN_VERSION_OUTPUT}")
986+
message(STATUS "Conan: Version found ${CONAN_DETECTED_VERSION}")
935987
endif()
936988

937989
if(DEFINED CONAN_VERSION)
938-
string(REGEX MATCH ".*Conan version ([0-9]+\\.[0-9]+\\.[0-9]+)" FOO
939-
"${CONAN_VERSION_OUTPUT}")
940-
if(${CMAKE_MATCH_1} VERSION_LESS ${CONAN_VERSION})
941-
message(FATAL_ERROR "Conan outdated. Installed: ${CMAKE_MATCH_1}, \
990+
if(${CONAN_DETECTED_VERSION} VERSION_LESS ${CONAN_VERSION})
991+
message(FATAL_ERROR "Conan outdated. Installed: ${CONAN_DETECTED_VERSION}, \
942992
required: ${CONAN_VERSION}. Consider updating via 'pip \
943993
install conan==${CONAN_VERSION}'.")
944994
endif()
@@ -1000,7 +1050,9 @@ macro(conan_config_install)
10001050
endif()
10011051

10021052
if(DEFINED CONAN_ARGS)
1003-
set(CONAN_ARGS_ARGS "--args=\"${CONAN_ARGS}\"")
1053+
# Convert ; seperated multi arg list into space seperated string
1054+
string(REPLACE ";" " " l_CONAN_ARGS "${CONAN_ARGS}")
1055+
set(CONAN_ARGS_ARGS "--args=${l_CONAN_ARGS}")
10041056
endif()
10051057

10061058
if(DEFINED CONAN_SOURCE)
@@ -1024,3 +1076,71 @@ macro(conan_config_install)
10241076
message(FATAL_ERROR "Conan config failed='${return_code}'")
10251077
endif()
10261078
endmacro()
1079+
1080+
1081+
function(conan_cmake_profile)
1082+
set(profileOneValueArgs FILEPATH INCLUDE)
1083+
set(profileMultiValueArgs SETTINGS OPTIONS CONF ENV BUILDENV RUNENV TOOL_REQUIRES)
1084+
cmake_parse_arguments(ARGS "" "${profileOneValueArgs}" "${profileMultiValueArgs}" ${ARGN})
1085+
1086+
if(DEFINED ARGS_FILEPATH)
1087+
set(_FN "${ARGS_FILEPATH}")
1088+
else()
1089+
set(_FN "${CMAKE_CURRENT_BINARY_DIR}/profile")
1090+
endif()
1091+
message(STATUS "Conan: Creating profile ${_FN}")
1092+
file(WRITE ${_FN} "")
1093+
1094+
if(DEFINED ARGS_INCLUDE)
1095+
file(APPEND ${_FN} "include(${ARGS_INCLUDE})\n")
1096+
endif()
1097+
1098+
if(DEFINED ARGS_SETTINGS)
1099+
file(APPEND ${_FN} "[settings]\n")
1100+
foreach(SETTING ${ARGS_SETTINGS})
1101+
file(APPEND ${_FN} ${SETTING} "\n")
1102+
endforeach()
1103+
endif()
1104+
1105+
if(DEFINED ARGS_OPTIONS)
1106+
file(APPEND ${_FN} "[options]\n")
1107+
foreach(OPTION ${ARGS_OPTIONS})
1108+
file(APPEND ${_FN} ${OPTION} "\n")
1109+
endforeach()
1110+
endif()
1111+
1112+
if(DEFINED ARGS_CONF)
1113+
file(APPEND ${_FN} "[conf]\n")
1114+
foreach(CONF ${ARGS_CONF})
1115+
file(APPEND ${_FN} ${CONF} "\n")
1116+
endforeach()
1117+
endif()
1118+
1119+
if(DEFINED ARGS_ENV)
1120+
file(APPEND ${_FN} "[env]\n")
1121+
foreach(ENV ${ARGS_ENV})
1122+
file(APPEND ${_FN} ${ENV} "\n")
1123+
endforeach()
1124+
endif()
1125+
1126+
if(DEFINED ARGS_BUILDENV)
1127+
file(APPEND ${_FN} "[buildenv]\n")
1128+
foreach(BUILDENV ${ARGS_BUILDENV})
1129+
file(APPEND ${_FN} ${BUILDENV} "\n")
1130+
endforeach()
1131+
endif()
1132+
1133+
if(DEFINED ARGS_RUNENV)
1134+
file(APPEND ${_FN} "[runenv]\n")
1135+
foreach(RUNENV ${ARGS_RUNENV})
1136+
file(APPEND ${_FN} ${RUNENV} "\n")
1137+
endforeach()
1138+
endif()
1139+
1140+
if(DEFINED ARGS_TOOL_REQUIRES)
1141+
file(APPEND ${_FN} "[tool_requires]\n")
1142+
foreach(TOOL_REQUIRE ${ARGS_TOOL_REQUIRES})
1143+
file(APPEND ${_FN} ${TOOL_REQUIRE} "\n")
1144+
endforeach()
1145+
endif()
1146+
endfunction()

0 commit comments

Comments
 (0)