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
3838include (CMakeParseArguments)
3939
@@ -55,8 +55,10 @@ 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)
60+ elseif (NOT MSVC_VERSION VERSION_LESS 1950 AND MSVC_VERSION VERSION_LESS 1960)
61+ set (${result} 18 PARENT_SCOPE)
6062 else ()
6163 message (FATAL_ERROR "Conan: Unknown MSVC compiler version [${MSVC_VERSION} ]" )
6264 endif ()
@@ -132,18 +134,28 @@ macro(_conan_detect_compiler)
132134 set (_CONAN_SETTING_COMPILER_CPPSTD ${CMAKE_CXX_STANDARD} )
133135 endif ()
134136
135- if (${CMAKE_${LANGUAGE} _COMPILER_ID} STREQUAL GNU)
136- # using GCC
137+ if (${CMAKE_${LANGUAGE} _COMPILER_ID} STREQUAL GNU OR ${CMAKE_ ${LANGUAGE} _COMPILER_ID} STREQUAL QCC )
138+ # using GCC or QCC
137139 # TODO: Handle other params
138140 string (REPLACE "." ";" VERSION_LIST ${CMAKE_${LANGUAGE} _COMPILER_VERSION})
139141 list (GET VERSION_LIST 0 MAJOR)
140142 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)
143+
144+ if (${CMAKE_${LANGUAGE} _COMPILER_ID} STREQUAL GNU)
145+ set (_CONAN_SETTING_COMPILER gcc)
146+ # mimic Conan client autodetection
147+ if (${MAJOR} GREATER_EQUAL 5)
148+ set (COMPILER_VERSION ${MAJOR} )
149+ else ()
150+ set (COMPILER_VERSION ${MAJOR} .${MINOR} )
151+ endif ()
152+ elseif (${CMAKE_${LANGUAGE} _COMPILER_ID} STREQUAL QCC)
153+ set (_CONAN_SETTING_COMPILER qcc)
154+ set (COMPILER_VERSION ${MAJOR} .${MINOR} )
155+ endif ()
156+
146157 set (_CONAN_SETTING_COMPILER_VERSION ${COMPILER_VERSION} )
158+
147159 if (USING_CXX)
148160 conan_cmake_detect_unix_libcxx(_LIBCXX)
149161 set (_CONAN_SETTING_COMPILER_LIBCXX ${_LIBCXX} )
@@ -152,7 +164,7 @@ macro(_conan_detect_compiler)
152164 string (REPLACE "." ";" VERSION_LIST ${CMAKE_${LANGUAGE} _COMPILER_VERSION})
153165 list (GET VERSION_LIST 0 MAJOR)
154166 list (GET VERSION_LIST 1 MINOR)
155- set (COMPILER_VERSION ${MAJOR} . ${MINOR} )
167+ set (COMPILER_VERSION ${MAJOR} )
156168 set (_CONAN_SETTING_COMPILER intel)
157169 set (_CONAN_SETTING_COMPILER_VERSION ${COMPILER_VERSION} )
158170 if (USING_CXX)
@@ -164,8 +176,17 @@ macro(_conan_detect_compiler)
164176 string (REPLACE "." ";" VERSION_LIST ${CMAKE_${LANGUAGE} _COMPILER_VERSION})
165177 list (GET VERSION_LIST 0 MAJOR)
166178 list (GET VERSION_LIST 1 MINOR)
179+
180+ # mimic Conan client autodetection
181+ if (${MAJOR} GREATER_EQUAL 13)
182+ set (COMPILER_VERSION ${MAJOR} )
183+ else ()
184+ set (COMPILER_VERSION ${MAJOR} .${MINOR} )
185+ endif ()
186+
187+ set (_CONAN_SETTING_COMPILER_VERSION ${COMPILER_VERSION} )
188+
167189 set (_CONAN_SETTING_COMPILER apple -clang)
168- set (_CONAN_SETTING_COMPILER_VERSION ${MAJOR} .${MINOR} )
169190 if (USING_CXX)
170191 conan_cmake_detect_unix_libcxx(_LIBCXX)
171192 set (_CONAN_SETTING_COMPILER_LIBCXX ${_LIBCXX} )
@@ -178,17 +199,23 @@ macro(_conan_detect_compiler)
178199 list (GET VERSION_LIST 0 MAJOR)
179200 list (GET VERSION_LIST 1 MINOR)
180201 set (_CONAN_SETTING_COMPILER clang)
181- set (_CONAN_SETTING_COMPILER_VERSION ${MAJOR} .${MINOR} )
202+
203+ # mimic Conan client autodetection
204+ if (${MAJOR} GREATER_EQUAL 8)
205+ set (COMPILER_VERSION ${MAJOR} )
206+ else ()
207+ set (COMPILER_VERSION ${MAJOR} .${MINOR} )
208+ endif ()
209+
210+ set (_CONAN_SETTING_COMPILER_VERSION ${COMPILER_VERSION} )
211+
182212 if (APPLE )
183213 cmake_policy (GET CMP0025 APPLE_CLANG_POLICY)
184214 if (NOT APPLE_CLANG_POLICY STREQUAL NEW)
185215 message (STATUS "Conan: APPLE and Clang detected. Assuming apple-clang compiler. Set CMP0025 to avoid it" )
186216 set (_CONAN_SETTING_COMPILER apple -clang)
187217 endif ()
188218 endif ()
189- if (${_CONAN_SETTING_COMPILER} STREQUAL clang AND ${MAJOR} GREATER 7)
190- set (_CONAN_SETTING_COMPILER_VERSION ${MAJOR} )
191- endif ()
192219 if (USING_CXX)
193220 conan_cmake_detect_unix_libcxx(_LIBCXX)
194221 set (_CONAN_SETTING_COMPILER_LIBCXX ${_LIBCXX} )
@@ -280,7 +307,7 @@ function(conan_cmake_settings result)
280307
281308 if (NOT _SETTINGS OR ARGUMENTS_PROFILE_AUTO STREQUAL "ALL" )
282309 set (ARGUMENTS_PROFILE_AUTO arch build_type compiler compiler.version
283- compiler.runtime compiler.libcxx compiler.toolset)
310+ compiler.runtime compiler.libcxx compiler.toolset os )
284311 endif ()
285312
286313 # remove any manually specified settings from the autodetected settings
@@ -429,7 +456,7 @@ endfunction()
429456function (_collect_settings result)
430457 set (ARGUMENTS_PROFILE_AUTO arch build_type compiler compiler.version
431458 compiler.runtime compiler.libcxx compiler.toolset
432- compiler.cppstd)
459+ compiler.cppstd os )
433460 foreach (ARG ${ARGUMENTS_PROFILE_AUTO} )
434461 string (TOUPPER ${ARG} _arg_name)
435462 string (REPLACE "." "_" _arg_name ${_arg_name} )
@@ -450,17 +477,18 @@ function(conan_cmake_autodetect detected_settings)
450477endfunction ()
451478
452479macro (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} )
480+ set (options BASIC_SETUP CMAKE_TARGETS UPDATE KEEP_RPATHS NO_LOAD NO_OUTPUT_DIRS
481+ OUTPUT_QUIET NO_IMPORTS SKIP_STD)
482+ set (oneValueArgs CONANFILE ARCH BUILD_TYPE INSTALL_FOLDER OUTPUT_FOLDER CONAN_COMMAND)
483+ set (multiValueArgs DEBUG_PROFILE RELEASE_PROFILE RELWITHDEBINFO_PROFILE MINSIZEREL_PROFILE
484+ PROFILE REQUIRES OPTIONS IMPORTS SETTINGS BUILD ENV GENERATORS PROFILE_AUTO
485+ INSTALL_ARGS CONFIGURATION_TYPES PROFILE_BUILD BUILD_REQUIRES)
486+ cmake_parse_arguments (ARGUMENTS "${options} " "${oneValueArgs} " "${multiValueArgs} " ${ARGN} )
459487endmacro ()
460488
461489function (old_conan_cmake_install)
462490 # Calls "conan install"
463- # Argument BUILD is equivalant to --build={missing, PkgName,...} or
491+ # Argument BUILD is equivalent to --build={missing, PkgName,...} or
464492 # --build when argument is 'BUILD all' (which builds all packages from source)
465493 # Argument CONAN_COMMAND, to specify the conan path, e.g. in case of running from source
466494 # cmake does not identify conan as command, even if it is +x and it is in the path
@@ -552,7 +580,7 @@ function(conan_cmake_install)
552580 set (installOptions UPDATE NO_IMPORTS OUTPUT_QUIET ERROR_QUIET)
553581 set (installOneValueArgs PATH_OR_REFERENCE REFERENCE REMOTE LOCKFILE LOCKFILE_OUT LOCKFILE_NODE_ID INSTALL_FOLDER OUTPUT_FOLDER)
554582 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)
583+ PROFILE_HOST PROFILE_BUILD SETTINGS SETTINGS_HOST SETTINGS_BUILD CONF CONF_HOST CONF_BUILD )
556584 cmake_parse_arguments (ARGS "${installOptions} " "${installOneValueArgs} " "${installMultiValueArgs} " ${ARGN} )
557585 foreach (arg ${installOptions} )
558586 if (ARGS_${arg} )
@@ -607,6 +635,12 @@ function(conan_cmake_install)
607635 set (flag "--settings:host" )
608636 elseif ("${arg} " STREQUAL "SETTINGS_BUILD" )
609637 set (flag "--settings:build" )
638+ elseif ("${arg} " STREQUAL "CONF" )
639+ set (flag "--conf" )
640+ elseif ("${arg} " STREQUAL "CONF_HOST" )
641+ set (flag "--conf:host" )
642+ elseif ("${arg} " STREQUAL "CONF_BUILD" )
643+ set (flag "--conf:build" )
610644 endif ()
611645 list (LENGTH ARGS_${arg} numargs)
612646 foreach (item ${ARGS_${arg} })
@@ -624,9 +658,12 @@ function(conan_cmake_install)
624658 if (DEFINED NO_IMPORTS)
625659 set (NO_IMPORTS --no -imports)
626660 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} )
661+ set (install_args install ${PATH_OR_REFERENCE} ${REFERENCE} ${UPDATE} ${NO_IMPORTS} ${REMOTE}
662+ ${LOCKFILE} ${LOCKFILE_OUT} ${LOCKFILE_NODE_ID} ${INSTALL_FOLDER}
663+ ${OUTPUT_FOLDER} ${GENERATOR} ${BUILD} ${ENV} ${ENV_HOST} ${ENV_BUILD}
664+ ${OPTIONS} ${OPTIONS_HOST} ${OPTIONS_BUILD} ${PROFILE} ${PROFILE_HOST}
665+ ${PROFILE_BUILD} ${SETTINGS} ${SETTINGS_HOST} ${SETTINGS_BUILD}
666+ ${CONF} ${CONF_HOST} ${CONF_BUILD} )
630667
631668 string (REPLACE ";" " " _install_args "${install_args} " )
632669 message (STATUS "Conan executing: ${CONAN_CMD} ${_install_args} " )
@@ -901,6 +938,30 @@ macro(conan_cmake_run)
901938 endif ()
902939endmacro ()
903940
941+ function (conan_version result)
942+ set (${result} "" PARENT_SCOPE)
943+
944+ if (NOT CONAN_CMD)
945+ find_program (CONAN_CMD conan)
946+ if (NOT CONAN_CMD AND CONAN_REQUIRED)
947+ message (FATAL_ERROR "Conan executable not found! Please install conan." )
948+ endif ()
949+ endif ()
950+
951+ execute_process (COMMAND ${CONAN_CMD} --version
952+ RESULT_VARIABLE return_code
953+ OUTPUT_VARIABLE CONAN_VERSION_OUTPUT
954+ ERROR_VARIABLE CONAN_VERSION_OUTPUT)
955+
956+ if (NOT "${return_code} " STREQUAL "0" )
957+ message (FATAL_ERROR "Conan --version failed='${return_code} '" )
958+ endif ()
959+
960+ string (REGEX MATCH ".*Conan version ([0-9]+\\ .[0-9]+\\ .[0-9]+)" FOO "${CONAN_VERSION_OUTPUT} " )
961+
962+ set (${result} ${CMAKE_MATCH_1} PARENT_SCOPE)
963+ endfunction ()
964+
904965macro (conan_check)
905966 # Checks conan availability in PATH
906967 # Arguments REQUIRED, DETECT_QUIET and VERSION are optional
@@ -920,25 +981,16 @@ macro(conan_check)
920981 if (NOT CONAN_DETECT_QUIET)
921982 message (STATUS "Conan: Found program ${CONAN_CMD} " )
922983 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)
927984
928- if (NOT "${return_code} " STREQUAL "0" )
929- message (FATAL_ERROR "Conan --version failed='${return_code} '" )
930- endif ()
985+ conan_version(CONAN_DETECTED_VERSION)
931986
932987 if (NOT CONAN_DETECT_QUIET)
933- string (STRIP "${CONAN_VERSION_OUTPUT} " _CONAN_VERSION_OUTPUT)
934- message (STATUS "Conan: Version found ${_CONAN_VERSION_OUTPUT} " )
988+ message (STATUS "Conan: Version found ${CONAN_DETECTED_VERSION} " )
935989 endif ()
936990
937991 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} , \
992+ if (${CONAN_DETECTED_VERSION} VERSION_LESS ${CONAN_VERSION} )
993+ message (FATAL_ERROR "Conan outdated. Installed: ${CONAN_DETECTED_VERSION} , \
942994 required: ${CONAN_VERSION} . Consider updating via 'pip \
943995 install conan==${CONAN_VERSION} '." )
944996 endif ()
@@ -1000,7 +1052,9 @@ macro(conan_config_install)
10001052 endif ()
10011053
10021054 if (DEFINED CONAN_ARGS)
1003- set (CONAN_ARGS_ARGS "--args=\" ${CONAN_ARGS} \" " )
1055+ # Convert ; seperated multi arg list into space seperated string
1056+ string (REPLACE ";" " " l_CONAN_ARGS "${CONAN_ARGS} " )
1057+ set (CONAN_ARGS_ARGS "--args=${l_CONAN_ARGS} " )
10041058 endif ()
10051059
10061060 if (DEFINED CONAN_SOURCE)
@@ -1024,3 +1078,71 @@ macro(conan_config_install)
10241078 message (FATAL_ERROR "Conan config failed='${return_code} '" )
10251079 endif ()
10261080endmacro ()
1081+
1082+
1083+ function (conan_cmake_profile)
1084+ set (profileOneValueArgs FILEPATH INCLUDE )
1085+ set (profileMultiValueArgs SETTINGS OPTIONS CONF ENV BUILDENV RUNENV TOOL_REQUIRES)
1086+ cmake_parse_arguments (ARGS "" "${profileOneValueArgs} " "${profileMultiValueArgs} " ${ARGN} )
1087+
1088+ if (DEFINED ARGS_FILEPATH)
1089+ set (_FN "${ARGS_FILEPATH} " )
1090+ else ()
1091+ set (_FN "${CMAKE_CURRENT_BINARY_DIR} /profile" )
1092+ endif ()
1093+ message (STATUS "Conan: Creating profile ${_FN} " )
1094+ file (WRITE ${_FN} "" )
1095+
1096+ if (DEFINED ARGS_INCLUDE)
1097+ file (APPEND ${_FN} "include(${ARGS_INCLUDE} )\n " )
1098+ endif ()
1099+
1100+ if (DEFINED ARGS_SETTINGS)
1101+ file (APPEND ${_FN} "[settings]\n " )
1102+ foreach (SETTING ${ARGS_SETTINGS} )
1103+ file (APPEND ${_FN} ${SETTING} "\n " )
1104+ endforeach ()
1105+ endif ()
1106+
1107+ if (DEFINED ARGS_OPTIONS)
1108+ file (APPEND ${_FN} "[options]\n " )
1109+ foreach (OPTION ${ARGS_OPTIONS} )
1110+ file (APPEND ${_FN} ${OPTION} "\n " )
1111+ endforeach ()
1112+ endif ()
1113+
1114+ if (DEFINED ARGS_CONF)
1115+ file (APPEND ${_FN} "[conf]\n " )
1116+ foreach (CONF ${ARGS_CONF} )
1117+ file (APPEND ${_FN} ${CONF} "\n " )
1118+ endforeach ()
1119+ endif ()
1120+
1121+ if (DEFINED ARGS_ENV)
1122+ file (APPEND ${_FN} "[env]\n " )
1123+ foreach (ENV ${ARGS_ENV} )
1124+ file (APPEND ${_FN} ${ENV} "\n " )
1125+ endforeach ()
1126+ endif ()
1127+
1128+ if (DEFINED ARGS_BUILDENV)
1129+ file (APPEND ${_FN} "[buildenv]\n " )
1130+ foreach (BUILDENV ${ARGS_BUILDENV} )
1131+ file (APPEND ${_FN} ${BUILDENV} "\n " )
1132+ endforeach ()
1133+ endif ()
1134+
1135+ if (DEFINED ARGS_RUNENV)
1136+ file (APPEND ${_FN} "[runenv]\n " )
1137+ foreach (RUNENV ${ARGS_RUNENV} )
1138+ file (APPEND ${_FN} ${RUNENV} "\n " )
1139+ endforeach ()
1140+ endif ()
1141+
1142+ if (DEFINED ARGS_TOOL_REQUIRES)
1143+ file (APPEND ${_FN} "[tool_requires]\n " )
1144+ foreach (TOOL_REQUIRE ${ARGS_TOOL_REQUIRES} )
1145+ file (APPEND ${_FN} ${TOOL_REQUIRE} "\n " )
1146+ endforeach ()
1147+ endif ()
1148+ endfunction ()
0 commit comments