diff --git a/emsdk_manifest.json b/emsdk_manifest.json index 0a6a139..281244f 100644 --- a/emsdk_manifest.json +++ b/emsdk_manifest.json @@ -420,6 +420,15 @@ "activated_env": "EMSDK_PYTHON=%installation_dir%/bin/python3;SSL_CERT_FILE=%installation_dir%/lib/python3.7/site-packages/certifi/cacert.pem", "is_old": true }, + { + "id": "python", + "version": "3.9.2-nuget", + "bitness": 64, + "arch": "x86_64", + "windows_url": "python-3.9.2-4-amd64+pywin32.zip", + "activated_cfg": "PYTHON='%installation_dir%/python.exe'", + "activated_env": "EMSDK_PYTHON=%installation_dir%/python.exe" + }, { "id": "python", "version": "3.9.2", @@ -644,7 +653,7 @@ { "version": "upstream-main", "bitness": 64, - "uses": ["python-3.9.2-64bit", "llvm-git-main-64bit", "node-14.18.2-64bit", "emscripten-main-64bit", "binaryen-main-64bit"], + "uses": ["python-3.9.2-nuget-64bit", "llvm-git-main-64bit", "node-14.18.2-64bit", "emscripten-main-64bit", "binaryen-main-64bit"], "os": "win" }, { @@ -727,7 +736,7 @@ { "version": "releases-upstream-%releases-tag%", "bitness": 64, - "uses": ["node-14.18.2-64bit", "python-3.9.2-64bit", "java-8.152-64bit", "releases-upstream-%releases-tag%-64bit"], + "uses": ["node-14.18.2-64bit", "python-3.9.2-nuget-64bit", "java-8.152-64bit", "releases-upstream-%releases-tag%-64bit"], "os": "win", "custom_install_script": "emscripten_npm_install" }, diff --git a/scripts/update_python.py b/scripts/update_python.py index f598954..b39597d 100755 --- a/scripts/update_python.py +++ b/scripts/update_python.py @@ -33,8 +33,8 @@ from subprocess import check_call version = '3.9.2' major_minor_version = '.'.join(version.split('.')[:2]) # e.g. '3.9.2' -> '3.9' -base = 'https://www.python.org/ftp/python/%s/' % version -revision = '3' +download_url = 'https://www.nuget.org/api/v2/package/python/%s' % version +revision = '4' pywin32_version = '227' pywin32_base = 'https://github.com/mhammond/pywin32/releases/download/b%s/' % pywin32_version @@ -44,7 +44,7 @@ upload_base = 'gs://webassembly/emscripten-releases-builds/deps/' def unzip_cmd(): # Use 7-Zip if available (https://www.7-zip.org/) - sevenzip = os.path.join(os.getenv('ProgramFiles'), '7-Zip', '7z.exe') + sevenzip = os.path.join(os.getenv('ProgramFiles', ''), '7-Zip', '7z.exe') if os.path.isfile(sevenzip): return [sevenzip, 'x'] # Fall back to 'unzip' tool @@ -53,52 +53,49 @@ def unzip_cmd(): def zip_cmd(): # Use 7-Zip if available (https://www.7-zip.org/) - sevenzip = os.path.join(os.getenv('ProgramFiles'), '7-Zip', '7z.exe') + sevenzip = os.path.join(os.getenv('ProgramFiles', ''), '7-Zip', '7z.exe') if os.path.isfile(sevenzip): return [sevenzip, 'a', '-mx9'] # Fall back to 'zip' tool return ['zip', '-rq'] -def make_python_patch(arch): - if arch == 'amd64': - pywin32_filename = 'pywin32-%s.win-%s-py%s.exe' % (pywin32_version, arch, major_minor_version) - else: - pywin32_filename = 'pywin32-%s.%s-py%s.exe' % (pywin32_version, arch, major_minor_version) - filename = 'python-%s-embed-%s.zip' % (version, arch) - out_filename = 'python-%s-%s-embed-%s+pywin32.zip' % (version, revision, arch) +def make_python_patch(): + pywin32_filename = 'pywin32-%s.win-amd64-py%s.exe' % (pywin32_version, major_minor_version) + filename = 'python-%s-amd64.zip' % (version) + out_filename = 'python-%s-%s-amd64+pywin32.zip' % (version, revision) if not os.path.exists(pywin32_filename): - download_url = pywin32_base + pywin32_filename - print('Downloading pywin32: ' + download_url) - urllib.request.urlretrieve(download_url, pywin32_filename) + url = pywin32_base + pywin32_filename + print('Downloading pywin32: ' + url) + urllib.request.urlretrieve(url, pywin32_filename) if not os.path.exists(filename): - download_url = base + filename print('Downloading python: ' + download_url) urllib.request.urlretrieve(download_url, filename) - os.mkdir('python-embed') - check_call(unzip_cmd() + [os.path.abspath(filename)], cwd='python-embed') - os.remove(os.path.join('python-embed', 'python%s._pth' % major_minor_version.replace('.', ''))) + os.mkdir('python-nuget') + check_call(unzip_cmd() + [os.path.abspath(filename)], cwd='python-nuget') os.mkdir('pywin32') rtn = subprocess.call(unzip_cmd() + [os.path.abspath(pywin32_filename)], cwd='pywin32') assert rtn in [0, 1] - os.mkdir(os.path.join('python-embed', 'lib')) - shutil.move(os.path.join('pywin32', 'PLATLIB'), os.path.join('python-embed', 'lib', 'site-packages')) + os.mkdir(os.path.join('python-nuget', 'lib')) + shutil.move(os.path.join('pywin32', 'PLATLIB'), os.path.join('python-nuget', 'toolss', 'Lib', 'site-packages')) - check_call(zip_cmd() + [os.path.join('..', out_filename), '.'], cwd='python-embed') + check_call(zip_cmd() + [os.path.join('..', '..', out_filename), '.'], cwd='python-nuget/tools') # cleanup if everything went fine - shutil.rmtree('python-embed') + shutil.rmtree('python-nuget') shutil.rmtree('pywin32') - upload_url = upload_base + out_filename - print('Uploading: ' + upload_url) - cmd = ['gsutil', 'cp', '-n', out_filename, upload_url] - print(' '.join(cmd)) - check_call(cmd) + print('Created: %s' % out_filename) + if '--upload' in sys.argv: + upload_url = upload_base + out_filename + print('Uploading: ' + upload_url) + cmd = ['gsutil', 'cp', '-n', out_filename, upload_url] + print(' '.join(cmd)) + check_call(cmd) def build_python(): @@ -169,14 +166,16 @@ def build_python(): for lib in glob.glob(os.path.join(dirname, 'lib', 'lib*.a')): os.remove(lib) check_call(['tar', 'zcvf', tarball, dirname]) - print('Uploading: ' + upload_base + tarball) - check_call(['gsutil', 'cp', '-n', tarball, upload_base + tarball]) + + print('Created: %s' % tarball) + if '--upload' in sys.argv: + print('Uploading: ' + upload_base + tarball) + check_call(['gsutil', 'cp', '-n', tarball, upload_base + tarball]) def main(): - if sys.platform.startswith('win'): - for arch in ('amd64', 'win32'): - make_python_patch(arch) + if sys.platform.startswith('win') or '--win32' in sys.argv: + make_python_patch() else: build_python() return 0