|
|
|
@ -75,6 +75,7 @@ class Package:
|
|
|
|
|
# (typically, because it is included in a parent package already).
|
|
|
|
|
"distro_package_names",
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
def __init__(self, name, is_group=False, is_mandatory=False,
|
|
|
|
|
version=None, version_short=None, version_min=None, version_mex=None,
|
|
|
|
|
sub_packages=(), distro_package_names={}):
|
|
|
|
@ -499,6 +500,8 @@ def suse_pypackages_name_gen(name):
|
|
|
|
|
v = "".join(str(i) for i in PackageInstaller.version_tokenize(pp.version_installed)[0][:2])
|
|
|
|
|
return "python" + v + "-" + name
|
|
|
|
|
return _gen
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
PYTHON_SUBPACKAGES = (
|
|
|
|
|
Package(name="Cython", version="0.29", version_short="0.29", version_min="0.20", version_mex="1.0",
|
|
|
|
|
distro_package_names={DISTRO_ID_DEBIAN: "cython3",
|
|
|
|
@ -664,24 +667,57 @@ BOOST_SUBPACKAGES = (
|
|
|
|
|
|
|
|
|
|
# Packages required to build Blender, which are not included in the precompiled libraries.
|
|
|
|
|
PACKAGES_BASICS_BUILD = (
|
|
|
|
|
Package(name="Basics Mandatory Build", is_group=True, is_mandatory=True, sub_packages=BASICS_BUILD_MANDATORY_SUBPACKAGES),
|
|
|
|
|
Package(name="Basics Optional Build", is_group=True, is_mandatory=False, sub_packages=BASICS_BUILD_OPTIONAL_SUBPACKAGES),
|
|
|
|
|
Package(name="Basic Critical Dependencies", is_group=True, is_mandatory=True, sub_packages=BASIC_DEPS_CRITICAL_SUBPACKAGES),
|
|
|
|
|
Package(
|
|
|
|
|
name="Basics Mandatory Build",
|
|
|
|
|
is_group=True,
|
|
|
|
|
is_mandatory=True,
|
|
|
|
|
sub_packages=BASICS_BUILD_MANDATORY_SUBPACKAGES),
|
|
|
|
|
Package(
|
|
|
|
|
name="Basics Optional Build",
|
|
|
|
|
is_group=True,
|
|
|
|
|
is_mandatory=False,
|
|
|
|
|
sub_packages=BASICS_BUILD_OPTIONAL_SUBPACKAGES),
|
|
|
|
|
Package(
|
|
|
|
|
name="Basic Critical Dependencies",
|
|
|
|
|
is_group=True,
|
|
|
|
|
is_mandatory=True,
|
|
|
|
|
sub_packages=BASIC_DEPS_CRITICAL_SUBPACKAGES),
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# All packages, required or 'nice to have', to build Blender.
|
|
|
|
|
# Also covers (as best as possible) the dependencies provided by the precompiled libraries.
|
|
|
|
|
PACKAGES_ALL = (
|
|
|
|
|
Package(name="Basics Mandatory Build", is_group=True, is_mandatory=True, sub_packages=BASICS_BUILD_MANDATORY_SUBPACKAGES),
|
|
|
|
|
Package(name="Basics Optional Build", is_group=True, is_mandatory=False, sub_packages=BASICS_BUILD_OPTIONAL_SUBPACKAGES),
|
|
|
|
|
Package(name="Basic Critical Dependencies", is_group=True, is_mandatory=True, sub_packages=BASIC_DEPS_CRITICAL_SUBPACKAGES),
|
|
|
|
|
Package(name="Basic Mandatory Dependencies", is_group=True, is_mandatory=True, sub_packages=BASIC_DEPS_MANDATORY_SUBPACKAGES),
|
|
|
|
|
Package(name="Basic Optional Dependencies", is_group=True, is_mandatory=False, sub_packages=BASIC_DEPS_OPTIONAL_SUBPACKAGES),
|
|
|
|
|
Package(
|
|
|
|
|
name="Basics Mandatory Build",
|
|
|
|
|
is_group=True,
|
|
|
|
|
is_mandatory=True,
|
|
|
|
|
sub_packages=BASICS_BUILD_MANDATORY_SUBPACKAGES),
|
|
|
|
|
Package(
|
|
|
|
|
name="Basics Optional Build",
|
|
|
|
|
is_group=True,
|
|
|
|
|
is_mandatory=False,
|
|
|
|
|
sub_packages=BASICS_BUILD_OPTIONAL_SUBPACKAGES),
|
|
|
|
|
Package(
|
|
|
|
|
name="Basic Critical Dependencies",
|
|
|
|
|
is_group=True,
|
|
|
|
|
is_mandatory=True,
|
|
|
|
|
sub_packages=BASIC_DEPS_CRITICAL_SUBPACKAGES),
|
|
|
|
|
Package(
|
|
|
|
|
name="Basic Mandatory Dependencies",
|
|
|
|
|
is_group=True,
|
|
|
|
|
is_mandatory=True,
|
|
|
|
|
sub_packages=BASIC_DEPS_MANDATORY_SUBPACKAGES),
|
|
|
|
|
Package(
|
|
|
|
|
name="Basic Optional Dependencies",
|
|
|
|
|
is_group=True,
|
|
|
|
|
is_mandatory=False,
|
|
|
|
|
sub_packages=BASIC_DEPS_OPTIONAL_SUBPACKAGES),
|
|
|
|
|
|
|
|
|
|
Package(name="Clang Format", version="10.0", version_short="10.0", version_min="6.0", version_mex="15.0",
|
|
|
|
|
distro_package_names={DISTRO_ID_DEBIAN: "clang-format",
|
|
|
|
|
DISTRO_ID_FEDORA: "clang", # On Fedora clang-format is part of the main clang package.
|
|
|
|
|
# On Fedora clang-format is part of the main clang package.
|
|
|
|
|
DISTRO_ID_FEDORA: "clang",
|
|
|
|
|
DISTRO_ID_SUSE: "clang", # On Suse clang-format is part of the main clang package.
|
|
|
|
|
DISTRO_ID_ARCH: "clang", # On Arch clang-format is part of the main clang package.
|
|
|
|
|
},
|
|
|
|
@ -909,6 +945,7 @@ PACKAGES_ALL = (
|
|
|
|
|
|
|
|
|
|
class ProgressBar:
|
|
|
|
|
"""Very basic progress bar printing in the console."""
|
|
|
|
|
|
|
|
|
|
def __init__(self, min_value=0, max_value=100, print_len=80, is_known_limit=True):
|
|
|
|
|
self.value = 0
|
|
|
|
|
self.min_value = min_value
|
|
|
|
@ -965,7 +1002,11 @@ class PackageInstaller:
|
|
|
|
|
pbar.update(steps=2)
|
|
|
|
|
time.sleep(0.05)
|
|
|
|
|
pbar.finish()
|
|
|
|
|
return subprocess.CompletedProcess(args=command, returncode=p.returncode, stdout=p.stdout.read(), stderr=p.stderr.read())
|
|
|
|
|
return subprocess.CompletedProcess(
|
|
|
|
|
args=command,
|
|
|
|
|
returncode=p.returncode,
|
|
|
|
|
stdout=p.stdout.read(),
|
|
|
|
|
stderr=p.stderr.read())
|
|
|
|
|
|
|
|
|
|
@property
|
|
|
|
|
def can_install(self):
|
|
|
|
@ -1211,7 +1252,8 @@ class PackageInstaller:
|
|
|
|
|
package_distro_name = self.package_distro_name(package, parent_packages)[0]
|
|
|
|
|
if package_distro_name is None:
|
|
|
|
|
if package.is_mandatory:
|
|
|
|
|
self.settings.logger.warning(f"Mandatory package {info_name} is not defined for {distro_id} distribution, "
|
|
|
|
|
self.settings.logger.warning(
|
|
|
|
|
f"Mandatory package {info_name} is not defined for {distro_id} distribution, "
|
|
|
|
|
"Blender will likely not build at all without it.\n")
|
|
|
|
|
else:
|
|
|
|
|
self.settings.logger.info(f"Package {info_name} is not defined for {distro_id} distribution.\n")
|
|
|
|
@ -1223,7 +1265,8 @@ class PackageInstaller:
|
|
|
|
|
# Inherit parent version info if needed and possible.
|
|
|
|
|
if package.version is None:
|
|
|
|
|
if not parent_packages:
|
|
|
|
|
self.settings.logger.critical(f"Package {info_name} ({package_distro_name}) has no version information.")
|
|
|
|
|
self.settings.logger.critical(
|
|
|
|
|
f"Package {info_name} ({package_distro_name}) has no version information.")
|
|
|
|
|
exit(1)
|
|
|
|
|
package.version = parent_packages[-1].version
|
|
|
|
|
package.version_short = parent_packages[-1].version_short
|
|
|
|
@ -1249,7 +1292,8 @@ class PackageInstaller:
|
|
|
|
|
package_name = self.package_find(package, package_distro_name)
|
|
|
|
|
if package_name is None:
|
|
|
|
|
if package.is_mandatory:
|
|
|
|
|
self.settings.logger.critical(f"\tFailed to find a matching mandatory {package_distro_name} "
|
|
|
|
|
self.settings.logger.critical(
|
|
|
|
|
f"\tFailed to find a matching mandatory {package_distro_name} "
|
|
|
|
|
f"(withing versions range [{package.version_min}, {package.version_mex}[).")
|
|
|
|
|
exit(1)
|
|
|
|
|
self.settings.logger.warning(f"\tFailed to find a matching {package_distro_name} "
|
|
|
|
@ -1290,11 +1334,13 @@ class PackageInstaller:
|
|
|
|
|
# Only from PackageInstaller base class.
|
|
|
|
|
assert self.__class__ is PackageInstaller
|
|
|
|
|
packages_info_names = ',\n\t\t\t'.join(packages_distro_names)
|
|
|
|
|
self.settings.logger.info(f"\tWould install group of packages {package.name}:\n\t\t\t{packages_info_names}.")
|
|
|
|
|
self.settings.logger.info(
|
|
|
|
|
f"\tWould install group of packages {package.name}:\n\t\t\t{packages_info_names}.")
|
|
|
|
|
return True
|
|
|
|
|
|
|
|
|
|
if self.settings.no_sudo:
|
|
|
|
|
self.settings.logger.warning(f"\t--no-sudo enabled, impossible to run apt-get install for {packages_distro_names}.")
|
|
|
|
|
self.settings.logger.warning(
|
|
|
|
|
f"\t--no-sudo enabled, impossible to run apt-get install for {packages_distro_names}.")
|
|
|
|
|
return True
|
|
|
|
|
|
|
|
|
|
if not packages_distro_names:
|
|
|
|
@ -1308,7 +1354,8 @@ class PackageInstaller:
|
|
|
|
|
self.settings.logger.critical(f"\tFailed to install packages:\n\t{repr(result)}")
|
|
|
|
|
exit(1)
|
|
|
|
|
else:
|
|
|
|
|
self.settings.logger.warning(f"\tFailed to find install all of {packages_distro_names}:\n\t{repr(result)}")
|
|
|
|
|
self.settings.logger.warning(
|
|
|
|
|
f"\tFailed to find install all of {packages_distro_names}:\n\t{repr(result)}")
|
|
|
|
|
self.settings.logger.debug(repr(result))
|
|
|
|
|
return result.returncode == 0
|
|
|
|
|
|
|
|
|
@ -1363,19 +1410,35 @@ class PackageInstallerDebian(PackageInstaller):
|
|
|
|
|
version = self._re_version_candidate.search(str(result.stdout))
|
|
|
|
|
return version["version"] if version is not None else None
|
|
|
|
|
|
|
|
|
|
def package_name_version_gen(self, package, package_distro_name, version=..., suffix="", do_range_version_names=False):
|
|
|
|
|
def package_name_version_gen(
|
|
|
|
|
self,
|
|
|
|
|
package,
|
|
|
|
|
package_distro_name,
|
|
|
|
|
version=...,
|
|
|
|
|
suffix="",
|
|
|
|
|
do_range_version_names=False):
|
|
|
|
|
if version is ...:
|
|
|
|
|
version = package.version_short
|
|
|
|
|
# Generate versions variants with version between main name and '-dev' suffix, if any.
|
|
|
|
|
tmp_package_name = package_distro_name.removesuffix("-dev")
|
|
|
|
|
if tmp_package_name != package_distro_name:
|
|
|
|
|
for pn in self.package_name_version_gen(package, tmp_package_name, version, suffix="-dev" + suffix, do_range_version_names=do_range_version_names):
|
|
|
|
|
for pn in self.package_name_version_gen(
|
|
|
|
|
package,
|
|
|
|
|
tmp_package_name,
|
|
|
|
|
version,
|
|
|
|
|
suffix="-dev" + suffix,
|
|
|
|
|
do_range_version_names=do_range_version_names):
|
|
|
|
|
yield pn
|
|
|
|
|
# Strip any 'version-like' numbers at the end of the package name (already stripped of '-dev' suffix)
|
|
|
|
|
# and generate versions variants out of it.
|
|
|
|
|
tmp_package_name = tmp_package_name.rstrip("0123456789.-")
|
|
|
|
|
if tmp_package_name != package_distro_name:
|
|
|
|
|
for pn in self.package_name_version_gen(package, tmp_package_name, version, suffix=suffix, do_range_version_names=do_range_version_names):
|
|
|
|
|
for pn in self.package_name_version_gen(
|
|
|
|
|
package,
|
|
|
|
|
tmp_package_name,
|
|
|
|
|
version,
|
|
|
|
|
suffix=suffix,
|
|
|
|
|
do_range_version_names=do_range_version_names):
|
|
|
|
|
yield pn
|
|
|
|
|
# Generate version variants from given package name.
|
|
|
|
|
versions = [version]
|
|
|
|
@ -1413,19 +1476,35 @@ class PackageInstallerFedora(PackageInstaller):
|
|
|
|
|
def package_query_version_get_impl(self, package_distro_name):
|
|
|
|
|
return self.package_version_get(["sudo", "dnf", "info", "--all", package_distro_name])
|
|
|
|
|
|
|
|
|
|
def package_name_version_gen(self, package, package_distro_name, version=..., suffix="", do_range_version_names=False):
|
|
|
|
|
def package_name_version_gen(
|
|
|
|
|
self,
|
|
|
|
|
package,
|
|
|
|
|
package_distro_name,
|
|
|
|
|
version=...,
|
|
|
|
|
suffix="",
|
|
|
|
|
do_range_version_names=False):
|
|
|
|
|
if version is ...:
|
|
|
|
|
version = package.version_short
|
|
|
|
|
# Generate versions variants with version between main name and '-devel' suffix, if any.
|
|
|
|
|
tmp_package_name = package_distro_name.removesuffix("-devel")
|
|
|
|
|
if tmp_package_name != package_distro_name:
|
|
|
|
|
for pn in self.package_name_version_gen(package, tmp_package_name, version, suffix="-devel" + suffix, do_range_version_names=do_range_version_names):
|
|
|
|
|
for pn in self.package_name_version_gen(
|
|
|
|
|
package,
|
|
|
|
|
tmp_package_name,
|
|
|
|
|
version,
|
|
|
|
|
suffix="-devel" + suffix,
|
|
|
|
|
do_range_version_names=do_range_version_names):
|
|
|
|
|
yield pn
|
|
|
|
|
# Strip any 'version-like' numbers at the end of the package name (already stripped of '-devel' suffix)
|
|
|
|
|
# and generate versions variants out of it.
|
|
|
|
|
tmp_package_name = tmp_package_name.rstrip("0123456789.-")
|
|
|
|
|
if tmp_package_name != package_distro_name:
|
|
|
|
|
for pn in self.package_name_version_gen(package, tmp_package_name, version, suffix=suffix, do_range_version_names=do_range_version_names):
|
|
|
|
|
for pn in self.package_name_version_gen(
|
|
|
|
|
package,
|
|
|
|
|
tmp_package_name,
|
|
|
|
|
version,
|
|
|
|
|
suffix=suffix,
|
|
|
|
|
do_range_version_names=do_range_version_names):
|
|
|
|
|
yield pn
|
|
|
|
|
# Generate version variants from given package name.
|
|
|
|
|
versions = [version]
|
|
|
|
@ -1466,19 +1545,35 @@ class PackageInstallerSuse(PackageInstaller):
|
|
|
|
|
result = self.run_command(["sudo", "zypper", "info", package_distro_name])
|
|
|
|
|
return self.package_version_get(result)
|
|
|
|
|
|
|
|
|
|
def package_name_version_gen(self, package, package_distro_name, version=..., suffix="", do_range_version_names=False):
|
|
|
|
|
def package_name_version_gen(
|
|
|
|
|
self,
|
|
|
|
|
package,
|
|
|
|
|
package_distro_name,
|
|
|
|
|
version=...,
|
|
|
|
|
suffix="",
|
|
|
|
|
do_range_version_names=False):
|
|
|
|
|
if version is ...:
|
|
|
|
|
version = package.version_short
|
|
|
|
|
# Generate versions variants with version between main name and '-devel' suffix, if any.
|
|
|
|
|
tmp_package_name = package_distro_name.removesuffix("-devel")
|
|
|
|
|
if tmp_package_name != package_distro_name:
|
|
|
|
|
for pn in self.package_name_version_gen(package, tmp_package_name, version, suffix="-devel" + suffix, do_range_version_names=do_range_version_names):
|
|
|
|
|
for pn in self.package_name_version_gen(
|
|
|
|
|
package,
|
|
|
|
|
tmp_package_name,
|
|
|
|
|
version,
|
|
|
|
|
suffix="-devel" + suffix,
|
|
|
|
|
do_range_version_names=do_range_version_names):
|
|
|
|
|
yield pn
|
|
|
|
|
# Strip any 'version-like' numbers at the end of the package name (already stripped of '-devel' suffix)
|
|
|
|
|
# and generate versions variants out of it.
|
|
|
|
|
tmp_package_name = tmp_package_name.rstrip("0123456789.-")
|
|
|
|
|
if tmp_package_name != package_distro_name:
|
|
|
|
|
for pn in self.package_name_version_gen(package, tmp_package_name, version, suffix=suffix, do_range_version_names=do_range_version_names):
|
|
|
|
|
for pn in self.package_name_version_gen(
|
|
|
|
|
package,
|
|
|
|
|
tmp_package_name,
|
|
|
|
|
version,
|
|
|
|
|
suffix=suffix,
|
|
|
|
|
do_range_version_names=do_range_version_names):
|
|
|
|
|
yield pn
|
|
|
|
|
# Generate version variants from given package name.
|
|
|
|
|
versions = [version]
|
|
|
|
@ -1516,7 +1611,13 @@ class PackageInstallerArch(PackageInstaller):
|
|
|
|
|
def package_query_version_get_impl(self, package_distro_name):
|
|
|
|
|
return self.package_version_get(["pacman", "-Si", package_distro_name])
|
|
|
|
|
|
|
|
|
|
def package_name_version_gen(self, package, package_distro_name, version=..., suffix="", do_range_version_names=False):
|
|
|
|
|
def package_name_version_gen(
|
|
|
|
|
self,
|
|
|
|
|
package,
|
|
|
|
|
package_distro_name,
|
|
|
|
|
version=...,
|
|
|
|
|
suffix="",
|
|
|
|
|
do_range_version_names=False):
|
|
|
|
|
if version is ...:
|
|
|
|
|
version = package.version_short
|
|
|
|
|
# Generate versions variants with version after the main name.
|
|
|
|
@ -1525,7 +1626,12 @@ class PackageInstallerArch(PackageInstaller):
|
|
|
|
|
# and generate versions variants out of it.
|
|
|
|
|
tmp_package_name = tmp_package_name.rstrip("0123456789.-")
|
|
|
|
|
if tmp_package_name != package_distro_name:
|
|
|
|
|
for pn in self.package_name_version_gen(package, tmp_package_name, version, suffix=suffix, do_range_version_names=do_range_version_names):
|
|
|
|
|
for pn in self.package_name_version_gen(
|
|
|
|
|
package,
|
|
|
|
|
tmp_package_name,
|
|
|
|
|
version,
|
|
|
|
|
suffix=suffix,
|
|
|
|
|
do_range_version_names=do_range_version_names):
|
|
|
|
|
yield pn
|
|
|
|
|
# Generate version variants from given package name.
|
|
|
|
|
versions = [version]
|
|
|
|
@ -1643,7 +1749,8 @@ def main():
|
|
|
|
|
logger.addHandler(stdout_handler)
|
|
|
|
|
settings.logger = logger
|
|
|
|
|
|
|
|
|
|
distro_package_installer = PackageInstaller(settings) if settings.show_deps else get_distro_package_installer(settings)
|
|
|
|
|
distro_package_installer = PackageInstaller(
|
|
|
|
|
settings) if settings.show_deps else get_distro_package_installer(settings)
|
|
|
|
|
distro_package_installer.packages_database_update()
|
|
|
|
|
|
|
|
|
|
if settings.all:
|
|
|
|
|