@@ -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 (
@@ -291,44 +293,52 @@ env.Alias("godot_module_archive", [
291293
292294from tools .build import prepare_python
293295
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+ )
295302
296303
297304def _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+ )
311319
312320
313321def _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+ )
332342
333343
334344
@@ -366,31 +376,36 @@ env.Append(CPPDEFINES = [f'PYGODOT_ARCH=\\"{env["arch"]}\\"'])
366376
367377
368378def _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 ))
371382
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 )
374385
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 )
379390
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 "" } \\ "' ])
382393
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
385399
386400
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+ )
392406
393- env .Depends (sources , append_python_config )
407+ env .AlwaysBuild (append_python_config_files )
408+ env .Depends (sources , append_python_config_files )
394409
395410
396411# library name
@@ -410,7 +425,7 @@ env["OBJSUFFIX"] = suffix + env["OBJSUFFIX"]
410425library_name = "libgodot-python{}{}" .format (env ["suffix" ], env ["SHLIBSUFFIX" ])
411426
412427library = env .SharedLibrary (
413- target = f"bin/{ env [ 'platform' ] } - { env [ 'arch' ] } /{ library_name } " ,
428+ target = f"bin/{ prepared_python_config . name } /{ library_name } " ,
414429 source = sources ,
415430)
416431
0 commit comments