Compare commits

...

2 commits

Author SHA1 Message Date
Stephen Seo a040785bd6 Install s/ccache only when needed, note in README
It is better to not preinstall sccache/ccache in the chroot as mentioned
in the README.
2024-04-08 11:12:13 +09:00
Stephen Seo 0b91176586 Prefetch "other_deps" with "pacman -Sw" 2024-04-08 11:02:36 +09:00
2 changed files with 50 additions and 1 deletions

View file

@ -63,6 +63,17 @@ GiB somehow).
the build will fail if the limit is reached. If set to false, then the build the build will fail if the limit is reached. If set to false, then the build
will continue even if the limit is reached. will continue even if the limit is reached.
## Soft-lock if `sccache` is preinstalled in chroot
Apparently, some packages automatically use ccache/sccache if it is installed in
the chroot, and in some cases, causes a soft-lock during a build. It is
recommended to not have ccache/sccache preinstalled in the chroot and to just
let the aur-helper-script install it when necessary.
For example, when building `tenacity-git` with sccache preinstalled, the build
will hang after the final build step. Apparently, killing the running `sccache`
process stops the soft-lock in this case.
# Setting up the AUR Helper # Setting up the AUR Helper
The AUR Helper requires several things: The AUR Helper requires several things:
@ -86,7 +97,9 @@ The `python-toml` package is required for the Python script to run.
Use `/usr/bin/mkarchroot` to create your CHROOT in a directory. Use `/usr/bin/mkarchroot` to create your CHROOT in a directory.
mkarchroot $HOME/mychroot/root base base-devel ccache sccache cmake ninja mkarchroot $HOME/mychroot/root base base-devel cmake ninja
As noted earlier, it is better to NOT preinstall `ccache` and `sccache`.
You must refer to the CHROOT as `$HOME/mychroot` if you used the same name as in You must refer to the CHROOT as `$HOME/mychroot` if you used the same name as in
the previous example. the previous example.

View file

@ -742,6 +742,13 @@ def get_pkgbuild_version(
f'{os.environ["HOME"]}/.cargo/git:/build/.cargo/git', f'{os.environ["HOME"]}/.cargo/git:/build/.cargo/git',
) )
for dep in pkg_state[pkg]["other_deps"]: for dep in pkg_state[pkg]["other_deps"]:
prefetch_result = prefetch_dependency(dep, other_state)
if prefetch_result != "fetched":
log_print(
'ERROR: Failed to prefetch dep "{}"'.format(dep),
other_state=other_state,
)
return False, None, None, None
dep_fullpath = get_latest_pkg(dep, "/var/cache/pacman/pkg") dep_fullpath = get_latest_pkg(dep, "/var/cache/pacman/pkg")
if not dep_fullpath: if not dep_fullpath:
log_print( log_print(
@ -1374,7 +1381,20 @@ def update_pkg_list(
"--holdver", "--holdver",
] ]
failure = False failure = False
if "ccache_dir" in pkg_state[pkg]:
pkg_state[pkg]["other_deps"].append("ccache")
elif "sccache_dir" in pkg_state[pkg]:
pkg_state[pkg]["other_deps"].append("sccache")
for dep in pkg_state[pkg]["other_deps"]: for dep in pkg_state[pkg]["other_deps"]:
prefetch_result = prefetch_dependency(dep, other_state)
if prefetch_result != "fetched":
log_print(
'ERROR: Failed to prefetch dep "{}"'.format(dep),
other_state=other_state,
)
failure = True
pkg_state[pkg]["build_status"] = "get_dep_fail"
break
dep_fullpath = get_latest_pkg(dep, "/var/cache/pacman/pkg") dep_fullpath = get_latest_pkg(dep, "/var/cache/pacman/pkg")
if not dep_fullpath: if not dep_fullpath:
log_print( log_print(
@ -2030,6 +2050,22 @@ def prepare_user_chroot(other_state: [str, Any]):
return True return True
def prefetch_dependency(pkg_name, other_state: [str, Any]):
"""Returns "fetched" on success."""
log_print(
f'Prefetching package "{pkg_name}" with "pacman -Sw"...',
other_state=other_state,
)
try:
subprocess.run(
("/usr/bin/env", "sudo", "pacman", "--noconfirm", "-Sw", pkg_name),
check=True,
)
except subprocess.CalledProcessError:
return "fail"
return "fetched"
def main(): def main():
"""The main function.""" """The main function."""
signal.signal(signal.SIGINT, signal_handler) signal.signal(signal.SIGINT, signal_handler)