Compare commits

..

42 Commits

Author SHA1 Message Date
William Douglas 43d564b0b7 Make autoupdate default for new packages
Things should be autoupdating by default for new content at this point
as being held back for no reason isn't helpful.

Signed-off-by: William Douglas <william.douglas@intel.com>
2024-07-08 12:24:12 -07:00
William Douglas 2659038eaa Fix meson check builddir typo
Signed-off-by: William Douglas <william.douglas@intel.com>
2024-07-02 12:17:59 -07:00
William Douglas dc0ff31b43 Add support for a copy_prepend config file
This patch has a few interrelated changes in it but primarily it is
supporting a new copy_prepend configuration file for autospec. This is
intended to support cases where changes should be made to the source
directory prior to the source directory being copied for different
builds (avx2, 32bit, etc).

Also with this change some tweaks to how cmake builds are handled to
be more aligned with other build systems. Primarily that the source
directoy is now fully copied rather than just creating a cmake build
directory per build in the same source directory.

Finally check support has been updated to account for the new path and
update support for meson and apx.

Signed-off-by: William Douglas <william.douglas@intel.com>
2024-07-01 01:36:31 -07:00
William Douglas 3f1fa8e70b Fix mpi cmake Unix Makefiles argument
Signed-off-by: William Douglas <william.douglas@intel.com>
2024-07-01 01:36:31 -07:00
William Douglas 840d2ca0e2 Add new failed pattern detection
Signed-off-by: William Douglas <william.douglas@intel.com>
2024-07-01 01:36:31 -07:00
Brett T. Warden a5d3013703 Add pkgconfig detection pattern for rust dependencies 2024-06-25 13:13:03 -07:00
K1ngfish3r 381dfd88cc make check! 2024-06-20 14:55:48 -07:00
K1ngfish3r f483b68c90 make check? 2024-06-20 14:55:48 -07:00
K1ngfish3r 5d6bcfe2f7 zstd support 2024-06-20 14:55:48 -07:00
Brett T. Warden f9eab4897e Try a little bit harder to find licenses
Look in directories named 'licensing'.
2024-06-18 13:57:32 -07:00
William Douglas fbcebd0b3d Add missing install handling for ninja
For cmake builds, use ninja install if use_ninja is set.

Signed-off-by: William Douglas <william.douglas@intel.com>
2024-05-30 01:15:04 -07:00
William Douglas 1f398f5e7b Add config for using ninja instead of make
Given more packages are using ninja as the build system of choice
instead of make, add flag to enable ninja usage.

Signed-off-by: William Douglas <william.douglas@intel.com>
2024-05-29 16:02:05 -07:00
Arjan van de Ven 8e89d0cb0e no gcc-14 2024-05-29 17:44:43 +00:00
William Douglas 6fa3d52db4 Remove Ofast from flags
This caused some incorrect behavior for numpy. Generally disabling to
avoid problematic behavior.

Signed-off-by: William Douglas <william.douglas@intel.com>
2024-05-14 13:03:20 -07:00
Brett T. Warden 5905be97e8 Fix version parsing for x265 2024-04-12 09:23:30 -07:00
Brett T. Warden 81e1eebe28 Extend key ID matching to expired keys
gpg accepts signatures with expired keys as long as the signature was
made prior to key expiration. But it also changes the status-fd output
format that we grep for the expected key ID. Make sure we look for the
alternate EXPKEYSIG line in the output in that case to find the key ID.
2024-04-12 09:08:10 -07:00
Brett T. Warden 658bd0de10 Add gnupg as a buildreq if we'll need it during build 2024-04-11 16:10:02 -07:00
Brett T. Warden b628caf931 Add Config fields for pkey and signature macros 2024-04-11 12:37:09 -07:00
Brett T. Warden 8142032e7c Fix escaping to satisfy flake 2024-04-11 12:22:59 -07:00
Brett T. Warden 5a302d6c91 Check GPG package signatures during build
Add gpg commands to the specfile so we verify the package signature
during every rpmbuild. Also ensure that the signature key ID matches
what we expect.
2024-04-11 12:22:59 -07:00
William Douglas f56f1fa18d Don't autodetect xz build requirements
Signed-off-by: William Douglas <william.douglas@intel.com>
2024-03-29 15:10:55 -07:00
Brett T. Warden 0c408e7089 Yell louder about known bad signing keys 2024-03-29 11:43:38 -07:00
Brett T. Warden 5471f10f61 Implement blocklist for signing key IDs
Implement a blocklist, keyid_blocklist. If a keyid (without leading 0x)
in this file matches the signing key for a release, terminate autospec
with an error.

This is intended as a mechanism to block building releases signed with a
known compromised key.
2024-03-29 11:43:38 -07:00
William Douglas c02b2fec6a Add etc_files log
When a package has content in /etc, it is removed silently, this
change adds an etc_files log file in git that shows what files were in
/etc that weren't packaged.

Signed-off-by: William Douglas <william.douglas@intel.com>
2024-03-22 14:11:36 -07:00
William Douglas 312e1714f2 Update failed patterns and cmake patterns for qt6
Signed-off-by: William Douglas <william.douglas@intel.com>
2024-03-22 12:42:28 -07:00
William Douglas 652616b1b6 Add path handling for qt6
Signed-off-by: William Douglas <william.douglas@intel.com>
2024-03-22 12:42:28 -07:00
William Douglas f4bef72a70 Add handling for multiline find_package
Previously support for cmake's find_package parsing was only able to
handle single line entries. This change adds support for multiline
versions and allows for module namespacing (currently qt6 and kf6
support is available).

The change for cmake_modules shows this namespacing in use.

Signed-off-by: William Douglas <william.douglas@intel.com>
2024-03-15 14:20:20 -07:00
William Douglas 6095ef84a0 Migrate configs for qt6
Partial migration of patterns to qt6 for failed_commands and
qt_modules. Still more changes needed here but this is a start.

Signed-off-by: William Douglas <william.douglas@intel.com>
2024-03-15 14:20:20 -07:00
William Douglas fa36e95657 Stop using the %qmake macro
Rather than using %qmake, add the definition into autospec. This is
done to allow for using make_command to specify which version of qmake
to use.

Note for now qmake6 is not in PATH and needs a build_prepend addition.

Signed-off-by: William Douglas <william.douglas@intel.com>
2024-03-15 14:20:20 -07:00
William Douglas 3d985ebaf9 Allow optimization level specification in the R pattern
Signed-off-by: William Douglas <william.douglas@intel.com>
2024-03-11 16:25:34 -07:00
Brett T. Warden 1ab68caa3d Search licenses/*.txt
We search for licenses as *.txt in subdirectories "LICENSES" and "license". Also search "licenses".
2024-03-04 16:21:34 -08:00
Brett T. Warden e738c511eb Add support for non-tarball bz2 archives
Some projects require additional bz2 downloads that are single
compressed files, not tar archives. Detect and extract those with
appropriate bz2 tools instead of tar.

For a given entry like this:
ARCHIVES = https://example.com/download/foo.dat.bz2 src/data

...upstream file is downloaded to:
builddir/build/SOURCES/foo.dat.bz2

...initially extracted as:
builddir/build/BUILD/foo.dat/foo.dat

...and finally copied to
builddir/build/BUILD/<pkg>/src/data/foo.dat
2024-02-26 09:12:10 -08:00
William Douglas da8b975a56 Add --host to autogen pattern for apx
autogen uses autotools and also needs a --host parameter to build apx.

Signed-off-by: William Douglas <william.douglas@intel.com>
2024-02-07 14:06:26 -08:00
William Douglas 213bb01a2f Make use of GOAMD64
Add export for GOAMD64 and modify where needed in order to support
building optimized binaries using golang.

Signed-off-by: William Douglas <william.douglas@intel.com>
2024-02-05 13:14:23 -08:00
William Douglas 25ad860d7f Add handling for APX configure patterns
Support APX package builds using the configure patterns (needed to
handle cross compilation via --host option).

Also fixup some flag usage inconsistencies.

Signed-off-by: William Douglas <william.douglas@intel.com>
2024-02-05 10:55:39 -08:00
William Douglas 750e50d160 Add support for building APX binaries
Add early support for APX builds in autospec. This change also makes
APX disabled by default for now but may revert back to enabled by
default in the future. The APX prefix will be /VA as the arch flag is
not yet finalized. This also may change in the future though for now
there are no plans to move it.

Currently autotools builds are unable to use this as it detects as a
cross compilation.

Currently only C using GCC is supported.

This change also reworks how R language optimized binaries are built
and distributed. They will now work as all the other tooling does with
the /VX prefix.

Signed-off-by: William Douglas <william.douglas@intel.com>
2024-02-03 07:25:59 -08:00
William Douglas fae1327921 Correct configure pattern LDFLAGS setting
Update LDFLAGS to use the intermediate flags and be set the same as
the other avx2 flags.

Signed-off-by: William Douglas <william.douglas@intel.com>
2024-01-23 12:23:35 -08:00
William Douglas 1eaf8cd10c Rework avx2/512 flag passing
Instead of hard coding flags in each use, add global constants that
are substituted on use (removes a little copypasta and fixes up some
flags that were unintentionally different between build systems).

Signed-off-by: William Douglas <william.douglas@intel.com>
2024-01-18 10:07:48 -08:00
William Douglas 8c949329a8 Update regex for reconfigure detection
Update regex as grep doesn't need escape slashes and python hates
them.

Signed-off-by: William Douglas <william.douglas@intel.com>
2024-01-18 10:07:48 -08:00
Brett T. Warden 537da873db Add unit tests for allow_exe 2024-01-16 14:29:07 -08:00
Brett T. Warden e664610c0e Add a mechanism to automatically exclude Windows executables
Some packages, especially PIP wheels, install Windows executables.
Introduce an option, allow_exe, with which to permit installing those
executables. Otherwise, explicitly delete them so they're not
inadvertently installed via wildcards later.
2024-01-16 13:59:27 -08:00
Brett T. Warden ab27b0e7ad Add use_apx flag to options.conf
Set value True by default, but other added options still default to
false.

diff --git a/options.conf b/options.conf
index ed481d682825..127ec6e6ffaa 100644
--- a/options.conf
+++ b/options.conf
@@ -59,6 +59,16 @@ server = false
 skip_tests = false
 # add .so files to the lib package instead of dev
 so_to_lib = false
+# configure build for apx
+use_apx = true
+# configure build for avx2
+use_avx2 = false
+# configure build for avx512
+use_avx512 = false
+# add clang flags
+use_clang = false
+# configure build for lto
+use_lto = false
 # require package verification for build
 verify_required = false
2024-01-04 11:49:16 -08:00
17 changed files with 937 additions and 283 deletions
+6
View File
@@ -268,6 +268,12 @@ prep_prepend
resulting ``.spec``, and is used for situations where fine-grained
control is required.
copy_prepend
Additional actions that should take place directly before the source
directory is copied for other builds (32bit, avx2, etc). This will be
placed in the resulting ``.spec``, and is used for situations where
fine-grained control is required.
build_prepend
Additional actions that should take place after ``%build`` and before
the ``%configure`` macro or equivalent (``%cmake``, etc.). If autospec
+29 -1
View File
@@ -483,21 +483,45 @@ class Requirements(object):
def set_build_req(self, config):
"""Add build requirements based on the build pattern."""
def findpackage_parse_lines(self, fp_line, line_iter, cmake_modules):
"""Parse find_package multiline segment of the line_iter."""
qt6module = re.compile(r"^[^#]*find_package\(\s*\bQt6.*", re.I)
kf6module = re.compile(r"^[^#]*find_package\(\s*\bKF6.*", re.I)
ns = ''
if qt6module.search(fp_line):
ns = 'qt6'
elif kf6module.search(fp_line):
ns = 'kf6'
while True:
ln = next(line_iter).strip()
if not ln:
continue
modules = ln.strip(')').split(' ')
for module in modules:
if module:
if pkg := cmake_modules.get(f"{ns}.{module}"):
self.add_buildreq(pkg)
if ')' in ln:
break
def parse_cmake(self, filename, cmake_modules, conf32):
"""Scan a .cmake or CMakeLists.txt file for what's it's actually looking for."""
findpackage = re.compile(r"^[^#]*find_package\((\w+)\b.*\)", re.I)
findpackage_multiline = re.compile(r"^[^#]*find_package\((\w+)\b.*", re.I)
pkgconfig = re.compile(r"^[^#]*pkg_check_modules\s*\(\w+ (.*)\)", re.I)
pkg_search_modifiers = {'REQUIRED', 'QUIET', 'NO_CMAKE_PATH',
'NO_CMAKE_ENVIRONMENT_PATH', 'IMPORTED_TARGET'}
extractword = re.compile(r'(?:"([^"]+)"|(\S+))(.*)')
with util.open_auto(filename, "r") as f:
lines = f.readlines()
lines = iter(f.readlines())
for line in lines:
if match := findpackage.search(line):
module = match.group(1)
if pkg := cmake_modules.get(module):
self.add_buildreq(pkg)
elif findpackage_multiline.search(line):
self.findpackage_parse_lines(line, lines, cmake_modules)
if match := pkgconfig.search(line):
rest = match.group(1)
@@ -727,6 +751,10 @@ class Requirements(object):
configure_ac_files = []
qmake_profiles = []
cmake_files = []
if config.config_opts['use_ninja']:
self.add_buildreq('ninja')
for dirpath, _, files in os.walk(dirn):
default_score = 2 if dirpath == dirn else 1
+10 -4
View File
@@ -97,17 +97,23 @@ def scan_for_tests(src_dir, config, requirements, content):
}
if config.config_opts.get('32bit'):
testsuites["makecheck"] += "\ncd ../build32;\n" + make_check + " || :"
testsuites["cmake"] += "\ncd ../clr-build32;\n" + cmake_check + " || :"
testsuites["cmake"] += "\ncd ../../build32/clr-build32;\n" + cmake_check + " || :"
testsuites["meson"] += "\ncd ../build32;\n" + meson_check + " || :"
if config.config_opts.get('use_avx2'):
testsuites["makecheck"] += "\ncd ../buildavx2;\n" + make_check + " || :"
testsuites["cmake"] += "\ncd ../clr-build-avx2;\n" + cmake_check + " || :"
testsuites["cmake"] += "\ncd ../../buildavx2/clr-build-avx2;\n" + cmake_check + " || :"
testsuites["meson"] += "\ncd ../buildavx2;\n" + meson_check + " || :"
if config.config_opts.get('use_avx512'):
testsuites["makecheck"] += "\ncd ../buildavx512;\n" + make_check + " || :"
testsuites["cmake"] += "\ncd ../clr-build-avx512;\n" + cmake_check + " || :"
testsuites["cmake"] += "\ncd ../../buildavx512/clr-build-avx512;\n" + cmake_check + " || :"
testsuites["meson"] += "\ncd ../buildavx512;\n" + meson_check + " || :"
if config.config_opts.get('use_apx'):
testsuites["makecheck"] += "\ncd ../buildapx;\n" + make_check + " || :"
testsuites["cmake"] += "\ncd ../../buildapx/clr-build-apx;\n" + cmake_check + " || :"
testsuites["meson"] += "\ncd ../buildapx;\n" + meson_check + " || :"
if config.config_opts.get('openmpi'):
testsuites["makecheck"] += "\ncd ../build-openmpi;\n" + make_check_openmpi
testsuites["cmake"] += "\ncd ../clr-build-openmpi;\n" + cmake_check_openmpi
testsuites["cmake"] += "\ncd ../../build-openmpi/clr-build-openmpi;\n" + cmake_check_openmpi
files = os.listdir(src_dir)
+19 -2
View File
@@ -266,6 +266,7 @@ KSMServerDBusInterface, plasma-workspace-dev
KSaneCore, ksanecore-dev
KScreenLocker, kscreenlocker-dev
KSysGuard, libksysguard-dev
KUserFeedback, kuserfeedback-dev
KWaylandServer, kwayland-server-dev
KWinDBusInterface, kwin-dev
KWinEffects, kwin-dev
@@ -288,7 +289,6 @@ LibIcal, libical-dev
LibKEduVocDocument, libkeduvocdocument-dev
LibKWorkspace, plasma-workspace-dev
LibKompareDiff2, libkomparediff2-dev
LibLZMA, xz-dev
LibNotificationManager, plasma-workspace-dev
LibObs, obs-studio-dev
LibTaskManager, plasma-workspace-dev
@@ -329,6 +329,7 @@ PerlLibs, perl
Phonon4Qt5, phonon-dev
Phonon4Qt5Experimental, phonon-dev
PkgConfig, pkg-config
PlasmaActivities, plasma-activities-dev
PlasmaPotdProvider, kdeplasma-addons-dev
PlasmaWaylandProtocols, plasma-wayland-protocols-dev
Png2Ico, extra-cmake-modules png2ico
@@ -346,7 +347,7 @@ Python3, python3-dev
PythonInterp, python3
PythonLibs, python3-dev
QGpgme, gpgme-dev gpgme-extras
QHelpGenerator, extra-cmake-modules qttools-dev
QHelpGenerator, extra-cmake-modules qt6tools-dev
QMobipocket, kdegraphics-mobipocket-dev
Qca-qt5, qca-qt5-dev
Qt3DTests, qt6base-dev
@@ -901,6 +902,19 @@ igsc, igsc-dev
json-c, json-c-dev
kColorPicker, kcolorpicker-dev
kImageAnnotator, kimageannotator-dev
kf6.Config, kconfig-dev
kf6.CoreAddons, kcoreaddons-dev
kf6.Crash, kcrash-dev
kf6.DBusAddons, kdbusaddons-dev
kf6.FileMetaData, kfilemetadata-dev
kf6.I18n, ki18n-dev
kf6.JobWidgets, kjobwidgets-dev
kf6.KIO, kio-dev
kf6.Notifications, knotifications-dev
kf6.Purpose, purpose-dev
kf6.Runner, krunner-dev
kf6.Service, kservice-dev
kf6.StatusNotifierItem, kstatusnotifieritem-dev
kim-api, kim-api-data
leveldb, leveldb-dev
libavif, libavif-dev
@@ -926,6 +940,9 @@ pugixml, pugixml-dev
pybind11, pypi(pybind11)
qt5xdg, libqtxdg-data
qt5xdgiconloader, libqtxdg-data
qt6.DBus, qt6base-dev
qt6.Gui, qt6base-dev
qt6.Widgets, qt6base-dev
qtxdg-tools, qtxdg-tools-data
rabbitmq-c, rabbitmq-c-dev
realsense2, librealsense-dev
+25 -6
View File
@@ -74,6 +74,7 @@ class Config(object):
self.extra_configure64 = ""
self.extra_configure_avx2 = ""
self.extra_configure_avx512 = ""
self.extra_configure_apx = ""
self.extra_configure_openmpi = ""
self.config_files = set()
self.parallel_build = " %{?_smp_mflags} "
@@ -90,6 +91,7 @@ class Config(object):
self.install_macro = "%make_install"
self.disable_static = "--disable-static"
self.prep_prepend = []
self.copy_prepend = []
self.build_prepend = []
self.build_prepend_once = []
self.build_append = []
@@ -114,12 +116,15 @@ class Config(object):
self.old_keyid = None
self.profile_payload = None
self.signature = None
self.signature_macro = None
self.pkey_macro = None
self.yum_conf = None
self.failed_pattern_dir = None
self.alias = None
self.failed_commands = {}
self.ignored_commands = {}
self.gems = {}
self.keyid_blocklist = {}
self.license_hashes = {}
self.license_translations = {}
self.license_blacklist = {}
@@ -153,6 +158,7 @@ class Config(object):
"broken_c++": "extend flags with '-std=gnu++98",
"cargo_vendor": "create vendor archive with cargo",
"use_lto": "configure build for lto",
"use_apx": "configure build for APX",
"use_avx2": "configure build for avx2",
"use_avx512": "configure build for avx512",
"keepstatic": "do not remove static libraries",
@@ -180,7 +186,9 @@ class Config(object):
"nodebug": "do not generate debuginfo for this package",
"openmpi": "configure build also for openmpi",
"server": "Package is only used by servers",
"no_glob": "Do not use the replacement pattern for file matching"
"no_glob": "Do not use the replacement pattern for file matching",
"allow_exe": "Allow Windows executables (*.exe, *.dll) to be packaged",
"use_ninja": "Use ninja build files",
}
# simple_pattern_pkgconfig patterns
# contains patterns for parsing build.log for missing dependencies
@@ -260,6 +268,7 @@ class Config(object):
(r"Can't locate [a-zA-Z0-9_\-\/\.]+ in @INC \(you may need to install the ([a-zA-Z0-9_\-:]+) module\)", 0, 'perl'),
(r"Cannot find ([a-zA-Z0-9\-_\.]*)", 1, None),
(r"Checking for (.*?)\.\.\.no", 0, None),
(r"checking for (.*?) \(using pkg-config\)\.\.\. no", 0, None),
(r"Checking for (.*?)\s*: not found", 0, None),
(r"Checking for (.*?)\s>=.*\s*: not found", 0, None),
(r"Could not find suitable distribution for Requirement.parse\('([a-zA-Z\-\.]*)", 0, None),
@@ -282,6 +291,7 @@ class Config(object):
(r"No rule to make target `(.*)',", 0, None),
(r"Package (.*) was not found in the pkg-config search path.", 0, 'pkgconfig'),
(r"Package '([a-zA-Z0-9\-:]*)', required by '.*', not found", 0, 'pkgconfig'),
(r"The file `([a-zA-Z0-9\-:]*)\.pc` needs to be installed and the PKG_CONFIG_PATH environment variable must contain its parent directory\.", 0, 'pkgconfig'),
(r"Package which this enhances but not available for checking: [']([a-zA-Z0-9\-]*)[']", 0, 'R'),
(r"Perhaps you should add the directory containing `([a-zA-Z0-9\-:]*)\.pc'", 0, 'pkgconfig'),
(r"Program (.*) found: NO", 0, None),
@@ -428,20 +438,24 @@ class Config(object):
# next the options
config_f['autospec'] = {}
for fname, comment in sorted(self.config_options.items()):
fpath = os.path.join(self.download_path, fname)
config_f.set('autospec', '# {}'.format(comment))
if os.path.exists(fname):
if os.path.isfile(fpath):
config_f['autospec'][fname] = 'true'
os.remove(fname)
os.remove(fpath)
else:
config_f['autospec'][fname] = 'false'
# default lto to true for new things
config_f['autospec']['use_lto'] = 'true'
# default autoupdate to true for new things
config_f['autospec']['autoupdate'] = 'true'
# renamed options need special care
if os.path.exists("skip_test_suite"):
skip_path = os.path.join(self.download_path, "skip_test_suite")
if os.path.exists(skip_path):
config_f['autospec']['skip_tests'] = 'true'
os.remove("skip_test_suite")
os.remove(skip_path)
self.write_config(config_f)
def create_buildreq_cache(self, version, buildreqs_cache):
@@ -600,6 +614,7 @@ class Config(object):
read_pattern_conf("license_blacklist", self.license_blacklist, list_format=True, path=path)
read_pattern_conf("qt_modules", self.qt_modules, path=path)
read_pattern_conf("cmake_modules", self.cmake_modules, path=path)
read_pattern_conf("keyid_blocklist", self.keyid_blocklist, list_format=True, path=path)
def parse_existing_spec(self, name):
"""Determine the old version, old patch list, old keyid, and cves from old spec file."""
@@ -875,7 +890,7 @@ class Config(object):
self.patches += self.read_conf_file(os.path.join(self.download_path, "series"))
pfiles = [("%s/%s" % (self.download_path, x.split(" ")[0])) for x in self.patches]
cmd = "grep -E \"(\+\+\+|\-\-\-).*((Makefile.am)|(aclocal.m4)|(configure.ac|configure.in))\" %s" % " ".join(pfiles) # noqa: W605
cmd = "grep -E \"(+++|---).*((Makefile.am)|(aclocal.m4)|(configure.ac|configure.in))\" %s" % " ".join(pfiles) # noqa: W605
if self.patches and call(cmd,
check=False,
stdout=subprocess.DEVNULL,
@@ -908,6 +923,9 @@ class Config(object):
content = self.read_conf_file(os.path.join(self.download_path, "configure_avx512"))
self.extra_configure_avx512 = " \\\n".join(content)
content = self.read_conf_file(os.path.join(self.download_path, "configure_apx"))
self.extra_configure_apx = " \\\n".join(content)
content = self.read_conf_file(os.path.join(self.download_path, "configure_openmpi"))
self.extra_configure_openmpi = " \\\n".join(content)
@@ -991,6 +1009,7 @@ class Config(object):
requirements.add_buildreq("openssh")
self.prep_prepend = self.read_script_file(os.path.join(self.download_path, "prep_prepend"))
self.copy_prepend = self.read_script_file(os.path.join(self.download_path, "copy_prepend"))
if os.path.isfile(os.path.join(self.download_path, "prep_append")):
os.rename(os.path.join(self.download_path, "prep_append"), os.path.join(self.download_path, "build_prepend"))
self.make_prepend = self.read_script_file(os.path.join(self.download_path, "make_prepend"))
+97 -20
View File
@@ -12,6 +12,7 @@
-lICE, pkgconfig(ice)
-lIlmThread, ilmbase-dev
-lSM, pkgconfig(sm)
-lTerminfo, ncurses-dev
-lX11, pkgconfig(x11)
-lXau, libXau-dev
-lXaw, pkgconfig(xaw)
@@ -75,7 +76,6 @@
-lkrb5, krb5-dev
-lldap, openldap-dev
-lldb, ldb-dev
-llzma, xz-dev
-llzo, lzo-dev
-lmagic, file-dev
-lmenu, ncurses-dev
@@ -99,11 +99,11 @@
-lrdmacm, rdma-core-dev
-lreadline, readline-dev
-lsecret, libsecret-dev
-lsecret, pkgconfig(libsecret-1)
-lsensors, lm-sensors-dev
-lsqlite3, sqlite-autoconf-dev
-lssh, libssh-dev
-lssl, openssl-dev
-lTerminfo, ncurses-dev
-ltermcap, ncurses-dev
-ltinfo, ncurses-dev
-ltinfow, ncurses-dev
@@ -129,6 +129,7 @@ Analitza, analitza-dev
Analitza5, analitza-dev
BABL, babl-dev
BISON, bison
BROTLI, brotli-dev
BZ2_bzCompress, bzip2-dev
BZip2, bzip2-dev
Berkeley DB, db
@@ -138,6 +139,7 @@ Boost, boost-dev
Breeze, breeze-dev
CAIRO, cairo-dev
CARES, c-ares-dev
CFITSIO, cfitsio-dev
CGAL, CGAL-dev
CHECK, check
CLUTTER, clutter-dev
@@ -174,6 +176,7 @@ Eet.h, eet-dev
Eigen/Core, eigen-dev
Eigen/Dense, eigen-dev
Eigen3, eigen-dev
Epoxy, pkgconfig(epoxy)
Exiv2, exiv2-dev
Expat 1.95.x, expat-dev
Expat XML Parser, expat-dev
@@ -254,6 +257,7 @@ Fontconfig, pkgconfig(fontconfig)
FreeType 2, freetype-dev
Freetype, freetype-dev
GCRYPT, libgcrypt-dev
GCrypt, libgcrypt-dev
GD, gd-dev
GDBM, gdbm-dev
GDM_PAM_EXTENSIONS, gdm-dev
@@ -283,6 +287,7 @@ GTK, gtk+-dev
GnuTLS, gnutls-dev
GooglePerftools, gperftools-dev
Gperf, gperf
Gpgme, pkgconfig(gpgme)
Gpgmepp, gpgme-dev
Gphoto2, libgphoto2-dev
Grantlee5, grantlee-dev
@@ -375,6 +380,7 @@ KF5KMahjongglib, libkmahjongg-dev
KF5KdepimDBusInterfaces, kdepim-apps-libs-dev
KF5Kipi, libkipi-dev
KF5Kirigami2, kirigami2-dev
KF5KirigamiAddons, kirigami2-dev
KF5KontactInterface, kontactinterface-dev
KF5Kross, kross-dev
KF5Ldap, kldap-dev
@@ -416,6 +422,8 @@ KF5Su, kdesu-dev
KF5Syndication, syndication-dev
KF5SyntaxHighlighting, syntax-highlighting-dev
KF5SysGuard, libksysguard-dev
KF5TextAutoCorrection, ktextaddons-dev
KF5TextAutoCorrectionWidgets, ktextaddons-dev
KF5TextEditor, ktexteditor-dev
KF5TextWidgets, ktextwidgets-dev
KF5ThreadWeaver, threadweaver-dev
@@ -428,16 +436,74 @@ KF5WidgetsAddons, kwidgetsaddons-dev
KF5WindowSystem, kwindowsystem-dev
KF5XmlGui, kxmlgui-dev
KF5XmlRpcClient, kxmlrpcclient-dev
KF6Attica, attica-dev
KF6Baloo, baloo-dev
KF6BalooWidgets, baloo-widgets-dev
KF6ColorScheme, kcolorscheme-dev
KF6Config, kconfig-dev
KF6Contacts, kcontacts-dev
KF6DNSSD, kdnssd-dev
KF6FileMetaData, kfilemetadata-dev
KF6GlobalAccel, kglobalaccel-dev
KF6Holidays, kholidays-dev
KF6IdleTime, kidletime-dev
KF6JobWidgets, kjobwidgets-dev
KF6KCMUtils, kcmutils-dev
KF6Kirigami, kirigami-dev
KF6Kirigami2, kirigami-dev
KF6KirigamiAddons, kirigami-addons-dev
KF6KirigamiAddons2, kirigami-addons-dev
KF6KirigamiPlatform, kirigami-dev
KF6NetworkManagerQt, networkmanager-qt-dev
KF6NewStuff, knewstuff-def
KF6Notifications, knotifications-dev
KF6NotifyConfig, knotifyconfig-dev
KF6Package, kpackage-dev
KF6Purpose, purpose-dev
KF6QuickCharts, kquickcharts-dev
KF6Runner, krunner-dev
KF6Screen, libkscreen-dev
KF6StatusNotifierItem, kstatusnotifieritem-dev
KF6SyntaxHighlighting, syntax-highlighting-dev
KF6TextEditor, ktexteditor-dev
KGantt, kdiagram-dev
KPim5Akonadi, akonadi-dev
KPim5AkonadiContact, akonadi-contacts-dev
KPim5AkonadiMime, akonadi-mime-dev
KPim5AkonadiNotes, akonadi-notes-dev
KPim5GrantleeTheme, grantleetheme-dev
KPim5Gravatar, libgravatar-dev
KPim5IMAP, kimap-staticdev
KPim5Ldap, kldap-dev
KPim5LibKSieve, libksieve-dev
KPim5Libkdepim, libkdepim-dev
KPim5Libkleo, libkleo-dev
KPim5MailImporter, mailimporter-dev
KPim5MailTransport, kmailtransport-dev
KPim5MailTransportAkonadi, kmailtransport-dev
KPim5MessageComposer, messagelib-dev
KPim5MessageCore, messagelib-dev
KPim5Mime, kmime-dev
KPim5PimCommon, pimcommon-dev
KPim5TextEdit, kpimtextedit-dev
KPim6IMAP, kimap-dev
KPim6Libkdepim, libkdepim-dev
KPim6Libkleo, libkleo-dev
KPim6MailTransport, kmailtransport-dev
KPim6MessageCore, messagelib-dev
KPim6Mime, kmime-dev
KPim6PimCommon, pimcommon-dev
KPimGAPI, libkgapi-dev
KPimKDAV, kdav-dev
KPimPkPass, kpkpass-dev
KPimSMTP, ksmtp-dev
KPimSMTPConfig, ksmtp-dev
KPipeWire, kpipewire-dev
KScreenLocker, kscreenlocker-dev
KTP, ktp-common-internals-dev
KdepimLibs, kdepimlibs-dev
Kerberos 5, krb5-dev
KirigamiAddons, kirigami-addons-dev
LEX, flex bison
LIBCAP_NG_PATH, libcap-ng-dev
LIBEXIF, libexif-dev
@@ -445,7 +511,6 @@ LIBGCRYPT - version >= 1.5.0, libgcrypt-dev
LIBGD, libgd-dev
LIBICAL, libical-dev
LIBKONQ, kde-baseapps-dev
LIBLZMA, xz-dev
LIBNOTIFY, libnotify-dev
LIBPCREVERSION, pcre-dev
LIBRSVG, librsvg-dev
@@ -467,12 +532,12 @@ LibExiv2, pkgconfig(exiv2)
LibKEduVocDocument, libkeduvocdocument-dev
LibKWorkspace, plasma-workspace-dev
LibKrb5, krb5-dev
LibLZMA, xz-dev
LibR, R-dev
LibSSH, libssh-dev
LibXml2, libxml2-dev
LibXslt, libxslt-bin
Libcap, libcap-dev
Libev, libev-dev
Lua51, lua-dev
LuaJIT, LuaJIT-dev
MDDS, mdds-dev
@@ -503,12 +568,16 @@ PAM, Linux-PAM-dev
PCAP, libpcap-dev
PCIUTILS, pciutils-dev
PCRE, pcre-dev
PCRE2, pcre2-dev
PNG, pkgconfig(libpng)
POPT, popt-dev
POSIX ACL, acl-dev
PULSEAUDIO, pulseaudio-dev
Phonon, phonon-dev
Phonon4Qt5, phonon-dev
Phonon4Qt6, phonon-dev
PlasmaActivities, plasma-activities-dev
PlasmaActivitiesStats, plasma-activities-stats-dev
PolkitQt5-1, polkit-qt-dev
Poppler, poppler-dev
PopplerQt4, poppler-dev
@@ -522,13 +591,12 @@ Python, python3-dev
Python.h, python3-dev
PythonLibs, python3-dev
PythonLibsUnix, python3-dev
QCoro5, qcoro-dev
QGpgme, gpgme-dev
QImageBlitz, qimageblitz-dev
QREncode, qrencode-dev
QRencode, qrencode-dev
QT, buildreq-kde
Qt::Quick, qt6declarative-dev
Qt::Svg, qt6svg-dev
Qalculate, libqalculate-dev
Qca-qt5, qca-qt5-dev
Qt4, qt-everywhere-opensource-src-dev
@@ -539,6 +607,7 @@ Qt5Keychain, qtkeychain-dev
Qt5LinguistTools, qttools-dev
Qt5Multimedia, qtmultimedia-dev
Qt5Network, qtbase-dev
Qt5NetworkAuth, pkgconfig(Qt5NetworkAuth)
Qt5QuickControls2, pkgconfig(Qt5QuickControls2)
Qt5QuickTemplates2, pkgconfig(Qt5QuickTemplates2)
Qt5QuickTest, pkgconfig(Qt5QuickTest)
@@ -555,6 +624,9 @@ Qt6Positioning, qt6positioning-dev
Qt6Quick, qt6declarative-dev
Qt6QuickTimeline, qt6quicktimeline-dev
Qt6ShaderTools, qt6shadertools-dev
Qt6WaylandClient, qt6wayland-dev
Qt::Quick, qt6declarative-dev
Qt::Svg, qt6svg-dev
R, R
READLINE, readline-dev
RSVG, librsvg-dev
@@ -598,6 +670,7 @@ WEBKIT, webkitgtk-dev
WEBPMUX, libwebp-dev
WSME, WSME
Wayland, wayland-dev
WaylandProtocols, wayland-protocols-dev plasma-wayland-protocols-dev
WaylandScanner, wayland
WebOb, pypi-webob
X, pkgconfig(x11)
@@ -778,7 +851,7 @@ debtcollector, debtcollector
decorator, pypi-decorator
deflate, zlib-dev
deflateBound in -lz, zlib-dev
designer, qttools-dev
designer, qt6tools-dev
desktop-file-install, desktop-file-utils
desktop-file-validate, desktop-file-utils
dialog, dialog
@@ -817,6 +890,7 @@ ez_setup, pypi-setuptools
ffi.h, libffi-dev
ffi_call, libffi-dev
fftw3.h, fftw-dev
file, file
find_packages, pypi-setuptools
flatbuffers/flatbuffers.h, FlatBuffers-dev
flatpak, flatpak-dev
@@ -829,6 +903,7 @@ fontconfig.h, fontconfig-dev
fontconfig/fontconfig.h, fontconfig-dev
freerdp2, freerdp-dev
freetype-config, freetype-dev
frozen/unordered_map.h, frozen-dev
fuse (via pkg-config), compat-fuse-soname2-dev fuse-dev
fuse, fuse-dev
fuse.h, fuse-dev
@@ -842,6 +917,7 @@ gawk, gawk
gc/gc.h, gc-dev
gcj, gcj
gconftool-2, GConf-dev
gcr-3, pkgconfig(gcr-3)
gcrypt.h, libgcrypt-dev
gdal-config, gdal-dev
gdbm.h, gdbm-dev
@@ -858,6 +934,7 @@ gevent, pypi-gevent
gflags, gflags-dev
gfortran, gfortran
gi, pygobject
gi-docgen, gi-docgen
gif_lib.h, giflib-dev
gio-2.0, glib-dev
giomm-2.4, glibmm-dev
@@ -979,7 +1056,7 @@ lber.h, openldap-dev
lcms2, lcms2-dev
lcms2.h, lcms2-dev
lcms2/lcms2.h, lcms2-dev
lconvert, qttools-dev
lconvert, qt6tools-dev
ldap.h, openldap-dev
ldap_parse_sort_control, openldap-dev
ldap_search in -lldap, openldap-dev
@@ -1020,7 +1097,6 @@ libhandy-0.0, libhandy-dev
libiberty.h, binutils-dev
libkmod.h, kmod-dev
libksba, libksba-dev
liblzma, xz-dev
libmnl/libmnl.h, libmnl-dev
libmpfr, mpfr-dev
libmspack >= 0.0.20040308alpha (via pkg-config), libmspack-dev
@@ -1029,6 +1105,7 @@ libnettle, nettle-dev nettle-lib
libnftnl, libnftnl-dev
libnl-1, libnl-dev
libnotify, libnotify-dev
libnova, libnova-dev
libpeas-1.0, libpeas-dev
libpipewire-0.2, pipewire-dev
libpng, pkgconfig(libpng)
@@ -1065,14 +1142,14 @@ libxml2 devel libraries, libxml2-dev
libxml2 library, libxml2-dev
libxslt/pattern.h, libxslt-dev
libz, zlib-dev
linguist, qttools-dev
linguist, qt6tools-dev
linux/xattr.h, attr-dev
llvm-config, llvm-dev
loadkeys, kbd
lrelease, qttools-dev
lrelease, qt6tools-dev
ltdl.h, libtool-dev
lua, lua-dev
lupdate, qttools-dev
lupdate, qt6tools-dev
lvm2app.h, LVM2-dev
lxml, pypi-lxml
lxqt, liblxqt-dev
@@ -1080,8 +1157,6 @@ lxqt-build-tools, lxqt-build-tools
lxqt-globalkeys, lxqt-globalkeys-dev
lxqt-globalkeys-ui, lxqt-globalkeys-dev
lz4.h, lz4-dev
lzma, xz-dev
lzma.h, xz-dev
lzo/lzoconf.h, lzo-dev
magic, file-dev
magic.h, file-dev
@@ -1194,7 +1269,7 @@ pg_config, postgresql-dev
php, php
php-config7, php
pip, pypi-pip
pixeltool, qttools-dev
pixeltool, qt6tools-dev
pixman, pkgconfig(pixman-1)
pkg-config, pkg-config
pkg.m4, pkg-config-dev
@@ -1232,11 +1307,11 @@ python-pcre, python-pcre
python-subunit, pypi(python_subunit)
pytz, pypi(pytz)
pyyaml, PyYAML
qcollectiongenerator, qttools-dev
qcollectiongenerator, qt6tools-dev
qdbuscpp2xml, qtbase-dev
qdbusxml2cpp, qtbase-dev
qhelpconverter, qttools-dev
qhelpgenerator, qttools-dev
qhelpconverter, qt6tools-dev
qhelpgenerator, qt6tools-dev
qhull/libqhull.h, qhull-dev
qjson/parser.h, qjson-dev
qlalr, qtbase-dev
@@ -1250,8 +1325,8 @@ qmlplugindump, qtdeclarative-dev
qmltestrunner, qtdeclarative-dev
qscxmlc, qtscxml-dev
qt5, buildreq-kde
qtattributionsscanner, qttools-dev
qtplugininfo, qttools-dev
qtattributionsscanner, qt6tools-dev
qtplugininfo, qt6tools-dev
qtwaylandscanner, qtwayland-dev
qvkgen, qtbase-dev
raptor, raptor2-dev
@@ -1267,6 +1342,7 @@ requests, pypi-requests
rest-0.7, rest-dev
retrying, retrying
rpm, pkgconfig(rpm)
rst2man rst2man.py, pypi-docutils
rst2man, pypi-docutils
rsvg-convert, librsvg
ruby, ruby
@@ -1279,6 +1355,7 @@ sbc, sbc-dev
scrollkeeper-config, rarian
scrollkeeper-preinstall, rarian
sdl2, SDL2-dev
sdl2-config, SDL2-dev
security/pam_appl.h, Linux-PAM-dev
selenium, pypi-selenium
setcap, libcap-dev
+22 -5
View File
@@ -59,7 +59,7 @@ class FileManager(object):
r"/usr/src.*",
r"/var.*"]
for bpath in banned_paths:
if re.search(r"^(/V3|/V4)?" + bpath, path):
if re.search(r"^(/V3|/V4|/VA)?" + bpath, path):
return True
return False
@@ -101,7 +101,7 @@ class FileManager(object):
exclude = True
for pat in patterns:
pat = re.compile(r"^(/V3|/V4)?" + pat)
pat = re.compile(r"^(/V3|/V4|/VA)?" + pat)
if pat.search(filename):
exclude = False
break
@@ -126,10 +126,10 @@ class FileManager(object):
# All patterns at this time and should always be prefixed by '^'
# but just in case add the following to strip just the '^'
pattern = pattern if not pattern.startswith('^') else pattern[1:]
pat = re.compile(r"^(/V3|/V4)?" + pattern)
pat = re.compile(r"^(/V3|/V4|/VA)?" + pattern)
match = pat.search(filename)
if match:
if len(match.groups()) > 0 and match.groups()[0] in ['/V3', '/V4']:
if len(match.groups()) > 0 and match.groups()[0] in ['/V3', '/V4', '/VA']:
norm_filename = filename.removeprefix(match.groups()[0])
if replacement != filename:
replacement = match.groups()[0] + replacement
@@ -236,7 +236,7 @@ class FileManager(object):
# Explicit file packaging
for k, v in self.file_maps.items():
for match_name in v['files']:
match = re.search(r"^/(V3|V4)", filename)
match = re.search(r"^/(V3|V4|VA)", filename)
norm_filename = filename if not match else filename.removeprefix(match.group())
if isinstance(match_name, str):
if norm_filename == match_name:
@@ -272,6 +272,16 @@ class FileManager(object):
if self.want_dev_split and self.file_pat_match(filename, r"^/usr/.*/include/.*\.h$", "dev"):
return
# Exclude Windows executables and DLLs unless otherwise configured
# Can't just skip them because they could be swept up in a python lib wildcard, for example
if re.search(r"[^/]+\.(exe|dll)$", filename):
if self.config.config_opts.get('allow_exe'):
util.print_warning("Allowing {} because allow_exe is true".format(filename))
else:
util.print_warning("Blocking {} because allow_exe is false".format(filename))
self.excludes.append(filename)
return
# if configured to do so, add .so files to the lib package instead of
# the dev package. THis is useful for packages with a plugin
# architecture like elfutils and mesa.
@@ -291,6 +301,7 @@ class FileManager(object):
(r"^/usr/share/info/", "info"),
(r"^/usr/share/abi/", "abi"),
(r"^/usr/share/qt5/examples/", "examples"),
(r"^/usr/share/qt6/examples/", "examples"),
(r"^/usr/share/omf", "main", "/usr/share/omf/*"),
(r"^/usr/share/installed-tests/", "tests"),
(r"^/usr/libexec/installed-tests/", "tests"),
@@ -339,11 +350,17 @@ class FileManager(object):
(r"^/usr/lib64/cmake/", "dev"),
(r"^/usr/lib32/cmake/", "dev32"),
(r"^/usr/lib/qt5/mkspecs/", "dev"),
(r"^/usr/lib/qt6/mkspecs/", "dev"),
(r"^/usr/lib64/qt5/mkspecs/", "dev"),
(r"^/usr/lib32/qt5/mkspecs/", "dev32"),
(r"^/usr/lib64/qt6/mkspecs/", "dev"),
(r"^/usr/lib32/qt6/mkspecs/", "dev32"),
(r"^/usr/lib/qt5/", "lib"),
(r"^/usr/lib/qt6/", "lib"),
(r"^/usr/lib64/qt5/", "lib"),
(r"^/usr/lib32/qt5/", "lib32"),
(r"^/usr/lib64/qt6/", "lib"),
(r"^/usr/lib32/qt6/", "lib32"),
(r"^/usr/lib/[a-zA-Z0-9._+-]*\.so$", so_dest),
(r"^/usr/lib64/libkdeinit5_[a-zA-Z0-9._+-]*\.so$", "lib"),
(r"^/usr/lib32/libkdeinit5_[a-zA-Z0-9._+-]*\.so$", "lib32"),
+1
View File
@@ -109,6 +109,7 @@ def commit_to_git(config, name, success):
call("git add profile_payload", check=False, stderr=subprocess.DEVNULL, cwd=path)
call("git add options.conf", check=False, stderr=subprocess.DEVNULL, cwd=path)
call("git add configure_misses", check=False, stderr=subprocess.DEVNULL, cwd=path)
call("git add etc_files", check=False, stderr=subprocess.DEVNULL, cwd=path)
call("git add whatrequires", check=False, stderr=subprocess.DEVNULL, cwd=path)
call("git add description", check=False, stderr=subprocess.DEVNULL, cwd=path)
call("git add attrs", check=False, stderr=subprocess.DEVNULL, cwd=path)
+1
View File
@@ -0,0 +1 @@
59FCF207FEA7F445
+1 -1
View File
@@ -178,7 +178,7 @@ def scan_for_licenses(srcdir, config, pkg_name):
# seen in the DPDK 20.11.3 tree, where the `LICENSES` directory is
# named `license` instead.
dirbase = os.path.basename(dirpath)
if re.search(r'^(LICENSES|license)$', dirbase) and re.search(r'\.txt$', name):
if re.search(r'^(LICENSES|licenses?|licensing)$', dirbase) and re.search(r'\.txt$', name):
license_from_copying_hash(os.path.join(dirpath, name),
srcdir, config, pkg_name)
+27 -7
View File
@@ -18,10 +18,25 @@
import os
import re
import sys
from util import print_fatal, write_out
def log_etc(lines):
"""Return the content of the START/etc ... END/etc section."""
etc = []
while True:
line = next(lines)
line = line.strip()
if line == 'END/etc':
break
if line.startswith('+'):
continue
etc.append(line)
return etc
def logcheck(pkg_loc):
"""Try to discover configuration options that were automatically switched off."""
log = os.path.join(pkg_loc, 'results', 'build.log')
@@ -52,7 +67,12 @@ def logcheck(pkg_loc):
pat = re.compile(r"^checking (?:for )?(.*?)\.\.\. no")
misses = []
for line in lines:
iter_lines = iter(lines)
for line in iter_lines:
if line.strip() == "START/etc":
etc = log_etc(iter_lines)
if etc:
write_log(pkg_loc, "etc_files", etc)
match = None
m = pat.search(line)
if m:
@@ -70,8 +90,8 @@ def logcheck(pkg_loc):
if match in blacklist:
print_fatal("Blacklisted configure-miss is forbidden: " + match)
misses.append("Blacklisted configure-miss is forbidden: " + match)
write_misses(pkg_loc, misses)
exit(1)
write_log(pkg_loc, 'configure_misses', misses)
sys.exit(1)
print("Configure miss: " + match)
misses.append("Configure miss: " + match)
@@ -79,9 +99,9 @@ def logcheck(pkg_loc):
if not misses:
return
write_misses(pkg_loc, misses)
write_log(pkg_loc, 'configure_misses', misses)
def write_misses(pkg_loc, misses):
"""Create configure_misses file with automatically disabled configuration options."""
write_out(os.path.join(pkg_loc, 'configure_misses'), '\n'.join(sorted(misses)))
def write_log(pkg_loc, fname, content):
"""Create log file with content."""
write_out(os.path.join(pkg_loc, fname), '\n'.join(sorted(content)))
+5
View File
@@ -483,6 +483,10 @@ class GPGVerifier(Verifier):
return None
# valid signature exists at package_sign_path, operate on it now
keyid = get_keyid(self.package_sign_path)
if keyid in self.config.keyid_blocklist:
self.print_result(False, err_msg='KNOWNBADACTOR: {}'.format(keyid))
self.quit()
# default location first
pubkey_loc = self.pubkey_path.format(keyid)
cache_key = os.path.join(KEY_CACHE_DIR, pubkey_loc)
@@ -528,6 +532,7 @@ VERIFIER_TYPES = {
'.bz2': GPGVerifier,
'.xz': GPGVerifier,
'.zip': GPGVerifier,
'.zst': GPGVerifier,
}
+64 -64
View File
@@ -2,67 +2,67 @@
# pkgconfig equivalent, to be added to BuildRequires. Please keep sorted.
# This file is sorted with LC_COLLATE=C
# Format: <qmake key>, <pkgconfig value>
3danimation, Qt53DAnimation
3dcore, Qt53DCore
3dextras, Qt53DExtras
3dinput, Qt53DInput
3dlogic, Qt53DLogic
3dquick, Qt53DQuick
3dquickanimation, Qt53DQuickAnimation
3dquickextras, Qt53DQuickExtras
3dquickinput, Qt53DQuickInput
3dquickrender, Qt53DQuickRender
3dquickscene2d, Qt53DQuickScene2D
3drender, Qt53DRender
bluetooth, Qt5Bluetooth
charts, Qt5Charts
concurrent, Qt5Concurrent
core, Qt5Core
datavisualization, Qt5DataVisualization
dbus, Qt5DBus
declarative, Qt5Declarative
designer, Qt5Designer
gamepad, Qt5Gamepad
gui, Qt5Gui
help, Qt5Help
location, Qt5Location
multimedia, Qt5Multimedia
multimediawidgets, Qt5MultimediaWidgets
network, Qt5Network
networkauth, Qt5NetworkAuth
nfc, Qt5Nfc
opengl, Qt5OpenGL
openglextensions, Qt5OpenGLExtensions
positioning, Qt5Positioning
printsupport, Qt5PrintSupport
purchasing, Qt5Purchasing
qml, Qt5Qml
qmltest, Qt5QuickTest
quick, Qt5Quick
quickcontrols2, Qt5QuickControls2
quickwidgets, Qt5QuickWidgets
remoteobjects, Qt5RemoteObjects
script, Qt5Script
scripttools, Qt5ScriptTools
scxml, Qt5Scxml
sensors, Qt5Sensors
serialbus, Qt5SerialBus
serialport, Qt5SerialPort
sql, Qt5Sql
svg, Qt5Svg
testlib, Qt5Test
texttospeech, Qt5TextToSpeech
uitools, Qt5UiTools
waylandclient, Qt5WaylandClient
waylandcompositor, Qt5WaylandCompositor
webchannel, Qt5WebChannel
webengine, Qt5WebEngine
webenginecore, Qt5WebEngineCore
webenginewidgets, Qt5WebEngineWidgets
webkit, Qt5WebKit
webkitwidgets, Qt5WebKitWidgets
websockets, Qt5WebSockets
widgets, Qt5Widgets
x11extras, Qt5X11Extras
xml, Qt5Xml
xmlpatterns, Qt5XmlPatterns
3danimation, Qt63DAnimation
3dcore, Qt63DCore
3dextras, Qt63DExtras
3dinput, Qt63DInput
3dlogic, Qt63DLogic
3dquick, Qt63DQuick
3dquickanimation, Qt63DQuickAnimation
3dquickextras, Qt63DQuickExtras
3dquickinput, Qt63DQuickInput
3dquickrender, Qt63DQuickRender
3dquickscene2d, Qt63DQuickScene2D
3drender, Qt63DRender
bluetooth, Qt6Bluetooth
charts, Qt6Charts
concurrent, Qt6Concurrent
core, Qt6Core
datavisualization, Qt6DataVisualization
dbus, Qt6DBus
declarative, Qt6Declarative
designer, Qt6Designer
gamepad, Qt6Gamepad
gui, Qt6Gui
help, Qt6Help
location, Qt6Location
multimedia, Qt6Multimedia
multimediawidgets, Qt6MultimediaWidgets
network, Qt6Network
networkauth, Qt6NetworkAuth
nfc, Qt6Nfc
opengl, Qt6OpenGL
openglextensions, Qt6OpenGLExtensions
positioning, Qt6Positioning
printsupport, Qt6PrintSupport
purchasing, Qt6Purchasing
qml, Qt6Qml
qmltest, Qt6QuickTest
quick, Qt6Quick
quickcontrols2, Qt6QuickControls2
quickwidgets, Qt6QuickWidgets
remoteobjects, Qt6RemoteObjects
script, Qt6Script
scripttools, Qt6ScriptTools
scxml, Qt6Scxml
sensors, Qt6Sensors
serialbus, Qt6SerialBus
serialport, Qt6SerialPort
sql, Qt6Sql
svg, Qt6Svg
testlib, Qt6Test
texttospeech, Qt6TextToSpeech
uitools, Qt6UiTools
waylandclient, Qt6WaylandClient
waylandcompositor, Qt6WaylandCompositor
webchannel, Qt6WebChannel
webengine, Qt6WebEngine
webenginecore, Qt6WebEngineCore
webenginewidgets, Qt6WebEngineWidgets
webkit, Qt6WebKit
webkitwidgets, Qt6WebKitWidgets
websockets, Qt6WebSockets
widgets, Qt6Widgets
x11extras, Qt6X11Extras
xml, Qt6Xml
xmlpatterns, Qt6XmlPatterns
+481 -171
View File
File diff suppressed because it is too large Load Diff
+34 -1
View File
@@ -17,6 +17,7 @@
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
import bz2
import configparser
import os
import re
@@ -25,6 +26,7 @@ import tarfile
import zipfile
import download
import zstandard as zstd
from util import do_regex, get_sha1sum, print_fatal, write_out
@@ -50,6 +52,10 @@ class Source():
"""Determine compression type."""
if self.url.lower().endswith(('.zip', 'jar')):
self.type = 'zip'
elif self.url.lower().endswith(('.bz2')) and not self.url.lower().endswith(('.tar.bz2')):
self.type = 'bz2'
elif self.url.lower().endswith('.zst'):
self.type = 'zst'
else:
self.type = 'tar'
@@ -78,6 +84,19 @@ class Source():
print_fatal("Not a valid tar file.")
sys.exit(1)
def set_zst_prefix(self):
"""Determine prefix folder name of tar.zst file."""
with tarfile.open(fileobj=zstd.open(self.path, 'rb'), mode='r|') as content:
lines = content.getnames()
if len(lines) == 0:
print_fatal("Zstd compressed tar file doesn't appear to have any content")
sys.exit(1)
elif len(lines) > 1:
self.prefix = os.path.commonpath(lines)
def set_bz2_prefix(self):
"""No prefix for plain bz2 archives."""
def set_zip_prefix(self):
"""Determine prefix folder name of zip file."""
if zipfile.is_zipfile(self.path):
@@ -108,11 +127,25 @@ class Source():
with tarfile.open(self.path) as content:
content.extractall(path=extraction_path)
def extract_bz2(self, extraction_path):
"""Extract plain bz2 file in path."""
with bz2.BZ2File(self.path, 'rb') as content:
data = content.read()
newfile = self.path.rsplit('/', 1)[1]
newfile = newfile.rsplit('.bz2', 1)[0]
with open(os.path.join(extraction_path), mode='wb') as f:
f.write(data)
def extract_zip(self, extraction_path):
"""Extract zip in path."""
with zipfile.ZipFile(self.path, 'r') as content:
content.extractall(path=extraction_path)
def extract_zst(self, extraction_path):
"""Extract zst in path."""
with tarfile.open(fileobj=zstd.open(self.path, 'rb'), mode='r|') as content:
content.extractall(path=extraction_path)
def convert_version(ver_str, name):
"""Remove disallowed characters from the version."""
@@ -120,7 +153,7 @@ def convert_version(ver_str, name):
# them out with expensive regular expressions
banned_subs = ["x86.64", "source", "src", "all", "bin", "release", "rh",
"ga", ".ce", "lcms", "onig", "linux", "gc", "sdk", "orig",
"jurko", "%2f", "%2F", "%20"]
"jurko", "%2f", "%2F", "%20", "x265"]
# package names may be modified in the version string by adding "lib" for
# example. Remove these from the name before trying to remove the name from
+48 -1
View File
@@ -402,6 +402,7 @@ class TestBuildreq(unittest.TestCase):
should be sufficient.
"""
conf = config.Config("")
conf.config_opts['use_ninja'] = False
with tempfile.TemporaryDirectory() as tmpd:
os.mkdir(os.path.join(tmpd, 'subdir'))
open(os.path.join(tmpd, 'setup.py'), 'w').close()
@@ -418,6 +419,7 @@ class TestBuildreq(unittest.TestCase):
should be sufficient.
"""
conf = config.Config("")
conf.config_opts['use_ninja'] = False
with tempfile.TemporaryDirectory() as tmpd:
os.mkdir(os.path.join(tmpd, 'subdir'))
open(os.path.join(tmpd, 'CMakeLists.txt'), 'w').close()
@@ -434,6 +436,7 @@ class TestBuildreq(unittest.TestCase):
should be sufficient.
"""
conf = config.Config("")
conf.config_opts['use_ninja'] = False
with tempfile.TemporaryDirectory() as tmpd:
os.mkdir(os.path.join(tmpd, 'subdir'))
open(os.path.join(tmpd, 'SConstruct'), 'w').close()
@@ -450,6 +453,7 @@ class TestBuildreq(unittest.TestCase):
should be sufficient.
"""
conf = config.Config("")
conf.config_opts['use_ninja'] = False
with tempfile.TemporaryDirectory() as tmpd:
os.mkdir(os.path.join(tmpd, 'subdir'))
open(os.path.join(tmpd, 'meson.build'), 'w').close()
@@ -480,6 +484,7 @@ class TestBuildreq(unittest.TestCase):
buildreq.pypidata.get_pypi_metadata = MagicMock(return_value=content)
with tempfile.TemporaryDirectory() as tmpd:
conf = config.Config(tmpd)
conf.config_opts['use_ninja'] = False
os.mkdir(os.path.join(tmpd, 'subdir'))
open(os.path.join(tmpd, 'subdir', 'pyproject.toml'), 'w').close()
self.reqs.scan_for_configure(os.path.join(tmpd, 'subdir'), "", conf)
@@ -512,6 +517,7 @@ class TestBuildreq(unittest.TestCase):
m_open = mock_open(read_data=content)
with tempfile.TemporaryDirectory() as tmpd:
conf = config.Config(tmpd)
conf.config_opts['use_ninja'] = False
os.mkdir(os.path.join(tmpd, 'subdir'))
open(os.path.join(tmpd, 'subdir', 'pyproject.toml'), 'w').close()
open(os.path.join(tmpd, 'pypi.json'), 'w').close()
@@ -537,6 +543,7 @@ class TestBuildreq(unittest.TestCase):
with tempfile.TemporaryDirectory() as tmpd:
conf = config.Config(tmpd)
conf.config_opts['use_ninja'] = False
os.mkdir(os.path.join(tmpd, 'subdir'))
open(os.path.join(tmpd, 'subdir', 'setup.py'), 'w').close()
open(os.path.join(tmpd, 'subdir', 'requires.txt'), 'w').close()
@@ -546,6 +553,21 @@ class TestBuildreq(unittest.TestCase):
self.reqs.add_setup_py_requires.assert_called_once()
self.reqs.grab_python_requirements.assert_called_once()
def test_scan_for_configure_ninja(self):
"""
Test scan_for_configure when ninja is enabled.
"""
conf = config.Config("")
conf.config_opts['use_ninja'] = True
with tempfile.TemporaryDirectory() as tmpd:
os.mkdir(os.path.join(tmpd, 'subdir'))
open(os.path.join(tmpd, 'setup.py'), 'w').close()
self.reqs.scan_for_configure(tmpd, "", conf)
self.assertEqual(self.reqs.buildreqs,
set(['buildreq-distutils3', 'ninja']))
def test_parse_cmake_pkg_check_modules(self):
"""
Test parse_cmake to ensure accurate detection of versioned and
@@ -621,12 +643,30 @@ class TestBuildreq(unittest.TestCase):
"valid": "valid",
"valid_but_commented": "valid_but_commented",
"different_name": "another_name",
"qt6.module1": "qt6module1",
"qt6.module2": "qt6module2",
"kf6.module3": "kf6module3",
"kf6.module4": "kf6module4",
".module5": "namodule5",
".module6": "namodule6"
}
content = '''
find_package(valid)
#find_package(foo)
# find_package(valid_but_commented)
find_package(different_name)
find_package(Qt6 stuff
module1
module2)
find_package(KF6 stuff
module3
module4
)
find_package(NOT_HANDLED_NAMESPACE stuff
module5
module6
)
'''
with tempfile.TemporaryDirectory() as tmpd:
with open(os.path.join(tmpd, 'fname'), 'w') as f:
@@ -634,7 +674,14 @@ find_package(different_name)
self.reqs.parse_cmake(os.path.join(tmpd, 'fname'), cmake_modules, False)
self.assertEqual(self.reqs.buildreqs,
set(['valid', 'another_name']))
set(['valid',
'another_name',
'qt6module1',
'qt6module2',
'kf6module3',
'kf6module4',
'namodule5',
'namodule6']))
def test_r_desc_field_begin(self):
"""Test parsing of the first R description field."""
+67
View File
@@ -33,6 +33,7 @@ class TestFiles(unittest.TestCase):
"/opt/two",
"/V3/opt/two",
"/V4/opt/two",
"/VA/opt/two",
"/usr/etc/three",
"/usr/local/four",
"/usr/src/five",
@@ -58,6 +59,7 @@ class TestFiles(unittest.TestCase):
self.fm.push_package_file('/etc/test-fn')
self.fm.push_package_file('/V3/etc/test-fn')
self.fm.push_package_file('/V4/etc/test-fn')
self.fm.push_package_file('/VA/etc/test-fn')
self.assertTrue(self.fm.has_banned)
self.assertFalse(self.fm.newfiles_printed)
@@ -84,6 +86,7 @@ class TestFiles(unittest.TestCase):
self.assertTrue(self.fm.compat_exclude('/usr/lib64/libfoo.so'))
self.assertTrue(self.fm.compat_exclude('/V3/usr/lib64/libfoo.so'))
self.assertTrue(self.fm.compat_exclude('/V4/usr/lib64/libfoo.so'))
self.assertTrue(self.fm.compat_exclude('/VA/usr/lib64/libfoo.so'))
def test_compat_exclude_not_compat_mode(self):
"""
@@ -94,6 +97,7 @@ class TestFiles(unittest.TestCase):
self.assertFalse(self.fm.compat_exclude('/usr/lib64/libfoo.so'))
self.assertFalse(self.fm.compat_exclude('/V3/usr/lib64/libfoo.so'))
self.assertFalse(self.fm.compat_exclude('/V4/usr/lib64/libfoo.so'))
self.assertFalse(self.fm.compat_exclude('/VA/usr/lib64/libfoo.so'))
def test_file_pat_match(self):
"""
@@ -107,6 +111,8 @@ class TestFiles(unittest.TestCase):
self.fm.push_package_file.assert_called_with('/V3/test-fn', 'main')
self.assertTrue(self.fm.file_pat_match('/V4/test-fn', r'^/test-fn', 'main'))
self.fm.push_package_file.assert_called_with('/V4/test-fn', 'main')
self.assertTrue(self.fm.file_pat_match('/VA/test-fn', r'^/test-fn', 'main'))
self.fm.push_package_file.assert_called_with('/VA/test-fn', 'main')
def test_file_pat_match_exclude(self):
"""
@@ -117,6 +123,7 @@ class TestFiles(unittest.TestCase):
self.assertTrue(self.fm.file_pat_match('/test-fn', r'^/test-fn', 'main'))
self.assertTrue(self.fm.file_pat_match('/V3/test-fn', r'^/test-fn', 'main'))
self.assertTrue(self.fm.file_pat_match('/V4/test-fn', r'^/test-fn', 'main'))
self.assertTrue(self.fm.file_pat_match('/VA/test-fn', r'^/test-fn', 'main'))
self.fm.push_package_file.assert_not_called()
def test_file_pat_match_replacement(self):
@@ -130,6 +137,8 @@ class TestFiles(unittest.TestCase):
self.fm.push_package_file.assert_called_with('/V3/testfn', 'main')
self.assertTrue(self.fm.file_pat_match('/V4/test-fn', r'/test-fn', 'main', '/testfn'))
self.fm.push_package_file.assert_called_with('/V4/testfn', 'main')
self.assertTrue(self.fm.file_pat_match('/VA/test-fn', r'/test-fn', 'main', '/testfn'))
self.fm.push_package_file.assert_called_with('/VA/testfn', 'main')
def test_file_pat_match_replacement_no_glob(self):
"""
@@ -143,6 +152,42 @@ class TestFiles(unittest.TestCase):
self.fm.push_package_file.assert_called_with('/V3/test-fn', 'main')
self.assertTrue(self.fm.file_pat_match('/V4/test-fn', r'^/test-fn', 'main', '/testfn'))
self.fm.push_package_file.assert_called_with('/V4/test-fn', 'main')
self.assertTrue(self.fm.file_pat_match('/VA/test-fn', r'^/test-fn', 'main', '/testfn'))
self.fm.push_package_file.assert_called_with('/VA/test-fn', 'main')
def test_file_windows_exe_not_allowed(self):
"""
Test that Windows exe and dll files are excluded
"""
self.fm.push_package_file = MagicMock()
self.fm.config.config_opts['allow_exe'] = False
self.fm.push_file('/usr/bin/foo.exe', 'test')
self.fm.push_file('/usr/lib64/foo.dll', 'test')
self.fm.push_file('/usr/lib/python3.12/site-packages/nsist/msvcrt/x86/api-ms-win-core-console-l1-1-0.dll', 'test')
self.fm.push_file('/usr/lib/python3.12/site-packages/installer/_scripts/t32.exe', 'test')
self.assertIn('/usr/bin/foo.exe', self.fm.excludes)
self.assertIn('/usr/lib64/foo.dll', self.fm.excludes)
self.assertIn('/usr/lib/python3.12/site-packages/nsist/msvcrt/x86/api-ms-win-core-console-l1-1-0.dll', self.fm.excludes)
self.assertIn('/usr/lib/python3.12/site-packages/installer/_scripts/t32.exe', self.fm.excludes)
def test_file_windows_exe_allowed(self):
"""
Test that Windows exe and dll files are not excluded
"""
self.fm.push_package_file = MagicMock()
self.fm.config.config_opts['allow_exe'] = True
self.fm.push_file('/usr/bin/foo.exe', 'test')
self.fm.push_file('/usr/lib64/foo.dll', 'test')
self.fm.push_file('/usr/lib/python3.12/site-packages/nsist/msvcrt/x86/api-ms-win-core-console-l1-1-0.dll', 'test')
self.fm.push_file('/usr/lib/python3.12/site-packages/installer/_scripts/t32.exe', 'test')
self.assertIn('/usr/bin/foo.exe', self.fm.files)
self.assertIn('/usr/lib64/foo.dll', self.fm.files)
self.assertIn('/usr/lib/python3.12/site-packages/nsist/msvcrt/x86/api-ms-win-core-console-l1-1-0.dll', self.fm.files)
self.assertIn('/usr/lib/python3.12/site-packages/installer/_scripts/t32.exe', self.fm.files)
self.assertNotIn('/usr/bin/foo.exe', self.fm.excludes)
self.assertNotIn('/usr/lib64/foo.dll', self.fm.excludes)
self.assertNotIn('/usr/lib/python3.12/site-packages/nsist/msvcrt/x86/api-ms-win-core-console-l1-1-0.dll', self.fm.excludes)
self.assertNotIn('/usr/lib/python3.12/site-packages/installer/_scripts/t32.exe', self.fm.excludes)
def test_file_pat_match_no_match(self):
"""
@@ -203,6 +248,9 @@ class TestFiles(unittest.TestCase):
self.fm.push_file('/V4/foobar', '')
calls = [call('/V4/foobar', 'foobar-extras')]
self.fm.push_package_file.assert_has_calls(calls)
self.fm.push_file('/VA/foobar', '')
calls = [call('/VA/foobar', 'foobar-extras')]
self.fm.push_package_file.assert_has_calls(calls)
def test_push_package_file_glob_empty(self):
"""
@@ -220,6 +268,9 @@ class TestFiles(unittest.TestCase):
self.fm.push_file('/V4/leftglobrightglob', '')
calls = [call('/V4/leftglob*rightglob', 'foobar-extras')]
self.fm.push_package_file.assert_has_calls(calls)
self.fm.push_file('/VA/leftglobrightglob', '')
calls = [call('/VA/leftglob*rightglob', 'foobar-extras')]
self.fm.push_package_file.assert_has_calls(calls)
def test_push_package_file_glob_left_match(self):
"""
@@ -237,6 +288,9 @@ class TestFiles(unittest.TestCase):
self.fm.push_file('/V4/leftglobrightglob', '')
calls = [call('/V4/leftglob*', 'foobar-extras')]
self.fm.push_package_file.assert_has_calls(calls)
self.fm.push_file('/VA/leftglobrightglob', '')
calls = [call('/VA/leftglob*', 'foobar-extras')]
self.fm.push_package_file.assert_has_calls(calls)
def test_push_package_file_glob_right_match(self):
"""
@@ -254,6 +308,9 @@ class TestFiles(unittest.TestCase):
self.fm.push_file('/V4/leftglobrightglob', '')
calls = [call('/V4/*rightglob', 'foobar-extras')]
self.fm.push_package_file.assert_has_calls(calls)
self.fm.push_file('/VA/leftglobrightglob', '')
calls = [call('/VA/*rightglob', 'foobar-extras')]
self.fm.push_package_file.assert_has_calls(calls)
def test_push_package_file_glob_leftright_match(self):
"""
@@ -271,6 +328,9 @@ class TestFiles(unittest.TestCase):
self.fm.push_file('/V4/leftglobstuffrightglob', '')
calls = [call('/V4/leftglob*rightglob', 'foobar-extras')]
self.fm.push_package_file.assert_has_calls(calls)
self.fm.push_file('/VA/leftglobstuffrightglob', '')
calls = [call('/VA/leftglob*rightglob', 'foobar-extras')]
self.fm.push_package_file.assert_has_calls(calls)
def test_push_package_file_glob_multi_match(self):
"""
@@ -288,6 +348,9 @@ class TestFiles(unittest.TestCase):
self.fm.push_file('/V4/leftglobstuff/stuffrightglob', '')
calls = [call('/V4/leftglob*/*rightglob', 'foobar-extras')]
self.fm.push_package_file.assert_has_calls(calls)
self.fm.push_file('/VA/leftglobstuff/stuffrightglob', '')
calls = [call('/VA/leftglob*/*rightglob', 'foobar-extras')]
self.fm.push_package_file.assert_has_calls(calls)
def test_push_file_setuid(self):
"""
@@ -313,6 +376,8 @@ class TestFiles(unittest.TestCase):
self.fm.push_package_file.assert_has_calls([call('/V3/usr/bin/test', 'bin')])
self.fm.push_file('/V4/usr/bin/test', '')
self.fm.push_package_file.assert_has_calls([call('/V4/usr/bin/test', 'bin')])
self.fm.push_file('/VA/usr/bin/test', '')
self.fm.push_package_file.assert_has_calls([call('/VA/usr/bin/test', 'bin')])
def test_push_file_match_pkg_name_dependency(self):
"""
@@ -327,6 +392,8 @@ class TestFiles(unittest.TestCase):
self.fm.push_package_file.assert_has_calls([call('/V3/usr/share/doc/testball/*', 'doc')])
self.fm.push_file('/V4/usr/share/doc/testball/', 'testball')
self.fm.push_package_file.assert_has_calls([call('/V4/usr/share/doc/testball/*', 'doc')])
self.fm.push_file('/VA/usr/share/doc/testball/', 'testball')
self.fm.push_package_file.assert_has_calls([call('/VA/usr/share/doc/testball/*', 'doc')])
def test_push_file_no_match(self):
"""