Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Support linux_gcc_arm64 arch in 6.7.0 via new linux_arm64 host #766

Merged
merged 6 commits into from
Apr 10, 2024
Merged
Show file tree
Hide file tree
Changes from 3 commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/workflows/check.yml
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ jobs:
- uses: actions/checkout@v3
with:
fetch-depth: 20
- run: git fetch --depth=1 origin +refs/tags/*:refs/tags/*
fetch-tags: true
- name: Set up Python 3.9
uses: actions/setup-python@v4
with:
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/test-install-qt.yml
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ jobs:
- uses: actions/checkout@v3
with:
fetch-depth: 20
- run: git fetch --depth=1 origin +refs/tags/*:refs/tags/*
fetch-tags: true
- name: Set up Python
uses: actions/setup-python@v4
with:
Expand Down
4 changes: 2 additions & 2 deletions aqt/archives.py
Original file line number Diff line number Diff line change
Expand Up @@ -367,7 +367,7 @@ def _get_archives(self):
def _append_depends_tool(self, arch, tool_name):
os_target_folder = posixpath.join(
"online/qtsdkrepository",
self.os_name + ("_x86" if self.os_name == "windows" else "_x64"),
self.os_name + ("_x86" if self.os_name == "windows" else ("" if self.os_name == "linux_arm64" else "_x64")),
self.target,
tool_name,
)
Expand All @@ -379,7 +379,7 @@ def _append_depends_tool(self, arch, tool_name):
def _get_archives_base(self, name, target_packages):
os_target_folder = posixpath.join(
"online/qtsdkrepository",
self.os_name + ("_x86" if self.os_name == "windows" else "_x64"),
self.os_name + ("_x86" if self.os_name == "windows" else ("" if self.os_name == "linux_arm64" else "_x64")),
self.target,
# tools_ifw/
name,
Expand Down
7 changes: 6 additions & 1 deletion aqt/combinations.json
Original file line number Diff line number Diff line change
Expand Up @@ -434,6 +434,11 @@
"os_name": "linux",
"target": "desktop"
},
{
"arch": "linux_gcc_arm64",
"os_name": "linux_arm64",
"target": "desktop"
},
{
"arch": "wasm_32",
"os_name": "linux",
Expand Down Expand Up @@ -1296,4 +1301,4 @@
"6.7.0"
]
}
]
]
20 changes: 14 additions & 6 deletions aqt/installer.py
Original file line number Diff line number Diff line change
Expand Up @@ -261,7 +261,15 @@ def _set_arch(arch: Optional[str], os_name: str, target: str, qt_version_or_spec
if arch is not None and arch != "":
return arch
if os_name == "linux" and target == "desktop":
return "gcc_64"
try:
if Version(qt_version_or_spec) >= Version("6.7.0"):
return "linux_gcc_64"
else:
return "gcc_64"
except ValueError:
return "gcc_64"
elif os_name == "linux_arm64" and target == "desktop":
return "linux_gcc_arm64"
elif os_name == "mac" and target == "desktop":
return "clang_64"
elif os_name == "mac" and target == "ios":
Expand Down Expand Up @@ -730,7 +738,7 @@ def _set_install_qt_parser(self, install_qt_parser, *, is_legacy: bool):

def _set_install_tool_parser(self, install_tool_parser, *, is_legacy: bool):
install_tool_parser.set_defaults(func=self.run_install_tool, is_legacy=is_legacy)
install_tool_parser.add_argument("host", choices=["linux", "mac", "windows"], help="host os name")
install_tool_parser.add_argument("host", choices=["linux", "linux_arm64", "mac", "windows"], help="host os name")
if not is_legacy:
install_tool_parser.add_argument(
"target",
Expand Down Expand Up @@ -787,7 +795,7 @@ def make_parser_sde(cmd: str, desc: str, is_legacy: bool, action, is_add_kde: bo

def make_parser_list_sde(cmd: str, desc: str, cmd_type: str):
parser = subparsers.add_parser(cmd, description=desc)
parser.add_argument("host", choices=["linux", "mac", "windows"], help="host os name")
parser.add_argument("host", choices=["linux", "linux_arm64", "mac", "windows"], help="host os name")
parser.add_argument(
"qt_version_spec",
metavar="(VERSION | SPECIFICATION)",
Expand Down Expand Up @@ -835,7 +843,7 @@ def _make_list_qt_parser(self, subparsers: argparse._SubParsersAction):
"$ aqt list-qt mac desktop --archives 5.9.0 clang_64 # list archives in base Qt installation\n"
"$ aqt list-qt mac desktop --archives 5.14.0 clang_64 debug_info # list archives in debug_info module\n",
)
list_parser.add_argument("host", choices=["linux", "mac", "windows"], help="host os name")
list_parser.add_argument("host", choices=["linux", "linux_arm64", "mac", "windows"], help="host os name")
list_parser.add_argument(
"target",
nargs="?",
Expand Down Expand Up @@ -919,7 +927,7 @@ def _make_list_tool_parser(self, subparsers: argparse._SubParsersAction):
"$ aqt list-tool mac desktop tools_ifw --long # print tool variant names with metadata for QtIFW\n"
"$ aqt list-tool mac desktop ifw --long # print tool variant names with metadata for QtIFW\n",
)
list_parser.add_argument("host", choices=["linux", "mac", "windows"], help="host os name")
list_parser.add_argument("host", choices=["linux", "linux_arm64", "mac", "windows"], help="host os name")
list_parser.add_argument(
"target",
nargs="?",
Expand Down Expand Up @@ -1006,7 +1014,7 @@ def _set_common_arguments(self, subparser, *, is_legacy: bool, is_target_depreca
"""
if is_legacy:
subparser.add_argument("qt_version", help='Qt version in the format of "5.X.Y"')
subparser.add_argument("host", choices=["linux", "mac", "windows"], help="host os name")
subparser.add_argument("host", choices=["linux", "linux_arm64", "mac", "windows"], help="host os name")
if is_target_deprecated:
subparser.add_argument(
"target",
Expand Down
27 changes: 20 additions & 7 deletions aqt/metadata.py
Original file line number Diff line number Diff line change
Expand Up @@ -199,11 +199,12 @@ def get_semantic_version(qt_ver: str, is_preview: bool) -> Optional[Version]:

class ArchiveId:
CATEGORIES = ("tools", "qt")
HOSTS = ("windows", "mac", "linux")
HOSTS = ("windows", "mac", "linux", "linux_arm64")
TARGETS_FOR_HOST = {
"windows": ["android", "desktop", "winrt"],
"mac": ["android", "desktop", "ios"],
"linux": ["android", "desktop"],
"linux_arm64": ["desktop"],
}
EXTENSIONS_REQUIRED_ANDROID_QT6 = {"x86_64", "x86", "armv7", "arm64_v8a"}
ALL_EXTENSIONS = {"", "wasm", "src_doc_examples", *EXTENSIONS_REQUIRED_ANDROID_QT6}
Expand Down Expand Up @@ -231,7 +232,7 @@ def is_tools(self) -> bool:
def to_url(self) -> str:
return "online/qtsdkrepository/{os}{arch}/{target}/".format(
os=self.host,
arch="_x86" if self.host == "windows" else "_x64",
arch=("_x86" if self.host == "windows" else ("" if self.host == "linux_arm64" else "_x64")),
target=self.target,
)

Expand Down Expand Up @@ -384,12 +385,16 @@ def get_arch_dir_name(host: str, arch: str, version: Version) -> str:
return arch[6:]
elif host == "mac" and arch == "clang_64":
return QtRepoProperty.default_mac_desktop_arch_dir(version)
elif host == "linux" and arch in ("gcc_64", "linux_gcc_64"):
return "gcc_64"
elif host == "linux_arm64" and arch == "linux_gcc_arm64":
return "gcc_arm64"
else:
return arch

@staticmethod
def default_linux_desktop_arch_dir() -> str:
return "gcc_64"
def default_linux_desktop_arch_dir() -> tuple[str, str]:
return ("gcc_64", "gcc_arm64")

@staticmethod
def default_win_msvc_desktop_arch_dir(_version: Version) -> str:
Expand Down Expand Up @@ -476,8 +481,11 @@ def find_installed_desktop_qt_dir(host: str, base_path: Path, version: Version,
arch_path = installed_qt_version_dir / QtRepoProperty.default_mac_desktop_arch_dir(version)
return arch_path if (arch_path / "bin/qmake").is_file() else None
elif host == "linux":
arch_path = installed_qt_version_dir / QtRepoProperty.default_linux_desktop_arch_dir()
return arch_path if (arch_path / "bin/qmake").is_file() else None
for arch_dir in QtRepoProperty.default_linux_desktop_arch_dir():
arch_path = installed_qt_version_dir / arch_dir
if (arch_path / "bin/qmake").is_file():
return arch_path
return None
elif host == "windows" and is_msvc:
arch_path = installed_qt_version_dir / QtRepoProperty.default_win_msvc_desktop_arch_dir(version)
return arch_path if (arch_path / "bin/qmake.exe").is_file() else None
Expand Down Expand Up @@ -928,7 +936,12 @@ def describe_filters(self) -> str:
def fetch_default_desktop_arch(self, version: Version, is_msvc: bool = False) -> str:
assert self.archive_id.target == "desktop", "This function is meant to fetch desktop architectures"
if self.archive_id.host == "linux":
return "gcc_64"
if version >= Version("6.7.0"):
return "linux_gcc_64"
else:
return "gcc_64"
elif self.archive_id.host == "linux_arm64":
return "linux_gcc_arm64"
elif self.archive_id.host == "mac":
return "clang_64"
elif self.archive_id.host == "windows" and is_msvc:
Expand Down
12 changes: 12 additions & 0 deletions azure-pipelines.yml
Original file line number Diff line number Diff line change
Expand Up @@ -53,3 +53,15 @@ jobs:
matrix: $[ dependencies.MatricesGenerator.outputs['mtrx.linux'] ]
steps:
- template: ci/steps.yml

- job: Linux ARM64
dependsOn: MatricesGenerator
pool:
vmImage: 'ubuntu-22.04'
container:
image: ubuntu:22.04
options: --platform linux/arm64
strategy:
matrix: $[ dependencies.MatricesGenerator.outputs['mtrx.linux_arm64'] ]
steps:
- template: ci/steps.yml
62 changes: 36 additions & 26 deletions ci/generate_azure_pipelines_matrices.py
Original file line number Diff line number Diff line change
Expand Up @@ -92,11 +92,13 @@ def __init__(self, platform, build_jobs):
qt_versions = ["5.12.12", "5.15.14", "6.5.3"]

linux_build_jobs = []
linux_arm64_build_jobs = []
mac_build_jobs = []
windows_build_jobs = []

all_platform_build_jobs = [
PlatformBuildJobs("linux", linux_build_jobs),
PlatformBuildJobs("linux_arm64", linux_arm64_build_jobs),
miurahr marked this conversation as resolved.
Show resolved Hide resolved
PlatformBuildJobs("mac", mac_build_jobs),
PlatformBuildJobs("windows", windows_build_jobs),
]
Expand All @@ -106,6 +108,7 @@ def __init__(self, platform, build_jobs):
linux_build_jobs.append(
BuildJob("install-qt", qt_version, "linux", "desktop", "gcc_64", "gcc_64")
)
linux_arm64_build_jobs.append(BuildJob("install-qt", "6.7.0", "linux_arm64", "desktop", "linux_gcc_arm64", "gcc_arm64"))

# Mac Desktop
for qt_version in qt_versions:
Expand Down Expand Up @@ -368,32 +371,36 @@ def __init__(self, platform, build_jobs):
)

# Test binary patch of qmake
linux_build_jobs.extend(
[
# New output dir is shorter than the default value; qmake could fail to
# locate prefix dir if the value is patched wrong
BuildJob(
"install-qt",
"5.12.11",
"linux",
"desktop",
"gcc_64",
"gcc_64",
output_dir="/t/Q",
),
# New output dir is longer than the default value.
# This case is meant to work without any bugfix; if this fails, the test is setup wrong
BuildJob(
"install-qt",
"5.12.11",
"linux",
"desktop",
"gcc_64",
"gcc_64",
output_dir="/some/super/long/arbitrary/path/to" * 5,
),
]
)
for lst, os_name, version, arch, arch_dir in (
(linux_build_jobs, "linux", "5.12.11", "gcc_64", "gcc_64"),
(linux_arm64_build_jobs, "linux_arm64", "6.7.0", "linux_gcc_arm64", "gcc_arm64"),
rectalogic marked this conversation as resolved.
Show resolved Hide resolved
):
lst.extend(
[
# New output dir is shorter than the default value; qmake could fail to
# locate prefix dir if the value is patched wrong
BuildJob(
"install-qt",
version,
os_name,
"desktop",
arch,
arch_dir,
output_dir="/t/Q",
),
# New output dir is longer than the default value.
# This case is meant to work without any bugfix; if this fails, the test is setup wrong
BuildJob(
"install-qt",
version,
os_name,
"desktop",
arch,
arch_dir,
output_dir="/some/super/long/arbitrary/path/to" * 5,
),
]
)

qt_creator_bin_path = "./Tools/QtCreator/bin/"
qt_creator_mac_bin_path = "./Qt Creator.app/Contents/MacOS/"
Expand Down Expand Up @@ -480,6 +487,9 @@ def __init__(self, platform, build_jobs):
print(
f"##vso[task.setVariable variable=linux;isOutput=true]{json.dumps(matrices['linux'])}"
)
print(
f"##vso[task.setVariable variable=linux_arm64;isOutput=true]{json.dumps(matrices['linux_arm64'])}"
)
print(
f"##vso[task.setVariable variable=windows;isOutput=true]{json.dumps(matrices['windows'])}"
)
Expand Down
15 changes: 15 additions & 0 deletions tests/data/linux_arm64-desktop-expect.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
{
"qt": {
"qt": [
"6.7.0"
],
"preview": [
]
},
"tools": [
"tools_maintenance",
"tools_ifw",
"tools_cmake",
"sdktool"
]
}
20 changes: 20 additions & 0 deletions tests/data/linux_arm64-desktop.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Index of /online/qtsdkrepository/linux_arm64/desktop</title>
<meta name="viewport" content="width=device-width, initial-scale=1"><link rel="stylesheet" type="text/css" href="/static/normalize.css"><link rel="stylesheet" type="text/css" href="/static/style.css"><link rel="stylesheet" href="/static/bootstrap.css" type="text/css"><link rel="stylesheet" href="/static/bootstrap-download-index.css" type="text/css"><script type="text/javascript" src="/static/jquery.js"></script> <script type="text/javascript" src="/static/javascript-index.js"></script> <script type="text/javascript" src="/static/javascript-mirrorlist.js"></script> </head>
<body>
<h1>Index of /online/qtsdkrepository/linux_arm64/desktop</h1>
<table><tr><th>&nbsp;</th><th><a href="?C=N;O=A">Name</a></th><th><a href="?C=M;O=A">Last modified</a></th><th><a href="?C=S;O=A">Size</a></th><th>Metadata</th></tr><tr><th colspan="5"><hr /></th></tr>
<tr><td valign="top">&nbsp;</td><td><a href="/online/qtsdkrepository/linux_arm64/">Parent Directory</a></td><td>&nbsp;</td><td align="right"> - </td><td>&nbsp;</td></tr>
<tr><td valign="top">&nbsp;</td><td><a href="tools_maintenance/">tools_maintenance/</a></td><td align="right">19-Feb-2024 12:34 </td><td align="right"> - </td><td>&nbsp;</td></tr>
<tr><td valign="top">&nbsp;</td><td><a href="tools_ifw/">tools_ifw/</a></td><td align="right">19-Feb-2024 12:10 </td><td align="right"> - </td><td>&nbsp;</td></tr>
<tr><td valign="top">&nbsp;</td><td><a href="tools_cmake/">tools_cmake/</a></td><td align="right">15-Feb-2024 11:39 </td><td align="right"> - </td><td>&nbsp;</td></tr>
<tr><td valign="top">&nbsp;</td><td><a href="sdktool/">sdktool/</a></td><td align="right">07-Feb-2024 14:36 </td><td align="right"> - </td><td>&nbsp;</td></tr>
<tr><td valign="top">&nbsp;</td><td><a href="qt6_dev/">qt6_dev/</a></td><td align="right">08-Feb-2024 09:30 </td><td align="right"> - </td><td>&nbsp;</td></tr>
<tr><td valign="top">&nbsp;</td><td><a href="qt6_670/">qt6_670/</a></td><td align="right">16-Feb-2024 07:43 </td><td align="right"> - </td><td>&nbsp;</td></tr>
<tr><th colspan="5"><hr /></th></tr>
</table>
<br/><address><a href="http://mirrorbrain.org/">MirrorBrain</a> powered by <a href="http://httpd.apache.org/">Apache</a></address>
</body></html>
29 changes: 27 additions & 2 deletions tests/test_install.py
Original file line number Diff line number Diff line change
Expand Up @@ -1464,6 +1464,25 @@ def mock_extractor_that_fails(*args, **kwargs):
r"INFO : Time elapsed: .* second"
),
),
(
"install-qt linux_arm64 desktop 6.7 linux_gcc_arm64".split(),
"linux_arm64",
"desktop",
"6.7.0",
"linux_gcc_arm64",
"gcc_arm64",
"https://www.alt.qt.mirror.com",
"linux_arm64/desktop/qt6_670/Updates.xml",
[plain_qtbase_archive("qt.qt6.670.linux_gcc_arm64", "linux_gcc_arm64", host="linux_arm64")],
re.compile(
r"^INFO : aqtinstall\(aqt\) v.* on Python 3.*\n"
r"INFO : Resolved spec '6\.7' to 6\.7\.0\n"
r"INFO : Downloading qtbase\.\.\.\n"
r"Finished installation of qtbase-linux_arm64-linux_gcc_arm64\.7z in .*\n"
r"INFO : Finished installation\n"
r"INFO : Time elapsed: .* second"
),
),
),
)
def test_installer_passes_base_to_metadatafactory(
Expand Down Expand Up @@ -1491,7 +1510,13 @@ def test_installer_passes_base_to_metadatafactory(

def mock_get_url(url: str, *args, **kwargs) -> str:
# If we are fetching an index.html file, get it from tests/data/
if url == f"{base_url}/online/qtsdkrepository/{host}_x{'86' if host == 'windows' else '64'}/{target}/":
if host == "linux_arm64":
repo_dir = "linux_arm64"
elif host == "windows":
repo_dir = "windows_x86"
else:
repo_dir = f"{host}_x64"
if url == f"{base_url}/online/qtsdkrepository/{repo_dir}/{target}/":
return (Path(__file__).parent / "data" / f"{host}-{target}.html").read_text("utf-8")

# Intercept and check the base url, but only if it's not a hash.
Expand All @@ -1517,4 +1542,4 @@ def mock_get_url(url: str, *args, **kwargs) -> str:
sys.stdout.write(out)
sys.stderr.write(err)

assert expect_out.match(err)
assert expect_out.match(err), err
1 change: 1 addition & 0 deletions tests/test_list.py
Original file line number Diff line number Diff line change
Expand Up @@ -128,6 +128,7 @@ def spec_regex():
("windows", "winrt", "windows-winrt.html", "windows-winrt-expect.json"),
("linux", "android", "linux-android.html", "linux-android-expect.json"),
("linux", "desktop", "linux-desktop.html", "linux-desktop-expect.json"),
("linux_arm64", "desktop", "linux_arm64-desktop.html", "linux_arm64-desktop-expect.json"),
("mac", "android", "mac-android.html", "mac-android-expect.json"),
("mac", "desktop", "mac-desktop.html", "mac-desktop-expect.json"),
("mac", "ios", "mac-ios.html", "mac-ios-expect.json"),
Expand Down
Loading