diff options
author | Alexey Sheplyakov <asheplyakov@altlinux.org> | 2021-07-19 14:07:48 +0400 |
---|---|---|
committer | Alexey Sheplyakov <asheplyakov@altlinux.org> | 2021-07-26 14:01:40 +0400 |
commit | 67269a1e771f4f64d8154ed791115b26e14e9cc8 (patch) | |
tree | dc8f8b59b3787a6f846de4fca96df562a93d16ec | |
parent | 1b045f371d9c4f6ba44e79185a6de81586b024ef (diff) | |
download | distcc-git-67269a1e771f4f64d8154ed791115b26e14e9cc8.tar.gz |
update-distcc-symlinks works on rpm-based distros out of the box now
On ARM64 rpm-based distros GCC bits are installed into
`/usr/lib64/gcc` and `/usr/libexec/gcc` directories. However
`update-distcc-symlinks` does not scan these directories.
As a result `update-distcc-symlinks` does NOT create symlinks to
* versioned GCC binaries (`gcc-8`, `gcc-10`, etc)
* fully qualified GCC binaries (`aarch64-linux-gnu-gcc-8`, etc)
With this patch `update-distcc-symlinks` correctly work on such
systems.
Closes: #435
-rwxr-xr-x | update-distcc-symlinks.py | 75 |
1 files changed, 39 insertions, 36 deletions
diff --git a/update-distcc-symlinks.py b/update-distcc-symlinks.py index 3344335..71a5188 100755 --- a/update-distcc-symlinks.py +++ b/update-distcc-symlinks.py @@ -7,8 +7,11 @@ import stat import re distcc_dir = "@prefix@/lib/distcc" -gcc_dir = "/usr/lib/gcc" -gcccross_dir = "/usr/lib/gcc-cross" +GCC_LIBEXEC_DIRS = ( + '/usr/lib/gcc', # Debian native GCC compilers + '/usr/lib/gcc-cross', # Debian GCC cross-compilers + '/usr/libexec/gcc', # rpm-based distros +) old_symlinks = set() new_symlinks = set() standard_names = ["cc", "c++", "c89", "c99"] @@ -18,53 +21,56 @@ if not os.access(distcc_dir, os.X_OK): def consider(name): - if os.access("/usr/bin/%(name)s" % vars(), os.X_OK): + if os.access(f"/usr/bin/{name}", os.X_OK): new_symlinks.add(name) print(name) -def consider_gcc(prefix, suffix): - consider("%(prefix)sgcc%(suffix)s" % vars()) - consider("%(prefix)sg++%(suffix)s" % vars()) +def consider_gcc(prefix, suffix=""): + consider(f"{prefix}gcc{suffix}") + consider(f"{prefix}g++{suffix}") def consider_clang(suffix): - consider("clang%(suffix)s" % vars()) - consider("clang++%(suffix)s" % vars()) + consider(f"clang{suffix}") + consider(f"clang++{suffix}") for x in standard_names: consider(x) -consider_gcc("", "") -consider_gcc("c89-", "") -consider_gcc("c99-", "") -try: - for gnu_host in os.listdir(gcc_dir): - consider_gcc("%(gnu_host)s-" % vars(), "") - for version in os.listdir(gcc_dir + "/" + gnu_host): - consider_gcc("", "-%(version)s" % vars()) - consider_gcc("%(gnu_host)s-" % vars(), "-%(version)s" % vars()) -except FileNotFoundError: - pass -except NotADirectoryError: - pass -try: - for gnu_host in os.listdir(gcccross_dir): - consider_gcc("%(gnu_host)s-" % vars(), "") - for version in os.listdir(gcccross_dir + "/" + gnu_host): - consider_gcc("", "-%(version)s" % vars()) - consider_gcc("%(gnu_host)s-" % vars(), "-%(version)s" % vars()) -except FileNotFoundError: - pass -except NotADirectoryError: - pass +consider_gcc("") +consider_gcc("c89-") +consider_gcc("c99-") + + +def sloppy_listdir(thedir): + try: + return os.listdir(thedir) + except FileNotFoundError: + pass + except NotADirectoryError: + pass + return [] + + +def scan_gcc_libexec(gcc_dir): + for gnu_host in sloppy_listdir(gcc_dir): + consider_gcc(f"{gnu_host}-") + for version in sloppy_listdir(gcc_dir + "/" + gnu_host): + consider_gcc("", f"-{version}") + consider_gcc(f"{gnu_host}-", f"-{version}") + + +for gcc_dir in GCC_LIBEXEC_DIRS: + scan_gcc_libexec(gcc_dir) + consider_clang("") for ent in os.listdir("/usr/lib"): if ent.startswith("llvm-"): version = ent.split("-")[1] - consider_clang("-%(version)s" % vars()) + consider_clang(f"-{version}") for name in os.listdir(distcc_dir): mode = os.lstat(distcc_dir + "/" + name).st_mode @@ -80,7 +86,4 @@ for link in old_symlinks: for link in new_symlinks: if link not in old_symlinks: - if os.access("/usr/bin/distcc", os.X_OK): - os.symlink("../../bin/distcc", distcc_dir + "/" + link) - else: - os.symlink("../../local/bin/distcc", distcc_dir + "/" + link) + os.symlink("../../bin/distcc", distcc_dir + "/" + link) |