diff options
Diffstat (limited to 'src/compile.c')
-rw-r--r-- | src/compile.c | 44 |
1 files changed, 35 insertions, 9 deletions
diff --git a/src/compile.c b/src/compile.c index f1fd5c3..e6ef9b9 100644 --- a/src/compile.c +++ b/src/compile.c @@ -549,7 +549,7 @@ static void dcc_rewrite_generic_compiler(char **argv) static void dcc_add_clang_target(char **argv) { /* defined by autoheader */ - const char *target = GNU_HOST; + const char *target = NATIVE_COMPILER_TRIPLE; if (strcmp(argv[0], "clang") == 0 || strncmp(argv[0], "clang-", strlen("clang-")) == 0 || strcmp(argv[0], "clang++") == 0 || strncmp(argv[0], "clang++-", strlen("clang++-")) == 0) @@ -557,9 +557,14 @@ static void dcc_add_clang_target(char **argv) else return; + /* -target aarch64-linux-gnu */ if (dcc_argv_search(argv, "-target")) return; + /* --target=aarch64-linux-gnu */ + if (dcc_argv_startswith(argv, "--target")) + return; + rs_log_info("Adding '-target %s' to support clang cross-compilation.", target); dcc_argv_append(argv, strdup("-target")); @@ -572,9 +577,10 @@ static void dcc_add_clang_target(char **argv) static int dcc_gcc_rewrite_fqn(char **argv) { /* defined by autoheader */ - const char *target_with_vendor = GNU_HOST; + const char *target_with_vendor = NATIVE_COMPILER_TRIPLE; char *newcmd, *t, *path; int pathlen = 0; + int newcmd_len = 0; if (strcmp(argv[0], "gcc") == 0 || strncmp(argv[0], "gcc-", strlen("gcc-")) == 0 || strcmp(argv[0], "g++") == 0 || strncmp(argv[0], "g++-", strlen("g++-")) == 0) @@ -583,15 +589,13 @@ static int dcc_gcc_rewrite_fqn(char **argv) return -ENOENT; - newcmd = malloc(strlen(target_with_vendor) + 1 + strlen(argv[0] + 1)); + newcmd_len = strlen(target_with_vendor) + 1 + strlen(argv[0]) + 1; + newcmd = malloc(newcmd_len); if (!newcmd) return -ENOMEM; + memset(newcmd, 0, newcmd_len); - if ((t = strstr(target_with_vendor, "-pc-"))) { - memcpy(newcmd, target_with_vendor, t - target_with_vendor); - strcat(newcmd, t + strlen("-pc")); - } else - strcpy(newcmd, target_with_vendor); + strcpy(newcmd, target_with_vendor); strcat(newcmd, "-"); @@ -628,6 +632,18 @@ static int dcc_gcc_rewrite_fqn(char **argv) return -ENOENT; } +static int dcc_get_max_retries(void) +{ + if (dcc_backoff_is_enabled()) { + /* eventually distcc will either find a suitable host or mark + * all hosts as faulty (and fallback to a local compilation) + */ + return 0; /* no limit */ + } else { + return 3; /* somewhat arbitrary */ + } +} + /** * Execute the commands in argv remotely or locally as appropriate. * @@ -684,10 +700,13 @@ dcc_build_somewhere(char *argv[], int cpu_lock_fd = -1, local_cpu_lock_fd = -1; int ret; int remote_ret = 0; + int retry_count = 0, max_retries; struct dcc_hostdef *host = NULL; char *discrepancy_filename = NULL; char **new_argv; + max_retries = dcc_get_max_retries(); + if ((ret = dcc_expand_preprocessor_options(&argv)) != 0) goto clean_up; @@ -838,7 +857,14 @@ dcc_build_somewhere(char *argv[], /* dcc_compile_remote() already unlocked local_cpu_lock_fd. */ local_cpu_lock_fd = -1; bad_host(host, &cpu_lock_fd, &local_cpu_lock_fd); - goto choose_host; + retry_count++; + if (max_retries == 0 || retry_count < max_retries) + goto choose_host; + else { + rs_log_warning("Couldn't find a host in %d attempts, retrying locally", + retry_count); + goto fallback; + } } /* dcc_compile_remote() already unlocked local_cpu_lock_fd. */ local_cpu_lock_fd = -1; |