summaryrefslogtreecommitdiff
path: root/src/compile.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/compile.c')
-rw-r--r--src/compile.c44
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;