Compare commits

...

6 commits

Author SHA1 Message Date
Stephen Seo eb8fa7805a Update README.md
Note about not having ccache/sccache preinstalled in chroot.
2024-04-08 12:17:42 +09:00
Stephen Seo 71cf85f1cd Add notice when dependency prefetch is successful 2024-04-08 12:11:31 +09:00
Stephen Seo 3cc1a0b583 Fix prefetch_dependencies fn
Fixed invalid log of packages to prefetch (tried to read invalid
variable name that changed from "pkg" to "pkgs").
2024-04-08 12:00:08 +09:00
Stephen Seo 99f3d915c6 Fixes
Change "prefetch_dependency" to "prefetch_dependnecies" and fetch all
"other_deps" at the same time.

Fix some erronous type hints.
2024-04-08 11:57:09 +09:00
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 74 additions and 2 deletions

View file

@ -63,6 +63,24 @@ 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.
## Preloading ccache/sccache
This script expects ccache and sccache not to be installed in the chroot (for
reasons as mentioned in the previous section) and ccache or sccache will be
appended to a pkg's "other_deps" if a ccache or sccache directory is configured
for it.
# Setting up the AUR Helper # Setting up the AUR Helper
The AUR Helper requires several things: The AUR Helper requires several things:
@ -86,7 +104,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

@ -741,6 +741,18 @@ def get_pkgbuild_version(
5, 5,
f'{os.environ["HOME"]}/.cargo/git:/build/.cargo/git', f'{os.environ["HOME"]}/.cargo/git:/build/.cargo/git',
) )
if len(pkg_state[pkg]["other_deps"]) != 0:
prefetch_result = prefetch_dependencies(
pkg_state[pkg]["other_deps"], other_state
)
if prefetch_result != "fetched":
log_print(
"ERROR: Failed to prefetch deps {}".format(
pkg_state[pkg]["other_deps"]
),
other_state=other_state,
)
return False, None, None, None
for dep in pkg_state[pkg]["other_deps"]: for dep in pkg_state[pkg]["other_deps"]:
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:
@ -1374,6 +1386,28 @@ 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")
if len(pkg_state[pkg]["other_deps"]) != 0:
prefetch_result = prefetch_dependencies(
pkg_state[pkg]["other_deps"], other_state
)
if prefetch_result != "fetched":
log_print(
"ERROR: Failed to prefetch deps {}".format(
pkg_state[pkg]["other_deps"]
),
other_state=other_state,
)
failure = True
pkg_state[pkg]["build_status"] = "get_dep_fail"
break
log_print(
"Successfully prefetched deps, continuing on to build...",
other_state=other_state,
)
for dep in pkg_state[pkg]["other_deps"]: for dep in pkg_state[pkg]["other_deps"]:
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:
@ -1987,7 +2021,7 @@ fi
return "ok" return "ok"
def prepare_user_chroot(other_state: [str, Any]): def prepare_user_chroot(other_state: dict[str, Any]):
try: try:
log_print( log_print(
'Running "makechrootpkg ... --nobuild" with dummy package to ensure user chroot is ready...', 'Running "makechrootpkg ... --nobuild" with dummy package to ensure user chroot is ready...',
@ -2030,6 +2064,24 @@ def prepare_user_chroot(other_state: [str, Any]):
return True return True
def prefetch_dependencies(pkg_names: [str], other_state: dict[str, Any]):
"""Returns "fetched" on success."""
log_print(
f'Prefetching packages "{pkg_names}" with "pacman -Sw"...',
other_state=other_state,
)
command_list = ["/usr/bin/env", "sudo", "pacman", "--noconfirm", "-Sw"]
command_list.extend(pkg_names)
try:
subprocess.run(
command_list,
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)