From b509b618e7e47e32e248f4a61056a15e45f06b22 Mon Sep 17 00:00:00 2001 From: Nirbheek Chauhan Date: Wed, 15 Nov 2023 16:37:11 +0000 Subject: Stop using setuptools in a bunch of places, incl meson.recipe Since Python 3.12, venv no longer installs setuptools by default, and frankly we don't need it anymore since we can install with pip. The only place left that uses setuptools is bundlesource now. Part-of: --- cerbero/bootstrap/build_tools.py | 8 +++++++- cerbero/utils/__init__.py | 8 +++++--- cerbero/utils/shell.py | 5 ++--- recipes/build-tools/meson.recipe | 18 +++++++++++++++--- 4 files changed, 29 insertions(+), 10 deletions(-) diff --git a/cerbero/bootstrap/build_tools.py b/cerbero/bootstrap/build_tools.py index f9659be5..b2b98a56 100644 --- a/cerbero/bootstrap/build_tools.py +++ b/cerbero/bootstrap/build_tools.py @@ -123,9 +123,15 @@ class BuildTools (BootstrapperBase, Fetch): os.remove(tof) shutil.move(os.path.join(scriptsdir, f), tof) os.rmdir(scriptsdir) + python = os.path.join(self.config.build_tools_prefix, 'bin', 'python') + shell.new_call([python, '-m', 'pip', 'install', 'setuptools']) async def start(self, jobs=0): - self.setup_venv() + python = os.path.join(self.config.build_tools_prefix, 'bin', 'python') + if self.config.platform == Platform.WINDOWS: + python += '.exe' + if not os.path.exists(python): + self.setup_venv() # Check and these at the last minute because we may have installed them # in system bootstrap self.recipes += self.check_build_tools() diff --git a/cerbero/utils/__init__.py b/cerbero/utils/__init__.py index 624a461e..4f08d6a1 100644 --- a/cerbero/utils/__init__.py +++ b/cerbero/utils/__init__.py @@ -33,7 +33,6 @@ try: import xml.etree.cElementTree as etree except ImportError: from lxml import etree -from distutils.version import StrictVersion import gettext import platform as pplatform import re @@ -544,6 +543,9 @@ def add_system_libs(config, new_env, old_env=None): os.path.join(sysroot, 'usr/share/aclocal')] new_env['ACLOCAL_PATH'] = ':'.join(search_paths) +def split_version(s): + return tuple(int(e) for e in s.split('.')) + def needs_xcode8_sdk_workaround(config): ''' Returns whether the XCode 8 clock_gettime, mkostemp, getentropy workaround @@ -552,10 +554,10 @@ def needs_xcode8_sdk_workaround(config): These symbols are only available on macOS 10.12+ and iOS 10.0+ ''' if config.target_platform == Platform.DARWIN: - if StrictVersion(config.min_osx_sdk_version) < StrictVersion('10.12'): + if split_version(config.min_osx_sdk_version) < (10, 12): return True elif config.target_platform == Platform.IOS: - if StrictVersion(config.ios_min_version) < StrictVersion('10.0'): + if split_version(config.ios_min_version) < (10, 0): return True return False diff --git a/cerbero/utils/shell.py b/cerbero/utils/shell.py index a47347cf..60f07393 100644 --- a/cerbero/utils/shell.py +++ b/cerbero/utils/shell.py @@ -33,10 +33,9 @@ import hashlib import urllib.request, urllib.error, urllib.parse import collections from pathlib import Path, PurePath -from distutils.version import StrictVersion from cerbero.enums import CERBERO_VERSION, Platform, Distro -from cerbero.utils import _, system_info, to_unixpath, determine_num_of_cpus, CerberoSemaphore +from cerbero.utils import _, system_info, split_version, CerberoSemaphore from cerbero.utils import messages as m from cerbero.errors import CommandError, FatalError @@ -682,7 +681,7 @@ def check_tool_version(tool_name, needed, env, version_arg=None): m = re.search(r'([0-9]+\.[0-9]+(\.[0-9]+)?)', out) if m: found = m.groups()[0] - newer = StrictVersion(found) >= StrictVersion(needed) + newer = split_version(found) >= split_version(needed) return tool, found, newer diff --git a/recipes/build-tools/meson.recipe b/recipes/build-tools/meson.recipe index dafb5c6b..794dfe76 100644 --- a/recipes/build-tools/meson.recipe +++ b/recipes/build-tools/meson.recipe @@ -1,7 +1,8 @@ # -*- Mode: Python -*- vi:si:et:sw=4:sts=4:ts=4:syntax=python +import glob import shutil -from pathlib import PurePath, Path +from pathlib import PurePath class Recipe(recipe.Recipe): name = 'meson' @@ -31,6 +32,17 @@ class Recipe(recipe.Recipe): # Our workaround is to only install the script into bin. This also # fixes things on Windows, where the script is installed into Scripts/ # instead of bin/ - await shell.async_call([self.config.python_exe, 'setup.py', 'install', - '--prefix', prefix, '--install-scripts', '{}/bin'.format(prefix)], + await shell.async_call([self.config.python_exe, '-m', 'pip', 'install', '--prefix', prefix, '.'], cmd_dir=self.build_dir, env=self.env, logfile=self.logfile) + if self.config.platform == Platform.WINDOWS: + # Python insists on using Scripts instead of bin on Windows for + # scripts. Insist back, and use bin again. + scriptsdir = os.path.join(prefix, 'Scripts') + bindir = os.path.join(prefix, 'bin') + os.makedirs(bindir, exist_ok=True) + for f in glob.glob('*', root_dir=scriptsdir): + tof = os.path.join(bindir, f) + if os.path.isfile(tof): + os.remove(tof) + shutil.move(os.path.join(scriptsdir, f), tof) + os.rmdir(scriptsdir) -- cgit v1.2.3