@@ -86,13 +86,15 @@ opts.Add(
8686# godot python options
8787
8888opts .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" ,
9698)
9799
98100opts .Add (
@@ -311,44 +313,52 @@ env.Alias("godot_module_archive", [
311313
312314from tools .build import prepare_python
313315
314- prepared_python_config = prepare_python .platform_configs [(env ['platform' ], env ['arch' ])]
316+ prepared_python_config = prepare_python .configure (
317+ platform = env ['platform' ],
318+ arch = env ['arch' ],
319+ python_version = env ['python_version' ],
320+ build = env ['python_standalone_build' ],
321+ )
315322
316323
317324def _fetch_python (target , source , env ):
318- dest = pathlib .Path (target [0 ].path ).parent
319- dest .mkdir (parents = True , exist_ok = True )
320- prepare_python .fetch_python_for_platform (env ['platform' ], env ['arch' ], dest )
321-
322- fetch_python_alias = env .Alias ("fetch_python" , [
323- Builder (action = env .Action (_fetch_python , "Fetching Python" ))(
324- env ,
325- target = os .fspath (generated_path / 'python'
326- / prepared_python_config .name / pathlib .Path (prepared_python_config .source_url ).name ),
327- source = [
328- ],
329- )
330- ])
325+ try :
326+ prepare_python .fetch_python_for_config (prepared_python_config , target [0 ])
327+ except Exception as exc :
328+ print (f"Error while fetching python: { exc } " )
329+ return 1
330+
331+ fetched_python_files = env .Command (
332+ target = os .fspath (
333+ generated_path / 'python' / prepared_python_config .name / pathlib .Path (prepared_python_config .source_url ).name
334+ ),
335+ source = [
336+ ],
337+ action = _fetch_python
338+ )
331339
332340
333341def _prepare_python (target , source , env ):
334- dest = pathlib .Path (target [0 ].path ).parent .resolve ()
335- dest .mkdir (parents = True , exist_ok = True )
336-
337- src = pathlib .Path (source [0 ].path ).parent .resolve ()
338-
339- env ['python' ] = prepare_python .prepare_for_platform (env ['platform' ], env ['arch' ],
340- src_dir = src , dest_dir = dest )
341-
342- prepare_python_alias = env .Alias ("prepare_python" , [
343- Builder (action = Action (_prepare_python , "Preparing Python" ))(
344- env ,
345- target = f'bin/{ prepared_python_config .name } /python312.zip' , # XXX: version
346- source = [
347- fetch_python_alias [0 ].children (),
348- prepare_python .__file__ ,
349- ],
350- )
351- ])
342+ try :
343+ dest = pathlib .Path (target [0 ].path ).parent .resolve ()
344+ dest .mkdir (parents = True , exist_ok = True )
345+
346+ src = pathlib .Path (source [0 ].path ).parent .resolve ()
347+
348+ env ['python' ] = prepare_python .prepare_for_platform (prepared_python_config ,
349+ src_dir = src , dest_dir = dest )
350+ except Exception as exc :
351+ print (f"Error while preparing python: { exc } " )
352+ return 1
353+
354+ prepared_python_files = env .Command (
355+ target = f'bin/{ prepared_python_config .name } /python{ prepared_python_config .python_version_minor } -lib.zip' ,
356+ source = [
357+ * fetched_python_files ,
358+ prepare_python .__file__ ,
359+ ],
360+ action = _prepare_python
361+ )
352362
353363
354364
@@ -386,31 +396,36 @@ env.Append(CPPDEFINES = [f'PYGODOT_ARCH=\\"{env["arch"]}\\"'])
386396
387397
388398def _append_python_config (env , target , ** kwargs ):
389- src_dir = generated_path / 'python' / prepared_python_config .name
390- env ['python' ] = os .fspath (prepare_python .get_python_for_platform (env ['platform' ], env ['arch' ], src_dir ))
399+ try :
400+ src_dir = generated_path / 'python' / prepared_python_config .name
401+ env ['python' ] = os .fspath (prepare_python .get_python_for_platform (prepared_python_config , src_dir ))
391402
392- from tools .build import python_config
393- _config_vars = python_config .get_python_config_vars (env )
403+ from tools .build import python_config
404+ _config_vars = python_config .get_python_config_vars (env )
394405
395- env .Append (LIBPATH = _config_vars .lib_paths )
396- env .Append (LINKFLAGS = _config_vars .link_flags )
397- env .Append (LIBS = _config_vars .link_libs )
398- env .Append (CPPPATH = _config_vars .include_flags )
406+ env .Append (LIBPATH = _config_vars .lib_paths )
407+ env .Append (LINKFLAGS = _config_vars .link_flags )
408+ env .Append (LIBS = _config_vars .link_libs )
409+ env .Append (CPPPATH = _config_vars .include_flags )
399410
400- if env ['platform' ] != 'windows' :
401- env .Append (CPPDEFINES = [f'PYTHON_LIBRARY_PATH=\\ "{ _config_vars .ldlibrary or "" } \\ "' ])
411+ if env ['platform' ] != 'windows' :
412+ env .Append (CPPDEFINES = [f'PYTHON_LIBRARY_PATH=\\ "{ _config_vars .ldlibrary or "" } \\ "' ])
402413
403- dest = pathlib .Path (target [0 ].path )
404- dest .write_text (repr (_config_vars ))
414+ dest = pathlib .Path (target [0 ].path )
415+ dest .write_text (repr (_config_vars ))
416+ except Exception as exc :
417+ print (f"Error while appending python config: { exc } " )
418+ return 1
405419
406420
407- append_python_config = Builder ( action = Action ( _append_python_config , None )) (
408- env , target = 'src/.generated/.append_python_config' , source = None )
409-
410- env . Depends ( append_python_config , prepare_python_alias )
411- env . AlwaysBuild ( append_python_config )
421+ append_python_config_files = env . Command (
422+ source = prepared_python_files ,
423+ target = 'src/.generated/.append_python_config' ,
424+ action = _append_python_config
425+ )
412426
413- env .Depends (sources , append_python_config )
427+ env .AlwaysBuild (append_python_config_files )
428+ env .Depends (sources , append_python_config_files )
414429
415430
416431# library name
@@ -430,7 +445,7 @@ env["OBJSUFFIX"] = suffix + env["OBJSUFFIX"]
430445library_name = "libgodot-python{}{}" .format (env ["suffix" ], env ["SHLIBSUFFIX" ])
431446
432447library = env .SharedLibrary (
433- target = f"bin/{ env [ 'platform' ] } - { env [ 'arch' ] } /{ library_name } " ,
448+ target = f"bin/{ prepared_python_config . name } /{ library_name } " ,
434449 source = sources ,
435450)
436451
0 commit comments