Compare commits
1
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
72d60228d0 |
No files matched your search
Executable
+84
@@ -0,0 +1,84 @@
|
||||
#!/usr/bin/env python3
|
||||
# Copyright 2019 Martijn Braam
|
||||
# Copyright 2019 Oliver Smith
|
||||
# SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
import json
|
||||
import os
|
||||
import requests
|
||||
|
||||
# Require environment vars
|
||||
for key in ["BPO_API_ENDPOINT",
|
||||
"BPO_API_HOST",
|
||||
"BPO_ARCH",
|
||||
"BPO_BRANCH",
|
||||
"BPO_JOB_ID",
|
||||
"BPO_JOB_NAME",
|
||||
"BPO_TOKEN_FILE",
|
||||
"BPO_PAYLOAD_FILES", # one file per line
|
||||
"BPO_PAYLOAD_IS_JSON", # set to "1" to enable
|
||||
"BPO_PKGNAME",
|
||||
"BPO_VERSION", # $pkgver-r$pkgrel
|
||||
]:
|
||||
if key not in os.environ:
|
||||
print("ERROR: missing environment variable: " + key)
|
||||
exit(1)
|
||||
|
||||
# Parse and check files
|
||||
files = os.environ["BPO_PAYLOAD_FILES"].split("\n")
|
||||
for path in files:
|
||||
if not os.path.exists(path):
|
||||
print("ERROR: file not found: " + path)
|
||||
exit(1)
|
||||
|
||||
# Load token
|
||||
with open(os.path.expanduser(os.environ["BPO_TOKEN_FILE"]),
|
||||
encoding="utf-8") as handle:
|
||||
token = handle.read().strip()
|
||||
|
||||
# Load other env vars
|
||||
url = (os.environ["BPO_API_HOST"] + "/api/job-callback/" +
|
||||
os.environ["BPO_API_ENDPOINT"])
|
||||
is_json = (os.environ["BPO_PAYLOAD_IS_JSON"] == "1")
|
||||
|
||||
# Prepare HTTP headers
|
||||
headers = {"X-BPO-Arch": os.environ["BPO_ARCH"],
|
||||
"X-BPO-Branch": os.environ["BPO_BRANCH"],
|
||||
"X-BPO-Job-Id": os.environ["BPO_JOB_ID"],
|
||||
"X-BPO-Job-Name": os.environ["BPO_JOB_NAME"],
|
||||
"X-BPO-Token": token,
|
||||
"X-BPO-Pkgname": os.environ["BPO_PKGNAME"],
|
||||
"X-BPO-Version": os.environ["BPO_VERSION"]}
|
||||
|
||||
# Submit JSON
|
||||
if is_json:
|
||||
if len(files) > 1:
|
||||
print("ERROR: json mode doesn't support multiple input files")
|
||||
exit(1)
|
||||
|
||||
# Send contents of file as HTTP POST with json payload
|
||||
with open(files[0], encoding="utf-8") as handle:
|
||||
data = handle.read()
|
||||
data = json.loads(data)
|
||||
|
||||
print("Sending JSON to: " + url)
|
||||
response = requests.post(url, json=data, headers=headers)
|
||||
else: # Submit blobs
|
||||
blobs = []
|
||||
for path in files:
|
||||
print("Appending: " + path)
|
||||
filename = os.path.basename(path)
|
||||
# Send contents of file as HTTP POST with multipart/formdata payload
|
||||
blobs.append(("file[]", (filename,
|
||||
open(path, "rb"),
|
||||
"application/octet-stream")))
|
||||
|
||||
print("Uploading to: " + url)
|
||||
response = requests.post(url, files=blobs, headers=headers)
|
||||
|
||||
if response.status_code > 399:
|
||||
print("Error occurred:")
|
||||
print(response.content.decode())
|
||||
exit(1)
|
||||
else:
|
||||
print(response.content.decode())
|
||||
@@ -1,22 +0,0 @@
|
||||
#!/bin/sh -e
|
||||
# Description: run apkbuild-lint on modified APKBUILDs
|
||||
# Options: native
|
||||
# Use 'native' because it requires git commit history.
|
||||
# https://postmarketos.org/pmb-ci
|
||||
|
||||
if [ "$(id -u)" = 0 ]; then
|
||||
set -x
|
||||
wget "https://gitlab.com/postmarketOS/ci-common/-/raw/master/install_pmbootstrap.sh"
|
||||
sh ./install_pmbootstrap.sh
|
||||
exec su "${TESTUSER:-pmos}" -c "sh -e $0"
|
||||
fi
|
||||
|
||||
# Wrap pmbootstrap to use this repository for --aports
|
||||
pmaports="$(cd "$(dirname "$0")"/..; pwd -P)"
|
||||
_pmbootstrap="$(command -v pmbootstrap)"
|
||||
pmbootstrap() {
|
||||
"$_pmbootstrap" --aports="$pmaports" "$@"
|
||||
}
|
||||
|
||||
.ci/lib/apkbuild_linting.py
|
||||
|
||||
@@ -1 +0,0 @@
|
||||
lib/build_changed_aports.sh
|
||||
@@ -1 +0,0 @@
|
||||
lib/build_changed_aports.sh
|
||||
@@ -1 +0,0 @@
|
||||
lib/build_changed_aports.sh
|
||||
@@ -1 +0,0 @@
|
||||
lib/build_changed_aports.sh
|
||||
@@ -1 +0,0 @@
|
||||
lib/build_changed_aports.sh
|
||||
@@ -1 +0,0 @@
|
||||
lib/build_changed_aports.sh
|
||||
@@ -1,20 +0,0 @@
|
||||
#!/bin/sh -e
|
||||
# Copyright 2023 Oliver Smith
|
||||
# SPDX-License-Identifier: GPL-3.0-or-later
|
||||
# Description: check pkgver/pkgrel bumps, amount of changed pkgs etc
|
||||
# Options: native
|
||||
# Use 'native' because it requires git commit history.
|
||||
# https://postmarketos.org/pmb-ci
|
||||
|
||||
if [ "$(id -u)" = 0 ]; then
|
||||
set -x
|
||||
# In .gitlab-ci.yml currently .ci/pytest.sh runs before this and
|
||||
# already downloads and runs install_pmbootstrap.sh.
|
||||
if ! [ -e install_pmbootstrap.sh ]; then
|
||||
wget "https://gitlab.com/postmarketOS/ci-common/-/raw/master/install_pmbootstrap.sh"
|
||||
sh ./install_pmbootstrap.sh
|
||||
fi
|
||||
exec su "${TESTUSER:-pmos}" -c "sh -e $0"
|
||||
fi
|
||||
|
||||
.ci/lib/check_changed_aports_versions.py
|
||||
@@ -1,13 +0,0 @@
|
||||
#!/bin/sh -e
|
||||
# Description: editorconfig-checker: lint for trailing whitespaces etc.
|
||||
# https://postmarketos.org/pmb-ci
|
||||
|
||||
if [ "$(id -u)" = 0 ]; then
|
||||
set -x
|
||||
apk -q add \
|
||||
editorconfig-checker
|
||||
exec su "${TESTUSER:-build}" -c "sh -e $0"
|
||||
fi
|
||||
|
||||
set -x
|
||||
ec
|
||||
@@ -1,14 +0,0 @@
|
||||
#!/bin/sh -e
|
||||
# Description: lint CI related python scripts/tests
|
||||
# https://postmarketos.org/pmb-ci
|
||||
|
||||
if [ "$(id -u)" = 0 ]; then
|
||||
set -x
|
||||
apk -q add py3-flake8
|
||||
exec su "${TESTUSER:-build}" -c "sh -e $0"
|
||||
fi
|
||||
|
||||
set -x
|
||||
|
||||
# shellcheck disable=SC2046
|
||||
flake8 --ignore E501,F401,E722,W504,W605 $(find .ci -name '*.py')
|
||||
-47
@@ -1,47 +0,0 @@
|
||||
#!/bin/sh -e
|
||||
# Description: check various bad patterns with grep
|
||||
# https://postmarketos.org/pmb-ci
|
||||
|
||||
if [ "$(id -u)" = 0 ]; then
|
||||
set -x
|
||||
apk -q add grep
|
||||
exec su "${TESTUSER:-build}" -c "sh -e $0"
|
||||
fi
|
||||
|
||||
# Find CHANGEMEs in APKBUILDs
|
||||
if grep -qr '(CHANGEME!)' -- *; then
|
||||
echo "ERROR: Please replace '(CHANGEME!)' in the following files:"
|
||||
grep --color=always -r '(CHANGEME!)' -- *
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# DTBs installed to /usr/share/db
|
||||
# shellcheck disable=SC2016
|
||||
if grep -qr 'INSTALL_DTBS_PATH="$pkgdir"/usr/share/dtb' device/; then
|
||||
echo 'ERROR: Please do not install dtbs to /usr/share/dtb!'
|
||||
echo 'ERROR: Unless you have a good reason not to, please put them in /boot/dtbs'
|
||||
echo 'ERROR: Files that need fixing:'
|
||||
# shellcheck disable=SC2016
|
||||
grep --color=always -r 'INSTALL_DTBS_PATH="$pkgdir"/usr/share/dtb' device/
|
||||
exit 1
|
||||
fi
|
||||
|
||||
|
||||
# Find old mkinitfs paths (pre mkinitfs 2.0)
|
||||
if grep -qr '/etc/postmarketos-mkinitfs' -- *; then
|
||||
echo "ERROR: Please replace '/etc/postmarketos-mkinitfs' with '/usr/share/mkinitfs' in the following files:"
|
||||
grep --color=always -r '/etc/postmarketos-mkinitfs' -- *
|
||||
exit 1
|
||||
fi
|
||||
if grep -qr '/usr/share/postmarketos-mkinitfs' -- *; then
|
||||
echo "ERROR: Please replace '/usr/share/postmarketos-mkinitfs' with '/usr/share/mkinitfs' in the following files:"
|
||||
grep --color=always -r '/usr/share/postmarketos-mkinitfs' -- *
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Direct sourcing of deviceinfo
|
||||
if grep --exclude='source_deviceinfo' -qEr 'source /etc/deviceinfo|\. /etc/deviceinfo' -- *; then
|
||||
echo 'ERROR: Please source the source_deviceinfo script instead of sourcing deviceinfo directly!'
|
||||
grep --color=always --exclude='rootfs-usr-share-misc-source_deviceinfo' -Er 'source /etc/deviceinfo|\. /etc/deviceinfo' -- *
|
||||
exit 1
|
||||
fi
|
||||
@@ -1,16 +0,0 @@
|
||||
#!/bin/sh -e
|
||||
# Description: check modified kernel configs
|
||||
# Options: native
|
||||
# Use 'native' because it requires running pmbootstrap.
|
||||
# https://postmarketos.org/pmb-ci
|
||||
|
||||
if [ "$(id -u)" = 0 ]; then
|
||||
set -x
|
||||
wget "https://gitlab.com/postmarketOS/ci-common/-/raw/master/install_pmbootstrap.sh"
|
||||
sh ./install_pmbootstrap.sh
|
||||
exec su "${TESTUSER:-pmos}" -c "sh -e $0"
|
||||
fi
|
||||
|
||||
export PYTHONUNBUFFERED=1
|
||||
|
||||
.ci/lib/check_changed_kernels.py
|
||||
@@ -1 +0,0 @@
|
||||
../testcases/add_pmbootstrap_to_import_path
|
||||
@@ -1,31 +0,0 @@
|
||||
#!/usr/bin/env python3
|
||||
# SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
import common
|
||||
import os.path
|
||||
import sys
|
||||
|
||||
if __name__ == "__main__":
|
||||
common.add_upstream_git_remote()
|
||||
apkbuilds = {file for file in common.get_changed_files(removed=False)
|
||||
if os.path.basename(file) == "APKBUILD"}
|
||||
if len(apkbuilds) < 1:
|
||||
print("No APKBUILDs to lint")
|
||||
sys.exit(0)
|
||||
|
||||
packages = []
|
||||
for apkbuild in apkbuilds:
|
||||
if apkbuild.startswith("temp/") or apkbuild.startswith("cross/"):
|
||||
print(f"NOTE: Skipping linting of {apkbuild}")
|
||||
continue
|
||||
packages.append(os.path.basename(os.path.dirname(apkbuild)))
|
||||
if len(packages) < 1:
|
||||
print("No APKBUILDs to lint")
|
||||
sys.exit(0)
|
||||
|
||||
result = common.run_pmbootstrap(["-q", "lint"] + packages, output_return=True)
|
||||
|
||||
if len(result) > 0:
|
||||
print("Linting issues found:")
|
||||
print(result)
|
||||
sys.exit(1)
|
||||
@@ -1,83 +0,0 @@
|
||||
#!/usr/bin/env python3
|
||||
# Copyright 2021 Oliver Smith
|
||||
# SPDX-License-Identifier: GPL-3.0-or-later
|
||||
import sys
|
||||
|
||||
# Same dir
|
||||
import common
|
||||
|
||||
# pmbootstrap
|
||||
import add_pmbootstrap_to_import_path
|
||||
import pmb.parse
|
||||
import pmb.parse._apkbuild
|
||||
import pmb.helpers.pmaports
|
||||
|
||||
|
||||
def build_strict(packages, arch):
|
||||
common.run_pmbootstrap(["build_init"])
|
||||
common.run_pmbootstrap(["--details-to-stdout", "--no-ccache", "build",
|
||||
"--strict", "--force",
|
||||
"--arch", arch, ] + list(packages))
|
||||
|
||||
|
||||
def verify_checksums(packages, arch):
|
||||
# Only do this with one build-{arch} job
|
||||
arch_verify = "x86_64"
|
||||
if arch != arch_verify:
|
||||
print(f"NOTE: doing checksum verification in build-{arch_verify} job,"
|
||||
" not here.")
|
||||
return
|
||||
|
||||
if len(packages) == 0:
|
||||
print("no packages changed, not doing any checksums verification")
|
||||
return
|
||||
|
||||
common.run_pmbootstrap(["build_init"])
|
||||
common.run_pmbootstrap(["--details-to-stdout", "checksum", "--verify"] +
|
||||
list(packages))
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
# Architecture to build for (as in build-{arch})
|
||||
if len(sys.argv) != 2:
|
||||
print("usage: build_changed_aports.py ARCH")
|
||||
sys.exit(1)
|
||||
arch = sys.argv[1]
|
||||
|
||||
# Get and print modified packages
|
||||
common.add_upstream_git_remote()
|
||||
packages = common.get_changed_packages()
|
||||
|
||||
# Package count sanity check
|
||||
common.get_changed_packages_sanity_check(len(packages))
|
||||
|
||||
# [ci:skip-build]: verify checksums and stop
|
||||
verify_only = common.commit_message_has_string("[ci:skip-build]")
|
||||
if verify_only:
|
||||
print("WARNING: not building changed packages ([ci:skip-build])!")
|
||||
print("verifying checksums: " + ", ".join(packages))
|
||||
verify_checksums(packages, arch)
|
||||
sys.exit(0)
|
||||
|
||||
# Prepare "args" to use pmbootstrap code
|
||||
sys.argv = ["pmbootstrap", "chroot"]
|
||||
args = pmb.parse.arguments()
|
||||
|
||||
# Filter out packages that can't be built for given arch
|
||||
# (Iterate over copy of packages, because we modify it in this loop)
|
||||
for package in packages.copy():
|
||||
apkbuild_path = pmb.helpers.pmaports.find(args, package)
|
||||
apkbuild = pmb.parse._apkbuild.apkbuild(f"{apkbuild_path}/APKBUILD")
|
||||
|
||||
if not pmb.helpers.pmaports.check_arches(apkbuild["arch"], arch):
|
||||
print(f"{package}: not enabled for {arch}, skipping")
|
||||
packages.remove(package)
|
||||
|
||||
# No packages: skip build
|
||||
if len(packages) == 0:
|
||||
print(f"no packages changed, which can be built for {arch}")
|
||||
sys.exit(0)
|
||||
|
||||
# Build packages
|
||||
print(f"building in strict mode for {arch}: {', '.join(packages)}")
|
||||
build_strict(packages, arch)
|
||||
@@ -1,19 +0,0 @@
|
||||
#!/bin/sh -e
|
||||
# Description: build modified packages for this architecture
|
||||
# Options: native slow
|
||||
# https://postmarketos.org/pmb-ci
|
||||
|
||||
if [ "$(id -u)" = 0 ]; then
|
||||
set -x
|
||||
wget "https://gitlab.com/postmarketOS/ci-common/-/raw/master/install_pmbootstrap.sh"
|
||||
sh ./install_pmbootstrap.sh
|
||||
exec su "${TESTUSER:-pmos}" -c "sh -e $0"
|
||||
fi
|
||||
|
||||
export PYTHONUNBUFFERED=1
|
||||
|
||||
# Get the architecture from the symlink we are running
|
||||
arch="$(echo "$0" | cut -d '-' -f 2 | cut -d '.' -f 1)"
|
||||
|
||||
set -x
|
||||
.ci/lib/build_changed_aports.py "$arch"
|
||||
@@ -1,156 +0,0 @@
|
||||
#!/usr/bin/env python3
|
||||
# Copyright 2021 Oliver Smith
|
||||
# SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
import glob
|
||||
import tempfile
|
||||
import sys
|
||||
import subprocess
|
||||
|
||||
# Same dir
|
||||
import common
|
||||
|
||||
# pmbootstrap
|
||||
import add_pmbootstrap_to_import_path # noqa
|
||||
import pmb.parse
|
||||
import pmb.parse.version
|
||||
import pmb.helpers.logging
|
||||
|
||||
|
||||
def get_package_version(args, package, revision, check=True):
|
||||
# Redirect stderr to /dev/null, so git doesn't complain about files not
|
||||
# existing in upstream branch for new packages
|
||||
stderr = None
|
||||
if not check:
|
||||
stderr = subprocess.DEVNULL
|
||||
|
||||
# Run something like "git show upstream/master:main/hello-world/APKBUILD"
|
||||
pmaports_dir = common.get_pmaports_dir()
|
||||
pattern = pmaports_dir + "/**/" + package + "/APKBUILD"
|
||||
path = glob.glob(pattern, recursive=True)[0][len(pmaports_dir + "/"):]
|
||||
apkbuild_content = common.run_git(["show", revision + ":" + path], check,
|
||||
stderr)
|
||||
if not apkbuild_content:
|
||||
return None
|
||||
|
||||
# Save APKBUILD to a temporary path and parse it from there. (Not the best
|
||||
# way to do things, but good enough for this CI script.)
|
||||
with tempfile.TemporaryDirectory() as tempdir:
|
||||
with open(tempdir + "/APKBUILD", "w", encoding="utf-8") as handle:
|
||||
handle.write(apkbuild_content)
|
||||
parsed = pmb.parse.apkbuild(tempdir + "/APKBUILD", False, False)
|
||||
|
||||
return parsed["pkgver"] + "-r" + parsed["pkgrel"]
|
||||
|
||||
|
||||
def version_compare_operator(result):
|
||||
""" :param result: return value from pmb.parse.version.compare() """
|
||||
if result == -1:
|
||||
return "<"
|
||||
elif result == 0:
|
||||
return "=="
|
||||
elif result == 1:
|
||||
return ">"
|
||||
|
||||
raise RuntimeError("Unexpected version_compare_operator input: " + result)
|
||||
|
||||
|
||||
def exit_with_error_message():
|
||||
branch = common.get_upstream_branch()
|
||||
print()
|
||||
print("ERROR: Modified package(s) don't have an increased version or a")
|
||||
print("new package has a nonzero pkgrel!")
|
||||
print()
|
||||
print("This can happen if you added a new package with a nonzero")
|
||||
print("pkgrel, or if you did not change the pkgver/pkgrel")
|
||||
print("variables in the APKBUILDs. Or you did change them, but the")
|
||||
print(f"packages have been updated in the official '{branch}' branch, and")
|
||||
print("now your versions are not higher anymore.")
|
||||
print()
|
||||
print("Your options:")
|
||||
print("a) If you made changes to the packages, and did not increase the")
|
||||
print(" pkgrel/pkgver: increase them now, and force push your branch.")
|
||||
print(" => https://postmarketos.org/howto-bump-pkgrel-pkgver")
|
||||
print("b) If you had already increased the package versions, rebase on")
|
||||
print(f" '{branch}', increase the versions again and then force push:")
|
||||
print(" => https://postmarketos.org/rebase")
|
||||
print("c) If you made a change, that does not require rebuilding the")
|
||||
print(" packages, such as only changing the arch=... line: you can")
|
||||
print(" disable this check by adding '[ci:skip-vercheck]' to the")
|
||||
print(" latest commit message, then force push.")
|
||||
print()
|
||||
print("Thank you and sorry for the inconvenience.")
|
||||
exit(1)
|
||||
|
||||
|
||||
def check_versions(args, packages):
|
||||
error = False
|
||||
|
||||
# Get relevant commits: compare HEAD against upstream branch or HEAD~1
|
||||
# (the latter if this CI check is running on upstream branch). Note that
|
||||
# for the common.get_changed_files() code, we don't check against
|
||||
# upstream branch HEAD, but against the latest common ancestor. This is not
|
||||
# desired here, since we already know what packages changed, and really
|
||||
# want to check if the version was increased towards *current* upstream
|
||||
# branch HEAD.
|
||||
commit = f"upstream/{common.get_upstream_branch()}"
|
||||
if common.run_git(["rev-parse", "HEAD"]) == common.run_git(["rev-parse",
|
||||
commit]):
|
||||
print(f"NOTE: {commit} is on same commit as HEAD, comparing"
|
||||
" HEAD against HEAD~1.")
|
||||
commit = "HEAD~1"
|
||||
|
||||
for package in packages:
|
||||
# Get versions, skip new packages
|
||||
head = get_package_version(args, package, "HEAD")
|
||||
upstream = get_package_version(args, package, commit, False)
|
||||
if not upstream:
|
||||
if head.rpartition('r')[2] != "0":
|
||||
print(f"- {package}: {head} (HEAD) (new package) [ERROR]")
|
||||
error = True
|
||||
else:
|
||||
print(f"- {package}: {head} (HEAD) (new package)")
|
||||
continue
|
||||
|
||||
# Compare head and upstream versions
|
||||
result = pmb.parse.version.compare(head, upstream)
|
||||
if result != 1:
|
||||
error = True
|
||||
|
||||
# Print result line ("- hello-world: 1-r2 (HEAD) > 1-r1 (HEAD~1)")
|
||||
formatstr = "- {}: {} (HEAD) {} {} ({})"
|
||||
if result != 1:
|
||||
formatstr += " [ERROR]"
|
||||
operator = version_compare_operator(result)
|
||||
print(formatstr.format(package, head, operator, upstream, commit))
|
||||
|
||||
if error:
|
||||
exit_with_error_message()
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
# Get and print modified packages
|
||||
common.add_upstream_git_remote()
|
||||
packages = common.get_changed_packages()
|
||||
print(f"Changed packages: {packages}")
|
||||
|
||||
# Verify modified package count
|
||||
common.get_changed_packages_sanity_check(len(packages))
|
||||
if len(packages) == 0:
|
||||
print("no aports changed in this branch")
|
||||
exit(0)
|
||||
|
||||
# Potentially skip this check
|
||||
if common.commit_message_has_string("[ci:skip-vercheck]"):
|
||||
print("WARNING: not checking for changed package versions"
|
||||
" ([ci:skip-vercheck])!")
|
||||
exit(0)
|
||||
|
||||
# Initialize args (so we can use pmbootstrap's APKBUILD parsing)
|
||||
sys.argv = ["pmbootstrap.py", "chroot"]
|
||||
args = pmb.parse.arguments()
|
||||
pmb.helpers.logging.init(args)
|
||||
|
||||
# Verify package versions
|
||||
print("checking changed package versions...")
|
||||
check_versions(args, packages)
|
||||
@@ -1,83 +0,0 @@
|
||||
#!/usr/bin/env python3
|
||||
# Copyright 2023 Oliver Smith
|
||||
# SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
import glob
|
||||
import tempfile
|
||||
import sys
|
||||
import subprocess
|
||||
|
||||
# Same dir
|
||||
import common
|
||||
|
||||
# pmbootstrap
|
||||
import add_pmbootstrap_to_import_path # noqa
|
||||
import pmb.parse
|
||||
import pmb.helpers.logging
|
||||
|
||||
|
||||
def check_kconfig(args, pkgnames):
|
||||
last_failed = None
|
||||
for i in range(len(pkgnames)):
|
||||
pkgname = pkgnames[i]
|
||||
print(f" ({i+1}/{len(pkgnames)}) {pkgname}")
|
||||
|
||||
apkbuild_path = pmb.helpers.pmaports.find(args, pkgname)
|
||||
apkbuild = pmb.parse._apkbuild.apkbuild(f"{apkbuild_path}/APKBUILD")
|
||||
|
||||
options = []
|
||||
|
||||
for opt in apkbuild["options"]:
|
||||
if "pmb:kconfigcheck" in opt:
|
||||
options += [opt]
|
||||
|
||||
if len(options):
|
||||
options.sort()
|
||||
print(f'options="{" ".join(options)}"')
|
||||
|
||||
if "!pmb:kconfigcheck" in apkbuild["options"]:
|
||||
print("skipped (!pmb:kconfigcheck)")
|
||||
continue
|
||||
|
||||
if not pmb.parse.kconfig.check(args, pkgname, details=True):
|
||||
last_failed = pkgname
|
||||
|
||||
return last_failed
|
||||
|
||||
|
||||
def show_error(last_failed):
|
||||
print("")
|
||||
print("Please adjust your kernel config. This is required for getting your"
|
||||
" patch merged.")
|
||||
print("")
|
||||
print("Edit your kernel config:")
|
||||
print(f" pmbootstrap kconfig edit {last_failed}")
|
||||
print("")
|
||||
print("Test this kernel config again:")
|
||||
print(f" pmbootstrap kconfig check {last_failed}")
|
||||
print("")
|
||||
print("Run this check again (on all kernels you modified):")
|
||||
print(" pmbootstrap ci kconfig")
|
||||
print("")
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
common.add_upstream_git_remote()
|
||||
pkgnames = common.get_changed_kernels()
|
||||
print(f"Changed kernels: {pkgnames}")
|
||||
|
||||
if len(pkgnames) == 0:
|
||||
print("No kernels changed in this branch")
|
||||
exit(0)
|
||||
|
||||
# Initialize args (so we can use pmbootstrap's kconfig parsing)
|
||||
sys.argv = ["pmbootstrap", "kconfig", "check"]
|
||||
args = pmb.parse.arguments()
|
||||
pmb.helpers.logging.init(args)
|
||||
|
||||
print("Running kconfig check on changed kernels...")
|
||||
last_failed = check_kconfig(args, pkgnames)
|
||||
|
||||
if last_failed:
|
||||
show_error(last_failed)
|
||||
exit(1)
|
||||
@@ -1,200 +0,0 @@
|
||||
#!/usr/bin/env python3
|
||||
# Copyright 2021 Oliver Smith
|
||||
# SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
# Various functions used in CI scripts
|
||||
|
||||
import configparser
|
||||
import os
|
||||
import subprocess
|
||||
import sys
|
||||
|
||||
|
||||
cache = {}
|
||||
|
||||
|
||||
def get_pmaports_dir():
|
||||
global cache
|
||||
if "pmaports_dir" in cache:
|
||||
return cache["pmaports_dir"]
|
||||
ret = os.path.realpath(os.path.join(os.path.dirname(__file__) + "/../.."))
|
||||
cache["pmaports_dir"] = ret
|
||||
return ret
|
||||
|
||||
|
||||
def run_git(parameters, check=True, stderr=None):
|
||||
""" Run git in the pmaports dir and return the output """
|
||||
cmd = ["git", "-C", get_pmaports_dir()] + parameters
|
||||
try:
|
||||
return subprocess.check_output(cmd, stderr=stderr).decode()
|
||||
except subprocess.CalledProcessError:
|
||||
if check:
|
||||
raise
|
||||
return None
|
||||
|
||||
|
||||
def add_upstream_git_remote():
|
||||
""" Add a remote pointing to postmarketOS/pmaports. """
|
||||
run_git(["remote", "add", "upstream",
|
||||
"https://gitlab.com/postmarketOS/pmaports.git"], False)
|
||||
run_git(["fetch", "-q", "upstream"])
|
||||
|
||||
|
||||
def commit_message_has_string(needle):
|
||||
return needle in run_git(["show", "-s", "--format=full", "HEAD"])
|
||||
|
||||
|
||||
def run_pmbootstrap(parameters, output_return=False):
|
||||
""" Run pmbootstrap with the pmaports dir as --aports """
|
||||
cmd = ["pmbootstrap", "--aports", get_pmaports_dir()] + parameters
|
||||
stdout = subprocess.PIPE if output_return else None
|
||||
result = subprocess.run(cmd, stdout=stdout, universal_newlines=True)
|
||||
result.check_returncode()
|
||||
if output_return:
|
||||
return result.stdout
|
||||
|
||||
|
||||
def get_upstream_branch():
|
||||
""" Use pmaports.cfg from current branch (e.g. "v20.05_fix-ci") and
|
||||
channels.cfg from master to retrieve the upstream branch.
|
||||
|
||||
:returns: branch name, e.g. "v20.05" """
|
||||
global cache
|
||||
if "upstream_branch" in cache:
|
||||
return cache["upstream_branch"]
|
||||
|
||||
# Get channel (e.g. "stable") from pmaports.cfg
|
||||
# https://postmarketos.org/pmaports.cfg
|
||||
pmaports_dir = get_pmaports_dir()
|
||||
pmaports_cfg = configparser.ConfigParser()
|
||||
pmaports_cfg.read(f"{pmaports_dir}/pmaports.cfg")
|
||||
channel = pmaports_cfg["pmaports"]["channel"]
|
||||
|
||||
# Get branch_pmaports (e.g. "v20.05") from channels.cfg
|
||||
# https://postmarketos.org/channels.cfg
|
||||
channels_cfg_str = run_git(["show", "upstream/master:channels.cfg"])
|
||||
channels_cfg = configparser.ConfigParser()
|
||||
channels_cfg.read_string(channels_cfg_str)
|
||||
assert channel in channels_cfg, \
|
||||
f"Channel '{channel}' from pmaports.cfg in your branch is unknown." \
|
||||
" This appears to be an old branch, consider recreating your change" \
|
||||
" on top of master."
|
||||
|
||||
ret = channels_cfg[channel]["branch_pmaports"]
|
||||
cache["upstream_branch"] = ret
|
||||
return ret
|
||||
|
||||
|
||||
def get_changed_files(removed=True):
|
||||
""" Get all changed files and print them, as well as the branch and the
|
||||
commit that was used for the diff.
|
||||
:param removed: also return removed files (default: True)
|
||||
:returns: set of changed files
|
||||
"""
|
||||
branch_upstream = f"upstream/{get_upstream_branch()}"
|
||||
commit_head = run_git(["rev-parse", "HEAD"])[:-1]
|
||||
commit_upstream = run_git(["rev-parse", branch_upstream])[:-1]
|
||||
print("commit HEAD: " + commit_head)
|
||||
print(f"commit {branch_upstream}: f{commit_upstream}")
|
||||
|
||||
# Check if we are HEAD on the upstream branch
|
||||
if commit_head == commit_upstream:
|
||||
# then compare with previous commit
|
||||
commit = "HEAD~1"
|
||||
else:
|
||||
# otherwise compare with latest common ancestor
|
||||
commit = run_git(["merge-base", branch_upstream, "HEAD"])[:-1]
|
||||
print("comparing HEAD with: " + commit)
|
||||
|
||||
# Changed files
|
||||
ret = set()
|
||||
print("changed file(s):")
|
||||
for file in run_git(["diff", "--name-only", commit, "HEAD"]).splitlines():
|
||||
message = " " + file
|
||||
if not os.path.exists(file):
|
||||
message += " (deleted)"
|
||||
if removed:
|
||||
ret.add(file)
|
||||
else:
|
||||
ret.add(file)
|
||||
print(message)
|
||||
return ret
|
||||
|
||||
|
||||
def get_changed_packages_sanity_check(count):
|
||||
for mark in ["[ci:ignore-count]", "[ci:skip-build]"]:
|
||||
if commit_message_has_string(mark):
|
||||
print("NOTE: package count sanity check skipped (" + mark + ").")
|
||||
return
|
||||
if count <= 10:
|
||||
return
|
||||
|
||||
branch = get_upstream_branch()
|
||||
print()
|
||||
print("ERROR: Too many packages have changed!")
|
||||
print()
|
||||
print("This is a sanity check, so we don't end up building packages that")
|
||||
print("have not been modified. CI won't run for more than three hours")
|
||||
print("anyway.")
|
||||
print()
|
||||
print("Your options:")
|
||||
print("a) If you *did not* modify everything listed above, then rebase")
|
||||
print(f" your branch on the official postmarketOS/pmaports.git {branch}")
|
||||
print(" branch. Feel free to ask in the chat for help if you need any.")
|
||||
print("b) If you *did* modify all these packages, and you assume that")
|
||||
print(" they will build within one hour: skip this sanity check by")
|
||||
print(" adding '[ci:ignore-count]' to the commit message (then force")
|
||||
print(" push).")
|
||||
print("c) If you *did* modify all these packages, and you are sure that")
|
||||
print(" they won't build in time, please add '[ci:skip-build]' to the")
|
||||
print(" commit message (then force push). Make sure that all packages")
|
||||
print(" build with 'pmbootstrap build --strict'!")
|
||||
print()
|
||||
print("Thank you and sorry for the inconvenience.")
|
||||
|
||||
sys.exit(1)
|
||||
|
||||
|
||||
def get_changed_packages():
|
||||
ret = set()
|
||||
for file in get_changed_files():
|
||||
dirname, filename = os.path.split(file)
|
||||
|
||||
# Skip files:
|
||||
# * in the root dir of pmaports (e.g. README.md)
|
||||
# * path with a dot (e.g. .ci/, device/.shared-patches/)
|
||||
if not dirname or file.startswith(".") or "/." in file:
|
||||
continue
|
||||
|
||||
if filename != "APKBUILD":
|
||||
# Walk up directories until we (eventually) find the package
|
||||
# the file belongs to (could be in a subdirectory of a package)
|
||||
while dirname and not os.path.exists(os.path.join(dirname, "APKBUILD")):
|
||||
dirname = os.path.dirname(dirname)
|
||||
|
||||
# Unable to find APKBUILD the file belong to
|
||||
if not dirname:
|
||||
# ... maybe the package was deleted entirely?
|
||||
if not os.path.exists(file):
|
||||
continue
|
||||
|
||||
# Weird, file does not belong to any package?
|
||||
# Here we just warn, there is an extra check
|
||||
# to make sure that files are organized properly.
|
||||
print(f"WARNING: Changed file {file} does not belong to any package")
|
||||
continue
|
||||
|
||||
elif not os.path.exists(file):
|
||||
continue # APKBUILD was deleted
|
||||
|
||||
ret.add(os.path.basename(dirname))
|
||||
|
||||
return ret
|
||||
|
||||
|
||||
def get_changed_kernels():
|
||||
ret = []
|
||||
for pkgname in get_changed_packages():
|
||||
if pkgname.startswith("linux-"):
|
||||
ret += [pkgname]
|
||||
return ret
|
||||
@@ -1,17 +0,0 @@
|
||||
#!/bin/sh -e
|
||||
# Copyright 2023 Oliver Smith
|
||||
# SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
if ! mount | grep -q /proc/sys/fs/binfmt_misc; then
|
||||
echo "Mounting binfmt_misc"
|
||||
mount -t binfmt_misc none /proc/sys/fs/binfmt_misc
|
||||
fi
|
||||
|
||||
if id "build" > /dev/null 2>&1; then
|
||||
echo "User 'build' exists already"
|
||||
else
|
||||
echo "Creating build user"
|
||||
adduser -D build
|
||||
chown -R build:build .
|
||||
echo 'build ALL=(ALL) NOPASSWD: ALL' >> /etc/sudoers
|
||||
fi
|
||||
@@ -1,47 +0,0 @@
|
||||
#!/bin/sh -e
|
||||
# Copyright 2023 Oliver Smith
|
||||
# SPDX-License-Identifier: GPL-3.0-or-later
|
||||
# Description: lint with various python tests
|
||||
# Options: native
|
||||
# Use 'native' because it requires pmbootstrap.
|
||||
# https://postmarketos.org/pmb-ci
|
||||
|
||||
if [ "$(id -u)" = 0 ]; then
|
||||
set -x
|
||||
wget "https://gitlab.com/postmarketOS/ci-common/-/raw/master/install_pmbootstrap.sh"
|
||||
sh ./install_pmbootstrap.sh pytest
|
||||
exec su "${TESTUSER:-pmos}" -c "sh -e $0"
|
||||
fi
|
||||
|
||||
# Require pytest to be installed on the host system
|
||||
if [ -z "$(command -v pytest)" ]; then
|
||||
echo "ERROR: pytest command not found, make sure it is in your PATH."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Wrap pmbootstrap to use this repository for --aports
|
||||
pmaports="$(cd "$(dirname "$0")"/..; pwd -P)"
|
||||
_pmbootstrap="$(command -v pmbootstrap)"
|
||||
pmbootstrap() {
|
||||
"$_pmbootstrap" --aports="$pmaports" "$@"
|
||||
}
|
||||
|
||||
# Make sure that the work folder format is up to date, and that there are no
|
||||
# mounts from aborted test cases (pmbootstrap#1595)
|
||||
pmbootstrap work_migrate
|
||||
pmbootstrap -q shutdown
|
||||
|
||||
# Make sure we have a valid device (pmbootstrap#1128)
|
||||
device="$(pmbootstrap config device)"
|
||||
deviceinfo="$pmaports/device/*/device-$device/deviceinfo"
|
||||
# shellcheck disable=SC2086
|
||||
if ! [ -e $deviceinfo ]; then
|
||||
echo "ERROR: Could not find deviceinfo file for selected device '$device'."
|
||||
echo "Expected path: $deviceinfo"
|
||||
echo "Maybe you have switched to a branch where your device does not exist?"
|
||||
echo "Use 'pmbootstrap config device qemu-amd64' to switch to a valid device."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Run testcases
|
||||
pytest -vv -x --tb=native "$pmaports/.ci/testcases" "$@"
|
||||
@@ -1,52 +0,0 @@
|
||||
#!/bin/sh -e
|
||||
# Copyright 2023 Oliver Smith
|
||||
# SPDX-License-Identifier: GPL-3.0-or-later
|
||||
# Description: lint all shell scripts
|
||||
# https://postmarketos.org/pmb-ci
|
||||
|
||||
DIR="$(cd "$(dirname "$0")/.." && pwd -P)"
|
||||
|
||||
if [ "$(id -u)" = 0 ]; then
|
||||
set -x
|
||||
apk -q add shellcheck
|
||||
exec su "${TESTUSER:-build}" -c "sh -e $0"
|
||||
fi
|
||||
|
||||
# Shell: shellcheck
|
||||
sh_files="
|
||||
./main/mdss-fb-init-hack/mdss-fb-init-hack.sh
|
||||
./main/osk-sdl/unlock.sh
|
||||
./main/postmarketos-base/rootfs-usr-lib-firmwareload.sh
|
||||
./main/postmarketos-base-ui/rootfs-etc-NetworkManager-dispatcher.d-99-dns-filter.sh
|
||||
./main/postmarketos-base-ui/rootfs-etc-NetworkManager-dispatcher.d-85-tethering
|
||||
./main/postmarketos-installkernel/installkernel-pmos
|
||||
./main/postmarketos-initramfs/init.sh
|
||||
./main/postmarketos-initramfs/init_functions.sh
|
||||
./main/postmarketos-mkinitfs-hook-debug-shell/20-debug-shell.sh
|
||||
./main/postmarketos-mkinitfs-hook-netboot/netboot.sh
|
||||
./main/postmarketos-update-kernel/update-kernel.sh
|
||||
./main/ttyescape/*.post-install
|
||||
./main/unl0kr/unlock.sh
|
||||
./main/msm-firmware-loader/*.post-install
|
||||
./device/community/soc-qcom-sdm845/call_audio_idle_suspend_workaround.sh
|
||||
|
||||
$(find . -path './main/postmarketos-ui-*/*.sh')
|
||||
$(find . -path './main/postmarketos-ui-*/*.pre-install')
|
||||
$(find . -path './main/postmarketos-ui-*/*.post-install')
|
||||
$(find . -path './main/postmarketos-ui-*/*.pre-upgrade')
|
||||
$(find . -path './main/postmarketos-ui-*/*.post-upgrade')
|
||||
$(find . -path './main/postmarketos-ui-*/*.pre-deinstall')
|
||||
$(find . -path './main/postmarketos-ui-*/*.post-deinstall')
|
||||
|
||||
$(find . -name '*.trigger')
|
||||
$(find . -path './main/devicepkg-dev/*.sh')
|
||||
$(find . -path './main/postmarketos-mvcfg/*.sh')
|
||||
|
||||
$(find . -path './.ci/**.sh')
|
||||
"
|
||||
|
||||
for file in $sh_files; do
|
||||
echo "Test with shellcheck: $file"
|
||||
cd "$DIR/$(dirname "$file")"
|
||||
shellcheck -e SC1008 -x "$(basename "$file")"
|
||||
done
|
||||
@@ -1,43 +0,0 @@
|
||||
#!/usr/bin/env python3
|
||||
# Copyright 2021 Oliver Smith
|
||||
# SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
import shutil
|
||||
import sys
|
||||
import os
|
||||
import importlib
|
||||
import importlib.util
|
||||
from distutils.sysconfig import get_python_lib
|
||||
|
||||
|
||||
def path_pmbootstrap():
|
||||
""" Find the pmbootstrap installation folder, so we can import the Python
|
||||
code from there.
|
||||
returns: pmbootstrap installation folder
|
||||
"""
|
||||
# This variable is set by pmbootstrap 1.52 and later
|
||||
# If it's undefined, try to find 'pmbootstrap' in path
|
||||
bin = os.environ.get("PMBOOTSTRAP_CMD") or shutil.which("pmbootstrap")
|
||||
|
||||
if not bin:
|
||||
print("ERROR: 'pmbootstrap' not found in $PATH")
|
||||
sys.exit(1)
|
||||
|
||||
# Resolve the symlink and verify the folder
|
||||
dir = os.path.dirname(os.path.realpath(bin))
|
||||
if os.path.exists(dir + "/pmb/__init__.py"):
|
||||
return dir
|
||||
|
||||
dir = get_python_lib()
|
||||
if os.path.exists(dir + "/pmb/__init__.py"):
|
||||
return dir
|
||||
|
||||
# Symlink not set up properly
|
||||
print("ERROR: 'pmbootstrap' is not a symlink to pmbootstrap.py")
|
||||
sys.exit(1)
|
||||
|
||||
|
||||
# Check if pmb module can be imported
|
||||
if importlib.util.find_spec("pmb") is None:
|
||||
# Add pmbootstrap dir to import path
|
||||
sys.path.append(os.path.realpath(path_pmbootstrap()))
|
||||
@@ -1,25 +0,0 @@
|
||||
#!/usr/bin/env python3
|
||||
# Copyright 2021 Oliver Smith
|
||||
# SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
import add_pmbootstrap_to_import_path
|
||||
import pmb.parse
|
||||
import pytest
|
||||
import sys
|
||||
import os
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def args(request):
|
||||
# Initialize args
|
||||
pmaports = os.path.realpath(f"{os.path.dirname(__file__)}/../..")
|
||||
sys.argv = ["pmbootstrap",
|
||||
"--aports", pmaports,
|
||||
"--log", "$WORK/log_testsuite_pmaports.txt"
|
||||
"chroot"]
|
||||
args = pmb.parse.arguments()
|
||||
|
||||
# Initialize logging
|
||||
pmb.helpers.logging.init(args)
|
||||
request.addfinalizer(pmb.helpers.logging.logfd.close)
|
||||
return args
|
||||
@@ -1,138 +0,0 @@
|
||||
#!/usr/bin/env python3
|
||||
# Copyright 2021 Oliver Smith
|
||||
# SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
import glob
|
||||
import pytest
|
||||
import sys
|
||||
import os
|
||||
|
||||
import add_pmbootstrap_to_import_path
|
||||
import pmb.parse
|
||||
import pmb.parse._apkbuild
|
||||
|
||||
|
||||
def device_dependency_check(apkbuild, path):
|
||||
""" Raise an error if a device package has a dependency that is not allowed
|
||||
(e.g. because it should be in a subpackage instead). """
|
||||
|
||||
for depend in apkbuild["depends"]:
|
||||
if depend == "linux-firmware-none":
|
||||
continue
|
||||
if (depend.startswith("firmware-") or
|
||||
depend.startswith("linux-firmware")):
|
||||
raise RuntimeError("Firmware package '" + depend + "' found in"
|
||||
" depends of " + path + ". These go into"
|
||||
" subpackages now, see"
|
||||
" <https://postmarketos.org/devicepkg>.")
|
||||
if depend == "mesa-dri-gallium":
|
||||
raise RuntimeError(f"{path}: mesa-dri-gallium shouldn't be in"
|
||||
" depends anymore (see pmaports!3478)")
|
||||
|
||||
|
||||
def test_aports_device(args):
|
||||
"""
|
||||
Various tests performed on the /device/*/device-* aports.
|
||||
"""
|
||||
for path in glob.iglob(args.aports + "/device/*/device-*/APKBUILD"):
|
||||
apkbuild = pmb.parse.apkbuild(path)
|
||||
|
||||
# Depends: Require "postmarketos-base"
|
||||
depend_flag = False
|
||||
for dependency in apkbuild["depends"]:
|
||||
if "postmarketos-base" == dependency or "postmarketos-base>" in dependency:
|
||||
depend_flag = True
|
||||
if not depend_flag:
|
||||
raise RuntimeError("Missing 'postmarketos-base' in depends of " +
|
||||
path)
|
||||
|
||||
# Depends: Must not have firmware packages
|
||||
for depend in apkbuild["depends"]:
|
||||
device_dependency_check(apkbuild, path)
|
||||
|
||||
# Architecture
|
||||
device = apkbuild["pkgname"][len("device-"):]
|
||||
deviceinfo = pmb.parse.deviceinfo(args, device)
|
||||
if "".join(apkbuild["arch"]) != deviceinfo["arch"]:
|
||||
raise RuntimeError("wrong architecture, please change to arch=\"" +
|
||||
deviceinfo["arch"] + "\": " + path)
|
||||
if "!archcheck" not in apkbuild["options"]:
|
||||
raise RuntimeError("!archcheck missing in options= line: " + path)
|
||||
|
||||
if deviceinfo["flash_kernel_on_update"] == "true" \
|
||||
and "postmarketos-update-kernel" not in apkbuild["depends"]:
|
||||
raise RuntimeError(
|
||||
"Deviceinfo indicates this device supports automatic kernel"
|
||||
" flashing on update, but doesn't depend on"
|
||||
" 'postmarketos-update-kernel'. Please add the missing"
|
||||
" dependency.")
|
||||
|
||||
|
||||
def test_aports_device_kernel(args):
|
||||
"""
|
||||
Verify the kernels specified in the device packages:
|
||||
* Kernel must not be in depends when kernels are in subpackages
|
||||
* Check if only one kernel is defined in depends
|
||||
"""
|
||||
|
||||
# Iterate over device aports
|
||||
for path in glob.glob(args.aports + "/device/*/device-*/APKBUILD"):
|
||||
# Parse apkbuild and kernels from subpackages
|
||||
apkbuild = pmb.parse.apkbuild(path)
|
||||
device = apkbuild["pkgname"][len("device-"):]
|
||||
kernels_subpackages = pmb.parse._apkbuild.kernels(args, device)
|
||||
|
||||
# Parse kernels from depends
|
||||
kernels_depends = []
|
||||
for depend in apkbuild["depends"]:
|
||||
if not depend.startswith("linux-") or depend.startswith("linux-firmware-"):
|
||||
continue
|
||||
kernels_depends.append(depend)
|
||||
|
||||
# Kernel in subpackages *and* depends
|
||||
if kernels_subpackages:
|
||||
raise RuntimeError("Kernel package '" + depend + "' needs to"
|
||||
" be removed when using kernel" +
|
||||
" subpackages: " + path)
|
||||
|
||||
# No kernel
|
||||
if not kernels_depends and not kernels_subpackages:
|
||||
raise RuntimeError("Device doesn't have a kernel in depends or"
|
||||
" subpackages: " + path)
|
||||
|
||||
# Multiple kernels in depends
|
||||
if len(kernels_depends) > 1:
|
||||
raise RuntimeError("Please use kernel subpackages instead of"
|
||||
" multiple kernels in depends (see"
|
||||
" <https://postmarketos.org/devicepkg>): " +
|
||||
path)
|
||||
|
||||
|
||||
def test_aports_maintained(args):
|
||||
"""
|
||||
Ensure that aports in /device/{main,community} have "Maintainer:" and
|
||||
"Co-Maintainer:" (only required for main) listed in their APKBUILDs.
|
||||
"""
|
||||
for path in glob.iglob(f"{args.aports}/device/main/*/APKBUILD"):
|
||||
if '/firmware-' in path:
|
||||
continue
|
||||
maintainers = pmb.parse._apkbuild.maintainers(path)
|
||||
assert maintainers and len(maintainers) >= 2, \
|
||||
f"{path} in main needs at least 1 Maintainer and 1 Co-Maintainer"
|
||||
|
||||
for path in glob.iglob(f"{args.aports}/device/community/*/APKBUILD"):
|
||||
if '/firmware-' in path:
|
||||
continue
|
||||
maintainers = pmb.parse._apkbuild.maintainers(path)
|
||||
assert maintainers, f"{path} in community needs at least 1 Maintainer"
|
||||
|
||||
|
||||
def test_aports_unmaintained(args):
|
||||
"""
|
||||
Ensure that aports in /device/unmaintained have an "Unmaintained:" comment
|
||||
that describes why the aport is unmaintained.
|
||||
"""
|
||||
for path in glob.iglob(f"{args.aports}/device/unmaintained/*/APKBUILD"):
|
||||
unmaintained = pmb.parse._apkbuild.unmaintained(path)
|
||||
assert unmaintained, f"{path} should have an Unmaintained: " +\
|
||||
"comment that describes why the package is unmaintained"
|
||||
@@ -1,90 +0,0 @@
|
||||
#!/usr/bin/env python3
|
||||
# Copyright 2021 Oliver Smith
|
||||
# SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
import glob
|
||||
import os
|
||||
import pytest
|
||||
import re
|
||||
import sys
|
||||
|
||||
import add_pmbootstrap_to_import_path
|
||||
import pmb.parse
|
||||
|
||||
|
||||
def deviceinfo_obsolete(info):
|
||||
"""
|
||||
Test for obsolete options used in the deviceinfo file. They must still be
|
||||
defined in pmbootstrap's config/__init__.py.
|
||||
"""
|
||||
obsolete_options = [
|
||||
"usb_rndis_function",
|
||||
"weston_pixman_type",
|
||||
]
|
||||
for option in obsolete_options:
|
||||
if option in info and info[option]:
|
||||
raise RuntimeError(f"option {option} is obsolete, please rename"
|
||||
" or remove it (see reasons for removal of at"
|
||||
" https://postmarketos.org/deviceinfo)")
|
||||
|
||||
|
||||
def test_deviceinfo(args):
|
||||
"""
|
||||
Parse all deviceinfo files successfully and run checks on the parsed data.
|
||||
"""
|
||||
# Iterate over all devices
|
||||
last_exception = None
|
||||
count = 0
|
||||
pattern = re.compile("^deviceinfo_[a-zA-Z0-9_]*=\".*\"$")
|
||||
|
||||
for folder in glob.glob(args.aports + "/device/*/device-*"):
|
||||
device = folder[len(args.aports):].split("-", 1)[1]
|
||||
|
||||
f = open(folder[len(args.aports):][1:] + "/deviceinfo")
|
||||
lines = f.read().split("\n")
|
||||
f.close()
|
||||
|
||||
try:
|
||||
for line in lines:
|
||||
# Require space after # for comments
|
||||
if line.startswith("#") and not line.startswith("# "):
|
||||
raise RuntimeError("Comment style: please change '#' to"
|
||||
f" '# ': {line}")
|
||||
|
||||
# Skip empty lines and comments
|
||||
if not line or line.startswith("# "):
|
||||
continue
|
||||
|
||||
# Variable can not be empty
|
||||
if '=""' in line:
|
||||
raise RuntimeError("Please remove the empty variable: " + line)
|
||||
|
||||
# Check line against regex (can't use multiple lines etc.)
|
||||
if not pattern.match(line) or line.endswith("\\\""):
|
||||
raise RuntimeError("Line looks invalid, maybe missing"
|
||||
" quotes/multi-line string/comment next"
|
||||
f" to line instead of above? {line}")
|
||||
|
||||
# Successful deviceinfo parsing / obsolete options
|
||||
info = pmb.parse.deviceinfo(args, device)
|
||||
deviceinfo_obsolete(info)
|
||||
|
||||
# deviceinfo_name must start with manufacturer
|
||||
name = info["name"]
|
||||
manufacturer = info["manufacturer"]
|
||||
if not name.startswith(manufacturer) and \
|
||||
not name.startswith("Google"):
|
||||
raise RuntimeError("Please add the manufacturer in front of"
|
||||
" the deviceinfo_name, e.g.: '" +
|
||||
manufacturer + " " + name + "'")
|
||||
|
||||
# Don't abort on first error
|
||||
except Exception as e:
|
||||
last_exception = e
|
||||
count += 1
|
||||
print(device + ": " + str(e))
|
||||
|
||||
# Raise the last exception
|
||||
if last_exception:
|
||||
print("deviceinfo error count: " + str(count))
|
||||
raise last_exception
|
||||
@@ -1,72 +0,0 @@
|
||||
#!/usr/bin/env python3
|
||||
# SPDX-License-Identifier: GPL-3.0-or-later
|
||||
import glob
|
||||
import os
|
||||
import stat
|
||||
|
||||
expected_directories = [
|
||||
"cross",
|
||||
"device/community",
|
||||
"device/main",
|
||||
"device/testing",
|
||||
"device/unmaintained",
|
||||
"main",
|
||||
"modem",
|
||||
"non-free",
|
||||
"sxmo",
|
||||
"temp",
|
||||
]
|
||||
|
||||
|
||||
# pmbootstrap allows placing APKBUILDs in arbitrarily nested directories.
|
||||
# This test makes sure all of them are in one of the expected locations.
|
||||
def test_directories():
|
||||
apkbuilds = set(glob.iglob("**/APKBUILD", recursive=True))
|
||||
expected = set(f for d in expected_directories for f in glob.iglob(d + "/*/APKBUILD"))
|
||||
assert apkbuilds == expected, "Found APKBUILD in unexpected directory. " \
|
||||
"Note that we moved firmware/* to device/{main,community,testing}/*."
|
||||
|
||||
|
||||
# Ensure no file in pmaports are executable.
|
||||
# see https://gitlab.com/postmarketOS/pmaports/-/issues/593.
|
||||
def test_executable_files():
|
||||
for file in glob.iglob("**/*", recursive=True):
|
||||
if os.path.isdir(file) or os.path.islink(file):
|
||||
continue
|
||||
# still check other less common inode types
|
||||
permissions = os.stat(file).st_mode
|
||||
executable_bits = stat.S_IXUSR | stat.S_IXGRP | stat.S_IXOTH
|
||||
if permissions & executable_bits != 0:
|
||||
raise RuntimeError(f"\"{file}\" is executable. Files in pmaports" +
|
||||
" should not be executables. post-* files" +
|
||||
" don't need to be executable and executables" +
|
||||
" should be installed using `install -D" +
|
||||
"m0755` or a variation thereof.")
|
||||
|
||||
|
||||
# Make sure files are either:
|
||||
# - in root directory (README.md)
|
||||
# - hidden (.ci/, device/.shared-patches/)
|
||||
# - or belong to a package (below a directory with APKBUILD)
|
||||
def test_files_belong_to_package():
|
||||
# Walk directories and set package_dir when we find an APKBUILD
|
||||
# This allows matching files in subdirectories to the package directory.
|
||||
package_dir = None
|
||||
for dirpath, dirs, files in os.walk("."):
|
||||
# Skip "hidden" directories
|
||||
dirs[:] = [d for d in dirs if not d.startswith(".")]
|
||||
# Ignore files in root directory
|
||||
if dirpath == '.':
|
||||
continue
|
||||
|
||||
# Switched to another directory?
|
||||
if package_dir and not dirpath.startswith(package_dir + os.sep):
|
||||
package_dir = None
|
||||
|
||||
if 'APKBUILD' in files:
|
||||
assert not package_dir, f"Nested packages: {package_dir} and {dirpath} " \
|
||||
"both contain an APKBUILD"
|
||||
package_dir = dirpath
|
||||
|
||||
assert not files or package_dir, "Found files that do not belong to any package: " \
|
||||
f"{dirpath}/{files}"
|
||||
@@ -1,50 +0,0 @@
|
||||
#!/usr/bin/env python3
|
||||
# Copyright 2021 Johannes Marbach
|
||||
# SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
import glob
|
||||
import os
|
||||
|
||||
import add_pmbootstrap_to_import_path
|
||||
import pmb.parse
|
||||
|
||||
|
||||
def test_aports_firmware(args):
|
||||
"""
|
||||
Various tests performed on the /**/firmware-* aports.
|
||||
"""
|
||||
|
||||
excluded = [
|
||||
"firmware-motorola-ali", # Depends on firmware-qcom-adreno-a530
|
||||
"firmware-motorola-potter", # Depends on soc-qcom-msm8916-ucm
|
||||
"firmware-oneplus-msm8998", # Depends on soc-qcom-sdm845-nonfree-firmware
|
||||
"firmware-xiaomi-sagit", # Depends on soc-qcom-sdm845-nonfree-firmware
|
||||
"firmware-samsung-baffinlite", # Depends on firmware-aosp-broadcom-wlan
|
||||
"firmware-samsung-crespo", # Depends on firmware-aosp-broadcom-wlan
|
||||
"firmware-samsung-maguro", # Depends on firmware-aosp-broadcom-wlan
|
||||
"firmware-xiaomi-ferrari", # Depends on soc-qcom-msm8916
|
||||
"firmware-xiaomi-willow", # Doesn't build, source link is dead (pma#1212)
|
||||
]
|
||||
|
||||
for path in glob.iglob(f"{args.aports}/**/firmware-*/APKBUILD", recursive=True):
|
||||
apkbuild = pmb.parse.apkbuild(path)
|
||||
aport_name = os.path.basename(os.path.dirname(path))
|
||||
|
||||
if aport_name not in excluded:
|
||||
if "pmb:cross-native" not in apkbuild["options"]:
|
||||
raise RuntimeError(f"{aport_name}: \"pmb:cross-native\" missing in"
|
||||
" options= line. The pmb:cross-native option is"
|
||||
" preferred because it results in significantly"
|
||||
" lower build times. If the package doesn't build"
|
||||
" with the option, you can add an exemption in"
|
||||
" .gitlab-ci/testcases/test_firmware.py.")
|
||||
|
||||
if "!tracedeps" not in apkbuild["options"]:
|
||||
raise RuntimeError(f"{aport_name}: \"!tracedeps\" missing in"
|
||||
" options= line. The tracedeps option is superfluous"
|
||||
" for firmware packages.")
|
||||
|
||||
if "noarch" in apkbuild["arch"]:
|
||||
raise RuntimeError(f"{aport_name}: \"arch\" must not be \"noarch\"!"
|
||||
" Please limit this firmware package to the"
|
||||
" required architectures only!")
|
||||
@@ -1,118 +0,0 @@
|
||||
#!/usr/bin/env python3
|
||||
# Copyright 2021 Oliver Smith
|
||||
# SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
""" Make sure that components of frameworks (Qt, KDE, ...) have the same
|
||||
version in all packages. We scan all packages, categorize them by URL
|
||||
and then compare the versions of all packages in each category. """
|
||||
|
||||
import glob
|
||||
import logging
|
||||
import os
|
||||
import pytest
|
||||
import sys
|
||||
|
||||
import add_pmbootstrap_to_import_path
|
||||
import pmb.config
|
||||
import pmb.parse
|
||||
|
||||
|
||||
def get_categorized_packages(args):
|
||||
"""
|
||||
Parse all aports and categorize them.
|
||||
|
||||
:returns: {"plasma": {"kwin": "5.13.3", ...},
|
||||
"kde": {"kcrash": "5.48.0", ...},
|
||||
"qt": {"qt5-qtbase": "5.12.0", ...},
|
||||
"other": {"konsole": "1234", ...}}
|
||||
"""
|
||||
ret = {}
|
||||
|
||||
for path in glob.glob(args.aports + "/*/*/APKBUILD"):
|
||||
# Parse APKBUILD
|
||||
apkbuild = pmb.parse.apkbuild(path)
|
||||
url = apkbuild["url"]
|
||||
pkgname = apkbuild["pkgname"]
|
||||
pkgver = apkbuild["pkgver"]
|
||||
if pkgver == "9999":
|
||||
pkgver = apkbuild["_pkgver"]
|
||||
|
||||
if "_git" in pkgver:
|
||||
continue
|
||||
|
||||
# Categorize by URL
|
||||
category = "other"
|
||||
if "https://www.kde.org/workspaces/plasmadesktop" in url:
|
||||
category = "plasma"
|
||||
elif "https://community.kde.org/Frameworks" in url:
|
||||
category = "kde"
|
||||
elif url in ["http://qt-project.org/",
|
||||
"https://www.qt.io/developers/"]:
|
||||
category = "qt"
|
||||
|
||||
# Remove hotfix number (i.e. 5.16.90.1 becomes 5.16.90)
|
||||
if category in ["kde", "plasma"]:
|
||||
pkgver = ".".join(pkgver.split(".")[0:3])
|
||||
|
||||
# Save result
|
||||
if category not in ret:
|
||||
ret[category] = {}
|
||||
ret[category][pkgname] = pkgver
|
||||
return ret
|
||||
|
||||
|
||||
def check_categories(categories):
|
||||
"""
|
||||
Make sure that all packages in one framework (kde, plasma, ...) have the
|
||||
same package version (and that there is at least one package in each
|
||||
category).
|
||||
|
||||
:param categories: see return of get_categorized_packages()
|
||||
:returns: True when the check passed, False otherwise
|
||||
"""
|
||||
ret = True
|
||||
for category, packages in categories.items():
|
||||
reference = None
|
||||
for pkgname, pkgver in packages.items():
|
||||
|
||||
# Use the first package as reference and print a summary
|
||||
if not reference:
|
||||
logging.info("---")
|
||||
logging.info("Package category: " + category)
|
||||
logging.info("Packages count: " + str(len(packages)))
|
||||
|
||||
# Category "other": done after printing the basic summary, no
|
||||
# need to print each package or compare the package versions
|
||||
if category == "other":
|
||||
reference = True
|
||||
break
|
||||
|
||||
# Print all packages
|
||||
logging.info("Packages: " + ", ".join(sorted(packages.keys())))
|
||||
|
||||
# Print the reference and skip checking it against itself
|
||||
reference = {"pkgname": pkgname, "pkgver": pkgver}
|
||||
logging.info("Reference pkgver: " + pkgver + " (from '" +
|
||||
pkgname + "')")
|
||||
continue
|
||||
|
||||
# Check version against reference
|
||||
if pkgver != reference["pkgver"]:
|
||||
logging.info("ERROR: " + pkgname + " has version " + pkgver)
|
||||
ret = False
|
||||
|
||||
# Each category must at least have one package
|
||||
if not reference:
|
||||
logging.info("ERROR: could not find any packages in category: " +
|
||||
category)
|
||||
ret = False
|
||||
return ret
|
||||
|
||||
|
||||
def test_framework_versions(args):
|
||||
"""
|
||||
Make sure that packages of the same framework have the same version.
|
||||
"""
|
||||
categories = get_categorized_packages(args)
|
||||
if not check_categories(categories):
|
||||
raise RuntimeError("Framework version check failed!")
|
||||
@@ -1,42 +0,0 @@
|
||||
#!/usr/bin/env python3
|
||||
# Copyright 2021 Oliver Smith
|
||||
# SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
import glob
|
||||
import pytest
|
||||
import sys
|
||||
import os
|
||||
|
||||
import add_pmbootstrap_to_import_path
|
||||
import pmb.parse
|
||||
|
||||
|
||||
def test_aports_kernel(args):
|
||||
"""
|
||||
Various tests performed on the /**/linux-* aports.
|
||||
"""
|
||||
|
||||
for path in glob.iglob(f"{args.aports}/**/linux-*/APKBUILD", recursive=True):
|
||||
apkbuild = pmb.parse.apkbuild(path)
|
||||
aport_name = os.path.basename(os.path.dirname(path))
|
||||
|
||||
if "pmb:cross-native" not in apkbuild["options"]:
|
||||
raise RuntimeError(f"{aport_name}: \"pmb:cross-native\" missing in"
|
||||
" options= line")
|
||||
|
||||
# cross-compilers should not be in makedepends
|
||||
for ccc in ["gcc-armv7", "gcc-armhf", "gcc-aarch64",
|
||||
"gcc4-armv7", "gcc4-armhf", "gcc4-aarch64",
|
||||
"gcc6-armv7", "gcc6-armhf", "gcc6-aarch64"]:
|
||||
if ccc in apkbuild["makedepends"]:
|
||||
raise RuntimeError(f"{aport_name}: Cross-compiler ({ccc}) should"
|
||||
" not be explicitly specified in makedepends!"
|
||||
" pmbootstrap installs cross-compiler"
|
||||
" automatically.")
|
||||
|
||||
# check some options only for main and community devices
|
||||
for dir in ["main", "device/main", "device/community"]:
|
||||
if path.startswith(f"{args.aports}/{dir}"):
|
||||
if "pmb:kconfigcheck-community" not in apkbuild["options"]:
|
||||
raise RuntimeError(f"{aport_name}: \"pmb:kconfigcheck-community\" missing in"
|
||||
" options= line, required for all community/main devices.")
|
||||
@@ -1,87 +0,0 @@
|
||||
#!/usr/bin/env python3
|
||||
# Copyright 2023 Oliver Smith
|
||||
# SPDX-License-Identifier: GPL-3.0-or-later
|
||||
import glob
|
||||
import logging
|
||||
import os
|
||||
import pytest
|
||||
import sys
|
||||
|
||||
import add_pmbootstrap_to_import_path
|
||||
import pmb.parse
|
||||
import pmb.parse._apkbuild
|
||||
|
||||
|
||||
def apkbuild_check_provides(path, apkbuild, version, pkgname, subpkgname=None):
|
||||
"""
|
||||
Verify that a package or subpackage is using provides correctly.
|
||||
|
||||
:param path: to the APKBUILD for the error message
|
||||
:param apkbuild: either the full return of pmb.parse.apkbuild() or a
|
||||
subpackage of it (apkbuild["subpackages"][$subpkgname])
|
||||
:param version: like 1.0.0-r3 so we can check against it
|
||||
:param pkgname: package name
|
||||
:param subpkgname: subpackage name, if we are looking at a subpackage
|
||||
:returns: list of error strings
|
||||
"""
|
||||
name = pkgname
|
||||
if subpkgname:
|
||||
name = f"{pkgname}:{subpkgname}"
|
||||
|
||||
logging.info(f"{name}: checking provides")
|
||||
ret = []
|
||||
|
||||
if not apkbuild["provides"]:
|
||||
return ret
|
||||
|
||||
for provide in apkbuild["provides"]:
|
||||
# Having provides entries without version is valid if the
|
||||
# provider_priorty is also set (pma#1766)
|
||||
if apkbuild["provider_priority"]:
|
||||
continue
|
||||
# Otherwise the version =$pkgver-r$pkgrel needs to be set. pmbootstrap
|
||||
# already replaces the variables, so we check against the inserted
|
||||
# values here.
|
||||
if not provide.endswith(f"={version}"):
|
||||
provide_no_ver = provide.split("=", 1)[0]
|
||||
|
||||
error = f"error in {path}:\n"
|
||||
if subpkgname:
|
||||
error += f"in subpackage:\n {subpkgname}\n"
|
||||
else:
|
||||
error += f"in package:\n {pkgname}\n"
|
||||
error += f"broken provides entry:\n {provide_no_ver}\n"
|
||||
error += "\n"
|
||||
error += "This provides entry needs to be changed to"
|
||||
error += f" '{provide_no_ver}=$pkgver-r$pkgrel'"
|
||||
error += " (do not replace the variables, without '').\n"
|
||||
error += "\n"
|
||||
error += "If you know what you are doing and didn't add the"
|
||||
error += " version on purpose, you also need to set a"
|
||||
error += " provider_priority (pma#1766).\n"
|
||||
error += "Reference:"
|
||||
error += " https://wiki.alpinelinux.org/wiki/APKBUILD_Reference#provides"
|
||||
ret += [error]
|
||||
return ret
|
||||
|
||||
|
||||
def test_provides(args):
|
||||
errors = []
|
||||
for path in glob.iglob(f"{args.aports}/**/APKBUILD", recursive=True):
|
||||
apkbuild = pmb.parse.apkbuild(path)
|
||||
pkgname = apkbuild["pkgname"]
|
||||
version = f"{apkbuild['pkgver']}-r{apkbuild['pkgrel']}"
|
||||
path_rel = os.path.relpath(path, args.aports)
|
||||
errors += apkbuild_check_provides(path_rel, apkbuild, version, pkgname)
|
||||
|
||||
for subpkg, subpkg_data in apkbuild["subpackages"].items():
|
||||
if not subpkg_data:
|
||||
# default packaging function like -doc
|
||||
continue
|
||||
errors += apkbuild_check_provides(path_rel, subpkg_data, version,
|
||||
pkgname, subpkg)
|
||||
|
||||
if errors:
|
||||
for error in errors:
|
||||
logging.error(error)
|
||||
raise RuntimeError(f"test_provides failed with {len(errors)} errors")
|
||||
@@ -1,152 +0,0 @@
|
||||
#!/usr/bin/env python3
|
||||
# Copyright 2023 Oliver Smith
|
||||
# SPDX-License-Identifier: GPL-3.0-or-later
|
||||
# Various checks on source= in the APKBUILDs
|
||||
|
||||
import glob
|
||||
import logging
|
||||
import os
|
||||
import pytest
|
||||
import sys
|
||||
|
||||
import add_pmbootstrap_to_import_path
|
||||
import pmb.parse
|
||||
import pmb.parse._apkbuild
|
||||
import pmb.parse.apkindex
|
||||
import pmb.helpers.repo
|
||||
|
||||
|
||||
def parse_source_from_checksums(args, apkbuild_path):
|
||||
"""
|
||||
Read the APKBUILD file and parse source files from the checksums at the
|
||||
bottom. This has always the same format, even if $source is built with hard
|
||||
to parse shell code (like in postmarketos-base).
|
||||
|
||||
:param apkbuild_path: full path to the APKBUILD
|
||||
:returns: dict of parsed "source" filenames and checksums, e.g.:
|
||||
{"first.patch": "b4dc4f3…",
|
||||
"second.patch": "b4dc4f3…"}
|
||||
"""
|
||||
start = 'sha512sums="'
|
||||
in_block = False
|
||||
ret = {}
|
||||
|
||||
with open(apkbuild_path, encoding="utf-8") as handle:
|
||||
for line in handle.readlines():
|
||||
# Find start
|
||||
if not in_block:
|
||||
if line.startswith(start):
|
||||
in_block = True
|
||||
else:
|
||||
continue
|
||||
|
||||
# sha512sums may have lines without checksums:
|
||||
# https://gitlab.alpinelinux.org/alpine/abuild/-/merge_requests/73
|
||||
if " " not in line:
|
||||
continue
|
||||
|
||||
try:
|
||||
checksum, filename = line.rstrip().split(" ", 2)
|
||||
except ValueError:
|
||||
raise ValueError("Failed to parse checksums. Try to delete the"
|
||||
" checksums and generate them again with"
|
||||
f" 'pmbootstrap checksum': {apkbuild_path}")
|
||||
|
||||
# Cut off 'sha512sums="' if the first checksum is in that line
|
||||
if checksum.startswith(start):
|
||||
checksum = checksum[len(start):]
|
||||
|
||||
# Find end
|
||||
if filename.endswith('"'):
|
||||
filename = filename[:-1]
|
||||
|
||||
ret[filename] = checksum
|
||||
return ret
|
||||
|
||||
|
||||
def test_aports_unreferenced_files(args):
|
||||
"""
|
||||
Raise an error if an unreferenced file is found
|
||||
"""
|
||||
for apkbuild_path in glob.iglob(args.aports + "/**/APKBUILD", recursive=True):
|
||||
# pmbootstrap parser has some issues with complicated APKBUILDs, skip those.
|
||||
if apkbuild_path.startswith(args.aports + "/cross/"):
|
||||
continue
|
||||
|
||||
apkbuild = pmb.parse.apkbuild(apkbuild_path)
|
||||
sources_chk = parse_source_from_checksums(args, apkbuild_path)
|
||||
|
||||
# Collect files from subpackages
|
||||
subpackage_installs = []
|
||||
subpackage_triggers = []
|
||||
if apkbuild["subpackages"]:
|
||||
for subpackage in apkbuild["subpackages"].values():
|
||||
if not subpackage:
|
||||
continue
|
||||
subpackage_installs += subpackage.get("install", [])
|
||||
subpackage_triggers += subpackage.get("triggers", [])
|
||||
|
||||
# Collect trigger files
|
||||
trigger_sources = []
|
||||
for trigger in apkbuild["triggers"] + subpackage_triggers:
|
||||
trigger_sources.append(trigger.split("=")[0])
|
||||
|
||||
dirname = os.path.dirname(apkbuild_path)
|
||||
for file in glob.iglob(dirname + "/**", recursive=True):
|
||||
rel_file_path = os.path.relpath(file, dirname)
|
||||
# Skip APKBUILDs and directories
|
||||
if rel_file_path == "APKBUILD" or os.path.isdir(file):
|
||||
continue
|
||||
|
||||
if os.path.basename(rel_file_path) not in sources_chk \
|
||||
and rel_file_path not in apkbuild["install"] \
|
||||
and rel_file_path not in subpackage_installs \
|
||||
and rel_file_path not in trigger_sources:
|
||||
raise RuntimeError(f"{apkbuild_path}: found unreferenced file: {rel_file_path}")
|
||||
|
||||
|
||||
def test_distfiles_conflict(args):
|
||||
"""
|
||||
Make sure that each filename mentioned in any source= of any APKBUILD
|
||||
always has the same checksum. This is important because apk caches
|
||||
downloaded source files in a flat distfiles directory. So if two APKBUILDs
|
||||
both download a file with the same filename but different checksum, and the
|
||||
user builds both after each other, abuild will fail on the second build
|
||||
with a checksum error.
|
||||
"""
|
||||
source_all = {}
|
||||
for apkbuild_path in glob.iglob(f"{args.aports}/**/APKBUILD", recursive=True):
|
||||
source = parse_source_from_checksums(args, apkbuild_path)
|
||||
dir_path = os.path.dirname(apkbuild_path)
|
||||
apkbuild_rel = os.path.relpath(apkbuild_path, args.aports)
|
||||
for filename, checksum in source.items():
|
||||
# Files bundled with the APKBUILD don't get copied to the distfiles
|
||||
# cache, so not relevant for this check. Use glob.glob here and not
|
||||
# iglob, because we don't want an iterator.
|
||||
if glob.glob(f"{dir_path}/**/{filename}", recursive=True):
|
||||
continue
|
||||
|
||||
# First time seeing this file
|
||||
if filename not in source_all:
|
||||
source_all[filename] = {"checksum": checksum,
|
||||
"apkbuild_rel": apkbuild_rel}
|
||||
continue
|
||||
|
||||
# Saw this file already with same checksum
|
||||
if checksum == source_all[filename]["checksum"]:
|
||||
continue
|
||||
|
||||
# Saw this file already with different checksum
|
||||
logging.error("")
|
||||
logging.error(f"ERROR: the source file '{filename}' has different"
|
||||
" checksums in the following files:")
|
||||
logging.error(f"- {source_all[filename]['apkbuild_rel']}:")
|
||||
logging.error(f" {source_all[filename]['checksum']}")
|
||||
logging.error(f"- {apkbuild_rel}:")
|
||||
logging.error(f" {checksum}")
|
||||
logging.error("")
|
||||
logging.error("Fix this by setting a different target filename in"
|
||||
" the package you modified:")
|
||||
logging.error("https://wiki.alpinelinux.org/wiki/APKBUILD_Reference#source")
|
||||
logging.error("")
|
||||
raise RuntimeError(f"Conflict with source file '{filename}'")
|
||||
@@ -1,42 +0,0 @@
|
||||
#!/usr/bin/env python3
|
||||
# Copyright 2021 Oliver Smith
|
||||
# SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
import glob
|
||||
import pytest
|
||||
import sys
|
||||
import os
|
||||
|
||||
import add_pmbootstrap_to_import_path
|
||||
import pmb.parse
|
||||
|
||||
|
||||
def test_aports_ui(args):
|
||||
"""
|
||||
Raise an error if package in _pmb_recommends is not found
|
||||
"""
|
||||
pmaports_cfg = pmb.config.pmaports.read_config(args)
|
||||
|
||||
for arch in pmaports_cfg["supported_arches"].split(","):
|
||||
for path in glob.iglob(args.aports + "/main/postmarketos-ui-*/APKBUILD"):
|
||||
apkbuild = pmb.parse.apkbuild(path)
|
||||
# Skip if arch isn't enabled
|
||||
if not pmb.helpers.package.check_arch(args, apkbuild["pkgname"], arch, False):
|
||||
continue
|
||||
|
||||
for package in apkbuild["_pmb_recommends"]:
|
||||
depend = pmb.helpers.package.get(args, package,
|
||||
arch, must_exist=False)
|
||||
if depend is None or not pmb.helpers.package.check_arch(args, package, arch):
|
||||
raise RuntimeError(f"{path}: package '{package}' from"
|
||||
f" _pmb_recommends not found for arch '{arch}'")
|
||||
|
||||
# Check packages from "_pmb_recommends" of -extras subpackage if one exists
|
||||
if f"{apkbuild['pkgname']}-extras" in apkbuild["subpackages"]:
|
||||
apkbuild = apkbuild["subpackages"][f"{apkbuild['pkgname']}-extras"]
|
||||
for package in apkbuild["_pmb_recommends"]:
|
||||
depend = pmb.helpers.package.get(args, package,
|
||||
arch, must_exist=False)
|
||||
if depend is None or not pmb.helpers.package.check_arch(args, package, arch):
|
||||
raise RuntimeError(f"{path}: package '{package}' from _pmb_recommends "
|
||||
f"of -extras subpackage is not found for arch '{arch}'")
|
||||
-15
@@ -1,15 +0,0 @@
|
||||
#!/bin/sh -e
|
||||
# Description: verify devices are documented in the wiki
|
||||
# Options: native
|
||||
# Run natively so we don't need to set up a chroot, python3 is the only dep.
|
||||
# https://postmarketos.org/pmb-ci
|
||||
|
||||
if [ "$(id -u)" = 0 ]; then
|
||||
set -x
|
||||
apk -q add \
|
||||
python3
|
||||
exec su "${TESTUSER:-build}" -c "sh -e $0"
|
||||
fi
|
||||
|
||||
set -x
|
||||
.ci/lib/check_devices_in_wiki.py --booting
|
||||
+2
-2
@@ -7,8 +7,8 @@
|
||||
# Top-most EditorConfig file.
|
||||
root = true
|
||||
|
||||
[{**.{md,ini,sh,rules,nft},**/APKBUILD}]
|
||||
[**/APKBUILD]
|
||||
indent_style = tab
|
||||
end_of_line = lf
|
||||
trim_trailing_whitespace = true
|
||||
insert_final_newline = true
|
||||
trim_trailing_whitespace = true
|
||||
@@ -1,119 +0,0 @@
|
||||
#!/bin/sh
|
||||
#
|
||||
# This hook checks that all local sources specified in the staged APKBUILDs
|
||||
# are staged too or already committed and that checksums are correct.
|
||||
#
|
||||
set -eu
|
||||
|
||||
# Maximal allowed size (in bytes) of a file.
|
||||
FILE_SIZE_LIMIT=262144 # 256 kiB
|
||||
|
||||
|
||||
if ! command -v sha512sum >/dev/null; then
|
||||
# macOS / BSDs (?) don't have sha512sum, but shasum.
|
||||
alias sha512sum='shasum -a 512'
|
||||
fi
|
||||
|
||||
error() {
|
||||
printf '\033[0;31mpre-commit:\033[0m %s\n' "$1" >&2 # red
|
||||
}
|
||||
|
||||
# Prints paths of created or modified files being committed.
|
||||
changed_files() {
|
||||
git diff-index \
|
||||
--name-only \
|
||||
--cached \
|
||||
--diff-filter=ACMR HEAD \
|
||||
-- "$@"
|
||||
}
|
||||
|
||||
# Prints file names and checksums (in format <SHA-512>:<filename>) of local
|
||||
# sources specified in the APKBUILD ($1).
|
||||
apkbuild_local_sources() {
|
||||
apkbuild="$1"
|
||||
|
||||
set +eu
|
||||
. "$apkbuild" || {
|
||||
error "$apkbuild is invalid"
|
||||
return 1
|
||||
}
|
||||
set -eu
|
||||
|
||||
status=0
|
||||
: ${source:=""}
|
||||
for src in $source; do
|
||||
# Skip remote sources.
|
||||
case "$src" in */*) continue;; esac
|
||||
|
||||
echo "$sha512sums" | awk -v src="$src" '
|
||||
{ if ($2 == src) { ok=1; print($2 ":" $1) } }
|
||||
END { if (ok != 1) exit 1 }' || {
|
||||
status=1
|
||||
error "${apkbuild%/*}: file \"$src\" is missing in \$sha512sums (hint: run pmbootstrap checksum)"
|
||||
}
|
||||
done
|
||||
|
||||
return $status
|
||||
}
|
||||
|
||||
# check if given object is a symlink
|
||||
is_symlink() {
|
||||
test "$(git ls-files --stage "$1" | awk '{print $1}')" = "120000"
|
||||
}
|
||||
|
||||
# Checks that all local sources specified in the APKBUILD file ($1) are
|
||||
# available in git tree and checksums are correct.
|
||||
check_local_sources() {
|
||||
local apkbuild="$1"
|
||||
local startdir="${apkbuild%/*}"
|
||||
local status=0
|
||||
local checksum_act checksum_exp content filename line sources
|
||||
|
||||
sources=$(apkbuild_local_sources "$apkbuild")
|
||||
for line in $sources; do
|
||||
filename=${line%%:*}
|
||||
checksum_exp=${line#*:}
|
||||
|
||||
if ! git cat-file -e ":$startdir/$filename" 2>/dev/null; then
|
||||
error "$startdir: missing file \"$filename\""
|
||||
status=1
|
||||
continue
|
||||
fi
|
||||
|
||||
if is_symlink ":$startdir/$filename"; then
|
||||
continue
|
||||
fi
|
||||
|
||||
checksum_act=$(git show ":$startdir/$filename" | sha512sum)
|
||||
if [ "$checksum_act" != "$checksum_exp -" ]; then
|
||||
local cmd="pmbootstrap checksum $(basename "$startdir")"
|
||||
error "$startdir: bad checksum for file \"$filename\" (hint: run $cmd)"
|
||||
status=1
|
||||
fi
|
||||
done
|
||||
|
||||
return $status
|
||||
}
|
||||
|
||||
# Checks if the file ($1) being committed is not bigger than FILE_SIZE_LIMIT.
|
||||
check_file_size() {
|
||||
local path="$1"
|
||||
local size
|
||||
|
||||
size=$(git cat-file -s ":$path")
|
||||
if [ $size -gt $FILE_SIZE_LIMIT ]; then
|
||||
local size_kb=$(( size / 1024 ))
|
||||
|
||||
error "file \"$path\" is quite big ($(( size / 1024 )) kiB), better put a remote url in source="
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
|
||||
|
||||
for apkbuild in $(changed_files '**/APKBUILD'); do
|
||||
check_local_sources "$apkbuild"
|
||||
done
|
||||
|
||||
for path in $(changed_files); do
|
||||
check_file_size "$path"
|
||||
done
|
||||
@@ -1,49 +0,0 @@
|
||||
#!/bin/sh
|
||||
#
|
||||
# This hook adds prefix "<repo>/<pkgname>: " to the commit message when
|
||||
# committing changes of a single package.
|
||||
#
|
||||
MSG_FILE="$1"
|
||||
SOURCE="$2"
|
||||
|
||||
longest_common_prefix() {
|
||||
awk -F/ '
|
||||
(NR == 1) { split($0, prefix); prefix_len = NF }
|
||||
(NR > 1) {
|
||||
for (i = 1; i <= prefix_len; i++) {
|
||||
if (prefix[i] != $i) {
|
||||
prefix_len = i - 1; break
|
||||
}
|
||||
}
|
||||
}
|
||||
(prefix_len == 0) { exit }
|
||||
END {
|
||||
res = prefix[1]
|
||||
for (i = 2; i <= prefix_len; i++) {
|
||||
res = res FS prefix[i]
|
||||
}
|
||||
print(res)
|
||||
}'
|
||||
}
|
||||
|
||||
prepend_msg() {
|
||||
local prefix="$1"
|
||||
|
||||
printf '%s\n%s\n' "$prefix" "$(cat "$MSG_FILE")" > "$MSG_FILE"
|
||||
}
|
||||
|
||||
|
||||
# Do nothing if message has been given using -m, template, merge etc.
|
||||
[ -z "$SOURCE" ] || exit 0
|
||||
|
||||
lcp=$(git diff-index --name-only --cached HEAD | longest_common_prefix)
|
||||
|
||||
case "$lcp" in
|
||||
device/*/*) prepend_msg "$(echo "$lcp" | cut -d/ -f3): ";;
|
||||
# Multiple packages touched for same device category
|
||||
# More logic could be added to detect if they all belong to same device
|
||||
device/*) ;;
|
||||
[^.]*/*) prepend_msg "$(echo "$lcp" | cut -d/ -f1-2): ";;
|
||||
esac
|
||||
|
||||
exit 0
|
||||
+2
-1
@@ -20,6 +20,7 @@ dist/
|
||||
downloads/
|
||||
eggs/
|
||||
.eggs/
|
||||
lib/
|
||||
lib64/
|
||||
parts/
|
||||
sdist/
|
||||
@@ -114,7 +115,7 @@ ENV/
|
||||
.idea
|
||||
|
||||
# Sources as unpacked and built by abuild
|
||||
**/src/
|
||||
/*/*/src/
|
||||
|
||||
# Allow having untracked packages in aports using a custom-something directory
|
||||
/custom-*/
|
||||
+44
-79
@@ -3,10 +3,10 @@
|
||||
# global settings
|
||||
image: alpine:latest
|
||||
after_script:
|
||||
- .ci/lib/move_logs.sh $CI_PROJECT_DIR
|
||||
- .gitlab-ci/move_logs.sh $CI_PROJECT_DIR
|
||||
stages:
|
||||
- lint
|
||||
- build
|
||||
- first
|
||||
- second
|
||||
|
||||
# defaults for "only"
|
||||
# We need to run the CI jobs in a "merge request specific context", if CI is
|
||||
@@ -24,59 +24,55 @@ stages:
|
||||
|
||||
# device documentation
|
||||
wiki:
|
||||
stage: lint
|
||||
stage: first
|
||||
<<: *only-default
|
||||
only:
|
||||
refs:
|
||||
- merge_requests
|
||||
changes:
|
||||
- device/*/device-*/*
|
||||
before_script:
|
||||
- apk -q add python3
|
||||
script:
|
||||
- .ci/lib/gitlab_prepare_ci.sh
|
||||
- .ci/wiki.sh
|
||||
- .gitlab-ci/check_devices_in_wiki.py --booting
|
||||
|
||||
# testcases linting
|
||||
flake8:
|
||||
stage: lint
|
||||
testcases-linting:
|
||||
stage: first
|
||||
<<: *only-default
|
||||
only:
|
||||
refs:
|
||||
- merge_requests
|
||||
changes:
|
||||
- .ci/*
|
||||
- .ci/*/*
|
||||
- .gitlab-ci/*
|
||||
- .gitlab-ci/*/*
|
||||
before_script:
|
||||
- apk -q add py-flake8
|
||||
script:
|
||||
- .ci/lib/gitlab_prepare_ci.sh
|
||||
- .ci/flake8.sh
|
||||
- flake8 --ignore E501,F401,E722,W504,W605
|
||||
|
||||
# shellcheck and various grep checks
|
||||
shellcheck-grep:
|
||||
stage: lint
|
||||
# shellcheck
|
||||
shellcheck:
|
||||
stage: first
|
||||
<<: *only-default
|
||||
image: alpine:edge
|
||||
before_script:
|
||||
- apk -q upgrade
|
||||
- apk -q add shellcheck
|
||||
script:
|
||||
- .ci/lib/gitlab_prepare_ci.sh
|
||||
- .ci/shellcheck.sh
|
||||
- .ci/grep.sh
|
||||
|
||||
editor-config:
|
||||
stage: lint
|
||||
<<: *only-default
|
||||
image: alpine:edge
|
||||
script:
|
||||
- .ci/lib/gitlab_prepare_ci.sh
|
||||
- .ci/ec.sh
|
||||
- .gitlab-ci/shellcheck.sh
|
||||
|
||||
# aports checks (generic)
|
||||
pytest-commits:
|
||||
stage: lint
|
||||
aports-static:
|
||||
stage: first
|
||||
<<: *only-default
|
||||
before_script:
|
||||
- wget "https://gitlab.com/postmarketOS/ci-common/-/raw/master/install_pmbootstrap.sh"
|
||||
- sh ./install_pmbootstrap.sh pytest
|
||||
script:
|
||||
- .ci/lib/gitlab_prepare_ci.sh
|
||||
- .ci/pytest.sh
|
||||
- .ci/commits.sh
|
||||
- apk -q add git
|
||||
- su pmos -c ".gitlab-ci/run_testcases.sh"
|
||||
- su pmos -c ".gitlab-ci/check_changed_aports_versions.py"
|
||||
artifacts:
|
||||
when: on_failure
|
||||
paths:
|
||||
@@ -87,17 +83,19 @@ pytest-commits:
|
||||
|
||||
# APKBUILD linting
|
||||
aport-lint:
|
||||
stage: lint
|
||||
stage: first
|
||||
before_script:
|
||||
- wget "https://gitlab.com/postmarketOS/ci-common/-/raw/master/install_pmbootstrap.sh"
|
||||
- sh ./install_pmbootstrap.sh
|
||||
script:
|
||||
- .ci/lib/gitlab_prepare_ci.sh
|
||||
- .ci/apkbuild-lint.sh
|
||||
- su pmos -c ".gitlab-ci/apkbuild-linting.py"
|
||||
only:
|
||||
- merge_requests
|
||||
allow_failure: true
|
||||
|
||||
# kernel kconfig check
|
||||
kernel-kconfig:
|
||||
stage: lint
|
||||
stage: first
|
||||
only:
|
||||
refs:
|
||||
- master
|
||||
@@ -105,62 +103,29 @@ kernel-kconfig:
|
||||
changes:
|
||||
- device/*/linux-*/config-*
|
||||
- main/linux-*/config-*
|
||||
before_script:
|
||||
- wget "https://gitlab.com/postmarketOS/ci-common/-/raw/master/install_pmbootstrap.sh"
|
||||
- sh ./install_pmbootstrap.sh pytest
|
||||
script:
|
||||
- .ci/lib/gitlab_prepare_ci.sh
|
||||
- .ci/kconfig.sh
|
||||
- su pmos -c "pmbootstrap kconfig check"
|
||||
|
||||
# MR settings
|
||||
# (Checks for "Allow commits from members who can merge to the target branch")
|
||||
mr-settings:
|
||||
stage: lint
|
||||
stage: first
|
||||
only:
|
||||
- merge_requests
|
||||
before_script:
|
||||
- apk -q add python3
|
||||
script:
|
||||
- wget -q "https://gitlab.com/postmarketOS/ci-common/-/raw/master/check_mr_settings.py"
|
||||
- python3 ./check_mr_settings.py
|
||||
- .gitlab-ci/check_mr_settings.py
|
||||
|
||||
# build changed aports
|
||||
.build:
|
||||
stage: build
|
||||
aports-build:
|
||||
stage: second
|
||||
<<: *only-default
|
||||
before_script:
|
||||
- .ci/lib/gitlab_prepare_ci.sh
|
||||
after_script:
|
||||
- cp -r /home/pmos/.local/var/pmbootstrap/packages/ packages/ || true
|
||||
artifacts:
|
||||
expire_in: 1 week
|
||||
paths:
|
||||
- packages/
|
||||
timeout: 10 h
|
||||
|
||||
build-x86_64:
|
||||
extends: .build
|
||||
- wget "https://gitlab.com/postmarketOS/ci-common/-/raw/master/install_pmbootstrap.sh"
|
||||
- sh ./install_pmbootstrap.sh
|
||||
script:
|
||||
- .ci/build-x86_64.sh
|
||||
|
||||
build-x86:
|
||||
extends: .build
|
||||
script:
|
||||
- .ci/build-x86.sh
|
||||
|
||||
build-aarch64:
|
||||
extends: .build
|
||||
script:
|
||||
- .ci/build-aarch64.sh
|
||||
|
||||
build-armv7:
|
||||
extends: .build
|
||||
script:
|
||||
- .ci/build-armv7.sh
|
||||
|
||||
build-armhf:
|
||||
extends: .build
|
||||
script:
|
||||
- .ci/build-armhf.sh
|
||||
|
||||
build-riscv64:
|
||||
extends: .build
|
||||
script:
|
||||
- .ci/build-riscv64.sh
|
||||
- PYTHONUNBUFFERED=1 su pmos -c ".gitlab-ci/build_changed_aports.py"
|
||||
Executable
+32
@@ -0,0 +1,32 @@
|
||||
#!/usr/bin/env python3
|
||||
# SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
import common
|
||||
import os.path
|
||||
import sys
|
||||
|
||||
if __name__ == "__main__":
|
||||
common.add_upstream_git_remote()
|
||||
apkbuilds = {file for file in common.get_changed_files(removed=False)
|
||||
if os.path.basename(file) == "APKBUILD"}
|
||||
if len(apkbuilds) < 1:
|
||||
print("No APKBUILDs to lint")
|
||||
sys.exit(0)
|
||||
|
||||
issues = []
|
||||
for apkbuild in apkbuilds:
|
||||
if apkbuild.startswith("temp/") or apkbuild.startswith("cross/"):
|
||||
print(f"NOTE: Skipping linting of {apkbuild}")
|
||||
continue
|
||||
|
||||
package = os.path.basename(os.path.dirname(apkbuild))
|
||||
result = common.run_pmbootstrap(["-q", "lint", package], output_return=True)
|
||||
if len(result) > 0:
|
||||
issues.append([apkbuild, result])
|
||||
|
||||
if len(issues) > 0:
|
||||
print("Linting issues found:")
|
||||
for issue in issues:
|
||||
print(issue[0] + ": " + issue[1])
|
||||
|
||||
sys.exit(1)
|
||||
Executable
+37
@@ -0,0 +1,37 @@
|
||||
#!/usr/bin/env python3
|
||||
# Copyright 2020 Oliver Smith
|
||||
# SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
# Same dir
|
||||
import common
|
||||
|
||||
|
||||
def check_build(packages, verify_only=False):
|
||||
# Initialize build environment with less logging
|
||||
common.run_pmbootstrap(["build_init"])
|
||||
|
||||
if verify_only:
|
||||
common.run_pmbootstrap(["--details-to-stdout", "checksum",
|
||||
"--verify"] + list(packages))
|
||||
else:
|
||||
common.run_pmbootstrap(["--details-to-stdout", "build", "--strict",
|
||||
"--force"] + list(packages))
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
# Get and print modified packages
|
||||
common.add_upstream_git_remote()
|
||||
packages = common.get_changed_packages()
|
||||
|
||||
# Build changed packages
|
||||
common.get_changed_packages_sanity_check(len(packages))
|
||||
if len(packages) == 0:
|
||||
print("no aports changed in this branch")
|
||||
else:
|
||||
verify_only = common.commit_message_has_string("[ci:skip-build]")
|
||||
if verify_only:
|
||||
print("WARNING: not building changed packages ([ci:skip-build])!")
|
||||
print("verifying checksums: " + ", ".join(packages))
|
||||
else:
|
||||
print("building in strict mode: " + ", ".join(packages))
|
||||
check_build(packages, verify_only)
|
||||
Executable
+148
@@ -0,0 +1,148 @@
|
||||
#!/usr/bin/env python3
|
||||
# Copyright 2020 Oliver Smith
|
||||
# SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
import glob
|
||||
import tempfile
|
||||
import sys
|
||||
import subprocess
|
||||
|
||||
# Same dir
|
||||
import common
|
||||
|
||||
# pmbootstrap
|
||||
import testcases.add_pmbootstrap_to_import_path # noqa
|
||||
import pmb.parse
|
||||
import pmb.parse.version
|
||||
import pmb.helpers.logging
|
||||
|
||||
|
||||
def get_package_version(args, package, revision, check=True):
|
||||
# Redirect stderr to /dev/null, so git doesn't complain about files not
|
||||
# existing in master for new packages
|
||||
stderr = None
|
||||
if not check:
|
||||
stderr = subprocess.DEVNULL
|
||||
|
||||
# Run something like "git show upstream/master:main/hello-world/APKBUILD"
|
||||
pmaports_dir = common.get_pmaports_dir()
|
||||
pattern = pmaports_dir + "/**/" + package + "/APKBUILD"
|
||||
path = glob.glob(pattern, recursive=True)[0][len(pmaports_dir + "/"):]
|
||||
apkbuild_content = common.run_git(["show", revision + ":" + path], check,
|
||||
stderr)
|
||||
if not apkbuild_content:
|
||||
return None
|
||||
|
||||
# Save APKBUILD to a temporary path and parse it from there. (Not the best
|
||||
# way to do things, but good enough for this CI script.)
|
||||
with tempfile.TemporaryDirectory() as tempdir:
|
||||
with open(tempdir + "/APKBUILD", "w", encoding="utf-8") as handle:
|
||||
handle.write(apkbuild_content)
|
||||
parsed = pmb.parse.apkbuild(args, tempdir + "/APKBUILD", False, False)
|
||||
|
||||
return parsed["pkgver"] + "-r" + parsed["pkgrel"]
|
||||
|
||||
|
||||
def version_compare_operator(result):
|
||||
""" :param result: return value from pmb.parse.version.compare() """
|
||||
if result == -1:
|
||||
return "<"
|
||||
elif result == 0:
|
||||
return "=="
|
||||
elif result == 1:
|
||||
return ">"
|
||||
|
||||
raise RuntimeError("Unexpected version_compare_operator input: " + result)
|
||||
|
||||
|
||||
def exit_with_error_message():
|
||||
print()
|
||||
print("ERROR: Modified package(s) don't have an increased version!")
|
||||
print()
|
||||
print("This can either happen if you did not change the pkgver/pkgrel")
|
||||
print("variables in the APKBUILDs. Or you did change them, but the")
|
||||
print("packages have been updated in the official master branch, and now")
|
||||
print("your versions are not higher anymore.")
|
||||
print()
|
||||
print("Your options:")
|
||||
print("a) If you made changes to the packages, and did not increase the")
|
||||
print(" pkgrel/pkgver: increase them now, and force push your branch.")
|
||||
print(" => https://postmarketos.org/howto-bump-pkgrel-pkgver")
|
||||
print("b) If you had already increased the package versions, rebase on")
|
||||
print(" master, increase the versions again and then force push:")
|
||||
print(" => https://postmarketos.org/rebase")
|
||||
print("c) If you made a change, that does not require rebuilding the")
|
||||
print(" packages, such as only changing the arch=... line: you can")
|
||||
print(" disable this check by adding '[ci:skip-vercheck]' to the")
|
||||
print(" latest commit message, then force push.")
|
||||
print()
|
||||
print("Thank you and sorry for the inconvenience.")
|
||||
exit(1)
|
||||
|
||||
|
||||
def check_versions(args, packages):
|
||||
error = False
|
||||
|
||||
# Get relevant commits: compare HEAD against upstream/master or HEAD~1
|
||||
# (the latter if this CI check is running on upstream/master). Note that
|
||||
# for the common.get_changed_files() code, we don't check against
|
||||
# upstream/master, but against the latest common ancestor. This is not
|
||||
# desired here, since we already know what packages changed, and really
|
||||
# want to check if the version was increased towards *current* master.
|
||||
commit = "upstream/master"
|
||||
if common.run_git(["rev-parse", "HEAD"]) == common.run_git(["rev-parse",
|
||||
commit]):
|
||||
print("NOTE: upstream/master is on same commit as HEAD, comparing"
|
||||
" HEAD against HEAD~1.")
|
||||
commit = "HEAD~1"
|
||||
|
||||
for package in packages:
|
||||
# Get versions, skip new packages
|
||||
head = get_package_version(args, package, "HEAD")
|
||||
master = get_package_version(args, package, commit, False)
|
||||
if not master:
|
||||
print("- {}: {} (HEAD) (new package)".format(package, head))
|
||||
continue
|
||||
|
||||
# Compare head and master versions
|
||||
result = pmb.parse.version.compare(head, master)
|
||||
if result != 1:
|
||||
error = True
|
||||
|
||||
# Print result line ("- hello-world: 1-r2 (HEAD) > 1-r1 (HEAD~1)")
|
||||
formatstr = "- {}: {} (HEAD) {} {} ({})"
|
||||
if result != 1:
|
||||
formatstr += " [ERROR]"
|
||||
operator = version_compare_operator(result)
|
||||
print(formatstr.format(package, head, operator, master, commit))
|
||||
|
||||
if error:
|
||||
exit_with_error_message()
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
# Get and print modified packages
|
||||
common.add_upstream_git_remote()
|
||||
packages = common.get_changed_packages()
|
||||
print(f"Changed packages: {packages}")
|
||||
|
||||
# Verify modified package count
|
||||
common.get_changed_packages_sanity_check(len(packages))
|
||||
if len(packages) == 0:
|
||||
print("no aports changed in this branch")
|
||||
exit(0)
|
||||
|
||||
# Potentially skip this check
|
||||
if common.commit_message_has_string("[ci:skip-vercheck]"):
|
||||
print("WARNING: not checking for changed package versions"
|
||||
" ([ci:skip-vercheck])!")
|
||||
exit(0)
|
||||
|
||||
# Initialize args (so we can use pmbootstrap's APKBUILD parsing)
|
||||
sys.argv = ["pmbootstrap.py", "chroot"]
|
||||
args = pmb.parse.arguments()
|
||||
pmb.helpers.logging.init(args)
|
||||
|
||||
# Verify package versions
|
||||
print("checking changed package versions...")
|
||||
check_versions(args, packages)
|
||||
@@ -1,5 +1,5 @@
|
||||
#!/usr/bin/env python3
|
||||
# Copyright 2023 Oliver Smith
|
||||
# Copyright 2020 Oliver Smith
|
||||
# SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
import argparse
|
||||
@@ -13,17 +13,9 @@ def get_devices():
|
||||
""":returns: list of all devices"""
|
||||
ret = []
|
||||
pmaports = (os.path.realpath(os.path.join(os.path.dirname(__file__) +
|
||||
"/../..")))
|
||||
"/..")))
|
||||
for path in glob.glob(pmaports + "/device/*/device-*/"):
|
||||
device = os.path.dirname(path).split("device-", 1)[1]
|
||||
|
||||
# -downstream suffix is used when packaging the downstream kernel for
|
||||
# devices that have a working mainline kernel. Those are usually
|
||||
# unmaintained and therefore might not appear in the wiki. However,
|
||||
# the main device should be documented (remove the -downstream suffix).
|
||||
if device.endswith('-downstream'):
|
||||
device = device[:-len('-downstream')]
|
||||
|
||||
ret.append(device)
|
||||
return sorted(ret)
|
||||
|
||||
@@ -53,13 +45,6 @@ def get_wiki_devices_html(path):
|
||||
return {"booting": split[0], "not_booting": split[1]}
|
||||
|
||||
|
||||
def get_wiki_renamed_devices_html():
|
||||
""":returns: HTML of the page"""
|
||||
# Download wiki page
|
||||
url = "http://wiki.postmarketos.org/wiki/Renamed_Devices"
|
||||
return urllib.request.urlopen(url).read().decode("utf-8")
|
||||
|
||||
|
||||
def check_device(device, html, is_booting):
|
||||
""":param is_booting: require the device to be in the booting section, not
|
||||
just anywhere in the page (i.e. in the not booting
|
||||
@@ -74,9 +59,6 @@ def check_device(device, html, is_booting):
|
||||
" section already)")
|
||||
return False
|
||||
return True
|
||||
if device in html["renamed"]:
|
||||
print(f"WARNING: {device} was renamed in the wiki")
|
||||
return True
|
||||
|
||||
print(device + ": not in the wiki yet.")
|
||||
return False
|
||||
@@ -97,7 +79,6 @@ def main():
|
||||
|
||||
# Check all devices
|
||||
html = get_wiki_devices_html(args.path)
|
||||
html["renamed"] = get_wiki_renamed_devices_html()
|
||||
error = False
|
||||
for device in get_devices():
|
||||
if not check_device(device, html, args.booting):
|
||||
@@ -110,7 +91,7 @@ def main():
|
||||
print("")
|
||||
print("Now it's time to add some documentation:")
|
||||
print("1) Create a device specific wiki page as described here:")
|
||||
print(" https://wiki.postmarketos.org/wiki/Help:Device_Page")
|
||||
print(" <https://wiki.postmarketos.org/wiki/Help:Device_Page>")
|
||||
print("2) Set 'booting = yes' in the infobox of your device page.")
|
||||
print("3) Run these tests again with an empty commit in your MR:")
|
||||
print(" $ git commit --allow-empty -m 'run tests again'")
|
||||
@@ -121,10 +102,6 @@ def main():
|
||||
print("it more easily. Many times one person did a port with basic")
|
||||
print("functionality, and then someone else jumped in and")
|
||||
print("contributed major new features.")
|
||||
print("")
|
||||
print("NOTE: if you renamed a device in pmaports, rename it in the")
|
||||
print("wiki as well and make sure to add it here:")
|
||||
print("https://postmarketos.org/renamed")
|
||||
return 1
|
||||
else:
|
||||
print("*** Wiki check successful!")
|
||||
Executable
+156
@@ -0,0 +1,156 @@
|
||||
#!/usr/bin/env python3
|
||||
# Copyright 2020 Oliver Smith
|
||||
# SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
import argparse
|
||||
import json
|
||||
import os
|
||||
import sys
|
||||
import urllib.parse
|
||||
import urllib.request
|
||||
|
||||
|
||||
def check_environment_variables():
|
||||
""" Make sure that all environment variables from GitLab CI are present,
|
||||
and exit right here when a variable is missing. """
|
||||
keys = ["CI_MERGE_REQUEST_IID",
|
||||
"CI_MERGE_REQUEST_PROJECT_PATH",
|
||||
"CI_MERGE_REQUEST_SOURCE_PROJECT_URL"]
|
||||
for key in keys:
|
||||
if key in os.environ:
|
||||
continue
|
||||
print("ERROR: missing environment variable: " + key)
|
||||
print("Reference: https://docs.gitlab.com/ee/ci/variables/")
|
||||
exit(1)
|
||||
|
||||
|
||||
def get_url_api():
|
||||
""" :returns: single merge request API URL, as documented here:
|
||||
https://docs.gitlab.com/ee/api/merge_requests.html#get-single-mr """
|
||||
project_path = os.environ["CI_MERGE_REQUEST_PROJECT_PATH"]
|
||||
project_path = urllib.parse.quote_plus(project_path)
|
||||
mr_id = os.environ["CI_MERGE_REQUEST_IID"]
|
||||
|
||||
url = "https://gitlab.com/api/v4/projects/{}/merge_requests/{}"
|
||||
return url.format(project_path, mr_id)
|
||||
|
||||
|
||||
def get_url_mr_edit():
|
||||
""" :returns: the link where the user can edit their own MR """
|
||||
url = "https://gitlab.com/{}/merge_requests/{}/edit"
|
||||
return url.format(os.environ["CI_MERGE_REQUEST_PROJECT_PATH"],
|
||||
os.environ["CI_MERGE_REQUEST_IID"])
|
||||
|
||||
|
||||
def get_url_repo_settings():
|
||||
""" :returns: link to the user's forked pmaports project's settings """
|
||||
prefix = os.environ["CI_MERGE_REQUEST_SOURCE_PROJECT_URL"]
|
||||
return prefix + "/settings/repository"
|
||||
|
||||
|
||||
def get_mr_settings(path):
|
||||
""" Get the merge request API data and parse it as JSON. Print the whole
|
||||
thing on failure.
|
||||
|
||||
:param path: to a local file with the saved API data (will download a
|
||||
fresh copy when set to None)
|
||||
:returns: dict of settings data (see GitLab API reference) """
|
||||
content = ""
|
||||
if path:
|
||||
# Read file
|
||||
with open(path, encoding="utf-8") as handle:
|
||||
content = handle.read()
|
||||
else:
|
||||
# Download from GitLab API
|
||||
url = get_url_api()
|
||||
print("Download " + url)
|
||||
content = urllib.request.urlopen(url).read().decode("utf-8")
|
||||
|
||||
# Parse JSON
|
||||
try:
|
||||
return json.loads(content)
|
||||
except:
|
||||
print("ERROR: failed to decode JSON. Here's the whole content for"
|
||||
" debugging:")
|
||||
print("---")
|
||||
print(content)
|
||||
exit(1)
|
||||
|
||||
|
||||
def settings_read(settings, key):
|
||||
if key not in settings:
|
||||
print("ERROR: missing '" + key + "' key in settings!")
|
||||
print("Here are the whole settings for debugging:")
|
||||
print("---")
|
||||
print(settings)
|
||||
exit(1)
|
||||
return settings[key]
|
||||
|
||||
|
||||
def check_allow_push(settings):
|
||||
""" :returns: True when maintainers are allowed to push to the branch
|
||||
(what we want!), False otherwise """
|
||||
|
||||
# Check if source branch is in same repository
|
||||
source = settings_read(settings, "source_project_id")
|
||||
target = settings_read(settings, "target_project_id")
|
||||
if source == target:
|
||||
return True
|
||||
|
||||
return settings_read(settings, "allow_maintainer_to_push")
|
||||
|
||||
|
||||
def main():
|
||||
# Parse arguments
|
||||
parser = argparse.ArgumentParser()
|
||||
parser.add_argument("--path", help="use a local file instead of querying"
|
||||
" the GitLab API", default=None)
|
||||
args = parser.parse_args()
|
||||
|
||||
# Check the merge request
|
||||
check_environment_variables()
|
||||
settings = get_mr_settings(args.path)
|
||||
|
||||
# Make sure that squashing is disabled
|
||||
if settings_read(settings, "squash"):
|
||||
print("*** MR settings check failed!")
|
||||
print('ERROR: Please turn off the "Squash commits when merge request'
|
||||
' is accepted." option in the merge request settings.')
|
||||
return 1
|
||||
if check_allow_push(settings):
|
||||
print("*** MR settings check successful!")
|
||||
else:
|
||||
print("*** MR settings check failed!")
|
||||
print()
|
||||
print("We need to be able to push changes to your merge request.")
|
||||
print("So we can rebase it on master right before merging, add the")
|
||||
print("MR-ID to the commit messages, etc.")
|
||||
print()
|
||||
print("How to fix it:")
|
||||
print("1) Open the 'edit' page of your merge request:")
|
||||
print(" " + get_url_mr_edit())
|
||||
print("2) Enable this option and save:")
|
||||
print(" 'Allow commits from members who can merge to the target"
|
||||
" branch'")
|
||||
print("3) Run these tests again with an empty commit in your MR:")
|
||||
print(" $ git commit --allow-empty -m 'run mr-settings test again'")
|
||||
print()
|
||||
print("If that setting is disabled, then you have created the MR from")
|
||||
print("a protected branch. When you had forked the repository from")
|
||||
print("postmarketOS, the protected branch settings were copied to")
|
||||
print("your fork.")
|
||||
print()
|
||||
print("Resolve this with:")
|
||||
print("1) Open your repository settings:")
|
||||
print(" " + get_url_repo_settings())
|
||||
print("2) Scroll down to 'Protected Branches' and expand it")
|
||||
print("3) Click 'unprotect' next to the branch from your MR")
|
||||
print("4) Follow steps 1-3 from the first list again, the option")
|
||||
print(" should not be disabled anymore.")
|
||||
print()
|
||||
print("Thank you and sorry for the inconvenience.")
|
||||
return 1
|
||||
return 0
|
||||
|
||||
|
||||
sys.exit(main())
|
||||
Executable
+162
@@ -0,0 +1,162 @@
|
||||
#!/usr/bin/env python3
|
||||
# Copyright 2020 Oliver Smith
|
||||
# SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
# Various functions used in CI scripts
|
||||
|
||||
import os
|
||||
import subprocess
|
||||
import sys
|
||||
|
||||
|
||||
def get_pmaports_dir():
|
||||
return os.path.realpath(os.path.join(os.path.dirname(__file__) + "/.."))
|
||||
|
||||
|
||||
def run_git(parameters, check=True, stderr=None):
|
||||
""" Run git in the pmaports dir and return the output """
|
||||
cmd = ["git", "-C", get_pmaports_dir()] + parameters
|
||||
try:
|
||||
return subprocess.check_output(cmd, stderr=stderr).decode()
|
||||
except subprocess.CalledProcessError:
|
||||
if check:
|
||||
raise
|
||||
return None
|
||||
|
||||
|
||||
def add_upstream_git_remote():
|
||||
""" Add a remote pointing to postmarketOS/pmaports. """
|
||||
run_git(["remote", "add", "upstream",
|
||||
"https://gitlab.com/postmarketOS/pmaports.git"], False)
|
||||
run_git(["fetch", "-q", "upstream"])
|
||||
|
||||
|
||||
def commit_message_has_string(needle):
|
||||
return needle in run_git(["show", "-s", "--format=full", "HEAD"])
|
||||
|
||||
|
||||
def run_pmbootstrap(parameters, output_return=False):
|
||||
""" Run pmbootstrap with the pmaports dir as --aports """
|
||||
cmd = ["pmbootstrap", "--aports", get_pmaports_dir()] + parameters
|
||||
stdout = subprocess.PIPE if output_return else None
|
||||
result = subprocess.run(cmd, stdout=stdout, universal_newlines=True)
|
||||
result.check_returncode()
|
||||
if output_return:
|
||||
return result.stdout
|
||||
|
||||
|
||||
def get_changed_files(removed=True):
|
||||
""" Get all changed files and print them, as well as the branch and the
|
||||
commit that was used for the diff.
|
||||
:param removed: also return removed files (default: True)
|
||||
:returns: set of changed files
|
||||
"""
|
||||
commit_head = run_git(["rev-parse", "HEAD"])[:-1]
|
||||
commit_upstream_master = run_git(["rev-parse", "upstream/master"])[:-1]
|
||||
print("commit HEAD: " + commit_head)
|
||||
print("commit upstream/master: " + commit_upstream_master)
|
||||
|
||||
# Check if we are latest upstream/master
|
||||
if commit_head == commit_upstream_master:
|
||||
# then compare with previous commit
|
||||
commit = "HEAD~1"
|
||||
else:
|
||||
# otherwise compare with latest common ancestor
|
||||
commit = run_git(["merge-base", "upstream/master", "HEAD"])[:-1]
|
||||
print("comparing HEAD with: " + commit)
|
||||
|
||||
# Changed files
|
||||
ret = set()
|
||||
print("changed file(s):")
|
||||
for file in run_git(["diff", "--name-only", commit, "HEAD"]).splitlines():
|
||||
message = " " + file
|
||||
if not os.path.exists(file):
|
||||
message += " (deleted)"
|
||||
if removed:
|
||||
ret.add(file)
|
||||
else:
|
||||
ret.add(file)
|
||||
print(message)
|
||||
return ret
|
||||
|
||||
|
||||
def get_changed_packages_sanity_check(count):
|
||||
for mark in ["[ci:ignore-count]", "[ci:skip-build]"]:
|
||||
if commit_message_has_string(mark):
|
||||
print("NOTE: package count sanity check skipped (" + mark + ").")
|
||||
return
|
||||
if count <= 10:
|
||||
return
|
||||
|
||||
print()
|
||||
print("ERROR: Too many packages have changed!")
|
||||
print()
|
||||
print("This is a sanity check, so we don't end up building packages that")
|
||||
print("have not been modified. CI won't run for more than one hour")
|
||||
print("anyway.")
|
||||
print()
|
||||
print("Your options:")
|
||||
print("a) If you *did not* modify everything listed above, then rebase")
|
||||
print(" your branch on the official postmarketOS/pmaports.git master")
|
||||
print(" branch. Feel free to ask in the chat for help if you need any.")
|
||||
print("b) If you *did* modify all these packages, and you assume that")
|
||||
print(" they will build within one hour: skip this sanity check by")
|
||||
print(" adding '[ci:ignore-count]' to the commit message (then force")
|
||||
print(" push).")
|
||||
print("c) If you *did* modify all these packages, and you are sure that")
|
||||
print(" they won't build in time, please add '[ci:skip-build]' to the")
|
||||
print(" commit message (then force push). Make sure that all packages")
|
||||
print(" build with 'pmbootstrap build --strict'!")
|
||||
print()
|
||||
print("Thank you and sorry for the inconvenience.")
|
||||
|
||||
sys.exit(1)
|
||||
|
||||
|
||||
def get_changed_packages():
|
||||
ret = set()
|
||||
for file in get_changed_files():
|
||||
dirname, filename = os.path.split(file)
|
||||
|
||||
# Skip files:
|
||||
# * in the root dir of pmaports (e.g. README.md)
|
||||
# * path with a dot (e.g. .gitlab-ci/, device/.shared-patches/)
|
||||
if not dirname or file.startswith(".") or "/." in file:
|
||||
continue
|
||||
|
||||
if filename != "APKBUILD":
|
||||
# Walk up directories until we (eventually) find the package
|
||||
# the file belongs to (could be in a subdirectory of a package)
|
||||
while dirname and not os.path.exists(os.path.join(dirname, "APKBUILD")):
|
||||
dirname = os.path.dirname(dirname)
|
||||
|
||||
# Unable to find APKBUILD the file belong to
|
||||
if not dirname:
|
||||
# ... maybe the package was deleted entirely?
|
||||
if not os.path.exists(file):
|
||||
continue
|
||||
|
||||
# Weird, file does not belong to any package?
|
||||
# Here we just warn, there is an extra check
|
||||
# to make sure that files are organized properly.
|
||||
print(f"WARNING: Changed file {file} does not belong to any package")
|
||||
continue
|
||||
|
||||
elif not os.path.exists(file):
|
||||
continue # APKBUILD was deleted
|
||||
|
||||
ret.add(os.path.basename(dirname))
|
||||
|
||||
return ret
|
||||
|
||||
|
||||
def check_build(packages, verify_only=False):
|
||||
# Initialize build environment with less logging
|
||||
run_pmbootstrap(["build_init"])
|
||||
|
||||
if verify_only:
|
||||
run_pmbootstrap(["--details-to-stdout", "checksum", "--verify"] +
|
||||
list(packages))
|
||||
else:
|
||||
run_pmbootstrap(["--details-to-stdout", "build", "--strict",
|
||||
"--force"] + list(packages))
|
||||
@@ -1,9 +1,9 @@
|
||||
#!/bin/sh -e
|
||||
# Copyright 2021 Oliver Smith
|
||||
# Copyright 2020 Oliver Smith
|
||||
# SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
if [ -z "$1" ]; then
|
||||
echo "usage: $(basename "$0") \$CI_PROJECT_DIR"
|
||||
echo "usage: $(basename $0) \$CI_PROJECT_DIR"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
Executable
+35
@@ -0,0 +1,35 @@
|
||||
#!/bin/sh -e
|
||||
# Copyright 2020 Oliver Smith
|
||||
# SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
# Require pmbootstrap
|
||||
if ! command -v pmbootstrap > /dev/null; then
|
||||
echo "ERROR: pmbootstrap needs to be installed."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Wrap pmbootstrap to use this repository for --aports
|
||||
pmaports="$(cd $(dirname $0)/..; pwd -P)"
|
||||
_pmbootstrap="$(command -v pmbootstrap)"
|
||||
pmbootstrap() {
|
||||
"$_pmbootstrap" --aports="$pmaports" "$@"
|
||||
}
|
||||
|
||||
# Make sure that the work folder format is up to date, and that there are no
|
||||
# mounts from aborted test cases (pmbootstrap#1595)
|
||||
pmbootstrap work_migrate
|
||||
pmbootstrap -q shutdown
|
||||
|
||||
# Make sure we have a valid device (pmbootstrap#1128)
|
||||
device="$(pmbootstrap config device)"
|
||||
deviceinfo="$pmaports/device/*/device-$device/deviceinfo"
|
||||
if ! [ -e $deviceinfo ]; then
|
||||
echo "ERROR: Could not find deviceinfo file for selected device '$device'."
|
||||
echo "Expected path: $deviceinfo"
|
||||
echo "Maybe you have switched to a branch where your device does not exist?"
|
||||
echo "Use 'pmbootstrap config device qemu-amd64' to switch to a valid device."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Run testcases
|
||||
pytest -vv -x --tb=native "$pmaports/.gitlab-ci/testcases" "$@"
|
||||
Executable
+45
@@ -0,0 +1,45 @@
|
||||
#!/bin/sh -e
|
||||
# Copyright 2020 Oliver Smith
|
||||
# SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
set -e
|
||||
DIR="$(cd "$(dirname "$0")" && pwd -P)"
|
||||
cd "$DIR/.."
|
||||
|
||||
# Find CHANGEMEs in APKBUILDs
|
||||
if grep -qr '(CHANGEME!)' *; then
|
||||
echo "ERROR: Please replace '(CHANGEME!)' in the following files:"
|
||||
grep --color=always -r '(CHANGEME!)' *
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Shell: shellcheck
|
||||
sh_files="
|
||||
./main/postmarketos-base/firmwareload.sh
|
||||
./main/postmarketos-mkinitfs/init.sh.in
|
||||
./main/postmarketos-mkinitfs/init_functions.sh
|
||||
./main/postmarketos-mkinitfs/mkinitfs.sh
|
||||
./main/postmarketos-mkinitfs/mkinitfs_functions.sh
|
||||
./main/postmarketos-mkinitfs/mkinitfs_test.sh
|
||||
./main/postmarketos-mkinitfs-hook-debug-shell/20-debug-shell.sh
|
||||
./main/postmarketos-update-kernel/update-kernel.sh
|
||||
./main/mdss-fb-init-hack/mdss-fb-init-hack.sh
|
||||
|
||||
$(find . -path './main/postmarketos-ui-*/*.sh')
|
||||
$(find . -path './main/postmarketos-ui-*/*.pre-install')
|
||||
$(find . -path './main/postmarketos-ui-*/*.post-install')
|
||||
$(find . -path './main/postmarketos-ui-*/*.pre-upgrade')
|
||||
$(find . -path './main/postmarketos-ui-*/*.post-upgrade')
|
||||
$(find . -path './main/postmarketos-ui-*/*.pre-deinstall')
|
||||
$(find . -path './main/postmarketos-ui-*/*.post-deinstall')
|
||||
|
||||
$(find . -name '*.trigger')
|
||||
$(find . -path './main/devicepkg-dev/*.sh')
|
||||
|
||||
$(find . -path '.gitlab-ci/*.sh')
|
||||
"
|
||||
for file in $sh_files; do
|
||||
echo "Test with shellcheck: $file"
|
||||
cd "$DIR/../$(dirname "$file")"
|
||||
shellcheck -e SC1008 -x "$(basename "$file")"
|
||||
done
|
||||
@@ -0,0 +1,37 @@
|
||||
#!/usr/bin/env python3
|
||||
# Copyright 2020 Oliver Smith
|
||||
# SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
import shutil
|
||||
import sys
|
||||
import os
|
||||
from distutils.sysconfig import get_python_lib
|
||||
|
||||
|
||||
def path_pmbootstrap():
|
||||
""" Find the pmbootstrap installation folder, so we can import the Python
|
||||
code from there.
|
||||
returns: pmbootstrap installation folder
|
||||
"""
|
||||
# Find 'pmbootstrap' executable
|
||||
bin = shutil.which("pmbootstrap")
|
||||
if not bin:
|
||||
print("ERROR: 'pmbootstrap' not found in $PATH")
|
||||
sys.exit(1)
|
||||
|
||||
# Resolve the symlink and verify the folder
|
||||
dir = os.path.dirname(os.path.realpath(bin))
|
||||
if os.path.exists(dir + "/pmb/__init__.py"):
|
||||
return dir
|
||||
|
||||
dir = get_python_lib()
|
||||
if os.path.exists(dir + "/pmb/__init__.py"):
|
||||
return dir
|
||||
|
||||
# Symlink not set up properly
|
||||
print("ERROR: 'pmbootstrap' is not a symlink to pmbootstrap.py")
|
||||
sys.exit(1)
|
||||
|
||||
|
||||
# Add pmbootstrap dir to import path
|
||||
sys.path.append(os.path.realpath(path_pmbootstrap()))
|
||||
@@ -0,0 +1,162 @@
|
||||
#!/usr/bin/env python3
|
||||
# Copyright 2020 Oliver Smith
|
||||
# SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
import glob
|
||||
import pytest
|
||||
import sys
|
||||
import os
|
||||
|
||||
import add_pmbootstrap_to_import_path
|
||||
import pmb.parse
|
||||
import pmb.parse._apkbuild
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def args(request):
|
||||
# Initialize args
|
||||
sys.argv = ["pmbootstrap",
|
||||
"--aports", os.path.dirname(__file__) + "/../..",
|
||||
"--log", "$WORK/log_testsuite_pmaports.txt"
|
||||
"chroot"]
|
||||
args = pmb.parse.arguments()
|
||||
|
||||
# Initialize logging
|
||||
pmb.helpers.logging.init(args)
|
||||
request.addfinalizer(args.logfd.close)
|
||||
return args
|
||||
|
||||
|
||||
def deviceinfo_obsolete(info):
|
||||
"""
|
||||
Test for obsolete options used in the deviceinfo file. They must still be
|
||||
defined in pmbootstrap's config/__init__.py.
|
||||
"""
|
||||
obsolete_options = ["weston_pixman_type"]
|
||||
for option in obsolete_options:
|
||||
if info[option]:
|
||||
raise RuntimeError("option '" + option + "' is obsolete, please"
|
||||
" remove it (reasons for removal are at"
|
||||
" <https://postmarketos.org/deviceinfo>)")
|
||||
|
||||
|
||||
def test_deviceinfo(args):
|
||||
"""
|
||||
Parse all deviceinfo files successfully and run checks on the parsed data.
|
||||
"""
|
||||
# Iterate over all devices
|
||||
last_exception = None
|
||||
count = 0
|
||||
for folder in glob.glob(args.aports + "/device/*/device-*"):
|
||||
device = folder[len(args.aports):].split("-", 1)[1]
|
||||
|
||||
try:
|
||||
# Successful deviceinfo parsing / obsolete options
|
||||
info = pmb.parse.deviceinfo(args, device)
|
||||
deviceinfo_obsolete(info)
|
||||
|
||||
# deviceinfo_name must start with manufacturer
|
||||
name = info["name"]
|
||||
manufacturer = info["manufacturer"]
|
||||
if not name.startswith(manufacturer) and \
|
||||
not name.startswith("Google"):
|
||||
raise RuntimeError("Please add the manufacturer in front of"
|
||||
" the deviceinfo_name, e.g.: '" +
|
||||
manufacturer + " " + name + "'")
|
||||
|
||||
# Don't abort on first error
|
||||
except Exception as e:
|
||||
last_exception = e
|
||||
count += 1
|
||||
print(device + ": " + str(e))
|
||||
|
||||
# Raise the last exception
|
||||
if last_exception:
|
||||
print("deviceinfo error count: " + str(count))
|
||||
raise last_exception
|
||||
|
||||
|
||||
def device_dependency_check(apkbuild, path):
|
||||
""" Raise an error if a device package has a dependency that is not allowed
|
||||
(e.g. because it should be in a subpackage instead). """
|
||||
|
||||
# asus-me176c: without this, the device will simply run the broken ACPI
|
||||
# DSDT table, so we might as well update it. See pmaports!699.
|
||||
firmware_ok = {"device-asus-me176c": ["firmware-asus-me176c-acpi"]}
|
||||
|
||||
pkgname = apkbuild["pkgname"]
|
||||
for depend in apkbuild["depends"]:
|
||||
if (depend.startswith("firmware-") or
|
||||
depend.startswith("linux-firmware")):
|
||||
if pkgname in firmware_ok and depend in firmware_ok[pkgname]:
|
||||
continue
|
||||
raise RuntimeError("Firmware package '" + depend + "' found in"
|
||||
" depends of " + path + ". These go into"
|
||||
" subpackages now, see"
|
||||
" <https://postmarketos.org/devicepkg>.")
|
||||
|
||||
|
||||
def test_aports_device(args):
|
||||
"""
|
||||
Various tests performed on the /device/*/device-* aports.
|
||||
"""
|
||||
for path in glob.glob(args.aports + "/device/*/device-*/APKBUILD"):
|
||||
apkbuild = pmb.parse.apkbuild(args, path)
|
||||
|
||||
# Depends: Require "postmarketos-base"
|
||||
if "postmarketos-base" not in apkbuild["depends"]:
|
||||
raise RuntimeError("Missing 'postmarketos-base' in depends of " +
|
||||
path)
|
||||
|
||||
# Depends: Must not have firmware packages
|
||||
for depend in apkbuild["depends"]:
|
||||
device_dependency_check(apkbuild, path)
|
||||
|
||||
# Architecture
|
||||
device = apkbuild["pkgname"][len("device-"):]
|
||||
deviceinfo = pmb.parse.deviceinfo(args, device)
|
||||
if "".join(apkbuild["arch"]) != deviceinfo["arch"]:
|
||||
raise RuntimeError("wrong architecture, please change to arch=\"" +
|
||||
deviceinfo["arch"] + "\": " + path)
|
||||
if "!archcheck" not in apkbuild["options"]:
|
||||
raise RuntimeError("!archcheck missing in options= line: " + path)
|
||||
|
||||
|
||||
def test_aports_device_kernel(args):
|
||||
"""
|
||||
Verify the kernels specified in the device packages:
|
||||
* Kernel must not be in depends when kernels are in subpackages
|
||||
* Check if only one kernel is defined in depends
|
||||
"""
|
||||
|
||||
# Iterate over device aports
|
||||
for path in glob.glob(args.aports + "/device/*/device-*/APKBUILD"):
|
||||
# Parse apkbuild and kernels from subpackages
|
||||
apkbuild = pmb.parse.apkbuild(args, path)
|
||||
device = apkbuild["pkgname"][len("device-"):]
|
||||
kernels_subpackages = pmb.parse._apkbuild.kernels(args, device)
|
||||
|
||||
# Parse kernels from depends
|
||||
kernels_depends = []
|
||||
for depend in apkbuild["depends"]:
|
||||
if not depend.startswith("linux-"):
|
||||
continue
|
||||
kernels_depends.append(depend)
|
||||
|
||||
# Kernel in subpackages *and* depends
|
||||
if kernels_subpackages:
|
||||
raise RuntimeError("Kernel package '" + depend + "' needs to"
|
||||
" be removed when using kernel" +
|
||||
" subpackages: " + path)
|
||||
|
||||
# No kernel
|
||||
if not kernels_depends and not kernels_subpackages:
|
||||
raise RuntimeError("Device doesn't have a kernel in depends or"
|
||||
" subpackages: " + path)
|
||||
|
||||
# Multiple kernels in depends
|
||||
if len(kernels_depends) > 1:
|
||||
raise RuntimeError("Please use kernel subpackages instead of"
|
||||
" multiple kernels in depends (see"
|
||||
" <https://postmarketos.org/devicepkg>): " +
|
||||
path)
|
||||
@@ -0,0 +1,133 @@
|
||||
#!/usr/bin/env python3
|
||||
# Copyright 2020 Oliver Smith
|
||||
# SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
""" Make sure that components of frameworks (Qt, KDE, ...) have the same
|
||||
version in all packages. We scan all packages, categorize them by URL
|
||||
and then compare the versions of all packages in each category. """
|
||||
|
||||
import glob
|
||||
import logging
|
||||
import os
|
||||
import pytest
|
||||
import sys
|
||||
|
||||
import add_pmbootstrap_to_import_path
|
||||
import pmb.config
|
||||
import pmb.parse
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def args(request):
|
||||
# Initialize args
|
||||
sys.argv = ["pmbootstrap",
|
||||
"--aports", os.path.dirname(__file__) + "/../..",
|
||||
"--log", "$WORK/log_testsuite_pmaports.txt"
|
||||
"chroot"]
|
||||
args = pmb.parse.arguments()
|
||||
|
||||
# Initialize logging
|
||||
pmb.helpers.logging.init(args)
|
||||
request.addfinalizer(args.logfd.close)
|
||||
return args
|
||||
|
||||
|
||||
def get_categorized_packages(args):
|
||||
"""
|
||||
Parse all aports and categorize them.
|
||||
|
||||
:returns: {"plasma": {"kwin": "5.13.3", ...},
|
||||
"kde": {"kcrash": "5.48.0", ...},
|
||||
"qt": {"qt5-qtbase": "5.12.0", ...},
|
||||
"other": {"konsole": "1234", ...}}
|
||||
"""
|
||||
ret = {}
|
||||
|
||||
for path in glob.glob(args.aports + "/*/*/APKBUILD"):
|
||||
# Parse APKBUILD
|
||||
apkbuild = pmb.parse.apkbuild(args, path)
|
||||
url = apkbuild["url"]
|
||||
pkgname = apkbuild["pkgname"]
|
||||
pkgver = apkbuild["pkgver"]
|
||||
if pkgver == "9999":
|
||||
pkgver = apkbuild["_pkgver"]
|
||||
|
||||
if "_git" in pkgver:
|
||||
continue
|
||||
|
||||
# Categorize by URL
|
||||
category = "other"
|
||||
if "https://www.kde.org/workspaces/plasmadesktop" in url:
|
||||
category = "plasma"
|
||||
elif "https://community.kde.org/Frameworks" in url:
|
||||
category = "kde"
|
||||
elif url in ["http://qt-project.org/",
|
||||
"https://www.qt.io/developers/"]:
|
||||
category = "qt"
|
||||
|
||||
# Remove hotfix number (i.e. 5.16.90.1 becomes 5.16.90)
|
||||
if category in ["kde", "plasma"]:
|
||||
pkgver = ".".join(pkgver.split(".")[0:3])
|
||||
|
||||
# Save result
|
||||
if category not in ret:
|
||||
ret[category] = {}
|
||||
ret[category][pkgname] = pkgver
|
||||
return ret
|
||||
|
||||
|
||||
def check_categories(categories):
|
||||
"""
|
||||
Make sure that all packages in one framework (kde, plasma, ...) have the
|
||||
same package version (and that there is at least one package in each
|
||||
category).
|
||||
|
||||
:param categories: see return of get_categorized_packages()
|
||||
:returns: True when the check passed, False otherwise
|
||||
"""
|
||||
ret = True
|
||||
for category, packages in categories.items():
|
||||
reference = None
|
||||
for pkgname, pkgver in packages.items():
|
||||
|
||||
# Use the first package as reference and print a summary
|
||||
if not reference:
|
||||
logging.info("---")
|
||||
logging.info("Package category: " + category)
|
||||
logging.info("Packages count: " + str(len(packages)))
|
||||
|
||||
# Category "other": done after printing the basic summary, no
|
||||
# need to print each package or compare the package versions
|
||||
if category == "other":
|
||||
reference = True
|
||||
break
|
||||
|
||||
# Print all packages
|
||||
logging.info("Packages: " + ", ".join(sorted(packages.keys())))
|
||||
|
||||
# Print the reference and skip checking it against itself
|
||||
reference = {"pkgname": pkgname, "pkgver": pkgver}
|
||||
logging.info("Reference pkgver: " + pkgver + " (from '" +
|
||||
pkgname + "')")
|
||||
continue
|
||||
|
||||
# Check version against reference
|
||||
if pkgver != reference["pkgver"]:
|
||||
logging.info("ERROR: " + pkgname + " has version " + pkgver)
|
||||
ret = False
|
||||
|
||||
# Each category must at least have one package
|
||||
if not reference:
|
||||
logging.info("ERROR: could not find any packages in category: " +
|
||||
category)
|
||||
ret = False
|
||||
return ret
|
||||
|
||||
|
||||
def test_framework_versions(args):
|
||||
"""
|
||||
Make sure that packages of the same framework have the same version.
|
||||
"""
|
||||
categories = get_categorized_packages(args)
|
||||
if not check_categories(categories):
|
||||
raise RuntimeError("Framework version check failed!")
|
||||
@@ -0,0 +1,56 @@
|
||||
#!/usr/bin/env python3
|
||||
# SPDX-License-Identifier: GPL-3.0-or-later
|
||||
import glob
|
||||
import os
|
||||
|
||||
expected_directories = [
|
||||
"console",
|
||||
"cross",
|
||||
"device/community",
|
||||
"device/main",
|
||||
"device/testing",
|
||||
"firmware",
|
||||
"hybris",
|
||||
"kde",
|
||||
"maemo",
|
||||
"main",
|
||||
"modem",
|
||||
"temp",
|
||||
]
|
||||
|
||||
|
||||
# pmbootstrap allows placing APKBUILDs in arbitrarily nested directories.
|
||||
# This test makes sure all of them are in one of the expected locations.
|
||||
def test_directories():
|
||||
apkbuilds = set(glob.iglob("**/APKBUILD", recursive=True))
|
||||
expected = set(f for d in expected_directories for f in glob.iglob(d + "/*/APKBUILD"))
|
||||
assert apkbuilds == expected, "Found APKBUILD in unexpected directory. " \
|
||||
"Consider adding it to test_directory_structure.py!"
|
||||
|
||||
|
||||
# Make sure files are either:
|
||||
# - in root directory (README.md)
|
||||
# - hidden (.gitlab-ci/, device/.shared-patches/)
|
||||
# - or belong to a package (below a directory with APKBUILD)
|
||||
def test_files_belong_to_package():
|
||||
# Walk directories and set package_dir when we find an APKBUILD
|
||||
# This allows matching files in subdirectories to the package directory.
|
||||
package_dir = None
|
||||
for dirpath, dirs, files in os.walk("."):
|
||||
# Skip "hidden" directories
|
||||
dirs[:] = [d for d in dirs if not d.startswith(".")]
|
||||
# Ignore files in root directory
|
||||
if dirpath == '.':
|
||||
continue
|
||||
|
||||
# Switched to another directory?
|
||||
if package_dir and not dirpath.startswith(package_dir + os.sep):
|
||||
package_dir = None
|
||||
|
||||
if 'APKBUILD' in files:
|
||||
assert not package_dir, f"Nested packages: {package_dir} and {dirpath} " \
|
||||
"both contain an APKBUILD"
|
||||
package_dir = dirpath
|
||||
|
||||
assert not files or package_dir, "Found files that do not belong to any package: " \
|
||||
f"{dirpath}/{files}"
|
||||
@@ -1,48 +0,0 @@
|
||||
<!--
|
||||
Thank you for using postmarketOS! In order to speed up process of resolving your issue,
|
||||
we would like you to fill in the following :
|
||||
-->
|
||||
### Describe your issue
|
||||
#### What's the expected behaviour?
|
||||
|
||||
#### What's the current behaviour?
|
||||
|
||||
#### How to reproduce your issue?
|
||||
|
||||
### What device are you using?
|
||||
<!--
|
||||
Leave name of your device in vendor-codename format.
|
||||
If unsure, check name in the device package or leave full name of device
|
||||
PinePhone: which revision exactly? See https://wiki.pine64.org/index.php/PinePhone#Hardware_revisions
|
||||
-->
|
||||
|
||||
### On what postmarketOS version did you encounter the issue?
|
||||
<!--
|
||||
Replace space inside `[ ]` with `x` to fill the checkbox
|
||||
-->
|
||||
* [ ] edge (`master` branch)
|
||||
* [ ] `v23.06`
|
||||
* [ ] `v22.12` (Supported until 2023-07-06)
|
||||
|
||||
* [ ] I confirm that the issue still is present after running `sudo apk upgrade -a`
|
||||
|
||||
### On what environment did you encounter the issue?
|
||||
#### Environments
|
||||
* [ ] GNOME Shell on Mobile
|
||||
* [ ] Phosh
|
||||
* [ ] Plasma Mobile
|
||||
* [ ] Sxmo (Wayland/Sway) **Please post the output of `sxmo_version.sh`**
|
||||
* [ ] Other: **Please fill out**
|
||||
### How did you get postmarketOS image?
|
||||
* [ ] from https://images.postmarketos.org
|
||||
* [ ] I built it using pmbootstrap
|
||||
* [ ] It was preinstalled on my device
|
||||
### What's the build date of the image? (in yyyy-mm-dd format)
|
||||
<!--
|
||||
Notes:
|
||||
can be left empty if unsure
|
||||
If you downloaded image from images.postmarketos.org, date will be in yyyymmdd format
|
||||
-->
|
||||
|
||||
### Additional information
|
||||
<!-- logs, etc. -- make use <details> for long listings -->
|
||||
+6
-1
@@ -1,7 +1,12 @@
|
||||
{
|
||||
"subject_format": {
|
||||
"pass": [
|
||||
"^(([a-z]+\\/[a-z\\-0-9*{}]+),?)+: [A-Za-z\\/\\-0-9*{}\\(\\)\\.,_&:=' ]+( \\(MR \\d+\\)|)$",
|
||||
"^[a-z]+/[a-z-0-9*{}]+: new aport(s|)( \\(MR \\d+\\)|)$",
|
||||
"^[a-z]+/[a-z-0-9*{}]+: pkgrel bump( \\(MR \\d+\\)|)$",
|
||||
"^[a-z-0-9*{}]+: new device \\([^\\)]+\\)( \\(MR \\d+\\)|)",
|
||||
"^[a-z]+/[a-z-0-9*{}]+: upgrade to [0-9\\.a-z\\-_]+( \\(MR \\d+\\)|)$",
|
||||
"^[a-z]+/[a-z-0-9*{}]+: remove( \\(MR \\d+\\)|)$",
|
||||
"^[a-z]+/[a-z-0-9*{}]+: remove, upstreamed( \\(MR \\d+\\)|)$",
|
||||
"^CI: [a-z-0-9*{}\\(\\)\\.,_ ][A-Za-z\\/\\-0-9*{}\\(\\)\\.,_ ]+( \\(MR \\d+\\)|)$",
|
||||
"^mrhlpr.json: [a-z-0-9*{}\\(\\)\\.,_ ][A-Za-z\\/\\-0-9*{}\\(\\)\\.,_ ]+( \\(MR \\d+\\)|)$",
|
||||
"^pmaports.cfg: [a-z-0-9*{}\\(\\)\\.,_ ][A-Za-z\\/\\-0-9*{}\\(\\)\\.,_ ]+( \\(MR \\d+\\)|)$"
|
||||
|
||||
-88
@@ -1,88 +0,0 @@
|
||||
# https://docs.gitlab.com/ee/user/project/code_owners.html
|
||||
|
||||
device/*/*-htc-golfu/ @Newbyte
|
||||
device/*/*-pine64-pinephone/ @craftyguy @milesalan @bshah @proycon @anjandev @StacyHarper
|
||||
device/*/*-htc-m8qlul/ @Newbyte
|
||||
device/*/*-purism-librem5/ @craftyguy @bshah
|
||||
device/*/device-lg-judyln/ @Newbyte
|
||||
device/*/device-samsung-m0/ @Newbyte
|
||||
device/*/linux-postmarketos-exynos4/ @Newbyte
|
||||
device/*/linux-postmarketos-msm8939/ @Newbyte
|
||||
device/*/linux-postmarketos-stericsson/ @Newbyte
|
||||
device/*/*-qcom-sdm845/ @sdm845-mainline
|
||||
device/*/*-xiaomi-berrylium/ @joelselvaraj
|
||||
device/*/device-oneplus-enchilada/ @calebccff
|
||||
device/*/device-oneplus-fajita/ @calebccff
|
||||
device/*/firmware-oneplus-sdm845/ @calebccff
|
||||
device/*/device-shift-axolotl/ @amartinz @calebccff @dylanvanassche
|
||||
device/*/*-lenovo-a6010/ @jenneron
|
||||
device/*/*-lenovo-a6000/ @jenneron
|
||||
device/*/device-microsoft-surface-rt/ @jenneron
|
||||
device/*/device-google-fennel/ @jenneron
|
||||
device/*/device-google-veyron-minnie/ @jenneron
|
||||
device/*/device-google-burnet/ @jenneron
|
||||
device/*/device-google-elm/ @jenneron
|
||||
device/*/device-google-nyan-big/ @jenneron
|
||||
device/*/device-google-peach-pi/ @jenneron
|
||||
device/*/device-google-veyron-speedy/ @jenneron
|
||||
device/*/linux-google-veyron/ @jenneron
|
||||
device/*/u-boot-peach-pi/ @jenneron
|
||||
device/*/device-google-cozmo/ @jenneron
|
||||
device/*/u-boot-veyron-speedy/ @jenneron
|
||||
device/*/device-google-juniper/ @jenneron @binarycraft
|
||||
device/*/u-boot-peach-pit/ @jenneron
|
||||
device/*/device-google-damu/ @jenneron
|
||||
device/*/u-boot-nyan-4gb/ @jenneron
|
||||
device/*/device-google-kenzo/ @jenneron
|
||||
device/*/device-google-kodama/ @jenneron
|
||||
device/*/u-boot-snow/ @jenneron
|
||||
device/*/device-google-kevin/ @jenneron
|
||||
device/*/linux-postmarketos-exynos5/ @jenneron @Grimler
|
||||
device/*/device-google-krane/ @jenneron
|
||||
device/*/soc-mediatek-mt8183/ @jenneron
|
||||
device/*/u-boot-veyron-minnie/ @jenneron
|
||||
device/*/device-google-fennel14/ @jenneron
|
||||
device/*/linux-google-nyan/ @jenneron
|
||||
device/*/device-google-willow/ @jenneron
|
||||
device/*/linux-postmarketos-mediatek-mt8173/ @jenneron
|
||||
device/*/linux-postmarketos-mediatek-mt8183/ @jenneron @binarycraft
|
||||
device/*/device-google-nyan-blaze/ @jenneron
|
||||
device/*/firmware-powervr-gx6250/ @jenneron
|
||||
device/*/device-google-hana/ @jenneron
|
||||
device/*/device-google-snow/ @jenneron
|
||||
device/*/device-google-kappa/ @jenneron
|
||||
device/*/u-boot-nyan-2gb/ @jenneron
|
||||
device/*/device-google-veyron-jerry/ @jenneron
|
||||
device/*/device-google-kakadu/ @jenneron
|
||||
device/*/firmware-google-veyron-brcm/ @jenneron
|
||||
device/*/device-google-peach-pit/ @jenneron
|
||||
device/*/device-lg-judyp/ @jenneron
|
||||
device/*/device-asus-tf201/ @clamor95
|
||||
device/*/device-asus-tf300t/ @clamor95
|
||||
device/*/device-asus-tf300tg/ @clamor95
|
||||
device/*/device-asus-tf700t/ @clamor95
|
||||
device/*/device-lg-p895/ @clamor95
|
||||
device/*/firmware-asus-transformer/ @clamor95 @jenneron
|
||||
device/*/firmware-lg-x3/ @clamor95
|
||||
device/*/linux-postmarketos-grate/ @clamor95 @jenneron
|
||||
device/*/device-samsung-chagallwifi @Grimler
|
||||
device/*/device-odroid-xu4 @Grimler
|
||||
device/*/device-samsung-klimtlte @Grimler
|
||||
device/*/linux-samsung-klimtlte @Grimler
|
||||
device/*/firmware-odroid-xu4 @Grimler
|
||||
device/*/linux-samsung-chagallwifi @Grimler
|
||||
device/*/device-huawei-plank @gtrxAC
|
||||
device/*/linux-huawei-plank @gtrxAC
|
||||
|
||||
main/postmarketos-update-depthcharge-kernel/ @jenneron
|
||||
main/osk-sdl/ @craftyguy
|
||||
main/postmarketos-ui-plasma-mobile/ @bshah
|
||||
main/ttyescape @calebccff
|
||||
temp/u-boot-librem5/ @craftyguy @bshah
|
||||
temp/alsa-ucm-conf-google-kukui/ @jenneron @binarycraft
|
||||
temp/alsa-ucm-conf-google-gru/ @jenneron
|
||||
device/*/*-videostrong-kii-pro/ @vitali64yt
|
||||
device/*/*-amlogic-s905* @vitali64yt
|
||||
device/*/linux-postmarketos-amlogic/ @vitali64yt @exkc
|
||||
|
||||
# vim: ts=8 sw=4 et
|
||||
@@ -1,89 +0,0 @@
|
||||
# Policy for commits in pmaports
|
||||
|
||||
This document defines policy for organising and titling commits for
|
||||
inclusion in pmaports.
|
||||
|
||||
## Definitions
|
||||
|
||||
### Device-specific package
|
||||
|
||||
A device-specific package is used to apply configuration and
|
||||
functionality specifically for device support in postmarketOS.
|
||||
This is in contrast to other packages
|
||||
(e.g. main/postmarketos-ui-phosh) in postmarketOS that are used
|
||||
for configuring the distribution without consideration of the
|
||||
target device.
|
||||
|
||||
## General policy
|
||||
|
||||
We follow Alpine's aports commit style with some minor exceptions
|
||||
and additions. Alpine's commit style can be found here:
|
||||
https://gitlab.alpinelinux.org/alpine/aports/-/blob/master/COMMITSTYLE.md
|
||||
|
||||
## Exceptions
|
||||
|
||||
### Changes to packages inside of the device directory
|
||||
|
||||
While Alpine has the policy of always prefixing package names with
|
||||
the name of the repository they are in, in the case of pmaports
|
||||
this can lead to excessively long commit titles due to the nested
|
||||
subfolders of the device directory. As such, commits changing
|
||||
packages inside of the device directory should omit the directory
|
||||
prefix, for example:
|
||||
|
||||
device-pine64-pinephone: description of change
|
||||
|
||||
Or:
|
||||
|
||||
soc-qcom-msm8996: description of change
|
||||
|
||||
If the commit only makes device-specific changes, the
|
||||
commit title can opt to use the following format:
|
||||
|
||||
manufacturer-codename: description of change
|
||||
|
||||
### Moving devices between categories
|
||||
|
||||
As we do not include directory prefixes in device-related commits,
|
||||
Alpine's commit style for moving packages does not apply. Instead,
|
||||
we do the following:
|
||||
|
||||
manufacturer-codename: move from category to category
|
||||
|
||||
For example:
|
||||
|
||||
samsung-m0: move from testing to community
|
||||
|
||||
## Additions
|
||||
|
||||
### Forking packages from Alpine
|
||||
|
||||
Run `pmbootstrap aportgen --fork-alpine package` and modify it.
|
||||
|
||||
#### Template
|
||||
|
||||
- temp/package-name: fork from Alpine
|
||||
|
||||
Example: temp/pulseaudio: fork from Alpine
|
||||
|
||||
#### Rules
|
||||
|
||||
One commit per forked package.
|
||||
|
||||
### Adding new devices
|
||||
|
||||
Adding a new device package and optionally also a device-specific
|
||||
Linux and firmware package.
|
||||
|
||||
#### Template
|
||||
|
||||
- manufacturer-codename: new device
|
||||
|
||||
Example: htc-m8qlul: new device
|
||||
|
||||
#### Rules
|
||||
|
||||
If the device has the option of making use of a device-specific
|
||||
kernel and/or firmware package, those packages should be included
|
||||
in the same commit that adds the device package. One device per
|
||||
commit.
|
||||
@@ -3,7 +3,5 @@
|
||||
Helpful resources:
|
||||
* [How to create a package](https://wiki.postmarketos.org/wiki/Create_a_package)
|
||||
* [APKBUILD reference](https://wiki.alpinelinux.org/wiki/APKBUILD_Reference)
|
||||
* [Alpine Linux aports](https://gitlab.alpinelinux.org/alpine/aports/)
|
||||
* [Alpine Linux package search](https://pkgs.alpinelinux.org/packages)
|
||||
* [postmarketOS package search](https://pkgs.postmarketos.org/packages)
|
||||
* [postmarketOS commit style](./COMMITSTYLE.md)
|
||||
* [Alpine Linux aports](https://git.alpinelinux.org/cgit/aports)
|
||||
* [Alpine Linux package search](https://pkgs.alpinelinux.org/packages)
|
||||
+5
-41
@@ -3,49 +3,13 @@
|
||||
recommended=edge
|
||||
|
||||
[edge]
|
||||
description=Rolling release / Most devices / Occasional breakage: https://postmarketos.org/edge
|
||||
description=Rolling release channel
|
||||
branch_pmaports=master
|
||||
branch_aports=master
|
||||
mirrordir_alpine=edge
|
||||
|
||||
[v23.06]
|
||||
description=Latest release / Recommended for best stability
|
||||
branch_pmaports=v23.06
|
||||
branch_aports=3.18-stable
|
||||
mirrordir_alpine=v3.18
|
||||
|
||||
[v22.12]
|
||||
description=Old release (supported until: 2023-07-07)
|
||||
branch_pmaports=v22.12
|
||||
branch_aports=3.17-stable
|
||||
mirrordir_alpine=v3.17
|
||||
|
||||
[v22.06]
|
||||
description=Old release (unsupported)
|
||||
branch_pmaports=v22.06
|
||||
branch_aports=3.16-stable
|
||||
mirrordir_alpine=v3.16
|
||||
|
||||
[v21.12]
|
||||
description=Old release (unsupported)
|
||||
branch_pmaports=v21.12
|
||||
branch_aports=3.15-stable
|
||||
mirrordir_alpine=v3.15
|
||||
|
||||
[v21.06]
|
||||
description=Old release (unsupported)
|
||||
branch_pmaports=v21.06
|
||||
branch_aports=3.14-stable
|
||||
mirrordir_alpine=v3.14
|
||||
|
||||
[v21.03]
|
||||
description=Old release (unsupported)
|
||||
branch_pmaports=v21.03
|
||||
branch_aports=3.13-stable
|
||||
mirrordir_alpine=v3.13
|
||||
|
||||
[v20.05]
|
||||
description=Old release (unsupported)
|
||||
[stable]
|
||||
description=Upcoming beta release (WIP, DO NOT USE!)
|
||||
branch_pmaports=v20.05
|
||||
branch_aports=3.12-stable
|
||||
mirrordir_alpine=v3.12
|
||||
branch_aports=3.11-stable
|
||||
mirrordir_alpine=v3.11
|
||||
@@ -0,0 +1,29 @@
|
||||
# Contributor: Danct12 <danct12@disroot.org>
|
||||
# Maintainer: Danct12 <danct12@disroot.org>
|
||||
pkgname="console-keyboard-basic"
|
||||
pkgver=0_git20200104
|
||||
pkgrel=0
|
||||
pkgdesc="A basic console keyboard"
|
||||
arch="all"
|
||||
url="https://github.com/Daniel-Abrecht/console-keyboard-basic"
|
||||
license="GPL-3.0-or-later"
|
||||
options="!check" # no testsuite
|
||||
depends="console-keyboard-multiplexer"
|
||||
makedepends="ncurses-dev libconsolekeyboard-dev"
|
||||
|
||||
# Source
|
||||
_commit="005fd482e9423b5d45743f098e52ba25255bffc0"
|
||||
source="
|
||||
$pkgname-$_commit.tar.gz::https://github.com/Daniel-Abrecht/$pkgname/archive/$_commit.tar.gz
|
||||
"
|
||||
builddir="$srcdir/$pkgname-$_commit"
|
||||
|
||||
build() {
|
||||
make
|
||||
}
|
||||
|
||||
package() {
|
||||
make install-all DESTDIR="$pkgdir"
|
||||
ln -sf /usr/bin/console-keyboard-basic $pkgdir/usr/bin/console-keyboard
|
||||
}
|
||||
sha512sums="6e4ffbfa6f44a2a7a90e7bafc3944e5c34c007ae9c9ab0d7cd26930422af9fb381ece6e4357b4bd2568d319393491130e880ebc0861c729fff482c02cce0114e console-keyboard-basic-005fd482e9423b5d45743f098e52ba25255bffc0.tar.gz"
|
||||
@@ -0,0 +1,32 @@
|
||||
# Contributor: Danct12 <danct12@disroot.org>
|
||||
# Maintainer: Danct12 <danct12@disroot.org>
|
||||
pkgname="console-keyboard-multiplexer"
|
||||
pkgver=0_git20200104
|
||||
pkgrel=0
|
||||
pkgdesc="An on screen keyboard for terminals"
|
||||
arch="all"
|
||||
url="https://github.com/Daniel-Abrecht/console-keyboard-multiplexer"
|
||||
install="$pkgname.post-install"
|
||||
license="AGPL-3.0-or-later"
|
||||
options="!check" # no testsuite
|
||||
depends="libconsolekeyboard kbd terminus-font"
|
||||
makedepends="libconsolekeyboard-dev libttymultiplex-dev libexecinfo-dev"
|
||||
|
||||
# Source
|
||||
_commit="e304969224ba79cdac9e6715fd329a8af278cc33"
|
||||
source="
|
||||
$pkgname-$_commit.tar.gz::https://github.com/Daniel-Abrecht/$pkgname/archive/$_commit.tar.gz
|
||||
ckmvt
|
||||
"
|
||||
builddir="$srcdir/$pkgname-$_commit"
|
||||
|
||||
build() {
|
||||
make
|
||||
}
|
||||
|
||||
package() {
|
||||
make install-bin DESTDIR="$pkgdir"
|
||||
cp -f $srcdir/ckmvt $pkgdir/usr/bin/ckmvt
|
||||
}
|
||||
sha512sums="be8e3a892409ee316ee0478c7d46249ab5eefffaffbe11215f593beab2b0da5ae24392e407748a50d567eaffb9cdcd847e24f077030447fb4753470bc75b8cf4 console-keyboard-multiplexer-e304969224ba79cdac9e6715fd329a8af278cc33.tar.gz
|
||||
1c56ec846de906ec63446aa07cb40d0e64c7e609e5756497aa63fef6b3b071d0f098071e42450e973b6a7bad670771b1c680e5788b987b852c471d074f909ac1 ckmvt"
|
||||
Executable
+24
@@ -0,0 +1,24 @@
|
||||
#!/bin/sh
|
||||
|
||||
# as for right now, it seems that postmarketOS runs without any color :(
|
||||
export TERM=linux
|
||||
|
||||
nr="$(printf "%s" "$1" | /bin/sed 's/^tty//')"; shift
|
||||
|
||||
case "$nr" in
|
||||
*[!0-9]*)
|
||||
echo "Usage: $0 vtnumber"
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
|
||||
tty="$(tty)"
|
||||
|
||||
if [ "$(tty)" != "/dev/tty$nr" ]
|
||||
then exec /sbin/getty -n -l "$0" 38400 "tty$nr" linux
|
||||
fi
|
||||
|
||||
# nicer font (requires terminus-font to be installed)
|
||||
setfont /usr/share/consolefonts/ter-u24b.psf.gz
|
||||
|
||||
exec /usr/bin/console-keyboard-multiplexer -w : -l "CKM$nr" -- login
|
||||
+5
@@ -0,0 +1,5 @@
|
||||
#!/bin/sh
|
||||
|
||||
echo -e "\n\nTo run getty with keyboard on startup, you'll need to edit /etc/inittab"
|
||||
echo -e "For example, you want the keyboard on tty1, this is how the entry should be:\n"
|
||||
echo -e "tty1::respawn:/usr/bin/ckmvt 1\n\n"
|
||||
@@ -0,0 +1,28 @@
|
||||
# Contributor: Danct12 <danct12@disroot.org>
|
||||
# Maintainer: Danct12 <danct12@disroot.org>
|
||||
pkgname="libconsolekeyboard"
|
||||
pkgver=1.0.0_git20191011
|
||||
pkgrel=0
|
||||
pkgdesc="A terminal multiplexer library"
|
||||
arch="all"
|
||||
url="https://github.com/Daniel-Abrecht/console-keyboard-multiplexer/tree/libconsolekeyboard"
|
||||
license="LGPL-3.0-or-later"
|
||||
subpackages="$pkgname-dev"
|
||||
options="!check" # fails without a proper devfs
|
||||
|
||||
# Source
|
||||
_commit="73611fa86c8a4c375102a4251cb795b30758e32b"
|
||||
source="
|
||||
console-keyboard-multiplexer-$_commit.tar.gz::https://github.com/Daniel-Abrecht/console-keyboard-multiplexer/archive/$_commit.tar.gz
|
||||
"
|
||||
builddir="$srcdir/console-keyboard-multiplexer-$_commit"
|
||||
|
||||
build() {
|
||||
make
|
||||
}
|
||||
|
||||
package() {
|
||||
make install DESTDIR="$pkgdir"
|
||||
}
|
||||
|
||||
sha512sums="3f2bd8aa62489068b02e4ac985a69a84ad12a59beabecca0a5a8cc0faba4250ff34e81be9d3dde8861bf9907f7137bea976e036eec286e0fe0bfdb2505e1f0ba console-keyboard-multiplexer-73611fa86c8a4c375102a4251cb795b30758e32b.tar.gz"
|
||||
@@ -0,0 +1,35 @@
|
||||
# Contributor: Danct12 <danct12@disroot.org>
|
||||
# Maintainer: Danct12 <danct12@disroot.org>
|
||||
pkgname="libttymultiplex"
|
||||
pkgver=0.0.1_git20200204
|
||||
pkgrel=0
|
||||
pkgdesc="A terminal multiplexer library"
|
||||
arch="all"
|
||||
url="https://github.com/Daniel-Abrecht/libttymultiplex"
|
||||
license="MIT AND AGPL-3.0-or-later"
|
||||
depends="ncurses"
|
||||
makedepends="bash ncurses-dev"
|
||||
subpackages="$pkgname-dev"
|
||||
|
||||
options="!check" # fails without a proper devfs
|
||||
|
||||
# Source
|
||||
_commit="91dfd9c6de24314977dd537d25b82cdb994e96ec"
|
||||
source="
|
||||
$pkgname-$_commit.tar.gz::https://github.com/Daniel-Abrecht/$pkgname/archive/$_commit.tar.gz
|
||||
"
|
||||
builddir="$srcdir/$pkgname-$_commit"
|
||||
|
||||
build() {
|
||||
make -j1 # workaround for ld issues
|
||||
}
|
||||
|
||||
package() {
|
||||
make install DESTDIR="$pkgdir"
|
||||
}
|
||||
|
||||
check() {
|
||||
make test
|
||||
}
|
||||
|
||||
sha512sums="955c48003b5612616c40afe2f832a7a0035afd71602a161d71c34d80c886215211185f6a3e13382d235b2936f2459cda105d2c2438c1f750d63de9e7d9304143 libttymultiplex-91dfd9c6de24314977dd537d25b82cdb994e96ec.tar.gz"
|
||||
@@ -12,7 +12,7 @@ pkgdesc="Wrappers for ccache + distcc (native and foreign chroots)"
|
||||
url="https://postmarketOS.org"
|
||||
arch="all"
|
||||
license="MIT"
|
||||
options="!check !tracedeps pmb:cross-native"
|
||||
options="!check !tracedeps"
|
||||
|
||||
package() {
|
||||
# Architectures and binaries
|
||||
|
||||
-55
@@ -1,55 +0,0 @@
|
||||
From bbf05b742fde518fb97c789b043fe0d3aaf549f0 Mon Sep 17 00:00:00 2001
|
||||
From: Ariadne Conill <ariadne@dereferenced.org>
|
||||
Date: Tue, 21 Sep 2021 14:53:13 +0000
|
||||
Subject: [PATCH] Revert "PR25882, .gnu.attributes are not checked for shared
|
||||
libraries"
|
||||
|
||||
This revert is needed to avoid wrongly tagging objects with the incompatible
|
||||
IBM long double ABI, which is not supported by musl and will result in
|
||||
linking errors if used.
|
||||
|
||||
This reverts commit a8acd6eeb6dc2cc5460ece90f90ebe36b56b20ba.
|
||||
---
|
||||
bfd/elf32-tic6x.c | 3 ---
|
||||
ld/ldlang.c | 10 ++++------
|
||||
2 files changed, 4 insertions(+), 9 deletions(-)
|
||||
|
||||
diff --git a/bfd/elf32-tic6x.c b/bfd/elf32-tic6x.c
|
||||
index 5754f3cb860..3ad1d612749 100644
|
||||
--- a/bfd/elf32-tic6x.c
|
||||
+++ b/bfd/elf32-tic6x.c
|
||||
@@ -3735,9 +3735,6 @@ elf32_tic6x_merge_attributes (bfd *ibfd, struct bfd_link_info *info)
|
||||
|
||||
case Tag_ABI_PIC:
|
||||
case Tag_ABI_PID:
|
||||
- /* Don't transfer these tags from dynamic objects. */
|
||||
- if ((ibfd->flags & DYNAMIC) != 0)
|
||||
- continue;
|
||||
if (out_attr[i].i > in_attr[i].i)
|
||||
out_attr[i].i = in_attr[i].i;
|
||||
break;
|
||||
diff --git a/ld/ldlang.c b/ld/ldlang.c
|
||||
index 37b64c89ee1..f13beaef9d9 100644
|
||||
--- a/ld/ldlang.c
|
||||
+++ b/ld/ldlang.c
|
||||
@@ -7071,13 +7071,11 @@ lang_check (void)
|
||||
bfd_printable_name (input_bfd), input_bfd,
|
||||
bfd_printable_name (link_info.output_bfd));
|
||||
}
|
||||
-
|
||||
- /* If the input bfd has no contents, it shouldn't set the
|
||||
- private data of the output bfd. */
|
||||
- else if (!file->flags.just_syms
|
||||
- && ((input_bfd->flags & DYNAMIC) != 0
|
||||
- || bfd_count_sections (input_bfd) != 0))
|
||||
+ else if (bfd_count_sections (input_bfd))
|
||||
{
|
||||
+ /* If the input bfd has no contents, it shouldn't set the
|
||||
+ private data of the output bfd. */
|
||||
+
|
||||
bfd_error_handler_type pfn = NULL;
|
||||
|
||||
/* If we aren't supposed to warn about mismatched input
|
||||
--
|
||||
2.33.0
|
||||
|
||||
+37
-120
@@ -2,37 +2,24 @@
|
||||
# Generator: pmbootstrap aportgen binutils-aarch64
|
||||
# Based on: main/binutils
|
||||
|
||||
|
||||
CTARGET_ARCH=aarch64
|
||||
CTARGET="$(arch_to_hostspec $CTARGET_ARCH)"
|
||||
|
||||
pkgname=binutils-aarch64
|
||||
pkgver=2.40
|
||||
pkgrel=12
|
||||
pkgname="binutils-aarch64"
|
||||
pkgver=2.34
|
||||
pkgrel=0
|
||||
pkgdesc="Tools necessary to build programs for aarch64 targets"
|
||||
url="https://www.gnu.org/software/binutils/"
|
||||
makedepends_build="bison flex texinfo"
|
||||
makedepends_host="zlib-dev jansson-dev zstd-dev"
|
||||
arch="x86_64"
|
||||
license="GPL-2.0-or-later AND LGPL-2.1-or-later AND BSD-3-Clause"
|
||||
subpackages="binutils-dev binutils-doc"
|
||||
source="https://ftp.gnu.org/gnu/binutils/binutils-$pkgver.tar.xz
|
||||
0001-Revert-PR25882-.gnu.attributes-are-not-checked-for-s.patch
|
||||
CVE-2023-1972.patch
|
||||
makedepends_build=""
|
||||
makedepends_host=""
|
||||
makedepends="gettext libtool autoconf automake bison texinfo"
|
||||
arch="armhf armv7 x86_64 x86"
|
||||
license="GPL-2.0 GPL-3.0-or-later LGPL-2.0 BSD"
|
||||
subpackages=""
|
||||
source="https://ftp.gnu.org/gnu/binutils/binutils-$pkgver.tar.bz2
|
||||
binutils-ld-fix-static-linking.patch
|
||||
riscv64-textrels.patch
|
||||
gold-mips.patch
|
||||
ld-bfd-mips.patch
|
||||
"
|
||||
builddir="$srcdir/binutils-$pkgver"
|
||||
|
||||
if [ -z "$BOOTSTRAP" ]; then
|
||||
makedepends_host="$makedepends_host jansson-dev zstd-dev"
|
||||
_noboot_configure="--enable-jansson --with-zstd"
|
||||
fi
|
||||
|
||||
if [ "$CHOST" = "$CBUILD" ] && [ "$CBUILD" = "$CTARGET" ] && [ "$CTARGET_ARCH" != "riscv64" ]; then
|
||||
subpackages="$subpackages binutils-gold"
|
||||
fi
|
||||
|
||||
if [ "$CHOST" != "$CTARGET" ]; then
|
||||
pkgname="binutils-$CTARGET_ARCH"
|
||||
subpackages=""
|
||||
@@ -40,114 +27,44 @@ if [ "$CHOST" != "$CTARGET" ]; then
|
||||
fi
|
||||
|
||||
# secfixes:
|
||||
# 2.40-r10:
|
||||
# - CVE-2023-1972
|
||||
# 2.40-r0:
|
||||
# - CVE-2023-1579
|
||||
# 2.39-r2:
|
||||
# - CVE-2022-38533
|
||||
# 2.39-r0:
|
||||
# - CVE-2022-38126
|
||||
# 2.35.2-r1:
|
||||
# - CVE-2021-3487
|
||||
# 2.32-r0:
|
||||
# - CVE-2018-19931
|
||||
# - CVE-2018-19932
|
||||
# - CVE-2018-20002
|
||||
# - CVE-2018-20712
|
||||
# - CVE-2018-19931
|
||||
# - CVE-2018-19932
|
||||
# - CVE-2018-20002
|
||||
# - CVE-2018-20712
|
||||
# 2.28-r1:
|
||||
# - CVE-2017-7614
|
||||
# - CVE-2017-7614
|
||||
|
||||
build() {
|
||||
local _sysroot=/
|
||||
local _cross_configure="--enable-install-libiberty --enable-shared"
|
||||
local _arch_configure=""
|
||||
local _gold_configure="--disable-gold"
|
||||
local _plugin_configure="--enable-plugins"
|
||||
|
||||
if [ "$CHOST" != "$CTARGET" ]; then
|
||||
_sysroot="$CBUILDROOT"
|
||||
_cross_configure="--disable-install-libiberty"
|
||||
_plugin_configure="--disable-plugins"
|
||||
fi
|
||||
|
||||
if [ "$CHOST" = "$CBUILD" ] && [ "$CBUILD" = "$CTARGET" ] && [ "$CTARGET_ARCH" != "riscv64" ]; then
|
||||
_gold_configure="--enable-gold"
|
||||
fi
|
||||
|
||||
if [ "$CTARGET_ARCH" = "x86_64" ]; then
|
||||
_arch_configure="--enable-targets=x86_64-pep"
|
||||
fi
|
||||
|
||||
if [ "$CTARGET_ARCH" = "riscv64" ]; then
|
||||
_gold_configure="--disable-gold"
|
||||
fi
|
||||
|
||||
CFLAGS="$CFLAGS -O2" \
|
||||
CXXFLAGS="$CXXFLAGS -O2" \
|
||||
./configure \
|
||||
--build=$CBUILD \
|
||||
--host=$CHOST \
|
||||
--target=$CTARGET \
|
||||
--with-build-sysroot="$CBUILDROOT" \
|
||||
--with-sysroot=$_sysroot \
|
||||
_target="$(arch_to_hostspec aarch64)"
|
||||
cd "$builddir"
|
||||
"$builddir"/configure \
|
||||
--build="$CBUILD" \
|
||||
--target=$_target \
|
||||
--with-lib-path=/usr/lib \
|
||||
--prefix=/usr \
|
||||
--mandir=/usr/share/man \
|
||||
--infodir=/usr/share/info \
|
||||
--sysconfdir=/etc \
|
||||
$_arch_configure \
|
||||
$_cross_configure \
|
||||
$_gold_configure \
|
||||
$_plugin_configure \
|
||||
$_noboot_configure \
|
||||
--disable-gprofng \
|
||||
--disable-multilib \
|
||||
--disable-nls \
|
||||
--disable-werror \
|
||||
--enable-64-bit-bfd \
|
||||
--enable-colored-disassembly \
|
||||
--enable-default-execstack=no \
|
||||
--enable-default-hash-style=gnu \
|
||||
--enable-deterministic-archives \
|
||||
--with-sysroot=/usr/$_target \
|
||||
--enable-ld=default \
|
||||
--enable-new-dtags \
|
||||
--enable-relro \
|
||||
--enable-threads \
|
||||
--with-bugurl="https://postmarketos.org/issues" \
|
||||
--with-mmap \
|
||||
--with-pic \
|
||||
--with-system-zlib
|
||||
--enable-gold=yes \
|
||||
--enable-plugins \
|
||||
--enable-deterministic-archives \
|
||||
--disable-multilib \
|
||||
--disable-werror \
|
||||
--disable-nls
|
||||
make
|
||||
}
|
||||
|
||||
package() {
|
||||
cd "$builddir"
|
||||
make install DESTDIR="$pkgdir"
|
||||
if [ -d "$pkgdir"/usr/lib64 ]; then
|
||||
mv "$pkgdir"/usr/lib64/* "$pkgdir"/usr/lib/
|
||||
rmdir "$pkgdir"/usr/lib64
|
||||
fi
|
||||
if [ "$CHOST" != "$CTARGET" ]; then
|
||||
# creating cross tools: remove any files that would conflict
|
||||
# with the native tools, or other cross tools
|
||||
rm -r "${pkgdir:?}"/usr/share
|
||||
rm -f "$pkgdir"/usr/lib/libiberty.a
|
||||
rm -r "${pkgdir:?}"/usr/lib/bfd-plugins
|
||||
fi
|
||||
|
||||
# remove man, info folders
|
||||
rm -rf "$pkgdir"/usr/share
|
||||
}
|
||||
|
||||
gold() {
|
||||
pkgdesc="GNU binutils - gold linker"
|
||||
|
||||
if [ -e "$pkgdir"/usr/bin/ld.gold ]; then
|
||||
amove usr/bin/ld.gold
|
||||
fi
|
||||
amove usr/$CTARGET/bin/ld.gold
|
||||
}
|
||||
|
||||
sha512sums="
|
||||
a37e042523bc46494d99d5637c3f3d8f9956d9477b748b3b1f6d7dfbb8d968ed52c932e88a4e946c6f77b8f48f1e1b360ca54c3d298f17193f3b4963472f6925 binutils-2.40.tar.xz
|
||||
70ec22bd72ef6dddecfd970613387dd4a8cdc8730dd3cbf03d5a0c3a7c4d839383167bb06dad21bf7c235329fd44b5dc4aefe762f68544f17155cf002bf1be4a 0001-Revert-PR25882-.gnu.attributes-are-not-checked-for-s.patch
|
||||
b434e126c4c3f70c02b0a5597a0d75a4ea99b1498552c2d0676005ac0ae171c56cf07a6f6e2faa1381f1f4d4a37043a07d177dd4912f09b61109f103853594b2 CVE-2023-1972.patch
|
||||
sha512sums="f47e7304e102c7bbc97958a08093e27796b9051d1567ce4fbb723d39ef3e29efa325ee14a1bdcc462a925a7f9bbbc9aee28294c6dc23850f371030f3835a8067 binutils-2.34.tar.bz2
|
||||
ecee33b0e435aa704af1c334e560f201638ff79e199aa11ed78a72f7c9b46f85fbb227af5748e735fd681d1965fcc42ac81b0c8824e540430ce0c706c81e8b49 binutils-ld-fix-static-linking.patch
|
||||
d138691d953c6f49111601df1731db157d2ecedf1593e37ababb5c12ff10572b5f7982288c81579f4a99097780dbb18d3b457f74daab0f935f59423e69cec56f riscv64-textrels.patch
|
||||
"
|
||||
f55cf2e0bf82f97583a1abe10710e4013ecf7d64f1da2ef8659a44a06d0dd8beaf58dab98a183488ea137f03e32d62efc878d95f018f836f8cec870bc448556f gold-mips.patch
|
||||
314d2ef9071c89940aa6c8118e8a1e2f191a5d0a4bf596da1ad9cc84f884d8bc7dea8bd7b9fc3f8f1bddd3fd41c6eb017e1e804044b3bf084df1ed9e6e095e2d ld-bfd-mips.patch"
|
||||
@@ -1,37 +0,0 @@
|
||||
Patch-Source: https://sourceware.org/git/?p=binutils-gdb.git;a=commitdiff;h=c22d38baefc5a7a1e1f5cdc9dbb556b1f0ec5c57;hp=f2f9bde5cde7ff34ed0a4c4682a211d402aa1086
|
||||
https://sourceware.org/bugzilla/show_bug.cgi?id=30285
|
||||
--
|
||||
From: Nick Clifton <nickc@redhat.com>
|
||||
Date: Thu, 30 Mar 2023 09:10:09 +0000 (+0100)
|
||||
Subject: Fix an illegal memory access when an accessing a zer0-lengthverdef table.
|
||||
X-Git-Url: https://sourceware.org/git/?p=binutils-gdb.git;a=commitdiff_plain;h=c22d38baefc5a7a1e1f5cdc9dbb556b1f0ec5c57;hp=f2f9bde5cde7ff34ed0a4c4682a211d402aa1086
|
||||
|
||||
Fix an illegal memory access when an accessing a zer0-lengthverdef table.
|
||||
|
||||
PR 30285
|
||||
* elf.c (_bfd_elf_slurp_version_tables): Fail if no version definitions are allocated.
|
||||
---
|
||||
|
||||
diff --git a/bfd/elf.c b/bfd/elf.c
|
||||
index 027d0143735..185028cbd97 100644
|
||||
--- a/bfd/elf.c
|
||||
+++ b/bfd/elf.c
|
||||
@@ -9030,6 +9030,9 @@ _bfd_elf_slurp_version_tables (bfd *abfd, bool default_imported_symver)
|
||||
bfd_set_error (bfd_error_file_too_big);
|
||||
goto error_return_verdef;
|
||||
}
|
||||
+
|
||||
+ if (amt == 0)
|
||||
+ goto error_return_verdef;
|
||||
elf_tdata (abfd)->verdef = (Elf_Internal_Verdef *) bfd_zalloc (abfd, amt);
|
||||
if (elf_tdata (abfd)->verdef == NULL)
|
||||
goto error_return_verdef;
|
||||
@@ -9133,6 +9136,8 @@ _bfd_elf_slurp_version_tables (bfd *abfd, bool default_imported_symver)
|
||||
bfd_set_error (bfd_error_file_too_big);
|
||||
goto error_return;
|
||||
}
|
||||
+ if (amt == 0)
|
||||
+ goto error_return;
|
||||
elf_tdata (abfd)->verdef = (Elf_Internal_Verdef *) bfd_zalloc (abfd, amt);
|
||||
if (elf_tdata (abfd)->verdef == NULL)
|
||||
goto error_return;
|
||||
@@ -0,0 +1,39 @@
|
||||
# DP: Fix gold on mips64 targets.
|
||||
|
||||
gold/
|
||||
|
||||
2016-08-09 Aurelien Jarno <aurelien@aurel32.net>
|
||||
|
||||
* configure.tgt: Add mips64el*-*-*|mips64le*-*-* and mips64*-*-*.
|
||||
|
||||
|
||||
--- a/gold/configure.tgt
|
||||
+++ b/gold/configure.tgt
|
||||
@@ -153,6 +153,13 @@ aarch64*-*)
|
||||
targ_big_endian=false
|
||||
targ_extra_big_endian=true
|
||||
;;
|
||||
+mips*64*el*-*-*|mips*64*le*-*-*)
|
||||
+ targ_obj=mips
|
||||
+ targ_machine=EM_MIPS_RS3_LE
|
||||
+ targ_size=64
|
||||
+ targ_big_endian=false
|
||||
+ targ_extra_big_endian=true
|
||||
+ ;;
|
||||
mips*el*-*-*|mips*le*-*-*)
|
||||
targ_obj=mips
|
||||
targ_machine=EM_MIPS_RS3_LE
|
||||
@@ -160,6 +167,13 @@ mips*el*-*-*|mips*le*-*-*)
|
||||
targ_big_endian=false
|
||||
targ_extra_big_endian=true
|
||||
;;
|
||||
+mips*64*-*-*)
|
||||
+ targ_obj=mips
|
||||
+ targ_machine=EM_MIPS
|
||||
+ targ_size=64
|
||||
+ targ_big_endian=true
|
||||
+ targ_extra_big_endian=false
|
||||
+ ;;
|
||||
mips*-*-*)
|
||||
targ_obj=mips
|
||||
targ_machine=EM_MIPS
|
||||
@@ -0,0 +1,19 @@
|
||||
--- ./ld/configure.tgt.orig
|
||||
+++ ./ld/configure.tgt
|
||||
@@ -541,12 +541,12 @@
|
||||
;;
|
||||
mips*-*-windiss) targ_emul=elf32mipswindiss
|
||||
;;
|
||||
-mips64*el-*-linux-*) targ_emul=elf32ltsmipn32
|
||||
- targ_extra_emuls="elf32btsmipn32 elf32ltsmip elf32btsmip elf64ltsmip elf64btsmip"
|
||||
+mips64*el-*-linux-*) targ_emul=elf64ltsmip
|
||||
+ targ_extra_emuls="elf32ltsmipn32 elf32btsmipn32 elf32ltsmip elf32btsmip elf64btsmip"
|
||||
targ_extra_libpath=$targ_extra_emuls
|
||||
;;
|
||||
-mips64*-*-linux-*) targ_emul=elf32btsmipn32
|
||||
- targ_extra_emuls="elf32ltsmipn32 elf32btsmip elf32ltsmip elf64btsmip elf64ltsmip"
|
||||
+mips64*-*-linux-*) targ_emul=elf64btsmip
|
||||
+ targ_extra_emuls="elf32btsmipn32 elf32ltsmipn32 elf32btsmip elf32ltsmip elf64ltsmip"
|
||||
targ_extra_libpath=$targ_extra_emuls
|
||||
;;
|
||||
mips*el-*-linux-*) targ_emul=elf32ltsmip
|
||||
@@ -1,103 +0,0 @@
|
||||
Patch-Source: https://sourceware.org/git/?p=binutils-gdb.git;a=commitdiff;h=225df051d3d4cf714d1791b9035966a6686b3f3d;hp=a70d5ba34cb64bbbb7df4f3055cf5b1967bdf61e#patch1
|
||||
https://sourceware.org/bugzilla/show_bug.cgi?id=25694
|
||||
--
|
||||
From: Nelson Chu <nelson@nelson.ba.rivosinc.com>
|
||||
Date: Thu, 4 May 2023 09:08:50 +0000 (+0800)
|
||||
Subject: [PR ld/22263][PR ld/25694] RISC-V: Avoid dynamic TLS relocs in PIE.
|
||||
X-Git-Url: https://sourceware.org/git/?p=binutils-gdb.git;a=commitdiff_plain;h=225df051d3d4cf714d1791b9035966a6686b3f3d;hp=a70d5ba34cb64bbbb7df4f3055cf5b1967bdf61e
|
||||
|
||||
[PR ld/22263][PR ld/25694] RISC-V: Avoid dynamic TLS relocs in PIE.
|
||||
|
||||
Lots of targets already fixed the TEXTREL problem for TLS in PIE.
|
||||
|
||||
* For PR ld/25694,
|
||||
In the check_reloc, refer to spare and loongarch, they don't need to reserve
|
||||
any local dynamic reloc for TLS LE in pie/pde, and similar to other targets.
|
||||
So it seems like riscv was too conservative to estimate the TLS LE before.
|
||||
Just break and don't goto static_reloc for TLS LE in pie/pde can fix the
|
||||
TEXTREL problem.
|
||||
|
||||
* For PR ld/22263,
|
||||
The risc-v code for TLS GD/IE in the relocate_section seems same as MIPS port.
|
||||
So similar to MIPS, pr22570, commits 9143e72c6d4d and 1cb83cac9a89, it seems
|
||||
also the right way to do the same thing for risc-v.
|
||||
|
||||
On risc-v, fixes
|
||||
FAIL: Build pr22263-1
|
||||
|
||||
RISC-V haven't supported the TLS transitions, so will need the same fix (use
|
||||
bfd_link_dll) in the future.
|
||||
|
||||
bfd/
|
||||
PR ld/22263
|
||||
PR ld/25694
|
||||
* elfnn-riscv.c (riscv_elf_check_relocs): Replace bfd_link_pic with
|
||||
bfd_link_dll for TLS IE. Don't need to reserve the local dynamic
|
||||
relocation for TLS LE in pie/pde, and report error in pic just like
|
||||
before.
|
||||
(riscv_elf_relocate_section): For TLS GD/IE, use bfd_link_dll rather
|
||||
than !bfd_link_pic in determining the dynamic symbol index. Avoid
|
||||
the index of -1.
|
||||
---
|
||||
|
||||
diff --git a/bfd/elfnn-riscv.c b/bfd/elfnn-riscv.c
|
||||
index 75af040cf92..762ea231c0b 100644
|
||||
--- a/bfd/elfnn-riscv.c
|
||||
+++ b/bfd/elfnn-riscv.c
|
||||
@@ -824,7 +824,7 @@ riscv_elf_check_relocs (bfd *abfd, struct bfd_link_info *info,
|
||||
break;
|
||||
|
||||
case R_RISCV_TLS_GOT_HI20:
|
||||
- if (bfd_link_pic (info))
|
||||
+ if (bfd_link_dll (info))
|
||||
info->flags |= DF_STATIC_TLS;
|
||||
if (!riscv_elf_record_got_reference (abfd, info, h, r_symndx)
|
||||
|| !riscv_elf_record_tls_type (abfd, h, r_symndx, GOT_TLS_IE))
|
||||
@@ -920,11 +920,12 @@ riscv_elf_check_relocs (bfd *abfd, struct bfd_link_info *info,
|
||||
goto static_reloc;
|
||||
|
||||
case R_RISCV_TPREL_HI20:
|
||||
+ /* This is not allowed in the pic, but okay in pie. */
|
||||
if (!bfd_link_executable (info))
|
||||
return bad_static_reloc (abfd, r_type, h);
|
||||
if (h != NULL)
|
||||
riscv_elf_record_tls_type (abfd, h, r_symndx, GOT_TLS_LE);
|
||||
- goto static_reloc;
|
||||
+ break;
|
||||
|
||||
case R_RISCV_HI20:
|
||||
if (bfd_link_pic (info))
|
||||
@@ -2880,24 +2881,20 @@ riscv_elf_relocate_section (bfd *output_bfd,
|
||||
if (htab->elf.srelgot == NULL)
|
||||
abort ();
|
||||
|
||||
- if (h != NULL)
|
||||
- {
|
||||
- bool dyn, pic;
|
||||
- dyn = htab->elf.dynamic_sections_created;
|
||||
- pic = bfd_link_pic (info);
|
||||
-
|
||||
- if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, pic, h)
|
||||
- && (!pic || !SYMBOL_REFERENCES_LOCAL (info, h)))
|
||||
- indx = h->dynindx;
|
||||
- }
|
||||
+ bool dyn = elf_hash_table (info)->dynamic_sections_created;
|
||||
+ if (h != NULL
|
||||
+ && h->dynindx != -1
|
||||
+ && WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, bfd_link_pic (info), h)
|
||||
+ && (bfd_link_dll (info) || !SYMBOL_REFERENCES_LOCAL (info, h)))
|
||||
+ indx = h->dynindx;
|
||||
|
||||
/* The GOT entries have not been initialized yet. Do it
|
||||
now, and emit any relocations. */
|
||||
- if ((bfd_link_pic (info) || indx != 0)
|
||||
+ if ((bfd_link_dll (info) || indx != 0)
|
||||
&& (h == NULL
|
||||
|| ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
|
||||
|| h->root.type != bfd_link_hash_undefweak))
|
||||
- need_relocs = true;
|
||||
+ need_relocs = true;
|
||||
|
||||
if (tls_type & GOT_TLS_GD)
|
||||
{
|
||||
|
||||
@@ -1,55 +0,0 @@
|
||||
From bbf05b742fde518fb97c789b043fe0d3aaf549f0 Mon Sep 17 00:00:00 2001
|
||||
From: Ariadne Conill <ariadne@dereferenced.org>
|
||||
Date: Tue, 21 Sep 2021 14:53:13 +0000
|
||||
Subject: [PATCH] Revert "PR25882, .gnu.attributes are not checked for shared
|
||||
libraries"
|
||||
|
||||
This revert is needed to avoid wrongly tagging objects with the incompatible
|
||||
IBM long double ABI, which is not supported by musl and will result in
|
||||
linking errors if used.
|
||||
|
||||
This reverts commit a8acd6eeb6dc2cc5460ece90f90ebe36b56b20ba.
|
||||
---
|
||||
bfd/elf32-tic6x.c | 3 ---
|
||||
ld/ldlang.c | 10 ++++------
|
||||
2 files changed, 4 insertions(+), 9 deletions(-)
|
||||
|
||||
diff --git a/bfd/elf32-tic6x.c b/bfd/elf32-tic6x.c
|
||||
index 5754f3cb860..3ad1d612749 100644
|
||||
--- a/bfd/elf32-tic6x.c
|
||||
+++ b/bfd/elf32-tic6x.c
|
||||
@@ -3735,9 +3735,6 @@ elf32_tic6x_merge_attributes (bfd *ibfd, struct bfd_link_info *info)
|
||||
|
||||
case Tag_ABI_PIC:
|
||||
case Tag_ABI_PID:
|
||||
- /* Don't transfer these tags from dynamic objects. */
|
||||
- if ((ibfd->flags & DYNAMIC) != 0)
|
||||
- continue;
|
||||
if (out_attr[i].i > in_attr[i].i)
|
||||
out_attr[i].i = in_attr[i].i;
|
||||
break;
|
||||
diff --git a/ld/ldlang.c b/ld/ldlang.c
|
||||
index 37b64c89ee1..f13beaef9d9 100644
|
||||
--- a/ld/ldlang.c
|
||||
+++ b/ld/ldlang.c
|
||||
@@ -7071,13 +7071,11 @@ lang_check (void)
|
||||
bfd_printable_name (input_bfd), input_bfd,
|
||||
bfd_printable_name (link_info.output_bfd));
|
||||
}
|
||||
-
|
||||
- /* If the input bfd has no contents, it shouldn't set the
|
||||
- private data of the output bfd. */
|
||||
- else if (!file->flags.just_syms
|
||||
- && ((input_bfd->flags & DYNAMIC) != 0
|
||||
- || bfd_count_sections (input_bfd) != 0))
|
||||
+ else if (bfd_count_sections (input_bfd))
|
||||
{
|
||||
+ /* If the input bfd has no contents, it shouldn't set the
|
||||
+ private data of the output bfd. */
|
||||
+
|
||||
bfd_error_handler_type pfn = NULL;
|
||||
|
||||
/* If we aren't supposed to warn about mismatched input
|
||||
--
|
||||
2.33.0
|
||||
|
||||
+37
-120
@@ -2,37 +2,24 @@
|
||||
# Generator: pmbootstrap aportgen binutils-armhf
|
||||
# Based on: main/binutils
|
||||
|
||||
|
||||
CTARGET_ARCH=armhf
|
||||
CTARGET="$(arch_to_hostspec $CTARGET_ARCH)"
|
||||
|
||||
pkgname=binutils-armhf
|
||||
pkgver=2.40
|
||||
pkgrel=12
|
||||
pkgname="binutils-armhf"
|
||||
pkgver=2.34
|
||||
pkgrel=0
|
||||
pkgdesc="Tools necessary to build programs for armhf targets"
|
||||
url="https://www.gnu.org/software/binutils/"
|
||||
makedepends_build="bison flex texinfo"
|
||||
makedepends_host="zlib-dev jansson-dev zstd-dev"
|
||||
arch="x86_64"
|
||||
license="GPL-2.0-or-later AND LGPL-2.1-or-later AND BSD-3-Clause"
|
||||
subpackages="binutils-dev binutils-doc"
|
||||
source="https://ftp.gnu.org/gnu/binutils/binutils-$pkgver.tar.xz
|
||||
0001-Revert-PR25882-.gnu.attributes-are-not-checked-for-s.patch
|
||||
CVE-2023-1972.patch
|
||||
makedepends_build=""
|
||||
makedepends_host=""
|
||||
makedepends="gettext libtool autoconf automake bison texinfo"
|
||||
arch="armv7 aarch64 x86_64 x86"
|
||||
license="GPL-2.0 GPL-3.0-or-later LGPL-2.0 BSD"
|
||||
subpackages=""
|
||||
source="https://ftp.gnu.org/gnu/binutils/binutils-$pkgver.tar.bz2
|
||||
binutils-ld-fix-static-linking.patch
|
||||
riscv64-textrels.patch
|
||||
gold-mips.patch
|
||||
ld-bfd-mips.patch
|
||||
"
|
||||
builddir="$srcdir/binutils-$pkgver"
|
||||
|
||||
if [ -z "$BOOTSTRAP" ]; then
|
||||
makedepends_host="$makedepends_host jansson-dev zstd-dev"
|
||||
_noboot_configure="--enable-jansson --with-zstd"
|
||||
fi
|
||||
|
||||
if [ "$CHOST" = "$CBUILD" ] && [ "$CBUILD" = "$CTARGET" ] && [ "$CTARGET_ARCH" != "riscv64" ]; then
|
||||
subpackages="$subpackages binutils-gold"
|
||||
fi
|
||||
|
||||
if [ "$CHOST" != "$CTARGET" ]; then
|
||||
pkgname="binutils-$CTARGET_ARCH"
|
||||
subpackages=""
|
||||
@@ -40,114 +27,44 @@ if [ "$CHOST" != "$CTARGET" ]; then
|
||||
fi
|
||||
|
||||
# secfixes:
|
||||
# 2.40-r10:
|
||||
# - CVE-2023-1972
|
||||
# 2.40-r0:
|
||||
# - CVE-2023-1579
|
||||
# 2.39-r2:
|
||||
# - CVE-2022-38533
|
||||
# 2.39-r0:
|
||||
# - CVE-2022-38126
|
||||
# 2.35.2-r1:
|
||||
# - CVE-2021-3487
|
||||
# 2.32-r0:
|
||||
# - CVE-2018-19931
|
||||
# - CVE-2018-19932
|
||||
# - CVE-2018-20002
|
||||
# - CVE-2018-20712
|
||||
# - CVE-2018-19931
|
||||
# - CVE-2018-19932
|
||||
# - CVE-2018-20002
|
||||
# - CVE-2018-20712
|
||||
# 2.28-r1:
|
||||
# - CVE-2017-7614
|
||||
# - CVE-2017-7614
|
||||
|
||||
build() {
|
||||
local _sysroot=/
|
||||
local _cross_configure="--enable-install-libiberty --enable-shared"
|
||||
local _arch_configure=""
|
||||
local _gold_configure="--disable-gold"
|
||||
local _plugin_configure="--enable-plugins"
|
||||
|
||||
if [ "$CHOST" != "$CTARGET" ]; then
|
||||
_sysroot="$CBUILDROOT"
|
||||
_cross_configure="--disable-install-libiberty"
|
||||
_plugin_configure="--disable-plugins"
|
||||
fi
|
||||
|
||||
if [ "$CHOST" = "$CBUILD" ] && [ "$CBUILD" = "$CTARGET" ] && [ "$CTARGET_ARCH" != "riscv64" ]; then
|
||||
_gold_configure="--enable-gold"
|
||||
fi
|
||||
|
||||
if [ "$CTARGET_ARCH" = "x86_64" ]; then
|
||||
_arch_configure="--enable-targets=x86_64-pep"
|
||||
fi
|
||||
|
||||
if [ "$CTARGET_ARCH" = "riscv64" ]; then
|
||||
_gold_configure="--disable-gold"
|
||||
fi
|
||||
|
||||
CFLAGS="$CFLAGS -O2" \
|
||||
CXXFLAGS="$CXXFLAGS -O2" \
|
||||
./configure \
|
||||
--build=$CBUILD \
|
||||
--host=$CHOST \
|
||||
--target=$CTARGET \
|
||||
--with-build-sysroot="$CBUILDROOT" \
|
||||
--with-sysroot=$_sysroot \
|
||||
_target="$(arch_to_hostspec armhf)"
|
||||
cd "$builddir"
|
||||
"$builddir"/configure \
|
||||
--build="$CBUILD" \
|
||||
--target=$_target \
|
||||
--with-lib-path=/usr/lib \
|
||||
--prefix=/usr \
|
||||
--mandir=/usr/share/man \
|
||||
--infodir=/usr/share/info \
|
||||
--sysconfdir=/etc \
|
||||
$_arch_configure \
|
||||
$_cross_configure \
|
||||
$_gold_configure \
|
||||
$_plugin_configure \
|
||||
$_noboot_configure \
|
||||
--disable-gprofng \
|
||||
--disable-multilib \
|
||||
--disable-nls \
|
||||
--disable-werror \
|
||||
--enable-64-bit-bfd \
|
||||
--enable-colored-disassembly \
|
||||
--enable-default-execstack=no \
|
||||
--enable-default-hash-style=gnu \
|
||||
--enable-deterministic-archives \
|
||||
--with-sysroot=/usr/$_target \
|
||||
--enable-ld=default \
|
||||
--enable-new-dtags \
|
||||
--enable-relro \
|
||||
--enable-threads \
|
||||
--with-bugurl="https://postmarketos.org/issues" \
|
||||
--with-mmap \
|
||||
--with-pic \
|
||||
--with-system-zlib
|
||||
--enable-gold=yes \
|
||||
--enable-plugins \
|
||||
--enable-deterministic-archives \
|
||||
--disable-multilib \
|
||||
--disable-werror \
|
||||
--disable-nls
|
||||
make
|
||||
}
|
||||
|
||||
package() {
|
||||
cd "$builddir"
|
||||
make install DESTDIR="$pkgdir"
|
||||
if [ -d "$pkgdir"/usr/lib64 ]; then
|
||||
mv "$pkgdir"/usr/lib64/* "$pkgdir"/usr/lib/
|
||||
rmdir "$pkgdir"/usr/lib64
|
||||
fi
|
||||
if [ "$CHOST" != "$CTARGET" ]; then
|
||||
# creating cross tools: remove any files that would conflict
|
||||
# with the native tools, or other cross tools
|
||||
rm -r "${pkgdir:?}"/usr/share
|
||||
rm -f "$pkgdir"/usr/lib/libiberty.a
|
||||
rm -r "${pkgdir:?}"/usr/lib/bfd-plugins
|
||||
fi
|
||||
|
||||
# remove man, info folders
|
||||
rm -rf "$pkgdir"/usr/share
|
||||
}
|
||||
|
||||
gold() {
|
||||
pkgdesc="GNU binutils - gold linker"
|
||||
|
||||
if [ -e "$pkgdir"/usr/bin/ld.gold ]; then
|
||||
amove usr/bin/ld.gold
|
||||
fi
|
||||
amove usr/$CTARGET/bin/ld.gold
|
||||
}
|
||||
|
||||
sha512sums="
|
||||
a37e042523bc46494d99d5637c3f3d8f9956d9477b748b3b1f6d7dfbb8d968ed52c932e88a4e946c6f77b8f48f1e1b360ca54c3d298f17193f3b4963472f6925 binutils-2.40.tar.xz
|
||||
70ec22bd72ef6dddecfd970613387dd4a8cdc8730dd3cbf03d5a0c3a7c4d839383167bb06dad21bf7c235329fd44b5dc4aefe762f68544f17155cf002bf1be4a 0001-Revert-PR25882-.gnu.attributes-are-not-checked-for-s.patch
|
||||
b434e126c4c3f70c02b0a5597a0d75a4ea99b1498552c2d0676005ac0ae171c56cf07a6f6e2faa1381f1f4d4a37043a07d177dd4912f09b61109f103853594b2 CVE-2023-1972.patch
|
||||
sha512sums="f47e7304e102c7bbc97958a08093e27796b9051d1567ce4fbb723d39ef3e29efa325ee14a1bdcc462a925a7f9bbbc9aee28294c6dc23850f371030f3835a8067 binutils-2.34.tar.bz2
|
||||
ecee33b0e435aa704af1c334e560f201638ff79e199aa11ed78a72f7c9b46f85fbb227af5748e735fd681d1965fcc42ac81b0c8824e540430ce0c706c81e8b49 binutils-ld-fix-static-linking.patch
|
||||
d138691d953c6f49111601df1731db157d2ecedf1593e37ababb5c12ff10572b5f7982288c81579f4a99097780dbb18d3b457f74daab0f935f59423e69cec56f riscv64-textrels.patch
|
||||
"
|
||||
f55cf2e0bf82f97583a1abe10710e4013ecf7d64f1da2ef8659a44a06d0dd8beaf58dab98a183488ea137f03e32d62efc878d95f018f836f8cec870bc448556f gold-mips.patch
|
||||
314d2ef9071c89940aa6c8118e8a1e2f191a5d0a4bf596da1ad9cc84f884d8bc7dea8bd7b9fc3f8f1bddd3fd41c6eb017e1e804044b3bf084df1ed9e6e095e2d ld-bfd-mips.patch"
|
||||
@@ -1,37 +0,0 @@
|
||||
Patch-Source: https://sourceware.org/git/?p=binutils-gdb.git;a=commitdiff;h=c22d38baefc5a7a1e1f5cdc9dbb556b1f0ec5c57;hp=f2f9bde5cde7ff34ed0a4c4682a211d402aa1086
|
||||
https://sourceware.org/bugzilla/show_bug.cgi?id=30285
|
||||
--
|
||||
From: Nick Clifton <nickc@redhat.com>
|
||||
Date: Thu, 30 Mar 2023 09:10:09 +0000 (+0100)
|
||||
Subject: Fix an illegal memory access when an accessing a zer0-lengthverdef table.
|
||||
X-Git-Url: https://sourceware.org/git/?p=binutils-gdb.git;a=commitdiff_plain;h=c22d38baefc5a7a1e1f5cdc9dbb556b1f0ec5c57;hp=f2f9bde5cde7ff34ed0a4c4682a211d402aa1086
|
||||
|
||||
Fix an illegal memory access when an accessing a zer0-lengthverdef table.
|
||||
|
||||
PR 30285
|
||||
* elf.c (_bfd_elf_slurp_version_tables): Fail if no version definitions are allocated.
|
||||
---
|
||||
|
||||
diff --git a/bfd/elf.c b/bfd/elf.c
|
||||
index 027d0143735..185028cbd97 100644
|
||||
--- a/bfd/elf.c
|
||||
+++ b/bfd/elf.c
|
||||
@@ -9030,6 +9030,9 @@ _bfd_elf_slurp_version_tables (bfd *abfd, bool default_imported_symver)
|
||||
bfd_set_error (bfd_error_file_too_big);
|
||||
goto error_return_verdef;
|
||||
}
|
||||
+
|
||||
+ if (amt == 0)
|
||||
+ goto error_return_verdef;
|
||||
elf_tdata (abfd)->verdef = (Elf_Internal_Verdef *) bfd_zalloc (abfd, amt);
|
||||
if (elf_tdata (abfd)->verdef == NULL)
|
||||
goto error_return_verdef;
|
||||
@@ -9133,6 +9136,8 @@ _bfd_elf_slurp_version_tables (bfd *abfd, bool default_imported_symver)
|
||||
bfd_set_error (bfd_error_file_too_big);
|
||||
goto error_return;
|
||||
}
|
||||
+ if (amt == 0)
|
||||
+ goto error_return;
|
||||
elf_tdata (abfd)->verdef = (Elf_Internal_Verdef *) bfd_zalloc (abfd, amt);
|
||||
if (elf_tdata (abfd)->verdef == NULL)
|
||||
goto error_return;
|
||||
@@ -0,0 +1,39 @@
|
||||
# DP: Fix gold on mips64 targets.
|
||||
|
||||
gold/
|
||||
|
||||
2016-08-09 Aurelien Jarno <aurelien@aurel32.net>
|
||||
|
||||
* configure.tgt: Add mips64el*-*-*|mips64le*-*-* and mips64*-*-*.
|
||||
|
||||
|
||||
--- a/gold/configure.tgt
|
||||
+++ b/gold/configure.tgt
|
||||
@@ -153,6 +153,13 @@ aarch64*-*)
|
||||
targ_big_endian=false
|
||||
targ_extra_big_endian=true
|
||||
;;
|
||||
+mips*64*el*-*-*|mips*64*le*-*-*)
|
||||
+ targ_obj=mips
|
||||
+ targ_machine=EM_MIPS_RS3_LE
|
||||
+ targ_size=64
|
||||
+ targ_big_endian=false
|
||||
+ targ_extra_big_endian=true
|
||||
+ ;;
|
||||
mips*el*-*-*|mips*le*-*-*)
|
||||
targ_obj=mips
|
||||
targ_machine=EM_MIPS_RS3_LE
|
||||
@@ -160,6 +167,13 @@ mips*el*-*-*|mips*le*-*-*)
|
||||
targ_big_endian=false
|
||||
targ_extra_big_endian=true
|
||||
;;
|
||||
+mips*64*-*-*)
|
||||
+ targ_obj=mips
|
||||
+ targ_machine=EM_MIPS
|
||||
+ targ_size=64
|
||||
+ targ_big_endian=true
|
||||
+ targ_extra_big_endian=false
|
||||
+ ;;
|
||||
mips*-*-*)
|
||||
targ_obj=mips
|
||||
targ_machine=EM_MIPS
|
||||
@@ -0,0 +1,19 @@
|
||||
--- ./ld/configure.tgt.orig
|
||||
+++ ./ld/configure.tgt
|
||||
@@ -541,12 +541,12 @@
|
||||
;;
|
||||
mips*-*-windiss) targ_emul=elf32mipswindiss
|
||||
;;
|
||||
-mips64*el-*-linux-*) targ_emul=elf32ltsmipn32
|
||||
- targ_extra_emuls="elf32btsmipn32 elf32ltsmip elf32btsmip elf64ltsmip elf64btsmip"
|
||||
+mips64*el-*-linux-*) targ_emul=elf64ltsmip
|
||||
+ targ_extra_emuls="elf32ltsmipn32 elf32btsmipn32 elf32ltsmip elf32btsmip elf64btsmip"
|
||||
targ_extra_libpath=$targ_extra_emuls
|
||||
;;
|
||||
-mips64*-*-linux-*) targ_emul=elf32btsmipn32
|
||||
- targ_extra_emuls="elf32ltsmipn32 elf32btsmip elf32ltsmip elf64btsmip elf64ltsmip"
|
||||
+mips64*-*-linux-*) targ_emul=elf64btsmip
|
||||
+ targ_extra_emuls="elf32btsmipn32 elf32ltsmipn32 elf32btsmip elf32ltsmip elf64ltsmip"
|
||||
targ_extra_libpath=$targ_extra_emuls
|
||||
;;
|
||||
mips*el-*-linux-*) targ_emul=elf32ltsmip
|
||||
@@ -1,103 +0,0 @@
|
||||
Patch-Source: https://sourceware.org/git/?p=binutils-gdb.git;a=commitdiff;h=225df051d3d4cf714d1791b9035966a6686b3f3d;hp=a70d5ba34cb64bbbb7df4f3055cf5b1967bdf61e#patch1
|
||||
https://sourceware.org/bugzilla/show_bug.cgi?id=25694
|
||||
--
|
||||
From: Nelson Chu <nelson@nelson.ba.rivosinc.com>
|
||||
Date: Thu, 4 May 2023 09:08:50 +0000 (+0800)
|
||||
Subject: [PR ld/22263][PR ld/25694] RISC-V: Avoid dynamic TLS relocs in PIE.
|
||||
X-Git-Url: https://sourceware.org/git/?p=binutils-gdb.git;a=commitdiff_plain;h=225df051d3d4cf714d1791b9035966a6686b3f3d;hp=a70d5ba34cb64bbbb7df4f3055cf5b1967bdf61e
|
||||
|
||||
[PR ld/22263][PR ld/25694] RISC-V: Avoid dynamic TLS relocs in PIE.
|
||||
|
||||
Lots of targets already fixed the TEXTREL problem for TLS in PIE.
|
||||
|
||||
* For PR ld/25694,
|
||||
In the check_reloc, refer to spare and loongarch, they don't need to reserve
|
||||
any local dynamic reloc for TLS LE in pie/pde, and similar to other targets.
|
||||
So it seems like riscv was too conservative to estimate the TLS LE before.
|
||||
Just break and don't goto static_reloc for TLS LE in pie/pde can fix the
|
||||
TEXTREL problem.
|
||||
|
||||
* For PR ld/22263,
|
||||
The risc-v code for TLS GD/IE in the relocate_section seems same as MIPS port.
|
||||
So similar to MIPS, pr22570, commits 9143e72c6d4d and 1cb83cac9a89, it seems
|
||||
also the right way to do the same thing for risc-v.
|
||||
|
||||
On risc-v, fixes
|
||||
FAIL: Build pr22263-1
|
||||
|
||||
RISC-V haven't supported the TLS transitions, so will need the same fix (use
|
||||
bfd_link_dll) in the future.
|
||||
|
||||
bfd/
|
||||
PR ld/22263
|
||||
PR ld/25694
|
||||
* elfnn-riscv.c (riscv_elf_check_relocs): Replace bfd_link_pic with
|
||||
bfd_link_dll for TLS IE. Don't need to reserve the local dynamic
|
||||
relocation for TLS LE in pie/pde, and report error in pic just like
|
||||
before.
|
||||
(riscv_elf_relocate_section): For TLS GD/IE, use bfd_link_dll rather
|
||||
than !bfd_link_pic in determining the dynamic symbol index. Avoid
|
||||
the index of -1.
|
||||
---
|
||||
|
||||
diff --git a/bfd/elfnn-riscv.c b/bfd/elfnn-riscv.c
|
||||
index 75af040cf92..762ea231c0b 100644
|
||||
--- a/bfd/elfnn-riscv.c
|
||||
+++ b/bfd/elfnn-riscv.c
|
||||
@@ -824,7 +824,7 @@ riscv_elf_check_relocs (bfd *abfd, struct bfd_link_info *info,
|
||||
break;
|
||||
|
||||
case R_RISCV_TLS_GOT_HI20:
|
||||
- if (bfd_link_pic (info))
|
||||
+ if (bfd_link_dll (info))
|
||||
info->flags |= DF_STATIC_TLS;
|
||||
if (!riscv_elf_record_got_reference (abfd, info, h, r_symndx)
|
||||
|| !riscv_elf_record_tls_type (abfd, h, r_symndx, GOT_TLS_IE))
|
||||
@@ -920,11 +920,12 @@ riscv_elf_check_relocs (bfd *abfd, struct bfd_link_info *info,
|
||||
goto static_reloc;
|
||||
|
||||
case R_RISCV_TPREL_HI20:
|
||||
+ /* This is not allowed in the pic, but okay in pie. */
|
||||
if (!bfd_link_executable (info))
|
||||
return bad_static_reloc (abfd, r_type, h);
|
||||
if (h != NULL)
|
||||
riscv_elf_record_tls_type (abfd, h, r_symndx, GOT_TLS_LE);
|
||||
- goto static_reloc;
|
||||
+ break;
|
||||
|
||||
case R_RISCV_HI20:
|
||||
if (bfd_link_pic (info))
|
||||
@@ -2880,24 +2881,20 @@ riscv_elf_relocate_section (bfd *output_bfd,
|
||||
if (htab->elf.srelgot == NULL)
|
||||
abort ();
|
||||
|
||||
- if (h != NULL)
|
||||
- {
|
||||
- bool dyn, pic;
|
||||
- dyn = htab->elf.dynamic_sections_created;
|
||||
- pic = bfd_link_pic (info);
|
||||
-
|
||||
- if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, pic, h)
|
||||
- && (!pic || !SYMBOL_REFERENCES_LOCAL (info, h)))
|
||||
- indx = h->dynindx;
|
||||
- }
|
||||
+ bool dyn = elf_hash_table (info)->dynamic_sections_created;
|
||||
+ if (h != NULL
|
||||
+ && h->dynindx != -1
|
||||
+ && WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, bfd_link_pic (info), h)
|
||||
+ && (bfd_link_dll (info) || !SYMBOL_REFERENCES_LOCAL (info, h)))
|
||||
+ indx = h->dynindx;
|
||||
|
||||
/* The GOT entries have not been initialized yet. Do it
|
||||
now, and emit any relocations. */
|
||||
- if ((bfd_link_pic (info) || indx != 0)
|
||||
+ if ((bfd_link_dll (info) || indx != 0)
|
||||
&& (h == NULL
|
||||
|| ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
|
||||
|| h->root.type != bfd_link_hash_undefweak))
|
||||
- need_relocs = true;
|
||||
+ need_relocs = true;
|
||||
|
||||
if (tls_type & GOT_TLS_GD)
|
||||
{
|
||||
|
||||
@@ -1,55 +0,0 @@
|
||||
From bbf05b742fde518fb97c789b043fe0d3aaf549f0 Mon Sep 17 00:00:00 2001
|
||||
From: Ariadne Conill <ariadne@dereferenced.org>
|
||||
Date: Tue, 21 Sep 2021 14:53:13 +0000
|
||||
Subject: [PATCH] Revert "PR25882, .gnu.attributes are not checked for shared
|
||||
libraries"
|
||||
|
||||
This revert is needed to avoid wrongly tagging objects with the incompatible
|
||||
IBM long double ABI, which is not supported by musl and will result in
|
||||
linking errors if used.
|
||||
|
||||
This reverts commit a8acd6eeb6dc2cc5460ece90f90ebe36b56b20ba.
|
||||
---
|
||||
bfd/elf32-tic6x.c | 3 ---
|
||||
ld/ldlang.c | 10 ++++------
|
||||
2 files changed, 4 insertions(+), 9 deletions(-)
|
||||
|
||||
diff --git a/bfd/elf32-tic6x.c b/bfd/elf32-tic6x.c
|
||||
index 5754f3cb860..3ad1d612749 100644
|
||||
--- a/bfd/elf32-tic6x.c
|
||||
+++ b/bfd/elf32-tic6x.c
|
||||
@@ -3735,9 +3735,6 @@ elf32_tic6x_merge_attributes (bfd *ibfd, struct bfd_link_info *info)
|
||||
|
||||
case Tag_ABI_PIC:
|
||||
case Tag_ABI_PID:
|
||||
- /* Don't transfer these tags from dynamic objects. */
|
||||
- if ((ibfd->flags & DYNAMIC) != 0)
|
||||
- continue;
|
||||
if (out_attr[i].i > in_attr[i].i)
|
||||
out_attr[i].i = in_attr[i].i;
|
||||
break;
|
||||
diff --git a/ld/ldlang.c b/ld/ldlang.c
|
||||
index 37b64c89ee1..f13beaef9d9 100644
|
||||
--- a/ld/ldlang.c
|
||||
+++ b/ld/ldlang.c
|
||||
@@ -7071,13 +7071,11 @@ lang_check (void)
|
||||
bfd_printable_name (input_bfd), input_bfd,
|
||||
bfd_printable_name (link_info.output_bfd));
|
||||
}
|
||||
-
|
||||
- /* If the input bfd has no contents, it shouldn't set the
|
||||
- private data of the output bfd. */
|
||||
- else if (!file->flags.just_syms
|
||||
- && ((input_bfd->flags & DYNAMIC) != 0
|
||||
- || bfd_count_sections (input_bfd) != 0))
|
||||
+ else if (bfd_count_sections (input_bfd))
|
||||
{
|
||||
+ /* If the input bfd has no contents, it shouldn't set the
|
||||
+ private data of the output bfd. */
|
||||
+
|
||||
bfd_error_handler_type pfn = NULL;
|
||||
|
||||
/* If we aren't supposed to warn about mismatched input
|
||||
--
|
||||
2.33.0
|
||||
|
||||
+37
-120
@@ -2,37 +2,24 @@
|
||||
# Generator: pmbootstrap aportgen binutils-armv7
|
||||
# Based on: main/binutils
|
||||
|
||||
|
||||
CTARGET_ARCH=armv7
|
||||
CTARGET="$(arch_to_hostspec $CTARGET_ARCH)"
|
||||
|
||||
pkgname=binutils-armv7
|
||||
pkgver=2.40
|
||||
pkgrel=12
|
||||
pkgname="binutils-armv7"
|
||||
pkgver=2.34
|
||||
pkgrel=0
|
||||
pkgdesc="Tools necessary to build programs for armv7 targets"
|
||||
url="https://www.gnu.org/software/binutils/"
|
||||
makedepends_build="bison flex texinfo"
|
||||
makedepends_host="zlib-dev jansson-dev zstd-dev"
|
||||
arch="x86_64"
|
||||
license="GPL-2.0-or-later AND LGPL-2.1-or-later AND BSD-3-Clause"
|
||||
subpackages="binutils-dev binutils-doc"
|
||||
source="https://ftp.gnu.org/gnu/binutils/binutils-$pkgver.tar.xz
|
||||
0001-Revert-PR25882-.gnu.attributes-are-not-checked-for-s.patch
|
||||
CVE-2023-1972.patch
|
||||
makedepends_build=""
|
||||
makedepends_host=""
|
||||
makedepends="gettext libtool autoconf automake bison texinfo"
|
||||
arch="armhf aarch64 x86_64 x86"
|
||||
license="GPL-2.0 GPL-3.0-or-later LGPL-2.0 BSD"
|
||||
subpackages=""
|
||||
source="https://ftp.gnu.org/gnu/binutils/binutils-$pkgver.tar.bz2
|
||||
binutils-ld-fix-static-linking.patch
|
||||
riscv64-textrels.patch
|
||||
gold-mips.patch
|
||||
ld-bfd-mips.patch
|
||||
"
|
||||
builddir="$srcdir/binutils-$pkgver"
|
||||
|
||||
if [ -z "$BOOTSTRAP" ]; then
|
||||
makedepends_host="$makedepends_host jansson-dev zstd-dev"
|
||||
_noboot_configure="--enable-jansson --with-zstd"
|
||||
fi
|
||||
|
||||
if [ "$CHOST" = "$CBUILD" ] && [ "$CBUILD" = "$CTARGET" ] && [ "$CTARGET_ARCH" != "riscv64" ]; then
|
||||
subpackages="$subpackages binutils-gold"
|
||||
fi
|
||||
|
||||
if [ "$CHOST" != "$CTARGET" ]; then
|
||||
pkgname="binutils-$CTARGET_ARCH"
|
||||
subpackages=""
|
||||
@@ -40,114 +27,44 @@ if [ "$CHOST" != "$CTARGET" ]; then
|
||||
fi
|
||||
|
||||
# secfixes:
|
||||
# 2.40-r10:
|
||||
# - CVE-2023-1972
|
||||
# 2.40-r0:
|
||||
# - CVE-2023-1579
|
||||
# 2.39-r2:
|
||||
# - CVE-2022-38533
|
||||
# 2.39-r0:
|
||||
# - CVE-2022-38126
|
||||
# 2.35.2-r1:
|
||||
# - CVE-2021-3487
|
||||
# 2.32-r0:
|
||||
# - CVE-2018-19931
|
||||
# - CVE-2018-19932
|
||||
# - CVE-2018-20002
|
||||
# - CVE-2018-20712
|
||||
# - CVE-2018-19931
|
||||
# - CVE-2018-19932
|
||||
# - CVE-2018-20002
|
||||
# - CVE-2018-20712
|
||||
# 2.28-r1:
|
||||
# - CVE-2017-7614
|
||||
# - CVE-2017-7614
|
||||
|
||||
build() {
|
||||
local _sysroot=/
|
||||
local _cross_configure="--enable-install-libiberty --enable-shared"
|
||||
local _arch_configure=""
|
||||
local _gold_configure="--disable-gold"
|
||||
local _plugin_configure="--enable-plugins"
|
||||
|
||||
if [ "$CHOST" != "$CTARGET" ]; then
|
||||
_sysroot="$CBUILDROOT"
|
||||
_cross_configure="--disable-install-libiberty"
|
||||
_plugin_configure="--disable-plugins"
|
||||
fi
|
||||
|
||||
if [ "$CHOST" = "$CBUILD" ] && [ "$CBUILD" = "$CTARGET" ] && [ "$CTARGET_ARCH" != "riscv64" ]; then
|
||||
_gold_configure="--enable-gold"
|
||||
fi
|
||||
|
||||
if [ "$CTARGET_ARCH" = "x86_64" ]; then
|
||||
_arch_configure="--enable-targets=x86_64-pep"
|
||||
fi
|
||||
|
||||
if [ "$CTARGET_ARCH" = "riscv64" ]; then
|
||||
_gold_configure="--disable-gold"
|
||||
fi
|
||||
|
||||
CFLAGS="$CFLAGS -O2" \
|
||||
CXXFLAGS="$CXXFLAGS -O2" \
|
||||
./configure \
|
||||
--build=$CBUILD \
|
||||
--host=$CHOST \
|
||||
--target=$CTARGET \
|
||||
--with-build-sysroot="$CBUILDROOT" \
|
||||
--with-sysroot=$_sysroot \
|
||||
_target="$(arch_to_hostspec armv7)"
|
||||
cd "$builddir"
|
||||
"$builddir"/configure \
|
||||
--build="$CBUILD" \
|
||||
--target=$_target \
|
||||
--with-lib-path=/usr/lib \
|
||||
--prefix=/usr \
|
||||
--mandir=/usr/share/man \
|
||||
--infodir=/usr/share/info \
|
||||
--sysconfdir=/etc \
|
||||
$_arch_configure \
|
||||
$_cross_configure \
|
||||
$_gold_configure \
|
||||
$_plugin_configure \
|
||||
$_noboot_configure \
|
||||
--disable-gprofng \
|
||||
--disable-multilib \
|
||||
--disable-nls \
|
||||
--disable-werror \
|
||||
--enable-64-bit-bfd \
|
||||
--enable-colored-disassembly \
|
||||
--enable-default-execstack=no \
|
||||
--enable-default-hash-style=gnu \
|
||||
--enable-deterministic-archives \
|
||||
--with-sysroot=/usr/$_target \
|
||||
--enable-ld=default \
|
||||
--enable-new-dtags \
|
||||
--enable-relro \
|
||||
--enable-threads \
|
||||
--with-bugurl="https://postmarketos.org/issues" \
|
||||
--with-mmap \
|
||||
--with-pic \
|
||||
--with-system-zlib
|
||||
--enable-gold=yes \
|
||||
--enable-plugins \
|
||||
--enable-deterministic-archives \
|
||||
--disable-multilib \
|
||||
--disable-werror \
|
||||
--disable-nls
|
||||
make
|
||||
}
|
||||
|
||||
package() {
|
||||
cd "$builddir"
|
||||
make install DESTDIR="$pkgdir"
|
||||
if [ -d "$pkgdir"/usr/lib64 ]; then
|
||||
mv "$pkgdir"/usr/lib64/* "$pkgdir"/usr/lib/
|
||||
rmdir "$pkgdir"/usr/lib64
|
||||
fi
|
||||
if [ "$CHOST" != "$CTARGET" ]; then
|
||||
# creating cross tools: remove any files that would conflict
|
||||
# with the native tools, or other cross tools
|
||||
rm -r "${pkgdir:?}"/usr/share
|
||||
rm -f "$pkgdir"/usr/lib/libiberty.a
|
||||
rm -r "${pkgdir:?}"/usr/lib/bfd-plugins
|
||||
fi
|
||||
|
||||
# remove man, info folders
|
||||
rm -rf "$pkgdir"/usr/share
|
||||
}
|
||||
|
||||
gold() {
|
||||
pkgdesc="GNU binutils - gold linker"
|
||||
|
||||
if [ -e "$pkgdir"/usr/bin/ld.gold ]; then
|
||||
amove usr/bin/ld.gold
|
||||
fi
|
||||
amove usr/$CTARGET/bin/ld.gold
|
||||
}
|
||||
|
||||
sha512sums="
|
||||
a37e042523bc46494d99d5637c3f3d8f9956d9477b748b3b1f6d7dfbb8d968ed52c932e88a4e946c6f77b8f48f1e1b360ca54c3d298f17193f3b4963472f6925 binutils-2.40.tar.xz
|
||||
70ec22bd72ef6dddecfd970613387dd4a8cdc8730dd3cbf03d5a0c3a7c4d839383167bb06dad21bf7c235329fd44b5dc4aefe762f68544f17155cf002bf1be4a 0001-Revert-PR25882-.gnu.attributes-are-not-checked-for-s.patch
|
||||
b434e126c4c3f70c02b0a5597a0d75a4ea99b1498552c2d0676005ac0ae171c56cf07a6f6e2faa1381f1f4d4a37043a07d177dd4912f09b61109f103853594b2 CVE-2023-1972.patch
|
||||
sha512sums="f47e7304e102c7bbc97958a08093e27796b9051d1567ce4fbb723d39ef3e29efa325ee14a1bdcc462a925a7f9bbbc9aee28294c6dc23850f371030f3835a8067 binutils-2.34.tar.bz2
|
||||
ecee33b0e435aa704af1c334e560f201638ff79e199aa11ed78a72f7c9b46f85fbb227af5748e735fd681d1965fcc42ac81b0c8824e540430ce0c706c81e8b49 binutils-ld-fix-static-linking.patch
|
||||
d138691d953c6f49111601df1731db157d2ecedf1593e37ababb5c12ff10572b5f7982288c81579f4a99097780dbb18d3b457f74daab0f935f59423e69cec56f riscv64-textrels.patch
|
||||
"
|
||||
f55cf2e0bf82f97583a1abe10710e4013ecf7d64f1da2ef8659a44a06d0dd8beaf58dab98a183488ea137f03e32d62efc878d95f018f836f8cec870bc448556f gold-mips.patch
|
||||
314d2ef9071c89940aa6c8118e8a1e2f191a5d0a4bf596da1ad9cc84f884d8bc7dea8bd7b9fc3f8f1bddd3fd41c6eb017e1e804044b3bf084df1ed9e6e095e2d ld-bfd-mips.patch"
|
||||
@@ -1,37 +0,0 @@
|
||||
Patch-Source: https://sourceware.org/git/?p=binutils-gdb.git;a=commitdiff;h=c22d38baefc5a7a1e1f5cdc9dbb556b1f0ec5c57;hp=f2f9bde5cde7ff34ed0a4c4682a211d402aa1086
|
||||
https://sourceware.org/bugzilla/show_bug.cgi?id=30285
|
||||
--
|
||||
From: Nick Clifton <nickc@redhat.com>
|
||||
Date: Thu, 30 Mar 2023 09:10:09 +0000 (+0100)
|
||||
Subject: Fix an illegal memory access when an accessing a zer0-lengthverdef table.
|
||||
X-Git-Url: https://sourceware.org/git/?p=binutils-gdb.git;a=commitdiff_plain;h=c22d38baefc5a7a1e1f5cdc9dbb556b1f0ec5c57;hp=f2f9bde5cde7ff34ed0a4c4682a211d402aa1086
|
||||
|
||||
Fix an illegal memory access when an accessing a zer0-lengthverdef table.
|
||||
|
||||
PR 30285
|
||||
* elf.c (_bfd_elf_slurp_version_tables): Fail if no version definitions are allocated.
|
||||
---
|
||||
|
||||
diff --git a/bfd/elf.c b/bfd/elf.c
|
||||
index 027d0143735..185028cbd97 100644
|
||||
--- a/bfd/elf.c
|
||||
+++ b/bfd/elf.c
|
||||
@@ -9030,6 +9030,9 @@ _bfd_elf_slurp_version_tables (bfd *abfd, bool default_imported_symver)
|
||||
bfd_set_error (bfd_error_file_too_big);
|
||||
goto error_return_verdef;
|
||||
}
|
||||
+
|
||||
+ if (amt == 0)
|
||||
+ goto error_return_verdef;
|
||||
elf_tdata (abfd)->verdef = (Elf_Internal_Verdef *) bfd_zalloc (abfd, amt);
|
||||
if (elf_tdata (abfd)->verdef == NULL)
|
||||
goto error_return_verdef;
|
||||
@@ -9133,6 +9136,8 @@ _bfd_elf_slurp_version_tables (bfd *abfd, bool default_imported_symver)
|
||||
bfd_set_error (bfd_error_file_too_big);
|
||||
goto error_return;
|
||||
}
|
||||
+ if (amt == 0)
|
||||
+ goto error_return;
|
||||
elf_tdata (abfd)->verdef = (Elf_Internal_Verdef *) bfd_zalloc (abfd, amt);
|
||||
if (elf_tdata (abfd)->verdef == NULL)
|
||||
goto error_return;
|
||||
@@ -0,0 +1,39 @@
|
||||
# DP: Fix gold on mips64 targets.
|
||||
|
||||
gold/
|
||||
|
||||
2016-08-09 Aurelien Jarno <aurelien@aurel32.net>
|
||||
|
||||
* configure.tgt: Add mips64el*-*-*|mips64le*-*-* and mips64*-*-*.
|
||||
|
||||
|
||||
--- a/gold/configure.tgt
|
||||
+++ b/gold/configure.tgt
|
||||
@@ -153,6 +153,13 @@ aarch64*-*)
|
||||
targ_big_endian=false
|
||||
targ_extra_big_endian=true
|
||||
;;
|
||||
+mips*64*el*-*-*|mips*64*le*-*-*)
|
||||
+ targ_obj=mips
|
||||
+ targ_machine=EM_MIPS_RS3_LE
|
||||
+ targ_size=64
|
||||
+ targ_big_endian=false
|
||||
+ targ_extra_big_endian=true
|
||||
+ ;;
|
||||
mips*el*-*-*|mips*le*-*-*)
|
||||
targ_obj=mips
|
||||
targ_machine=EM_MIPS_RS3_LE
|
||||
@@ -160,6 +167,13 @@ mips*el*-*-*|mips*le*-*-*)
|
||||
targ_big_endian=false
|
||||
targ_extra_big_endian=true
|
||||
;;
|
||||
+mips*64*-*-*)
|
||||
+ targ_obj=mips
|
||||
+ targ_machine=EM_MIPS
|
||||
+ targ_size=64
|
||||
+ targ_big_endian=true
|
||||
+ targ_extra_big_endian=false
|
||||
+ ;;
|
||||
mips*-*-*)
|
||||
targ_obj=mips
|
||||
targ_machine=EM_MIPS
|
||||
@@ -0,0 +1,19 @@
|
||||
--- ./ld/configure.tgt.orig
|
||||
+++ ./ld/configure.tgt
|
||||
@@ -541,12 +541,12 @@
|
||||
;;
|
||||
mips*-*-windiss) targ_emul=elf32mipswindiss
|
||||
;;
|
||||
-mips64*el-*-linux-*) targ_emul=elf32ltsmipn32
|
||||
- targ_extra_emuls="elf32btsmipn32 elf32ltsmip elf32btsmip elf64ltsmip elf64btsmip"
|
||||
+mips64*el-*-linux-*) targ_emul=elf64ltsmip
|
||||
+ targ_extra_emuls="elf32ltsmipn32 elf32btsmipn32 elf32ltsmip elf32btsmip elf64btsmip"
|
||||
targ_extra_libpath=$targ_extra_emuls
|
||||
;;
|
||||
-mips64*-*-linux-*) targ_emul=elf32btsmipn32
|
||||
- targ_extra_emuls="elf32ltsmipn32 elf32btsmip elf32ltsmip elf64btsmip elf64ltsmip"
|
||||
+mips64*-*-linux-*) targ_emul=elf64btsmip
|
||||
+ targ_extra_emuls="elf32btsmipn32 elf32ltsmipn32 elf32btsmip elf32ltsmip elf64ltsmip"
|
||||
targ_extra_libpath=$targ_extra_emuls
|
||||
;;
|
||||
mips*el-*-linux-*) targ_emul=elf32ltsmip
|
||||
@@ -1,103 +0,0 @@
|
||||
Patch-Source: https://sourceware.org/git/?p=binutils-gdb.git;a=commitdiff;h=225df051d3d4cf714d1791b9035966a6686b3f3d;hp=a70d5ba34cb64bbbb7df4f3055cf5b1967bdf61e#patch1
|
||||
https://sourceware.org/bugzilla/show_bug.cgi?id=25694
|
||||
--
|
||||
From: Nelson Chu <nelson@nelson.ba.rivosinc.com>
|
||||
Date: Thu, 4 May 2023 09:08:50 +0000 (+0800)
|
||||
Subject: [PR ld/22263][PR ld/25694] RISC-V: Avoid dynamic TLS relocs in PIE.
|
||||
X-Git-Url: https://sourceware.org/git/?p=binutils-gdb.git;a=commitdiff_plain;h=225df051d3d4cf714d1791b9035966a6686b3f3d;hp=a70d5ba34cb64bbbb7df4f3055cf5b1967bdf61e
|
||||
|
||||
[PR ld/22263][PR ld/25694] RISC-V: Avoid dynamic TLS relocs in PIE.
|
||||
|
||||
Lots of targets already fixed the TEXTREL problem for TLS in PIE.
|
||||
|
||||
* For PR ld/25694,
|
||||
In the check_reloc, refer to spare and loongarch, they don't need to reserve
|
||||
any local dynamic reloc for TLS LE in pie/pde, and similar to other targets.
|
||||
So it seems like riscv was too conservative to estimate the TLS LE before.
|
||||
Just break and don't goto static_reloc for TLS LE in pie/pde can fix the
|
||||
TEXTREL problem.
|
||||
|
||||
* For PR ld/22263,
|
||||
The risc-v code for TLS GD/IE in the relocate_section seems same as MIPS port.
|
||||
So similar to MIPS, pr22570, commits 9143e72c6d4d and 1cb83cac9a89, it seems
|
||||
also the right way to do the same thing for risc-v.
|
||||
|
||||
On risc-v, fixes
|
||||
FAIL: Build pr22263-1
|
||||
|
||||
RISC-V haven't supported the TLS transitions, so will need the same fix (use
|
||||
bfd_link_dll) in the future.
|
||||
|
||||
bfd/
|
||||
PR ld/22263
|
||||
PR ld/25694
|
||||
* elfnn-riscv.c (riscv_elf_check_relocs): Replace bfd_link_pic with
|
||||
bfd_link_dll for TLS IE. Don't need to reserve the local dynamic
|
||||
relocation for TLS LE in pie/pde, and report error in pic just like
|
||||
before.
|
||||
(riscv_elf_relocate_section): For TLS GD/IE, use bfd_link_dll rather
|
||||
than !bfd_link_pic in determining the dynamic symbol index. Avoid
|
||||
the index of -1.
|
||||
---
|
||||
|
||||
diff --git a/bfd/elfnn-riscv.c b/bfd/elfnn-riscv.c
|
||||
index 75af040cf92..762ea231c0b 100644
|
||||
--- a/bfd/elfnn-riscv.c
|
||||
+++ b/bfd/elfnn-riscv.c
|
||||
@@ -824,7 +824,7 @@ riscv_elf_check_relocs (bfd *abfd, struct bfd_link_info *info,
|
||||
break;
|
||||
|
||||
case R_RISCV_TLS_GOT_HI20:
|
||||
- if (bfd_link_pic (info))
|
||||
+ if (bfd_link_dll (info))
|
||||
info->flags |= DF_STATIC_TLS;
|
||||
if (!riscv_elf_record_got_reference (abfd, info, h, r_symndx)
|
||||
|| !riscv_elf_record_tls_type (abfd, h, r_symndx, GOT_TLS_IE))
|
||||
@@ -920,11 +920,12 @@ riscv_elf_check_relocs (bfd *abfd, struct bfd_link_info *info,
|
||||
goto static_reloc;
|
||||
|
||||
case R_RISCV_TPREL_HI20:
|
||||
+ /* This is not allowed in the pic, but okay in pie. */
|
||||
if (!bfd_link_executable (info))
|
||||
return bad_static_reloc (abfd, r_type, h);
|
||||
if (h != NULL)
|
||||
riscv_elf_record_tls_type (abfd, h, r_symndx, GOT_TLS_LE);
|
||||
- goto static_reloc;
|
||||
+ break;
|
||||
|
||||
case R_RISCV_HI20:
|
||||
if (bfd_link_pic (info))
|
||||
@@ -2880,24 +2881,20 @@ riscv_elf_relocate_section (bfd *output_bfd,
|
||||
if (htab->elf.srelgot == NULL)
|
||||
abort ();
|
||||
|
||||
- if (h != NULL)
|
||||
- {
|
||||
- bool dyn, pic;
|
||||
- dyn = htab->elf.dynamic_sections_created;
|
||||
- pic = bfd_link_pic (info);
|
||||
-
|
||||
- if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, pic, h)
|
||||
- && (!pic || !SYMBOL_REFERENCES_LOCAL (info, h)))
|
||||
- indx = h->dynindx;
|
||||
- }
|
||||
+ bool dyn = elf_hash_table (info)->dynamic_sections_created;
|
||||
+ if (h != NULL
|
||||
+ && h->dynindx != -1
|
||||
+ && WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, bfd_link_pic (info), h)
|
||||
+ && (bfd_link_dll (info) || !SYMBOL_REFERENCES_LOCAL (info, h)))
|
||||
+ indx = h->dynindx;
|
||||
|
||||
/* The GOT entries have not been initialized yet. Do it
|
||||
now, and emit any relocations. */
|
||||
- if ((bfd_link_pic (info) || indx != 0)
|
||||
+ if ((bfd_link_dll (info) || indx != 0)
|
||||
&& (h == NULL
|
||||
|| ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
|
||||
|| h->root.type != bfd_link_hash_undefweak))
|
||||
- need_relocs = true;
|
||||
+ need_relocs = true;
|
||||
|
||||
if (tls_type & GOT_TLS_GD)
|
||||
{
|
||||
|
||||
-55
@@ -1,55 +0,0 @@
|
||||
From bbf05b742fde518fb97c789b043fe0d3aaf549f0 Mon Sep 17 00:00:00 2001
|
||||
From: Ariadne Conill <ariadne@dereferenced.org>
|
||||
Date: Tue, 21 Sep 2021 14:53:13 +0000
|
||||
Subject: [PATCH] Revert "PR25882, .gnu.attributes are not checked for shared
|
||||
libraries"
|
||||
|
||||
This revert is needed to avoid wrongly tagging objects with the incompatible
|
||||
IBM long double ABI, which is not supported by musl and will result in
|
||||
linking errors if used.
|
||||
|
||||
This reverts commit a8acd6eeb6dc2cc5460ece90f90ebe36b56b20ba.
|
||||
---
|
||||
bfd/elf32-tic6x.c | 3 ---
|
||||
ld/ldlang.c | 10 ++++------
|
||||
2 files changed, 4 insertions(+), 9 deletions(-)
|
||||
|
||||
diff --git a/bfd/elf32-tic6x.c b/bfd/elf32-tic6x.c
|
||||
index 5754f3cb860..3ad1d612749 100644
|
||||
--- a/bfd/elf32-tic6x.c
|
||||
+++ b/bfd/elf32-tic6x.c
|
||||
@@ -3735,9 +3735,6 @@ elf32_tic6x_merge_attributes (bfd *ibfd, struct bfd_link_info *info)
|
||||
|
||||
case Tag_ABI_PIC:
|
||||
case Tag_ABI_PID:
|
||||
- /* Don't transfer these tags from dynamic objects. */
|
||||
- if ((ibfd->flags & DYNAMIC) != 0)
|
||||
- continue;
|
||||
if (out_attr[i].i > in_attr[i].i)
|
||||
out_attr[i].i = in_attr[i].i;
|
||||
break;
|
||||
diff --git a/ld/ldlang.c b/ld/ldlang.c
|
||||
index 37b64c89ee1..f13beaef9d9 100644
|
||||
--- a/ld/ldlang.c
|
||||
+++ b/ld/ldlang.c
|
||||
@@ -7071,13 +7071,11 @@ lang_check (void)
|
||||
bfd_printable_name (input_bfd), input_bfd,
|
||||
bfd_printable_name (link_info.output_bfd));
|
||||
}
|
||||
-
|
||||
- /* If the input bfd has no contents, it shouldn't set the
|
||||
- private data of the output bfd. */
|
||||
- else if (!file->flags.just_syms
|
||||
- && ((input_bfd->flags & DYNAMIC) != 0
|
||||
- || bfd_count_sections (input_bfd) != 0))
|
||||
+ else if (bfd_count_sections (input_bfd))
|
||||
{
|
||||
+ /* If the input bfd has no contents, it shouldn't set the
|
||||
+ private data of the output bfd. */
|
||||
+
|
||||
bfd_error_handler_type pfn = NULL;
|
||||
|
||||
/* If we aren't supposed to warn about mismatched input
|
||||
--
|
||||
2.33.0
|
||||
|
||||
@@ -1,153 +0,0 @@
|
||||
# Automatically generated aport, do not edit!
|
||||
# Generator: pmbootstrap aportgen binutils-riscv64
|
||||
# Based on: main/binutils
|
||||
|
||||
|
||||
CTARGET_ARCH=riscv64
|
||||
CTARGET="$(arch_to_hostspec $CTARGET_ARCH)"
|
||||
|
||||
pkgname=binutils-riscv64
|
||||
pkgver=2.40
|
||||
pkgrel=12
|
||||
pkgdesc="Tools necessary to build programs for riscv64 targets"
|
||||
url="https://www.gnu.org/software/binutils/"
|
||||
makedepends_build="bison flex texinfo"
|
||||
makedepends_host="zlib-dev jansson-dev zstd-dev"
|
||||
arch="x86_64"
|
||||
license="GPL-2.0-or-later AND LGPL-2.1-or-later AND BSD-3-Clause"
|
||||
subpackages="binutils-dev binutils-doc"
|
||||
source="https://ftp.gnu.org/gnu/binutils/binutils-$pkgver.tar.xz
|
||||
0001-Revert-PR25882-.gnu.attributes-are-not-checked-for-s.patch
|
||||
CVE-2023-1972.patch
|
||||
binutils-ld-fix-static-linking.patch
|
||||
riscv64-textrels.patch
|
||||
"
|
||||
builddir="$srcdir/binutils-$pkgver"
|
||||
|
||||
if [ -z "$BOOTSTRAP" ]; then
|
||||
makedepends_host="$makedepends_host jansson-dev zstd-dev"
|
||||
_noboot_configure="--enable-jansson --with-zstd"
|
||||
fi
|
||||
|
||||
if [ "$CHOST" = "$CBUILD" ] && [ "$CBUILD" = "$CTARGET" ] && [ "$CTARGET_ARCH" != "riscv64" ]; then
|
||||
subpackages="$subpackages binutils-gold"
|
||||
fi
|
||||
|
||||
if [ "$CHOST" != "$CTARGET" ]; then
|
||||
pkgname="binutils-$CTARGET_ARCH"
|
||||
subpackages=""
|
||||
sonameprefix="binutils:"
|
||||
fi
|
||||
|
||||
# secfixes:
|
||||
# 2.40-r10:
|
||||
# - CVE-2023-1972
|
||||
# 2.40-r0:
|
||||
# - CVE-2023-1579
|
||||
# 2.39-r2:
|
||||
# - CVE-2022-38533
|
||||
# 2.39-r0:
|
||||
# - CVE-2022-38126
|
||||
# 2.35.2-r1:
|
||||
# - CVE-2021-3487
|
||||
# 2.32-r0:
|
||||
# - CVE-2018-19931
|
||||
# - CVE-2018-19932
|
||||
# - CVE-2018-20002
|
||||
# - CVE-2018-20712
|
||||
# 2.28-r1:
|
||||
# - CVE-2017-7614
|
||||
|
||||
build() {
|
||||
local _sysroot=/
|
||||
local _cross_configure="--enable-install-libiberty --enable-shared"
|
||||
local _arch_configure=""
|
||||
local _gold_configure="--disable-gold"
|
||||
local _plugin_configure="--enable-plugins"
|
||||
|
||||
if [ "$CHOST" != "$CTARGET" ]; then
|
||||
_sysroot="$CBUILDROOT"
|
||||
_cross_configure="--disable-install-libiberty"
|
||||
_plugin_configure="--disable-plugins"
|
||||
fi
|
||||
|
||||
if [ "$CHOST" = "$CBUILD" ] && [ "$CBUILD" = "$CTARGET" ] && [ "$CTARGET_ARCH" != "riscv64" ]; then
|
||||
_gold_configure="--enable-gold"
|
||||
fi
|
||||
|
||||
if [ "$CTARGET_ARCH" = "x86_64" ]; then
|
||||
_arch_configure="--enable-targets=x86_64-pep"
|
||||
fi
|
||||
|
||||
if [ "$CTARGET_ARCH" = "riscv64" ]; then
|
||||
_gold_configure="--disable-gold"
|
||||
fi
|
||||
|
||||
CFLAGS="$CFLAGS -O2" \
|
||||
CXXFLAGS="$CXXFLAGS -O2" \
|
||||
./configure \
|
||||
--build=$CBUILD \
|
||||
--host=$CHOST \
|
||||
--target=$CTARGET \
|
||||
--with-build-sysroot="$CBUILDROOT" \
|
||||
--with-sysroot=$_sysroot \
|
||||
--prefix=/usr \
|
||||
--mandir=/usr/share/man \
|
||||
--infodir=/usr/share/info \
|
||||
--sysconfdir=/etc \
|
||||
$_arch_configure \
|
||||
$_cross_configure \
|
||||
$_gold_configure \
|
||||
$_plugin_configure \
|
||||
$_noboot_configure \
|
||||
--disable-gprofng \
|
||||
--disable-multilib \
|
||||
--disable-nls \
|
||||
--disable-werror \
|
||||
--enable-64-bit-bfd \
|
||||
--enable-colored-disassembly \
|
||||
--enable-default-execstack=no \
|
||||
--enable-default-hash-style=gnu \
|
||||
--enable-deterministic-archives \
|
||||
--enable-ld=default \
|
||||
--enable-new-dtags \
|
||||
--enable-relro \
|
||||
--enable-threads \
|
||||
--with-bugurl="https://postmarketos.org/issues" \
|
||||
--with-mmap \
|
||||
--with-pic \
|
||||
--with-system-zlib
|
||||
make
|
||||
}
|
||||
|
||||
package() {
|
||||
make install DESTDIR="$pkgdir"
|
||||
if [ -d "$pkgdir"/usr/lib64 ]; then
|
||||
mv "$pkgdir"/usr/lib64/* "$pkgdir"/usr/lib/
|
||||
rmdir "$pkgdir"/usr/lib64
|
||||
fi
|
||||
if [ "$CHOST" != "$CTARGET" ]; then
|
||||
# creating cross tools: remove any files that would conflict
|
||||
# with the native tools, or other cross tools
|
||||
rm -r "${pkgdir:?}"/usr/share
|
||||
rm -f "$pkgdir"/usr/lib/libiberty.a
|
||||
rm -r "${pkgdir:?}"/usr/lib/bfd-plugins
|
||||
fi
|
||||
}
|
||||
|
||||
gold() {
|
||||
pkgdesc="GNU binutils - gold linker"
|
||||
|
||||
if [ -e "$pkgdir"/usr/bin/ld.gold ]; then
|
||||
amove usr/bin/ld.gold
|
||||
fi
|
||||
amove usr/$CTARGET/bin/ld.gold
|
||||
}
|
||||
|
||||
sha512sums="
|
||||
a37e042523bc46494d99d5637c3f3d8f9956d9477b748b3b1f6d7dfbb8d968ed52c932e88a4e946c6f77b8f48f1e1b360ca54c3d298f17193f3b4963472f6925 binutils-2.40.tar.xz
|
||||
70ec22bd72ef6dddecfd970613387dd4a8cdc8730dd3cbf03d5a0c3a7c4d839383167bb06dad21bf7c235329fd44b5dc4aefe762f68544f17155cf002bf1be4a 0001-Revert-PR25882-.gnu.attributes-are-not-checked-for-s.patch
|
||||
b434e126c4c3f70c02b0a5597a0d75a4ea99b1498552c2d0676005ac0ae171c56cf07a6f6e2faa1381f1f4d4a37043a07d177dd4912f09b61109f103853594b2 CVE-2023-1972.patch
|
||||
ecee33b0e435aa704af1c334e560f201638ff79e199aa11ed78a72f7c9b46f85fbb227af5748e735fd681d1965fcc42ac81b0c8824e540430ce0c706c81e8b49 binutils-ld-fix-static-linking.patch
|
||||
d138691d953c6f49111601df1731db157d2ecedf1593e37ababb5c12ff10572b5f7982288c81579f4a99097780dbb18d3b457f74daab0f935f59423e69cec56f riscv64-textrels.patch
|
||||
"
|
||||
@@ -1,37 +0,0 @@
|
||||
Patch-Source: https://sourceware.org/git/?p=binutils-gdb.git;a=commitdiff;h=c22d38baefc5a7a1e1f5cdc9dbb556b1f0ec5c57;hp=f2f9bde5cde7ff34ed0a4c4682a211d402aa1086
|
||||
https://sourceware.org/bugzilla/show_bug.cgi?id=30285
|
||||
--
|
||||
From: Nick Clifton <nickc@redhat.com>
|
||||
Date: Thu, 30 Mar 2023 09:10:09 +0000 (+0100)
|
||||
Subject: Fix an illegal memory access when an accessing a zer0-lengthverdef table.
|
||||
X-Git-Url: https://sourceware.org/git/?p=binutils-gdb.git;a=commitdiff_plain;h=c22d38baefc5a7a1e1f5cdc9dbb556b1f0ec5c57;hp=f2f9bde5cde7ff34ed0a4c4682a211d402aa1086
|
||||
|
||||
Fix an illegal memory access when an accessing a zer0-lengthverdef table.
|
||||
|
||||
PR 30285
|
||||
* elf.c (_bfd_elf_slurp_version_tables): Fail if no version definitions are allocated.
|
||||
---
|
||||
|
||||
diff --git a/bfd/elf.c b/bfd/elf.c
|
||||
index 027d0143735..185028cbd97 100644
|
||||
--- a/bfd/elf.c
|
||||
+++ b/bfd/elf.c
|
||||
@@ -9030,6 +9030,9 @@ _bfd_elf_slurp_version_tables (bfd *abfd, bool default_imported_symver)
|
||||
bfd_set_error (bfd_error_file_too_big);
|
||||
goto error_return_verdef;
|
||||
}
|
||||
+
|
||||
+ if (amt == 0)
|
||||
+ goto error_return_verdef;
|
||||
elf_tdata (abfd)->verdef = (Elf_Internal_Verdef *) bfd_zalloc (abfd, amt);
|
||||
if (elf_tdata (abfd)->verdef == NULL)
|
||||
goto error_return_verdef;
|
||||
@@ -9133,6 +9136,8 @@ _bfd_elf_slurp_version_tables (bfd *abfd, bool default_imported_symver)
|
||||
bfd_set_error (bfd_error_file_too_big);
|
||||
goto error_return;
|
||||
}
|
||||
+ if (amt == 0)
|
||||
+ goto error_return;
|
||||
elf_tdata (abfd)->verdef = (Elf_Internal_Verdef *) bfd_zalloc (abfd, amt);
|
||||
if (elf_tdata (abfd)->verdef == NULL)
|
||||
goto error_return;
|
||||
@@ -1,46 +0,0 @@
|
||||
This fixes static linking for our hardened toolchain
|
||||
diff --git a/ld/scripttempl/elf.sc b/ld/scripttempl/elf.sc
|
||||
index e8126cb..9532bfb 100644
|
||||
--- a/ld/scripttempl/elf.sc
|
||||
+++ b/ld/scripttempl/elf.sc
|
||||
@@ -235,8 +235,8 @@ test "${LARGE_SECTIONS}" = "yes" && LARGE_SECTIONS="
|
||||
if test "${ENABLE_INITFINI_ARRAY}" = "yes"; then
|
||||
SORT_INIT_ARRAY="KEEP (*(SORT_BY_INIT_PRIORITY(.init_array.*) SORT_BY_INIT_PRIORITY(.ctors.*)))"
|
||||
SORT_FINI_ARRAY="KEEP (*(SORT_BY_INIT_PRIORITY(.fini_array.*) SORT_BY_INIT_PRIORITY(.dtors.*)))"
|
||||
- CTORS_IN_INIT_ARRAY="EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o $OTHER_EXCLUDE_FILES) .ctors"
|
||||
- DTORS_IN_FINI_ARRAY="EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o $OTHER_EXCLUDE_FILES) .dtors"
|
||||
+ CTORS_IN_INIT_ARRAY="EXCLUDE_FILE (*crtbegin*.o *crtend*.o $OTHER_EXCLUDE_FILES) .ctors"
|
||||
+ DTORS_IN_FINI_ARRAY="EXCLUDE_FILE (*crtbegin*.o *crtend*.o $OTHER_EXCLUDE_FILES) .dtors"
|
||||
else
|
||||
SORT_INIT_ARRAY="KEEP (*(SORT(.init_array.*)))"
|
||||
SORT_FINI_ARRAY="KEEP (*(SORT(.fini_array.*)))"
|
||||
@@ -270,15 +270,14 @@ CTOR=".ctors ${CONSTRUCTING-0} :
|
||||
doesn't matter which directory crtbegin.o
|
||||
is in. */
|
||||
|
||||
- KEEP (*crtbegin.o(.ctors))
|
||||
- KEEP (*crtbegin?.o(.ctors))
|
||||
+ KEEP (*crtbegin*.o(.ctors))
|
||||
|
||||
/* We don't want to include the .ctor section from
|
||||
the crtend.o file until after the sorted ctors.
|
||||
The .ctor section from the crtend file contains the
|
||||
end of ctors marker and it must be last */
|
||||
|
||||
- KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o $OTHER_EXCLUDE_FILES) .ctors))
|
||||
+ KEEP (*(EXCLUDE_FILE (*crtend*.o $OTHER_EXCLUDE_FILES) .ctors))
|
||||
KEEP (*(SORT(.ctors.*)))
|
||||
KEEP (*(.ctors))
|
||||
${CONSTRUCTING+${CTOR_END}}
|
||||
@@ -286,9 +285,8 @@ CTOR=".ctors ${CONSTRUCTING-0} :
|
||||
DTOR=".dtors ${CONSTRUCTING-0} :
|
||||
{
|
||||
${CONSTRUCTING+${DTOR_START}}
|
||||
- KEEP (*crtbegin.o(.dtors))
|
||||
- KEEP (*crtbegin?.o(.dtors))
|
||||
- KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o $OTHER_EXCLUDE_FILES) .dtors))
|
||||
+ KEEP (*crtbegin*.o(.dtors))
|
||||
+ KEEP (*(EXCLUDE_FILE (*crtend*.o $OTHER_EXCLUDE_FILES) .dtors))
|
||||
KEEP (*(SORT(.dtors.*)))
|
||||
KEEP (*(.dtors))
|
||||
${CONSTRUCTING+${DTOR_END}}
|
||||
@@ -1,103 +0,0 @@
|
||||
Patch-Source: https://sourceware.org/git/?p=binutils-gdb.git;a=commitdiff;h=225df051d3d4cf714d1791b9035966a6686b3f3d;hp=a70d5ba34cb64bbbb7df4f3055cf5b1967bdf61e#patch1
|
||||
https://sourceware.org/bugzilla/show_bug.cgi?id=25694
|
||||
--
|
||||
From: Nelson Chu <nelson@nelson.ba.rivosinc.com>
|
||||
Date: Thu, 4 May 2023 09:08:50 +0000 (+0800)
|
||||
Subject: [PR ld/22263][PR ld/25694] RISC-V: Avoid dynamic TLS relocs in PIE.
|
||||
X-Git-Url: https://sourceware.org/git/?p=binutils-gdb.git;a=commitdiff_plain;h=225df051d3d4cf714d1791b9035966a6686b3f3d;hp=a70d5ba34cb64bbbb7df4f3055cf5b1967bdf61e
|
||||
|
||||
[PR ld/22263][PR ld/25694] RISC-V: Avoid dynamic TLS relocs in PIE.
|
||||
|
||||
Lots of targets already fixed the TEXTREL problem for TLS in PIE.
|
||||
|
||||
* For PR ld/25694,
|
||||
In the check_reloc, refer to spare and loongarch, they don't need to reserve
|
||||
any local dynamic reloc for TLS LE in pie/pde, and similar to other targets.
|
||||
So it seems like riscv was too conservative to estimate the TLS LE before.
|
||||
Just break and don't goto static_reloc for TLS LE in pie/pde can fix the
|
||||
TEXTREL problem.
|
||||
|
||||
* For PR ld/22263,
|
||||
The risc-v code for TLS GD/IE in the relocate_section seems same as MIPS port.
|
||||
So similar to MIPS, pr22570, commits 9143e72c6d4d and 1cb83cac9a89, it seems
|
||||
also the right way to do the same thing for risc-v.
|
||||
|
||||
On risc-v, fixes
|
||||
FAIL: Build pr22263-1
|
||||
|
||||
RISC-V haven't supported the TLS transitions, so will need the same fix (use
|
||||
bfd_link_dll) in the future.
|
||||
|
||||
bfd/
|
||||
PR ld/22263
|
||||
PR ld/25694
|
||||
* elfnn-riscv.c (riscv_elf_check_relocs): Replace bfd_link_pic with
|
||||
bfd_link_dll for TLS IE. Don't need to reserve the local dynamic
|
||||
relocation for TLS LE in pie/pde, and report error in pic just like
|
||||
before.
|
||||
(riscv_elf_relocate_section): For TLS GD/IE, use bfd_link_dll rather
|
||||
than !bfd_link_pic in determining the dynamic symbol index. Avoid
|
||||
the index of -1.
|
||||
---
|
||||
|
||||
diff --git a/bfd/elfnn-riscv.c b/bfd/elfnn-riscv.c
|
||||
index 75af040cf92..762ea231c0b 100644
|
||||
--- a/bfd/elfnn-riscv.c
|
||||
+++ b/bfd/elfnn-riscv.c
|
||||
@@ -824,7 +824,7 @@ riscv_elf_check_relocs (bfd *abfd, struct bfd_link_info *info,
|
||||
break;
|
||||
|
||||
case R_RISCV_TLS_GOT_HI20:
|
||||
- if (bfd_link_pic (info))
|
||||
+ if (bfd_link_dll (info))
|
||||
info->flags |= DF_STATIC_TLS;
|
||||
if (!riscv_elf_record_got_reference (abfd, info, h, r_symndx)
|
||||
|| !riscv_elf_record_tls_type (abfd, h, r_symndx, GOT_TLS_IE))
|
||||
@@ -920,11 +920,12 @@ riscv_elf_check_relocs (bfd *abfd, struct bfd_link_info *info,
|
||||
goto static_reloc;
|
||||
|
||||
case R_RISCV_TPREL_HI20:
|
||||
+ /* This is not allowed in the pic, but okay in pie. */
|
||||
if (!bfd_link_executable (info))
|
||||
return bad_static_reloc (abfd, r_type, h);
|
||||
if (h != NULL)
|
||||
riscv_elf_record_tls_type (abfd, h, r_symndx, GOT_TLS_LE);
|
||||
- goto static_reloc;
|
||||
+ break;
|
||||
|
||||
case R_RISCV_HI20:
|
||||
if (bfd_link_pic (info))
|
||||
@@ -2880,24 +2881,20 @@ riscv_elf_relocate_section (bfd *output_bfd,
|
||||
if (htab->elf.srelgot == NULL)
|
||||
abort ();
|
||||
|
||||
- if (h != NULL)
|
||||
- {
|
||||
- bool dyn, pic;
|
||||
- dyn = htab->elf.dynamic_sections_created;
|
||||
- pic = bfd_link_pic (info);
|
||||
-
|
||||
- if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, pic, h)
|
||||
- && (!pic || !SYMBOL_REFERENCES_LOCAL (info, h)))
|
||||
- indx = h->dynindx;
|
||||
- }
|
||||
+ bool dyn = elf_hash_table (info)->dynamic_sections_created;
|
||||
+ if (h != NULL
|
||||
+ && h->dynindx != -1
|
||||
+ && WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, bfd_link_pic (info), h)
|
||||
+ && (bfd_link_dll (info) || !SYMBOL_REFERENCES_LOCAL (info, h)))
|
||||
+ indx = h->dynindx;
|
||||
|
||||
/* The GOT entries have not been initialized yet. Do it
|
||||
now, and emit any relocations. */
|
||||
- if ((bfd_link_pic (info) || indx != 0)
|
||||
+ if ((bfd_link_dll (info) || indx != 0)
|
||||
&& (h == NULL
|
||||
|| ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
|
||||
|| h->root.type != bfd_link_hash_undefweak))
|
||||
- need_relocs = true;
|
||||
+ need_relocs = true;
|
||||
|
||||
if (tls_type & GOT_TLS_GD)
|
||||
{
|
||||
|
||||
@@ -1,36 +1,29 @@
|
||||
# Automatically generated aport, do not edit!
|
||||
# Generator: pmbootstrap aportgen busybox-static-aarch64
|
||||
|
||||
# Stub for apkbuild-lint
|
||||
if [ -z "$(type -t arch_to_hostspec)" ]; then
|
||||
arch_to_hostspec() { :; }
|
||||
fi
|
||||
|
||||
pkgname=busybox-static-aarch64
|
||||
pkgver=1.36.1
|
||||
pkgrel=2
|
||||
pkgver=1.31.1
|
||||
pkgrel=14
|
||||
|
||||
_arch="aarch64"
|
||||
_mirror="http://dl-4.alpinelinux.org/alpine/"
|
||||
_mirror="http://dl-cdn.alpinelinux.org/alpine/"
|
||||
|
||||
url="http://busybox.net"
|
||||
license="GPL2"
|
||||
arch="x86_64"
|
||||
arch="all"
|
||||
options="!check !strip"
|
||||
pkgdesc="Statically linked Busybox for $_arch"
|
||||
_target="$(arch_to_hostspec $_arch)"
|
||||
|
||||
source="
|
||||
busybox-static-$pkgver-r$pkgrel-$_arch-edge.apk::$_mirror/edge/main/$_arch/busybox-static-$pkgver-r$pkgrel.apk
|
||||
busybox-static-$pkgver-r$pkgrel-$_arch.apk::$_mirror/edge/main/$_arch/busybox-static-$pkgver-r$pkgrel.apk
|
||||
"
|
||||
|
||||
package() {
|
||||
mkdir -p "$pkgdir/usr/$_target"
|
||||
cd "$pkgdir/usr/$_target"
|
||||
tar -xf $srcdir/busybox-static-$pkgver-r$pkgrel-$_arch-edge.apk
|
||||
rm .PKGINFO .SIGN.*
|
||||
mkdir -p "$pkgdir/usr/$_target"
|
||||
cd "$pkgdir/usr/$_target"
|
||||
tar -xf $srcdir/busybox-static-$pkgver-r$pkgrel-$_arch.apk
|
||||
rm .PKGINFO .SIGN.*
|
||||
}
|
||||
|
||||
sha512sums="
|
||||
25394d1105e40c8decf861c55c68401708ed8dbcd9643194c7c270f9cc4a792d0376cb926816f8803d496610bdbc53494a09a360097981f862958ceb4435768a busybox-static-1.36.1-r2-aarch64-edge.apk
|
||||
"
|
||||
sha512sums="d8b821b9f03837fde107cd6b4260b339c57c532d0c643d4bdf142c2cc33248029023238240a863117deed1ea3cb4531f51cbad0de4767f44801ce18cef4b3475 busybox-static-1.31.1-r14-aarch64.apk"
|
||||
@@ -1,36 +1,29 @@
|
||||
# Automatically generated aport, do not edit!
|
||||
# Generator: pmbootstrap aportgen busybox-static-armhf
|
||||
|
||||
# Stub for apkbuild-lint
|
||||
if [ -z "$(type -t arch_to_hostspec)" ]; then
|
||||
arch_to_hostspec() { :; }
|
||||
fi
|
||||
|
||||
pkgname=busybox-static-armhf
|
||||
pkgver=1.36.1
|
||||
pkgrel=2
|
||||
pkgver=1.31.1
|
||||
pkgrel=14
|
||||
|
||||
_arch="armhf"
|
||||
_mirror="http://dl-4.alpinelinux.org/alpine/"
|
||||
_mirror="http://dl-cdn.alpinelinux.org/alpine/"
|
||||
|
||||
url="http://busybox.net"
|
||||
license="GPL2"
|
||||
arch="x86_64"
|
||||
arch="all"
|
||||
options="!check !strip"
|
||||
pkgdesc="Statically linked Busybox for $_arch"
|
||||
_target="$(arch_to_hostspec $_arch)"
|
||||
|
||||
source="
|
||||
busybox-static-$pkgver-r$pkgrel-$_arch-edge.apk::$_mirror/edge/main/$_arch/busybox-static-$pkgver-r$pkgrel.apk
|
||||
busybox-static-$pkgver-r$pkgrel-$_arch.apk::$_mirror/edge/main/$_arch/busybox-static-$pkgver-r$pkgrel.apk
|
||||
"
|
||||
|
||||
package() {
|
||||
mkdir -p "$pkgdir/usr/$_target"
|
||||
cd "$pkgdir/usr/$_target"
|
||||
tar -xf $srcdir/busybox-static-$pkgver-r$pkgrel-$_arch-edge.apk
|
||||
rm .PKGINFO .SIGN.*
|
||||
mkdir -p "$pkgdir/usr/$_target"
|
||||
cd "$pkgdir/usr/$_target"
|
||||
tar -xf $srcdir/busybox-static-$pkgver-r$pkgrel-$_arch.apk
|
||||
rm .PKGINFO .SIGN.*
|
||||
}
|
||||
|
||||
sha512sums="
|
||||
6dd546f62fdb8c0a45428bc313c28be573d92e468c52ac1210ea054a4cc701810a5bbee766d53e0374fcca6b6611e9202ab4036899c97b5129ac216ffccadf73 busybox-static-1.36.1-r2-armhf-edge.apk
|
||||
"
|
||||
sha512sums="ceeb5786a2ca8a904dece9b9b3132e883c03eeb216b9343def3faa2a0d64a4744ee359f991730c531859ed7e82baa88a9f95349265735ac6e1c539f28adf668e busybox-static-1.31.1-r14-armhf.apk"
|
||||
@@ -1,36 +1,29 @@
|
||||
# Automatically generated aport, do not edit!
|
||||
# Generator: pmbootstrap aportgen busybox-static-armv7
|
||||
|
||||
# Stub for apkbuild-lint
|
||||
if [ -z "$(type -t arch_to_hostspec)" ]; then
|
||||
arch_to_hostspec() { :; }
|
||||
fi
|
||||
|
||||
pkgname=busybox-static-armv7
|
||||
pkgver=1.36.1
|
||||
pkgrel=2
|
||||
pkgver=1.31.1
|
||||
pkgrel=14
|
||||
|
||||
_arch="armv7"
|
||||
_mirror="http://dl-4.alpinelinux.org/alpine/"
|
||||
_mirror="http://dl-cdn.alpinelinux.org/alpine/"
|
||||
|
||||
url="http://busybox.net"
|
||||
license="GPL2"
|
||||
arch="x86_64"
|
||||
arch="all"
|
||||
options="!check !strip"
|
||||
pkgdesc="Statically linked Busybox for $_arch"
|
||||
_target="$(arch_to_hostspec $_arch)"
|
||||
|
||||
source="
|
||||
busybox-static-$pkgver-r$pkgrel-$_arch-edge.apk::$_mirror/edge/main/$_arch/busybox-static-$pkgver-r$pkgrel.apk
|
||||
busybox-static-$pkgver-r$pkgrel-$_arch.apk::$_mirror/edge/main/$_arch/busybox-static-$pkgver-r$pkgrel.apk
|
||||
"
|
||||
|
||||
package() {
|
||||
mkdir -p "$pkgdir/usr/$_target"
|
||||
cd "$pkgdir/usr/$_target"
|
||||
tar -xf $srcdir/busybox-static-$pkgver-r$pkgrel-$_arch-edge.apk
|
||||
rm .PKGINFO .SIGN.*
|
||||
mkdir -p "$pkgdir/usr/$_target"
|
||||
cd "$pkgdir/usr/$_target"
|
||||
tar -xf $srcdir/busybox-static-$pkgver-r$pkgrel-$_arch.apk
|
||||
rm .PKGINFO .SIGN.*
|
||||
}
|
||||
|
||||
sha512sums="
|
||||
b723bb48cc886706271f39a2bc096a1d6adfcca3df6233a3f7e904996e6dcd76a0a7d24fb75e4e637bf6a1b35f71221e8a10cd52a4f1e9bbe403a81d1f83bfc1 busybox-static-1.36.1-r2-armv7-edge.apk
|
||||
"
|
||||
sha512sums="7c5053f6eb683917708b36fc255630386e9b6e6deb265ee44bdcb7fdd272a54a0b9d0d589355f454bacdd6be75ebe5eeec9e0650d90e403c81c080204d422a59 busybox-static-1.31.1-r14-armv7.apk"
|
||||
@@ -4,8 +4,8 @@
|
||||
# ccache, which can then cache the results.
|
||||
|
||||
pkgname=ccache-cross-symlinks
|
||||
pkgver=3
|
||||
pkgrel=0
|
||||
pkgver=2
|
||||
pkgrel=1
|
||||
pkgdesc="Enable ccache for cross-compilers with symlinks"
|
||||
url="https://ccache.samba.org/"
|
||||
arch="noarch"
|
||||
@@ -30,11 +30,5 @@ package() {
|
||||
# /native/usr/bin/ccache)
|
||||
ln -v -s ../../../bin/ccache ${_hostspec}-${_bin}
|
||||
done
|
||||
|
||||
ln -v -s ../../../bin/ccache gcc4-${_hostspec}-gcc
|
||||
ln -v -s ../../../bin/ccache gcc6-${_hostspec}-gcc
|
||||
done
|
||||
|
||||
ln -v -s ../../../bin/ccache gcc4-gcc
|
||||
ln -v -s ../../../bin/ccache gcc6-gcc
|
||||
}
|
||||
@@ -17,7 +17,7 @@
|
||||
|
||||
pkgname=crossdirect
|
||||
pkgver=4
|
||||
pkgrel=3
|
||||
pkgrel=1
|
||||
pkgdesc="Wrappers to launch native cross compilers in foreign chroots"
|
||||
url="https://postmarketOS.org"
|
||||
arch="all"
|
||||
@@ -77,6 +77,6 @@ package() {
|
||||
install -Dm755 "$srcdir/rustc-$_arch" "$_bindir/rustc"
|
||||
done
|
||||
}
|
||||
sha512sums="500107e5aff8b34e74b54982ebcd447fc41bc8283956d506561b031a055cb30ec12698047c2604918b4b6d8560fe03db427a63dff2b83c907e8494b7f5233f29 crossdirect.c
|
||||
sha512sums="20b963322820de038257304c1eefa85767b78e242eda7459f06d70a1cfae5540a445aa7d5587024bf4d88a4bee28120ef9f5c2d24a648e71b542b9618318deb2 crossdirect.c
|
||||
6be16ba88720e628a3ecc8fa53f8e7a21d2af268b0509745d989139874d6b94b640bfcff09575eaa19073810be6ef91169c1f83e94f5cf8e6819f2670d9408de rustc.sh
|
||||
ea9bf8db3810d03d0a7395057f3d6e57f7127d87c55deaedc171c255288f5f3cc6fbcc680a5a1b92786cf573875d5dc22521173799fe2639acc97d0715ff905b rust-qemu-linker.sh"
|
||||
@@ -1,34 +1,4 @@
|
||||
/* Copyright 2020 Zhuowei Zhang, Oliver Smith
|
||||
* SPDX-License-Identifier: GPL-3.0-or-later
|
||||
*
|
||||
* This program gets built to a set of wrapper executables, which launch native
|
||||
* cross compilers inside foreign arch chroots. Speeds up cross compilation a
|
||||
* lot, compared to using just qemu user mode emulation or using the previous
|
||||
* distcc-based methods.
|
||||
*
|
||||
* How this program gets called:
|
||||
* - pmbootstrap creates one native arch chroot and one foreign arch chroot.
|
||||
* - The native chroot gets mounted as /native in the foreign chroot.
|
||||
* - When calling "abuild", pmbootstrap sets PATH to:
|
||||
* /native/usr/lib/crossdirect/<ARCH>:$PATH
|
||||
* - That crossdirect directory contains a crossdirect-<ARCH> binary built with
|
||||
* the matching HOSTSPEC (e.g. crossdirect-aarch64 binary with HOSTSPEC
|
||||
* aarch64-alpine-linux-musl). This binary is symlinked to:
|
||||
* - <HOSTSPEC>-c++
|
||||
* - <HOSTSPEC>-cc
|
||||
* - <HOSTSPEC>-clang
|
||||
* - <HOSTSPEC>-clang++
|
||||
* - <HOSTSPEC>-cpp
|
||||
* - <HOSTSPEC>-g++
|
||||
* - <HOSTSPEC>-gcc
|
||||
* - c++
|
||||
* - cc
|
||||
* - clang
|
||||
* - clang++
|
||||
* - cpp
|
||||
* - g++
|
||||
* - gcc
|
||||
*/
|
||||
// HOSTSPEC is defined at compile time, see APKBUILD
|
||||
|
||||
#include <errno.h>
|
||||
#include <libgen.h>
|
||||
@@ -82,31 +52,20 @@ int main(int argc, char **argv)
|
||||
}
|
||||
}
|
||||
|
||||
// Translate "cc" to "gcc": /usr/bin/cc is a symlink to /usr/bin/gcc,
|
||||
// but there is no <HOSTSPEC>-cc symlink (pmaports#732)
|
||||
if (strcmp(executableName, "cc") == 0)
|
||||
executableName = "gcc";
|
||||
|
||||
// prepend the HOSTSPEC to GCC binaries
|
||||
if (isClang || startsWithHostSpec) {
|
||||
snprintf(newExecutable, sizeof(newExecutable), NATIVE_BIN_DIR "/%s", executableName);
|
||||
} else {
|
||||
snprintf(newExecutable, sizeof(newExecutable), NATIVE_BIN_DIR "/" HOSTSPEC "-%s", executableName);
|
||||
}
|
||||
|
||||
// prepare new arguments for GCC / clang
|
||||
char **newArgsPtr = newargv;
|
||||
*newArgsPtr++ = newExecutable;
|
||||
if (isClang) {
|
||||
// clang does not use a HOSTSPEC prefix for the cross compiler
|
||||
// binary, but instead have a -target argument
|
||||
*newArgsPtr++ = "-target";
|
||||
*newArgsPtr++ = HOSTSPEC;
|
||||
}
|
||||
*newArgsPtr++ = "--sysroot=/";
|
||||
|
||||
// add all arguments passed to this executable to GCC / clang and set
|
||||
// the last arg in newargv to NULL to mark its end
|
||||
memcpy(newArgsPtr, argv + 1, sizeof(char *) * (argc - 1));
|
||||
newArgsPtr += (argc - 1);
|
||||
*newArgsPtr = NULL;
|
||||
@@ -126,7 +85,6 @@ int main(int argc, char **argv)
|
||||
}
|
||||
}
|
||||
|
||||
// finally exec GCC / clang
|
||||
if (execve(newExecutable, newargv, env) == -1) {
|
||||
fprintf(stderr, "ERROR: crossdirect: failed to execute %s: %s\n", newExecutable, strerror(errno));
|
||||
fprintf(stderr, "Maybe the target arch is missing in the ccache-cross-symlinks package?\n");
|
||||
|
||||
@@ -1,42 +0,0 @@
|
||||
From 75e758609803afe6ced6cd7799b4159f3848a8d5 Mon Sep 17 00:00:00 2001
|
||||
From: Szabolcs Nagy <nsz@port70.net>
|
||||
Date: Fri, 26 Jan 2018 20:32:50 +0000
|
||||
Subject: [PATCH 01/33] posix_memalign
|
||||
|
||||
---
|
||||
gcc/config/i386/pmm_malloc.h | 9 +++++----
|
||||
1 file changed, 5 insertions(+), 4 deletions(-)
|
||||
|
||||
diff --git a/gcc/config/i386/pmm_malloc.h b/gcc/config/i386/pmm_malloc.h
|
||||
index 3527283693b..c4071b64b53 100644
|
||||
--- a/gcc/config/i386/pmm_malloc.h
|
||||
+++ b/gcc/config/i386/pmm_malloc.h
|
||||
@@ -27,12 +27,13 @@
|
||||
#include <stdlib.h>
|
||||
|
||||
/* We can't depend on <stdlib.h> since the prototype of posix_memalign
|
||||
- may not be visible. */
|
||||
+ may not be visible and we can't pollute the namespace either. */
|
||||
#ifndef __cplusplus
|
||||
-extern int posix_memalign (void **, size_t, size_t);
|
||||
+extern int _mm_posix_memalign (void **, size_t, size_t)
|
||||
#else
|
||||
-extern "C" int posix_memalign (void **, size_t, size_t) throw ();
|
||||
+extern "C" int _mm_posix_memalign (void **, size_t, size_t) throw ()
|
||||
#endif
|
||||
+__asm__("posix_memalign");
|
||||
|
||||
static __inline void *
|
||||
_mm_malloc (size_t __size, size_t __alignment)
|
||||
@@ -42,7 +43,7 @@ _mm_malloc (size_t __size, size_t __alignment)
|
||||
return malloc (__size);
|
||||
if (__alignment == 2 || (sizeof (void *) == 8 && __alignment == 4))
|
||||
__alignment = sizeof (void *);
|
||||
- if (posix_memalign (&__ptr, __alignment, __size) == 0)
|
||||
+ if (_mm_posix_memalign (&__ptr, __alignment, __size) == 0)
|
||||
return __ptr;
|
||||
else
|
||||
return NULL;
|
||||
--
|
||||
2.41.0
|
||||
|
||||
@@ -1,203 +0,0 @@
|
||||
From 447c2a21d1fa8c2c3b216102a808834d86f12104 Mon Sep 17 00:00:00 2001
|
||||
From: Khem Raj <raj.khem@gmail.com>
|
||||
Date: Fri, 29 Mar 2013 08:59:00 +0400
|
||||
Subject: [PATCH 02/33] gcc: poison-system-directories
|
||||
|
||||
Add /sw/include and /opt/include based on the original
|
||||
zecke-no-host-includes.patch patch. The original patch checked for
|
||||
/usr/include, /sw/include and /opt/include and then triggered a failure and
|
||||
aborted.
|
||||
|
||||
Instead, we add the two missing items to the current scan. If the user
|
||||
wants this to be a failure, they can add "-Werror=poison-system-directories".
|
||||
|
||||
Signed-off-by: Mark Hatle <mark.hatle@windriver.com>
|
||||
Signed-off-by: Khem Raj <raj.khem@gmail.com>
|
||||
|
||||
Upstream-Status: Pending
|
||||
---
|
||||
gcc/common.opt | 4 ++++
|
||||
gcc/config.in | 6 ++++++
|
||||
gcc/configure | 16 ++++++++++++++++
|
||||
gcc/configure.ac | 10 ++++++++++
|
||||
gcc/doc/invoke.texi | 9 +++++++++
|
||||
gcc/gcc.cc | 2 ++
|
||||
gcc/incpath.cc | 21 +++++++++++++++++++++
|
||||
7 files changed, 68 insertions(+)
|
||||
|
||||
diff --git a/gcc/common.opt b/gcc/common.opt
|
||||
index 862c474d3c8..64c4277c991 100644
|
||||
--- a/gcc/common.opt
|
||||
+++ b/gcc/common.opt
|
||||
@@ -711,6 +711,10 @@ Wreturn-local-addr
|
||||
Common Var(warn_return_local_addr) Init(1) Warning
|
||||
Warn about returning a pointer/reference to a local or temporary variable.
|
||||
|
||||
+Wpoison-system-directories
|
||||
+Common Var(flag_poison_system_directories) Init(1) Warning
|
||||
+Warn for -I and -L options using system directories if cross compiling
|
||||
+
|
||||
Wshadow
|
||||
Common Var(warn_shadow) Warning
|
||||
Warn when one variable shadows another. Same as -Wshadow=global.
|
||||
diff --git a/gcc/config.in b/gcc/config.in
|
||||
index 4cad077bfbe..0679fbbf4c6 100644
|
||||
--- a/gcc/config.in
|
||||
+++ b/gcc/config.in
|
||||
@@ -236,6 +236,12 @@
|
||||
#endif
|
||||
|
||||
|
||||
+/* Define to warn for use of native system header directories */
|
||||
+#ifndef USED_FOR_TARGET
|
||||
+#undef ENABLE_POISON_SYSTEM_DIRECTORIES
|
||||
+#endif
|
||||
+
|
||||
+
|
||||
/* Define if you want all operations on RTL (the basic data structure of the
|
||||
optimizer and back end) to be checked for dynamic type safety at runtime.
|
||||
This is quite expensive. */
|
||||
diff --git a/gcc/configure b/gcc/configure
|
||||
index c7b26d1927d..8c46369f73f 100755
|
||||
--- a/gcc/configure
|
||||
+++ b/gcc/configure
|
||||
@@ -1026,6 +1026,7 @@ enable_maintainer_mode
|
||||
enable_link_mutex
|
||||
enable_link_serialization
|
||||
enable_version_specific_runtime_libs
|
||||
+enable_poison_system_directories
|
||||
enable_plugin
|
||||
enable_host_shared
|
||||
enable_libquadmath_support
|
||||
@@ -1788,6 +1789,8 @@ Optional Features:
|
||||
--enable-version-specific-runtime-libs
|
||||
specify that runtime libraries should be installed
|
||||
in a compiler-specific directory
|
||||
+ --enable-poison-system-directories
|
||||
+ warn for use of native system header directories
|
||||
--enable-plugin enable plugin support
|
||||
--enable-host-shared build host code as shared libraries
|
||||
--disable-libquadmath-support
|
||||
@@ -31753,6 +31756,19 @@ if test "${enable_version_specific_runtime_libs+set}" = set; then :
|
||||
fi
|
||||
|
||||
|
||||
+# Check whether --enable-poison-system-directories was given.
|
||||
+if test "${enable_poison_system_directories+set}" = set; then :
|
||||
+ enableval=$enable_poison_system_directories;
|
||||
+else
|
||||
+ enable_poison_system_directories=no
|
||||
+fi
|
||||
+
|
||||
+if test "x${enable_poison_system_directories}" = "xyes"; then
|
||||
+
|
||||
+$as_echo "#define ENABLE_POISON_SYSTEM_DIRECTORIES 1" >>confdefs.h
|
||||
+
|
||||
+fi
|
||||
+
|
||||
# Substitute configuration variables
|
||||
|
||||
|
||||
diff --git a/gcc/configure.ac b/gcc/configure.ac
|
||||
index 09082e8ccae..5504bf6eb01 100644
|
||||
--- a/gcc/configure.ac
|
||||
+++ b/gcc/configure.ac
|
||||
@@ -7292,6 +7292,16 @@ AC_ARG_ENABLE(version-specific-runtime-libs,
|
||||
[specify that runtime libraries should be
|
||||
installed in a compiler-specific directory])])
|
||||
|
||||
+AC_ARG_ENABLE([poison-system-directories],
|
||||
+ AS_HELP_STRING([--enable-poison-system-directories],
|
||||
+ [warn for use of native system header directories]),,
|
||||
+ [enable_poison_system_directories=no])
|
||||
+if test "x${enable_poison_system_directories}" = "xyes"; then
|
||||
+ AC_DEFINE([ENABLE_POISON_SYSTEM_DIRECTORIES],
|
||||
+ [1],
|
||||
+ [Define to warn for use of native system header directories])
|
||||
+fi
|
||||
+
|
||||
# Substitute configuration variables
|
||||
AC_SUBST(subdirs)
|
||||
AC_SUBST(srcdir)
|
||||
diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi
|
||||
index b61ecfc1bc8..b290908679e 100644
|
||||
--- a/gcc/doc/invoke.texi
|
||||
+++ b/gcc/doc/invoke.texi
|
||||
@@ -384,6 +384,7 @@ Objective-C and Objective-C++ Dialects}.
|
||||
-Wpacked -Wno-packed-bitfield-compat -Wpacked-not-aligned -Wpadded
|
||||
-Wparentheses -Wno-pedantic-ms-format
|
||||
-Wpointer-arith -Wno-pointer-compare -Wno-pointer-to-int-cast
|
||||
+-Wno-poison-system-directories
|
||||
-Wno-pragmas -Wno-prio-ctor-dtor -Wredundant-decls
|
||||
-Wrestrict -Wno-return-local-addr -Wreturn-type
|
||||
-Wno-scalar-storage-order -Wsequence-point
|
||||
@@ -8424,6 +8425,14 @@ made up of data only and thus requires no special treatment. But, for
|
||||
most targets, it is made up of code and thus requires the stack to be
|
||||
made executable in order for the program to work properly.
|
||||
|
||||
+@opindex Wno-poison-system-directories
|
||||
+@item -Wno-poison-system-directories
|
||||
+Do not warn for @option{-I} or @option{-L} options using system
|
||||
+directories such as @file{/usr/include} when cross compiling. This
|
||||
+option is intended for use in chroot environments when such
|
||||
+directories contain the correct headers and libraries for the target
|
||||
+system rather than the host.
|
||||
+
|
||||
@opindex Wfloat-equal
|
||||
@opindex Wno-float-equal
|
||||
@item -Wfloat-equal
|
||||
diff --git a/gcc/gcc.cc b/gcc/gcc.cc
|
||||
index 16bb07f2cdc..33b56e721d2 100644
|
||||
--- a/gcc/gcc.cc
|
||||
+++ b/gcc/gcc.cc
|
||||
@@ -1146,6 +1146,8 @@ proper position among the other output files. */
|
||||
"%{fuse-ld=*:-fuse-ld=%*} " LINK_COMPRESS_DEBUG_SPEC \
|
||||
"%X %{o*} %{e*} %{N} %{n} %{r}\
|
||||
%{s} %{t} %{u*} %{z} %{Z} %{!nostdlib:%{!r:%{!nostartfiles:%S}}} \
|
||||
+ %{Wno-poison-system-directories:--no-poison-system-directories} \
|
||||
+ %{Werror=poison-system-directories:--error-poison-system-directories} \
|
||||
%{static|no-pie|static-pie:} %@{L*} %(mfwrap) %(link_libgcc) " \
|
||||
VTABLE_VERIFICATION_SPEC " " SANITIZER_EARLY_SPEC " %o "" \
|
||||
%{fopenacc|fopenmp|%:gt(%{ftree-parallelize-loops=*:%*} 1):\
|
||||
diff --git a/gcc/incpath.cc b/gcc/incpath.cc
|
||||
index 4d44321183f..0f3f071b44c 100644
|
||||
--- a/gcc/incpath.cc
|
||||
+++ b/gcc/incpath.cc
|
||||
@@ -26,6 +26,7 @@
|
||||
#include "intl.h"
|
||||
#include "incpath.h"
|
||||
#include "cppdefault.h"
|
||||
+#include "diagnostic-core.h"
|
||||
|
||||
/* Microsoft Windows does not natively support inodes.
|
||||
VMS has non-numeric inodes. */
|
||||
@@ -399,6 +400,26 @@ merge_include_chains (const char *sysroot, cpp_reader *pfile, int verbose)
|
||||
}
|
||||
fprintf (stderr, _("End of search list.\n"));
|
||||
}
|
||||
+
|
||||
+#ifdef ENABLE_POISON_SYSTEM_DIRECTORIES
|
||||
+ if (flag_poison_system_directories)
|
||||
+ {
|
||||
+ struct cpp_dir *p;
|
||||
+
|
||||
+ for (p = heads[INC_QUOTE]; p; p = p->next)
|
||||
+ {
|
||||
+ if ((!strncmp (p->name, "/usr/include", 12))
|
||||
+ || (!strncmp (p->name, "/usr/local/include", 18))
|
||||
+ || (!strncmp (p->name, "/usr/X11R6/include", 18))
|
||||
+ || (!strncmp (p->name, "/sw/include", 11))
|
||||
+ || (!strncmp (p->name, "/opt/include", 12)))
|
||||
+ warning (OPT_Wpoison_system_directories,
|
||||
+ "include location \"%s\" is unsafe for "
|
||||
+ "cross-compilation",
|
||||
+ p->name);
|
||||
+ }
|
||||
+ }
|
||||
+#endif
|
||||
}
|
||||
|
||||
/* Use given -I paths for #include "..." but not #include <...>, and
|
||||
--
|
||||
2.41.0
|
||||
|
||||
@@ -0,0 +1,42 @@
|
||||
From 65eb86f3e110998d30489df009d44b4bc1043adc Mon Sep 17 00:00:00 2001
|
||||
From: Szabolcs Nagy <nsz@port70.net>
|
||||
Date: Fri, 26 Jan 2018 20:32:50 +0000
|
||||
Subject: [PATCH 02/12] posix_memalign
|
||||
|
||||
---
|
||||
gcc/config/i386/pmm_malloc.h | 9 +++++----
|
||||
1 file changed, 5 insertions(+), 4 deletions(-)
|
||||
|
||||
diff --git a/gcc/config/i386/pmm_malloc.h b/gcc/config/i386/pmm_malloc.h
|
||||
index ffbb7f82cf5..b0b890d2403 100644
|
||||
--- a/gcc/config/i386/pmm_malloc.h
|
||||
+++ b/gcc/config/i386/pmm_malloc.h
|
||||
@@ -27,12 +27,13 @@
|
||||
#include <stdlib.h>
|
||||
|
||||
/* We can't depend on <stdlib.h> since the prototype of posix_memalign
|
||||
- may not be visible. */
|
||||
+ may not be visible and we can't pollute the namespace either. */
|
||||
#ifndef __cplusplus
|
||||
-extern int posix_memalign (void **, size_t, size_t);
|
||||
+extern int _mm_posix_memalign (void **, size_t, size_t)
|
||||
#else
|
||||
-extern "C" int posix_memalign (void **, size_t, size_t) throw ();
|
||||
+extern "C" int _mm_posix_memalign (void **, size_t, size_t) throw ()
|
||||
#endif
|
||||
+__asm__("posix_memalign");
|
||||
|
||||
static __inline void *
|
||||
_mm_malloc (size_t __size, size_t __alignment)
|
||||
@@ -42,7 +43,7 @@ _mm_malloc (size_t __size, size_t __alignment)
|
||||
return malloc (__size);
|
||||
if (__alignment == 2 || (sizeof (void *) == 8 && __alignment == 4))
|
||||
__alignment = sizeof (void *);
|
||||
- if (posix_memalign (&__ptr, __alignment, __size) == 0)
|
||||
+ if (_mm_posix_memalign (&__ptr, __alignment, __size) == 0)
|
||||
return __ptr;
|
||||
else
|
||||
return NULL;
|
||||
--
|
||||
2.17.1
|
||||
|
||||
@@ -0,0 +1,194 @@
|
||||
From 48c670d2678e0323d88eb72205e039f393cabe05 Mon Sep 17 00:00:00 2001
|
||||
From: Khem Raj <raj.khem@gmail.com>
|
||||
Date: Fri, 29 Mar 2013 08:59:00 +0400
|
||||
Subject: [PATCH 03/39] gcc: poison-system-directories
|
||||
|
||||
Signed-off-by: Khem Raj <raj.khem@gmail.com>
|
||||
|
||||
Upstream-Status: Inappropriate [distribution: codesourcery]
|
||||
---
|
||||
gcc/common.opt | 4 ++++
|
||||
gcc/config.in | 6 ++++++
|
||||
gcc/configure | 16 ++++++++++++++++
|
||||
gcc/configure.ac | 10 ++++++++++
|
||||
gcc/doc/invoke.texi | 9 +++++++++
|
||||
gcc/gcc.c | 2 ++
|
||||
gcc/incpath.c | 19 +++++++++++++++++++
|
||||
7 files changed, 66 insertions(+)
|
||||
|
||||
diff --git a/gcc/common.opt b/gcc/common.opt
|
||||
index d6ef85928f3..7b29efe3882 100644
|
||||
--- a/gcc/common.opt
|
||||
+++ b/gcc/common.opt
|
||||
@@ -679,6 +679,10 @@ Wreturn-local-addr
|
||||
Common Var(warn_return_local_addr) Init(1) Warning
|
||||
Warn about returning a pointer/reference to a local or temporary variable.
|
||||
|
||||
+Wpoison-system-directories
|
||||
+Common Var(flag_poison_system_directories) Init(1) Warning
|
||||
+Warn for -I and -L options using system directories if cross compiling
|
||||
+
|
||||
Wshadow
|
||||
Common Var(warn_shadow) Warning
|
||||
Warn when one variable shadows another. Same as -Wshadow=global.
|
||||
diff --git a/gcc/config.in b/gcc/config.in
|
||||
index 5bccb408016..1c784a8276b 100644
|
||||
--- a/gcc/config.in
|
||||
+++ b/gcc/config.in
|
||||
@@ -194,6 +194,12 @@
|
||||
#endif
|
||||
|
||||
|
||||
+/* Define to warn for use of native system header directories */
|
||||
+#ifndef USED_FOR_TARGET
|
||||
+#undef ENABLE_POISON_SYSTEM_DIRECTORIES
|
||||
+#endif
|
||||
+
|
||||
+
|
||||
/* Define if you want all operations on RTL (the basic data structure of the
|
||||
optimizer and back end) to be checked for dynamic type safety at runtime.
|
||||
This is quite expensive. */
|
||||
diff --git a/gcc/configure b/gcc/configure
|
||||
index 5c345ce0fd7..cafd05fd150 100755
|
||||
--- a/gcc/configure
|
||||
+++ b/gcc/configure
|
||||
@@ -953,6 +953,7 @@ with_system_zlib
|
||||
enable_maintainer_mode
|
||||
enable_link_mutex
|
||||
enable_version_specific_runtime_libs
|
||||
+enable_poison_system_directories
|
||||
enable_plugin
|
||||
enable_host_shared
|
||||
enable_libquadmath_support
|
||||
@@ -1696,6 +1697,8 @@ Optional Features:
|
||||
--enable-version-specific-runtime-libs
|
||||
specify that runtime libraries should be installed
|
||||
in a compiler-specific directory
|
||||
+ --enable-poison-system-directories
|
||||
+ warn for use of native system header directories
|
||||
--enable-plugin enable plugin support
|
||||
--enable-host-shared build host code as shared libraries
|
||||
--disable-libquadmath-support
|
||||
@@ -29715,6 +29718,19 @@ if test "${enable_version_specific_runtime_libs+set}" = set; then :
|
||||
fi
|
||||
|
||||
|
||||
+# Check whether --enable-poison-system-directories was given.
|
||||
+if test "${enable_poison_system_directories+set}" = set; then :
|
||||
+ enableval=$enable_poison_system_directories;
|
||||
+else
|
||||
+ enable_poison_system_directories=no
|
||||
+fi
|
||||
+
|
||||
+if test "x${enable_poison_system_directories}" = "xyes"; then
|
||||
+
|
||||
+$as_echo "#define ENABLE_POISON_SYSTEM_DIRECTORIES 1" >>confdefs.h
|
||||
+
|
||||
+fi
|
||||
+
|
||||
# Substitute configuration variables
|
||||
|
||||
|
||||
diff --git a/gcc/configure.ac b/gcc/configure.ac
|
||||
index 65dbf1f2f80..dd5b38195ce 100644
|
||||
--- a/gcc/configure.ac
|
||||
+++ b/gcc/configure.ac
|
||||
@@ -6341,6 +6341,16 @@ AC_ARG_ENABLE(version-specific-runtime-libs,
|
||||
[specify that runtime libraries should be
|
||||
installed in a compiler-specific directory])])
|
||||
|
||||
+AC_ARG_ENABLE([poison-system-directories],
|
||||
+ AS_HELP_STRING([--enable-poison-system-directories],
|
||||
+ [warn for use of native system header directories]),,
|
||||
+ [enable_poison_system_directories=no])
|
||||
+if test "x${enable_poison_system_directories}" = "xyes"; then
|
||||
+ AC_DEFINE([ENABLE_POISON_SYSTEM_DIRECTORIES],
|
||||
+ [1],
|
||||
+ [Define to warn for use of native system header directories])
|
||||
+fi
|
||||
+
|
||||
# Substitute configuration variables
|
||||
AC_SUBST(subdirs)
|
||||
AC_SUBST(srcdir)
|
||||
diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi
|
||||
index 255149fcfb8..cb71b60fe3c 100644
|
||||
--- a/gcc/doc/invoke.texi
|
||||
+++ b/gcc/doc/invoke.texi
|
||||
@@ -303,6 +303,7 @@ Objective-C and Objective-C++ Dialects}.
|
||||
-Wpacked -Wpacked-bitfield-compat -Wpacked-not-aligned -Wpadded @gol
|
||||
-Wparentheses -Wno-pedantic-ms-format @gol
|
||||
-Wplacement-new -Wplacement-new=@var{n} @gol
|
||||
+-Wno-poison-system-directories @gol
|
||||
-Wpointer-arith -Wpointer-compare -Wno-pointer-to-int-cast @gol
|
||||
-Wno-pragmas -Wredundant-decls -Wrestrict -Wno-return-local-addr @gol
|
||||
-Wreturn-type -Wsequence-point -Wshadow -Wno-shadow-ivar @gol
|
||||
@@ -5712,6 +5713,14 @@ made up of data only and thus requires no special treatment. But, for
|
||||
most targets, it is made up of code and thus requires the stack to be
|
||||
made executable in order for the program to work properly.
|
||||
|
||||
+@item -Wno-poison-system-directories
|
||||
+@opindex Wno-poison-system-directories
|
||||
+Do not warn for @option{-I} or @option{-L} options using system
|
||||
+directories such as @file{/usr/include} when cross compiling. This
|
||||
+option is intended for use in chroot environments when such
|
||||
+directories contain the correct headers and libraries for the target
|
||||
+system rather than the host.
|
||||
+
|
||||
@item -Wfloat-equal
|
||||
@opindex Wfloat-equal
|
||||
@opindex Wno-float-equal
|
||||
diff --git a/gcc/gcc.c b/gcc/gcc.c
|
||||
index a716f708259..02b3cd39fc2 100644
|
||||
--- a/gcc/gcc.c
|
||||
+++ b/gcc/gcc.c
|
||||
@@ -1061,6 +1060,8 @@
|
||||
"-z relro -z now " \
|
||||
"%X %{o*} %{e*} %{N} %{n} %{r}\
|
||||
%{s} %{t} %{u*} %{z} %{Z} %{!nostdlib:%{!r:%{!nostartfiles:%S}}} \
|
||||
+ %{Wno-poison-system-directories:--no-poison-system-directories} \
|
||||
+ %{Werror=poison-system-directories:--error-poison-system-directories} \
|
||||
%{static|no-pie|static-pie:} %@{L*} %(mfwrap) %(link_libgcc) " \
|
||||
VTABLE_VERIFICATION_SPEC " " SANITIZER_EARLY_SPEC " %o "" \
|
||||
%{fopenacc|fopenmp|%:gt(%{ftree-parallelize-loops=*:%*} 1):\
|
||||
diff --git a/gcc/incpath.c b/gcc/incpath.c
|
||||
index b11c6a57939..e3b7a21966f 100644
|
||||
--- a/gcc/incpath.c
|
||||
+++ b/gcc/incpath.c
|
||||
@@ -26,6 +26,7 @@
|
||||
#include "intl.h"
|
||||
#include "incpath.h"
|
||||
#include "cppdefault.h"
|
||||
+#include "diagnostic-core.h"
|
||||
|
||||
/* Microsoft Windows does not natively support inodes.
|
||||
VMS has non-numeric inodes. */
|
||||
@@ -393,6 +394,26 @@ merge_include_chains (const char *sysroot, cpp_reader *pfile, int verbose)
|
||||
}
|
||||
fprintf (stderr, _("End of search list.\n"));
|
||||
}
|
||||
+
|
||||
+#ifdef ENABLE_POISON_SYSTEM_DIRECTORIES
|
||||
+ if (flag_poison_system_directories)
|
||||
+ {
|
||||
+ struct cpp_dir *p;
|
||||
+
|
||||
+ for (p = heads[INC_QUOTE]; p; p = p->next)
|
||||
+ {
|
||||
+ if ((!strncmp (p->name, "/usr/include", 12))
|
||||
+ || (!strncmp (p->name, "/usr/local/include", 18))
|
||||
+ || (!strncmp (p->name, "/usr/X11R6/include", 18))
|
||||
+ || (!strncmp (p->name, "/sw/include", 11))
|
||||
+ || (!strncmp (p->name, "/opt/include", 12)))
|
||||
+ warning (OPT_Wpoison_system_directories,
|
||||
+ "include location \"%s\" is unsafe for "
|
||||
+ "cross-compilation",
|
||||
+ p->name);
|
||||
+ }
|
||||
+ }
|
||||
+#endif
|
||||
}
|
||||
|
||||
/* Use given -I paths for #include "..." but not #include <...>, and
|
||||
--
|
||||
2.17.0
|
||||
|
||||
Loaded 100 of 5054 files, more files were not shown because too many files have changed in this diff.
Show more
Reference in new issue
Block a user