11import os
22import os .path
3- import re
43import shlex
54import shutil
65import subprocess
6+ import sysconfig
7+ from test import support
8+
9+
10+ def get_source_dir ():
11+ src_dir = sysconfig .get_config_var ('abs_builddir' )
12+ if src_dir is None :
13+ # gh-74470: On Windows, only srcdir is available.
14+ src_dir = sysconfig .get_config_var ('srcdir' )
15+ return os .path .abspath (src_dir )
716
817
918TESTS_DIR = os .path .dirname (__file__ )
1019TOOL_ROOT = os .path .dirname (TESTS_DIR )
11- SRCDIR = os . path . dirname ( os . path . dirname ( TOOL_ROOT ) )
20+ SRCDIR = get_source_dir ( )
1221
1322MAKE = shutil .which ('make' )
1423FREEZE = os .path .join (TOOL_ROOT , 'freeze.py' )
@@ -75,56 +84,17 @@ def ensure_opt(args, name, value):
7584
7685
7786def copy_source_tree (newroot , oldroot ):
78- print (f'copying the source tree into { newroot } ...' )
87+ print (f'copying the source tree from { oldroot } to { newroot } ...' )
7988 if os .path .exists (newroot ):
8089 if newroot == SRCDIR :
8190 raise Exception ('this probably isn\' t what you wanted' )
8291 shutil .rmtree (newroot )
8392
84- def ignore_non_src (src , names ):
85- """Turns what could be a 1000M copy into a 100M copy."""
86- # Don't copy the ~600M+ of needless git repo metadata.
87- # source only, ignore cached .pyc files.
88- subdirs_to_skip = {'.git' , '__pycache__' }
89- if os .path .basename (src ) == 'Doc' :
90- # Another potential ~250M+ of non test related data.
91- subdirs_to_skip .add ('build' )
92- subdirs_to_skip .add ('venv' )
93- return subdirs_to_skip
94-
95- shutil .copytree (oldroot , newroot , ignore = ignore_non_src )
93+ shutil .copytree (oldroot , newroot , ignore = support .copy_python_src_ignore )
9694 if os .path .exists (os .path .join (newroot , 'Makefile' )):
9795 _run_quiet ([MAKE , 'clean' ], newroot )
9896
9997
100- def get_makefile_var (builddir , name ):
101- regex = re .compile (rf'^{ name } *=\s*(.*?)\s*$' )
102- filename = os .path .join (builddir , 'Makefile' )
103- try :
104- infile = open (filename , encoding = 'utf-8' )
105- except FileNotFoundError :
106- return None
107- with infile :
108- for line in infile :
109- m = regex .match (line )
110- if m :
111- value , = m .groups ()
112- return value or ''
113- return None
114-
115-
116- def get_config_var (builddir , name ):
117- python = os .path .join (builddir , 'python' )
118- if os .path .isfile (python ):
119- cmd = [python , '-c' ,
120- f'import sysconfig; print(sysconfig.get_config_var("{ name } "))' ]
121- try :
122- return _run_stdout (cmd )
123- except subprocess .CalledProcessError :
124- pass
125- return get_makefile_var (builddir , name )
126-
127-
12898##################################
12999# freezing
130100
@@ -151,10 +121,8 @@ def prepare(script=None, outdir=None):
151121
152122 # Run configure.
153123 print (f'configuring python in { builddir } ...' )
154- cmd = [
155- os .path .join (srcdir , 'configure' ),
156- * shlex .split (get_config_var (SRCDIR , 'CONFIG_ARGS' ) or '' ),
157- ]
124+ config_args = shlex .split (sysconfig .get_config_var ('CONFIG_ARGS' ) or '' )
125+ cmd = [os .path .join (srcdir , 'configure' ), * config_args ]
158126 ensure_opt (cmd , 'cache-file' , os .path .join (outdir , 'python-config.cache' ))
159127 prefix = os .path .join (outdir , 'python-installation' )
160128 ensure_opt (cmd , 'prefix' , prefix )
0 commit comments