44
55from cppython .plugins .cmake .schema import (
66 BuildPreset ,
7- CacheVariable ,
87 CMakeData ,
98 CMakePresets ,
109 CMakeSyncData ,
@@ -18,136 +17,70 @@ class Builder:
1817 def __init__ (self ) -> None :
1918 """Initialize the builder"""
2019
21- @staticmethod
22- def generate_provider_preset (provider_data : CMakeSyncData ) -> CMakePresets :
23- """Generates a provider preset from input sync data
24-
25- Args:
26- provider_data: The providers synchronization data
27- """
28- # Base hidden preset with common configuration
29- base_preset = ConfigurePreset (name = f'{ provider_data .provider_name } -base' , hidden = True )
30-
31- # Handle both top_level_includes and toolchain options
32- cache_variables : dict [str , str | bool | CacheVariable | None ] = {}
33-
34- if provider_data .top_level_includes :
35- cache_variables ['CMAKE_PROJECT_TOP_LEVEL_INCLUDES' ] = str (provider_data .top_level_includes .as_posix ())
36-
37- if provider_data .toolchain :
38- # Use the toolchainFile field for better integration
39- base_preset .toolchainFile = provider_data .toolchain .as_posix ()
40-
41- if cache_variables :
42- base_preset .cacheVariables = cache_variables
43-
44- # Create specific configuration presets
45- default_preset = ConfigurePreset (
46- name = f'{ provider_data .provider_name } -default' , hidden = True , inherits = f'{ provider_data .provider_name } -base'
47- )
48-
49- release_preset = ConfigurePreset (
50- name = f'{ provider_data .provider_name } -release' ,
51- hidden = True ,
52- inherits = f'{ provider_data .provider_name } -base' ,
53- cacheVariables = {'CMAKE_BUILD_TYPE' : 'Release' },
54- )
55-
56- debug_preset = ConfigurePreset (
57- name = f'{ provider_data .provider_name } -debug' ,
58- hidden = True ,
59- inherits = f'{ provider_data .provider_name } -base' ,
60- cacheVariables = {'CMAKE_BUILD_TYPE' : 'Debug' },
61- )
62-
63- return CMakePresets (configurePresets = [base_preset , default_preset , release_preset , debug_preset ])
64-
65- @staticmethod
66- def write_provider_preset (provider_directory : Path , provider_data : CMakeSyncData ) -> None :
67- """Writes a provider preset from input sync data
68-
69- Args:
70- provider_directory: The base directory to place the preset files
71- provider_data: The providers synchronization data
72- """
73- generated_preset = Builder .generate_provider_preset (provider_data )
74-
75- provider_preset_file = provider_directory / f'{ provider_data .provider_name } .json'
76-
77- initial_preset = None
78-
79- # If the file already exists, we need to compare it
80- if provider_preset_file .exists ():
81- with open (provider_preset_file , encoding = 'utf-8' ) as file :
82- initial_json = file .read ()
83- initial_preset = CMakePresets .model_validate_json (initial_json )
84-
85- if generated_preset != initial_preset :
86- serialized = generated_preset .model_dump_json (exclude_none = True , by_alias = False , indent = 4 )
87- with open (provider_preset_file , 'w' , encoding = 'utf8' ) as file :
88- file .write (serialized )
89-
9020 @staticmethod
9121 def generate_cppython_preset (
92- cppython_preset_directory : Path , provider_directory : Path , provider_data : CMakeSyncData
22+ cppython_preset_directory : Path , provider_preset_file : Path , provider_data : CMakeSyncData
9323 ) -> CMakePresets :
9424 """Generates the cppython preset which inherits from the provider presets
9525
9626 Args:
9727 cppython_preset_directory: The tool directory
98- provider_directory: The base directory containing provider presets
28+ provider_preset_file: Path to the provider's preset file
9929 provider_data: The provider's synchronization data
10030
10131 Returns:
10232 A CMakePresets object
10333 """
104- # Configure presets similar to Conan structure
105- default_configure = ConfigurePreset (
106- name = 'default' , inherits = f'{ provider_data .provider_name } -default' , hidden = False
107- )
108-
109- release_configure = ConfigurePreset (
110- name = 'release' , inherits = f'{ provider_data .provider_name } -release' , hidden = False
111- )
112-
113- debug_configure = ConfigurePreset (name = 'debug' , inherits = f'{ provider_data .provider_name } -debug' , hidden = False )
114-
115- # Build presets for multi-config and single-config generators
116- multi_release_build = BuildPreset (
117- name = 'multi-release' ,
118- configurePreset = 'default' ,
119- configuration = 'Release' ,
120- inherits = f'{ provider_data .provider_name } -release' ,
121- )
122-
123- multi_debug_build = BuildPreset (
124- name = 'multi-debug' ,
125- configurePreset = 'default' ,
126- configuration = 'Debug' ,
127- inherits = f'{ provider_data .provider_name } -debug' ,
128- )
129-
130- release_build = BuildPreset (
131- name = 'release' ,
132- configurePreset = 'release' ,
133- configuration = 'Release' ,
134- inherits = f'{ provider_data .provider_name } -release' ,
135- )
136-
137- debug_build = BuildPreset (
138- name = 'debug' ,
139- configurePreset = 'debug' ,
140- configuration = 'Debug' ,
141- inherits = f'{ provider_data .provider_name } -debug' ,
142- )
34+ configure_presets = []
35+
36+ preset_name = 'cppython-default'
37+ parent_preset_name = f'{ provider_data .provider_name } -default'
38+
39+ # Create a default preset that inherits from provider's default preset
40+ default_configure = ConfigurePreset (name = preset_name , inherits = parent_preset_name , hidden = True )
41+ configure_presets .append (default_configure )
42+
43+ # Create presets for each configuration
44+ for config in provider_data .configurations :
45+ config_name = config .lower ()
46+ preset_name = f'cppython-{ config_name } '
47+ parent_preset_name = f'{ provider_data .provider_name } -{ config_name } '
48+ preset = ConfigurePreset (name = preset_name , inherits = parent_preset_name , hidden = True )
49+ configure_presets .append (preset )
50+
51+ build_presets = []
52+
53+ # Multi-config build presets using the default configure preset.
54+ # Important: Do not use a configure preset here, the user will do that in their own presets.
55+ for config in provider_data .configurations :
56+ config_name = config .lower ()
57+ preset_name = f'cppython-multi-{ config_name } '
58+ parent_preset_name = f'{ provider_data .provider_name } -multi-{ config_name } '
59+ multi_build_preset = BuildPreset (
60+ name = preset_name ,
61+ configuration = config ,
62+ inherits = parent_preset_name ,
63+ )
64+ build_presets .append (multi_build_preset )
65+
66+ # Single-config build presets using the config-specific configure presets
67+ # Important: Do not use a configure preset here, the user will do that in their own presets.
68+ for config in provider_data .configurations :
69+ config_name = config .lower ()
70+ parent_config_name = f'{ provider_data .provider_name } -{ config_name } '
71+ single_build_preset = BuildPreset (
72+ name = config_name ,
73+ configuration = config ,
74+ inherits = parent_config_name ,
75+ )
76+ build_presets .append (single_build_preset )
14377
14478 generated_preset = CMakePresets (
145- configurePresets = [ default_configure , release_configure , debug_configure ] ,
146- buildPresets = [ multi_release_build , multi_debug_build , release_build , debug_build ] ,
79+ configurePresets = configure_presets ,
80+ buildPresets = build_presets ,
14781 )
14882
14983 # Get the relative path to the provider preset file
150- provider_preset_file = provider_directory / f'{ provider_data .provider_name } .json'
15184 relative_preset = provider_preset_file .relative_to (cppython_preset_directory , walk_up = True ).as_posix ()
15285
15386 # Set the data
@@ -156,20 +89,20 @@ def generate_cppython_preset(
15689
15790 @staticmethod
15891 def write_cppython_preset (
159- cppython_preset_directory : Path , provider_directory : Path , provider_data : CMakeSyncData
92+ cppython_preset_directory : Path , provider_preset_file : Path , provider_data : CMakeSyncData
16093 ) -> Path :
16194 """Write the cppython presets which inherit from the provider presets
16295
16396 Args:
16497 cppython_preset_directory: The tool directory
165- provider_directory: The base directory containing provider presets
98+ provider_preset_file: Path to the provider's preset file
16699 provider_data: The provider's synchronization data
167100
168101 Returns:
169102 A file path to the written data
170103 """
171104 generated_preset = Builder .generate_cppython_preset (
172- cppython_preset_directory , provider_directory , provider_data
105+ cppython_preset_directory , provider_preset_file , provider_data
173106 )
174107 cppython_preset_file = cppython_preset_directory / 'cppython.json'
175108
0 commit comments