1212import shutil
1313import bz2
1414import io
15+ from pathlib import Path
1516
1617from distutils .version import StrictVersion
1718
1819# If not run from node/, cd to node/.
19- os .chdir (os . path . dirname (__file__ ) or '.' )
20+ os .chdir (Path (__file__ ). parent )
2021
2122original_argv = sys .argv [1 :]
2223
2526CC = os .environ .get ('CC' , 'cc' if sys .platform == 'darwin' else 'gcc' )
2627CXX = os .environ .get ('CXX' , 'c++' if sys .platform == 'darwin' else 'g++' )
2728
28- sys .path .insert (0 , os .path .join ('tools' , 'gyp' , 'pylib' ))
29+ tools_path = Path ('tools' )
30+
31+ sys .path .insert (0 , str (tools_path / 'gyp' / 'pylib' ))
2932from gyp .common import GetFlavor
3033
3134# imports in tools/configure.d
32- sys .path .insert (0 , os . path . join ( 'tools' , 'configure.d' ))
35+ sys .path .insert (0 , str ( tools_path / 'configure.d' ))
3336import nodedownload
3437
3538# imports in tools/
5356valid_mips_fpu = ('fp32' , 'fp64' , 'fpxx' )
5457valid_mips_float_abi = ('soft' , 'hard' )
5558valid_intl_modes = ('none' , 'small-icu' , 'full-icu' , 'system-icu' )
56- with open ('tools/icu/icu_versions.json' , encoding = 'utf-8' ) as f :
57- icu_versions = json .load (f )
59+ icu_versions = json .loads ((tools_path / 'icu' / 'icu_versions.json' ).read_text (encoding = 'utf-8' ))
5860
5961shareable_builtins = {'cjs_module_lexer/lexer' : 'deps/cjs-module-lexer/lexer.js' ,
6062 'cjs_module_lexer/dist/lexer' : 'deps/cjs-module-lexer/dist/lexer.js' ,
868870(options , args ) = parser .parse_known_args ()
869871
870872# Expand ~ in the install prefix now, it gets written to multiple files.
871- options .prefix = os . path . expanduser ( options .prefix or '' )
873+ options .prefix = str ( Path ( options .prefix or '' ). expanduser () )
872874
873875# set up auto-download list
874876auto_downloads = nodedownload .parse (options .download_list )
@@ -1228,7 +1230,7 @@ def configure_zos(o):
12281230 o ['variables' ]['node_static_zoslib' ] = b (True )
12291231 if options .static_zoslib_gyp :
12301232 # Apply to all Node.js components for now
1231- o ['variables' ]['zoslib_include_dir' ] = os . path . dirname (options .static_zoslib_gyp ) + '/include'
1233+ o ['variables' ]['zoslib_include_dir' ] = Path (options .static_zoslib_gyp ). parent + '/include'
12321234 o ['include_dirs' ] += [o ['variables' ]['zoslib_include_dir' ]]
12331235 else :
12341236 raise Exception ('--static-zoslib-gyp=<path to zoslib.gyp file> is required.' )
@@ -1656,7 +1658,7 @@ def configure_static(o):
16561658
16571659def write (filename , data ):
16581660 print_verbose (f'creating { filename } ' )
1659- with open (filename , 'w+' , encoding = 'utf-8' ) as f :
1661+ with Path (filename ). open ( mode = 'w+' , encoding = 'utf-8' ) as f :
16601662 f .write (data )
16611663
16621664do_not_edit = '# Do not edit. Generated by the configure script.\n '
@@ -1672,8 +1674,8 @@ def glob_to_var(dir_base, dir_sub, patch_dir):
16721674 # srcfile uses "slash" as dir separator as its output is consumed by gyp
16731675 srcfile = f'{ dir_sub } /{ file } '
16741676 if patch_dir :
1675- patchfile = f' { dir_base } { patch_dir } { file } '
1676- if os . path . isfile ( patchfile ):
1677+ patchfile = Path ( dir_base , patch_dir , file )
1678+ if patchfile . is_file ( ):
16771679 srcfile = f'{ patch_dir } /{ file } '
16781680 info (f'Using floating patch "{ patchfile } " from "{ dir_base } "' )
16791681 file_list .append (srcfile )
@@ -1682,9 +1684,8 @@ def glob_to_var(dir_base, dir_sub, patch_dir):
16821684
16831685def configure_intl (o ):
16841686 def icu_download (path ):
1685- depFile = 'tools/icu/current_ver.dep'
1686- with open (depFile , encoding = 'utf-8' ) as f :
1687- icus = json .load (f )
1687+ depFile = tools_path / 'icu' / 'current_ver.dep'
1688+ icus = json .loads (depFile .read_text (encoding = 'utf-8' ))
16881689 # download ICU, if needed
16891690 if not os .access (options .download_path , os .W_OK ):
16901691 error ('''Cannot write to desired download path.
@@ -1699,13 +1700,13 @@ def icu_download(path):
16991700 For the entry { url } ,
17001701 Expected one of these keys: { ' ' .join (allAlgos )} ''' )
17011702 local = url .split ('/' )[- 1 ]
1702- targetfile = os . path . join (options .download_path , local )
1703- if not os . path . isfile ( targetfile ):
1703+ targetfile = Path (options .download_path , local )
1704+ if not targetfile . is_file ( ):
17041705 if attemptdownload :
17051706 nodedownload .retrievefile (url , targetfile )
17061707 else :
17071708 print (f'Re-using existing { targetfile } ' )
1708- if os . path . isfile ( targetfile ):
1709+ if targetfile . is_file ( ):
17091710 print (f'Checking file integrity with { hashAlgo } :\r ' )
17101711 gotHash = nodedownload .checkHash (targetfile , hashAlgo )
17111712 print (f'{ hashAlgo } : { gotHash } { targetfile } ' )
@@ -1792,14 +1793,15 @@ def icu_download(path):
17921793 icu_full_path = icu_deps_path
17931794
17941795 # icu-tmp is used to download and unpack the ICU tarball.
1795- icu_tmp_path = os . path . join (icu_parent_path , 'icu-tmp' )
1796+ icu_tmp_path = Path (icu_parent_path , 'icu-tmp' )
17961797
17971798 # canned ICU. see tools/icu/README.md to update.
17981799 canned_icu_dir = 'deps/icu-small'
17991800
18001801 # use the README to verify what the canned ICU is
1801- canned_is_full = os .path .isfile (os .path .join (canned_icu_dir , 'README-FULL-ICU.txt' ))
1802- canned_is_small = os .path .isfile (os .path .join (canned_icu_dir , 'README-SMALL-ICU.txt' ))
1802+ canned_icu_path = Path (canned_icu_dir )
1803+ canned_is_full = (canned_icu_path / 'README-FULL-ICU.txt' ).is_file ()
1804+ canned_is_small = (canned_icu_path / 'README-SMALL-ICU.txt' ).is_file ()
18031805 if canned_is_small :
18041806 warn (f'Ignoring { canned_icu_dir } - in-repo small icu is no longer supported.' )
18051807
@@ -1819,39 +1821,39 @@ def icu_download(path):
18191821 icu_config ['variables' ]['icu_full_canned' ] = 1
18201822 # --with-icu-source processing
18211823 # now, check that they didn't pass --with-icu-source=deps/icu
1822- elif with_icu_source and os . path . abspath (icu_full_path ) == os . path . abspath (with_icu_source ):
1824+ elif with_icu_source and Path (icu_full_path ). resolve () == Path (with_icu_source ). resolve ( ):
18231825 warn (f'Ignoring redundant --with-icu-source={ with_icu_source } ' )
18241826 with_icu_source = None
18251827 # if with_icu_source is still set, try to use it.
18261828 if with_icu_source :
1827- if os . path . isdir (icu_full_path ):
1829+ if Path (icu_full_path ). is_dir ( ):
18281830 print (f'Deleting old ICU source: { icu_full_path } ' )
18291831 shutil .rmtree (icu_full_path )
18301832 # now, what path was given?
1831- if os . path . isdir (with_icu_source ):
1833+ if Path (with_icu_source ). is_dir ( ):
18321834 # it's a path. Copy it.
18331835 print (f'{ with_icu_source } -> { icu_full_path } ' )
18341836 shutil .copytree (with_icu_source , icu_full_path )
18351837 else :
18361838 # could be file or URL.
18371839 # Set up temporary area
1838- if os . path . isdir (icu_tmp_path ):
1840+ if Path (icu_tmp_path ). is_dir ( ):
18391841 shutil .rmtree (icu_tmp_path )
1840- os .mkdir (icu_tmp_path )
1842+ icu_tmp_path .mkdir ()
18411843 icu_tarball = None
1842- if os . path . isfile (with_icu_source ):
1844+ if Path (with_icu_source ). is_file ( ):
18431845 # it's a file. Try to unpack it.
18441846 icu_tarball = with_icu_source
18451847 else :
18461848 # Can we download it?
1847- local = os . path . join ( icu_tmp_path , with_icu_source .split ('/' )[- 1 ]) # local part
1849+ local = icu_tmp_path / with_icu_source .split ('/' )[- 1 ] # local part
18481850 icu_tarball = nodedownload .retrievefile (with_icu_source , local )
18491851 # continue with "icu_tarball"
18501852 nodedownload .unpack (icu_tarball , icu_tmp_path )
18511853 # Did it unpack correctly? Should contain 'icu'
1852- tmp_icu = os . path . join ( icu_tmp_path , 'icu' )
1853- if os . path . isdir ( tmp_icu ):
1854- os .rename (tmp_icu , icu_full_path )
1854+ tmp_icu = icu_tmp_path / 'icu'
1855+ if tmp_icu . is_dir ( ):
1856+ tmp_icu .rename (icu_full_path )
18551857 shutil .rmtree (icu_tmp_path )
18561858 else :
18571859 shutil .rmtree (icu_tmp_path )
@@ -1861,22 +1863,22 @@ def icu_download(path):
18611863 o ['variables' ]['icu_gyp_path' ] = 'tools/icu/icu-generic.gyp'
18621864 # ICU source dir relative to tools/icu (for .gyp file)
18631865 o ['variables' ]['icu_path' ] = icu_full_path
1864- if not os . path . isdir (icu_full_path ):
1866+ if not Path (icu_full_path ). is_dir ( ):
18651867 # can we download (or find) a zipfile?
18661868 localzip = icu_download (icu_full_path )
18671869 if localzip :
18681870 nodedownload .unpack (localzip , icu_parent_path )
18691871 else :
1870- warn ("* ECMA-402 (Intl) support didn't find ICU in {icu_full_path}.." )
1871- if not os . path . isdir (icu_full_path ):
1872+ warn (f "* ECMA-402 (Intl) support didn't find ICU in { icu_full_path } .." )
1873+ if not Path (icu_full_path ). is_dir ( ):
18721874 error (f'''Cannot build Intl without ICU in { icu_full_path } .
18731875 Fix, or disable with "--with-intl=none"''' )
18741876 else :
18751877 print_verbose (f'* Using ICU in { icu_full_path } ' )
18761878 # Now, what version of ICU is it? We just need the "major", such as 54.
18771879 # uvernum.h contains it as a #define.
1878- uvernum_h = os . path . join (icu_full_path , 'source/ common/ unicode/ uvernum.h' )
1879- if not os . path . isfile ( uvernum_h ):
1880+ uvernum_h = Path (icu_full_path , 'source' , ' common' , ' unicode' , ' uvernum.h' )
1881+ if not uvernum_h . is_file ( ):
18801882 error (f'Could not load { uvernum_h } - is ICU installed?' )
18811883 icu_ver_major = None
18821884 matchVerExp = r'^\s*#define\s+U_ICU_VERSION_SHORT\s+"([^"]*)".*'
@@ -1896,17 +1898,15 @@ def icu_download(path):
18961898 icu_data_file_l = f'icudt{ icu_ver_major } l.dat' # LE filename
18971899 icu_data_file = f'icudt{ icu_ver_major } { icu_endianness } .dat'
18981900 # relative to configure
1899- icu_data_path = os .path .join (icu_full_path ,
1900- 'source/data/in' ,
1901- icu_data_file_l ) # LE
1901+ icu_data_path = Path (icu_full_path , 'source' , 'data' , 'in' , icu_data_file_l ) # LE
19021902 compressed_data = f'{ icu_data_path } .bz2'
1903- if not os . path . isfile ( icu_data_path ) and os . path . isfile (compressed_data ):
1903+ if not icu_data_path . is_file ( ) and Path (compressed_data ). is_file ( ):
19041904 # unpack. deps/icu is a temporary path
1905- if os . path . isdir ( icu_tmp_path ):
1905+ if icu_tmp_path . is_dir ( ):
19061906 shutil .rmtree (icu_tmp_path )
1907- os .mkdir (icu_tmp_path )
1908- icu_data_path = os . path . join ( icu_tmp_path , icu_data_file_l )
1909- with open (icu_data_path , 'wb' ) as outf :
1907+ icu_tmp_path .mkdir ()
1908+ icu_data_path = icu_tmp_path / icu_data_file_l
1909+ with icu_data_path . open (mode = 'wb' ) as outf :
19101910 inf = bz2 .BZ2File (compressed_data , 'rb' )
19111911 try :
19121912 shutil .copyfileobj (inf , outf )
@@ -1915,20 +1915,18 @@ def icu_download(path):
19151915 # Now, proceed..
19161916
19171917 # relative to dep..
1918- icu_data_in = os . path . join ('..' , '..' , icu_data_path )
1919- if not os . path . isfile ( icu_data_path ) and icu_endianness != 'l' :
1918+ icu_data_in = Path ('..' , '..' , icu_data_path )
1919+ if not icu_data_path . is_file ( ) and icu_endianness != 'l' :
19201920 # use host endianness
1921- icu_data_path = os .path .join (icu_full_path ,
1922- 'source/data/in' ,
1923- icu_data_file ) # will be generated
1924- if not os .path .isfile (icu_data_path ):
1921+ icu_data_path = Path (icu_full_path , 'source' , 'data' , 'in' , icu_data_file ) # will be generated
1922+ if not icu_data_path .is_file ():
19251923 # .. and we're not about to build it from .gyp!
19261924 error (f'''ICU prebuilt data file { icu_data_path } does not exist.
19271925 See the README.md.''' )
19281926
19291927 # this is the input '.dat' file to use .. icudt*.dat
19301928 # may be little-endian if from a icu-project.org tarball
1931- o ['variables' ]['icu_data_in' ] = icu_data_in
1929+ o ['variables' ]['icu_data_in' ] = str ( icu_data_in )
19321930
19331931 # map from variable name to subdirs
19341932 icu_src = {
@@ -2026,16 +2024,16 @@ def make_bin_override():
20262024 os .path .realpath (which_python ) == os .path .realpath (sys .executable )):
20272025 return
20282026
2029- bin_override = os . path . abspath ('out/ tools/ bin' )
2027+ bin_override = Path ('out' , ' tools' , ' bin'). resolve ( )
20302028 try :
2031- os . makedirs ( bin_override )
2029+ bin_override . mkdir ( parents = True )
20322030 except OSError as e :
20332031 if e .errno != errno .EEXIST :
20342032 raise e
20352033
2036- python_link = os . path . join ( bin_override , 'python' )
2034+ python_link = bin_override / 'python'
20372035 try :
2038- os .unlink (python_link )
2036+ python_link .unlink ()
20392037 except OSError as e :
20402038 if e .errno != errno .ENOENT :
20412039 raise e
@@ -2044,7 +2042,7 @@ def make_bin_override():
20442042 # We need to set the environment right now so that when gyp (in run_gyp)
20452043 # shells out, it finds the right python (specifically at
20462044 # https://github.com/nodejs/node/blob/d82e107/deps/v8/gypfiles/toolchain.gypi#L43)
2047- os .environ ['PATH' ] = bin_override + ':' + os .environ ['PATH' ]
2045+ os .environ ['PATH' ] = str ( bin_override ) + ':' + os .environ ['PATH' ]
20482046
20492047 return bin_override
20502048
@@ -2123,7 +2121,7 @@ def make_bin_override():
21232121
21242122write ('config.status' , '#!/bin/sh\n set -x\n exec ./configure ' +
21252123 ' ' .join ([shlex .quote (arg ) for arg in original_argv ]) + '\n ' )
2126- os . chmod ('config.status' , 0o775 )
2124+ Path ('config.status' ). chmod ( 0o775 )
21272125
21282126
21292127config = {
@@ -2153,7 +2151,7 @@ def make_bin_override():
21532151# On Windows there's no reason to search for a different python binary.
21542152bin_override = None if sys .platform == 'win32' else make_bin_override ()
21552153if bin_override :
2156- config_str = 'export PATH:=' + bin_override + ':$(PATH)\n ' + config_str
2154+ config_str = 'export PATH:=' + str ( bin_override ) + ':$(PATH)\n ' + config_str
21572155
21582156write ('config.mk' , do_not_edit + config_str )
21592157
0 commit comments