@@ -86,13 +86,15 @@ opts.Add(
86
86
# godot python options
87
87
88
88
opts .Add (
89
- PathVariable (
90
- key = "python" ,
91
- help = "Path to the `python` to build against." ,
92
- default = 'python3' ,
93
- validator = (lambda key , val , env : build_utils .validate_executable (key , val , env )
94
- if not env .get ('python_lib_dir' ) else None ),
95
- )
89
+ key = "python_version" ,
90
+ help = "Version of python to use. Must be available in the python_standalone_build." ,
91
+ default = '3.12.0' ,
92
+ )
93
+
94
+ opts .Add (
95
+ key = "python_standalone_build" ,
96
+ help = "Build ID to use for the python version. You can find the list of builds at https://github.com/indygreg/python-build-standalone/releases." ,
97
+ default = "20231002" ,
96
98
)
97
99
98
100
opts .Add (
@@ -291,44 +293,52 @@ env.Alias("godot_module_archive", [
291
293
292
294
from tools .build import prepare_python
293
295
294
- prepared_python_config = prepare_python .platform_configs [(env ['platform' ], env ['arch' ])]
296
+ prepared_python_config = prepare_python .configure (
297
+ platform = env ['platform' ],
298
+ arch = env ['arch' ],
299
+ python_version = env ['python_version' ],
300
+ build = env ['python_standalone_build' ],
301
+ )
295
302
296
303
297
304
def _fetch_python (target , source , env ):
298
- dest = pathlib .Path (target [0 ].path ).parent
299
- dest .mkdir (parents = True , exist_ok = True )
300
- prepare_python .fetch_python_for_platform (env ['platform' ], env ['arch' ], dest )
301
-
302
- fetch_python_alias = env .Alias ("fetch_python" , [
303
- Builder (action = env .Action (_fetch_python , "Fetching Python" ))(
304
- env ,
305
- target = os .fspath (generated_path / 'python'
306
- / prepared_python_config .name / pathlib .Path (prepared_python_config .source_url ).name ),
307
- source = [
308
- ],
309
- )
310
- ])
305
+ try :
306
+ prepare_python .fetch_python_for_config (prepared_python_config , target [0 ])
307
+ except Exception as e :
308
+ print (f"Error while fetching python: { e } " )
309
+ return 1
310
+
311
+ fetched_python_files = env .Command (
312
+ target = os .fspath (
313
+ generated_path / 'python' / prepared_python_config .name / pathlib .Path (prepared_python_config .source_url ).name
314
+ ),
315
+ source = [
316
+ ],
317
+ action = _fetch_python
318
+ )
311
319
312
320
313
321
def _prepare_python (target , source , env ):
314
- dest = pathlib .Path (target [0 ].path ).parent .resolve ()
315
- dest .mkdir (parents = True , exist_ok = True )
316
-
317
- src = pathlib .Path (source [0 ].path ).parent .resolve ()
318
-
319
- env ['python' ] = prepare_python .prepare_for_platform (env ['platform' ], env ['arch' ],
320
- src_dir = src , dest_dir = dest )
321
-
322
- prepare_python_alias = env .Alias ("prepare_python" , [
323
- Builder (action = Action (_prepare_python , "Preparing Python" ))(
324
- env ,
325
- target = f'bin/{ prepared_python_config .name } /python312.zip' , # XXX: version
326
- source = [
327
- fetch_python_alias [0 ].children (),
328
- prepare_python .__file__ ,
329
- ],
330
- )
331
- ])
322
+ try :
323
+ dest = pathlib .Path (target [0 ].path ).parent .resolve ()
324
+ dest .mkdir (parents = True , exist_ok = True )
325
+
326
+ src = pathlib .Path (source [0 ].path ).parent .resolve ()
327
+
328
+ env ['python' ] = prepare_python .prepare_for_platform (prepared_python_config ,
329
+ src_dir = src , dest_dir = dest )
330
+ except Exception as e :
331
+ print (f"Error while preparing python: { e } " )
332
+ return 1
333
+
334
+ prepared_python_files = env .Command (
335
+ target = f'bin/{ prepared_python_config .name } /python{ prepared_python_config .python_version_minor } -lib.zip' ,
336
+ source = [
337
+ * fetched_python_files ,
338
+ prepare_python .__file__ ,
339
+ ],
340
+ action = _prepare_python
341
+ )
332
342
333
343
334
344
@@ -366,31 +376,36 @@ env.Append(CPPDEFINES = [f'PYGODOT_ARCH=\\"{env["arch"]}\\"'])
366
376
367
377
368
378
def _append_python_config (env , target , ** kwargs ):
369
- src_dir = generated_path / 'python' / prepared_python_config .name
370
- env ['python' ] = os .fspath (prepare_python .get_python_for_platform (env ['platform' ], env ['arch' ], src_dir ))
379
+ try :
380
+ src_dir = generated_path / 'python' / prepared_python_config .name
381
+ env ['python' ] = os .fspath (prepare_python .get_python_for_platform (prepared_python_config , src_dir ))
371
382
372
- from tools .build import python_config
373
- _config_vars = python_config .get_python_config_vars (env )
383
+ from tools .build import python_config
384
+ _config_vars = python_config .get_python_config_vars (env )
374
385
375
- env .Append (LIBPATH = _config_vars .lib_paths )
376
- env .Append (LINKFLAGS = _config_vars .link_flags )
377
- env .Append (LIBS = _config_vars .link_libs )
378
- env .Append (CPPPATH = _config_vars .include_flags )
386
+ env .Append (LIBPATH = _config_vars .lib_paths )
387
+ env .Append (LINKFLAGS = _config_vars .link_flags )
388
+ env .Append (LIBS = _config_vars .link_libs )
389
+ env .Append (CPPPATH = _config_vars .include_flags )
379
390
380
- if env ['platform' ] != 'windows' :
381
- env .Append (CPPDEFINES = [f'PYTHON_LIBRARY_PATH=\\ "{ _config_vars .ldlibrary or "" } \\ "' ])
391
+ if env ['platform' ] != 'windows' :
392
+ env .Append (CPPDEFINES = [f'PYTHON_LIBRARY_PATH=\\ "{ _config_vars .ldlibrary or "" } \\ "' ])
382
393
383
- dest = pathlib .Path (target [0 ].path )
384
- dest .write_text (repr (_config_vars ))
394
+ dest = pathlib .Path (target [0 ].path )
395
+ dest .write_text (repr (_config_vars ))
396
+ except Exception as e :
397
+ print (f"Error while appending python config: { e } " )
398
+ return 1
385
399
386
400
387
- append_python_config = Builder ( action = Action ( _append_python_config , None )) (
388
- env , target = 'src/.generated/.append_python_config' , source = None )
389
-
390
- env . Depends ( append_python_config , prepare_python_alias )
391
- env . AlwaysBuild ( append_python_config )
401
+ append_python_config_files = env . Command (
402
+ source = prepared_python_files ,
403
+ target = 'src/.generated/.append_python_config' ,
404
+ action = _append_python_config
405
+ )
392
406
393
- env .Depends (sources , append_python_config )
407
+ env .AlwaysBuild (append_python_config_files )
408
+ env .Depends (sources , append_python_config_files )
394
409
395
410
396
411
# library name
@@ -410,7 +425,7 @@ env["OBJSUFFIX"] = suffix + env["OBJSUFFIX"]
410
425
library_name = "libgodot-python{}{}" .format (env ["suffix" ], env ["SHLIBSUFFIX" ])
411
426
412
427
library = env .SharedLibrary (
413
- target = f"bin/{ env [ 'platform' ] } - { env [ 'arch' ] } /{ library_name } " ,
428
+ target = f"bin/{ prepared_python_config . name } /{ library_name } " ,
414
429
source = sources ,
415
430
)
416
431
0 commit comments