88from pathlib import Path
99from typing import Any
1010
11+ import requests
1112from conan .api .conan_api import ConanAPI
1213from conan .api .model import ListPattern
1314
2627class ConanProvider (Provider ):
2728 """Conan Provider"""
2829
30+ _provider_url = 'https://raw.githubusercontent.com/conan-io/cmake-conan/refs/heads/develop2/conan_provider.cmake'
31+
2932 def __init__ (
3033 self , group_data : ProviderPluginGroupData , core_data : CorePluginData , configuration_data : dict [str , Any ]
3134 ) -> None :
@@ -36,6 +39,15 @@ def __init__(
3639
3740 self .builder = Builder ()
3841
42+ @staticmethod
43+ def _download_file (url : str , file : Path ) -> None :
44+ """Replaces the given file with the contents of the url"""
45+ file .parent .mkdir (parents = True , exist_ok = True )
46+
47+ with open (file , 'wb' ) as out_file :
48+ content = requests .get (url , stream = True ).content
49+ out_file .write (content )
50+
3951 @staticmethod
4052 def features (directory : Path ) -> SupportedFeatures :
4153 """Queries conan support
@@ -185,13 +197,6 @@ def _generate_consumer_files(self, conan_api: ConanAPI, deps_graph) -> None:
185197 output_folder = str (self .core_data .cppython_data .build_path ),
186198 )
187199
188- # Rename the generated toolchain file so our wrapper can include it
189- original_toolchain = self .core_data .cppython_data .build_path / 'conan_toolchain.cmake'
190- renamed_toolchain = self .core_data .cppython_data .build_path / 'conan_toolchain.cmake.real'
191-
192- if original_toolchain .exists () and not renamed_toolchain .exists ():
193- original_toolchain .rename (renamed_toolchain )
194-
195200 def install (self ) -> None :
196201 """Installs the provider"""
197202 self ._install_dependencies (update = False )
@@ -226,25 +231,17 @@ def sync_data(self, consumer: SyncConsumer) -> SyncData:
226231 """
227232 for sync_type in consumer .sync_types ():
228233 if sync_type == CMakeSyncData :
229- # Use the CMakeToolchain file directly as the toolchain
230- toolchain_path = self .core_data .cppython_data .build_path / 'conan_toolchain.cmake'
231-
232234 return CMakeSyncData (
233235 provider_name = TypeName ('conan' ),
234- toolchain = toolchain_path ,
236+ top_level_includes = self . core_data . cppython_data . install_path / 'conan_provider.cmake' ,
235237 )
236238
237239 raise NotSupportedError (f'Unsupported sync types: { consumer .sync_types ()} ' )
238240
239241 @classmethod
240242 async def download_tooling (cls , directory : Path ) -> None :
241- """Download external tooling required by the Conan provider.
242-
243- Since we're using CMakeToolchain generator instead of cmake-conan provider,
244- no external tooling needs to be downloaded.
245- """
246- # No external tooling required when using CMakeToolchain
247- pass
243+ """Downloads the conan provider file"""
244+ cls ._download_file (cls ._provider_url , directory / 'conan_provider.cmake' )
248245
249246 def publish (self ) -> None :
250247 """Publishes the package using conan create workflow."""
0 commit comments