Hello everyone,

The patch we are presenting is from Tom Aratyn and Cesar Oliveira, and is
focused on getting distcc to work with Microsoft's cl compiler. This patch
simply adds mulitple compiler support to distcc so that it is possible to
add support for other compilers - this is not the final product so there is
no support for cl (yet! We're working on it!). We have made some changes to
the code's architecture that makes it simple for anyone to add another
compiler to distcc. For the sake of compatibility we have written the patch
to ALWAYS default to gcc.

The patch works via a virtual table (as Martin suggested) and is set by
dcc_set_compiler() which receives the first element of the of argv[] after
the compiler name has been set inside it (we've had to make some small
modifications to ensure that this is the case in all test apps).

We would also like any feedback on forcing a certain compiler through the
use of an environment variable (or possibly an option but we're somewhat
inclined to use an environment variable). For example, instead of distcc
cl.exe main.c An environment variable could specify the cl compiler. This
environment variable should be checked before distcc defaults to gcc.

Finally, we've tested this on Windows XP Pro with cygwin, Linux, and OS X
and we've passed all test (except one in cygwin where gcc, not distcc, seg
faults with an empty pre-processed file). To our understanding, the current
release fails three tests on cygwin (including the gcc seg fault).

Any constructive ideas/comments are welcome,
Cesar and Tom

Index: test/testdistcc.py
===================================================================
--- test/testdistcc.py	(revision 2)
+++ test/testdistcc.py	(working copy)
@@ -1,4 +1,4 @@
-#! /usr/bin/env python2.2
+#! /usr/bin/env python2.4
 
 # Copyright (C) 2002, 2003, 2004 by Martin Pool <[EMAIL PROTECTED]>
 # 
@@ -524,7 +524,7 @@
    4 SSH (no-user) angry /usr/sbin/distccd
    4 TCP localhostbutnotreally 3632
 """
-        out, err = self.runcmd("DISTCC_HOSTS=\"%s\" h_hosts" % spec)
+        out, err = self.runcmd(("DISTCC_HOSTS=\"%s\" h_hosts " % spec)+ _gcc)
         assert out == expected, "expected %s\ngot %s" % (`expected`, `out`)
 
 
@@ -862,7 +862,6 @@
         else:
             self.runcmd("distcc false -c testtmp.i", 1)
 
-
 class BinTrue_Case(Compilation_Case):
     """Compiler that succeeds without reading input.
 
Index: Makefile.in
===================================================================
--- Makefile.in	(revision 2)
+++ Makefile.in	(working copy)
@@ -179,7 +179,7 @@
 	src/remote.o							\
 	src/ssh.o src/state.o src/strip.o				\
 	src/timefile.o src/traceenv.o					\
-	src/where.o							\
+	src/where.o	src/compiler_distcc.o				\
 	$(common_obj)
 
 distccd_obj = src/access.o						\
@@ -187,6 +187,7 @@
 	src/ncpus.o							\
 	src/prefork.o							\
 	src/serve.o src/setuid.o src/srvnet.o src/srvrpc.o src/state.o	\
+	src/compiler_daemon.o \
 	$(common_obj) @BUILD_POPT@
 
 # Objects that need to be linked in to build monitors
@@ -204,19 +205,21 @@
 gnome_obj = src/history.o src/mon-gnome.o				\
 	src/renderer.o
 
+multicompiler_obj = src/compiler_distcc.o src/strip.o src/hosts.o \
+                    src/hostfile.o src/loadfile.o
+
 h_exten_obj = src/h_exten.o $(common_obj)
-h_issource_obj = src/h_issource.o $(common_obj) 
-h_scanargs_obj = src/h_scanargs.o $(common_obj) src/implicit.o
-h_hosts_obj = src/h_hosts.o $(common_obj) src/hostfile.o src/hosts.o	\
-	src/loadfile.o
+h_issource_obj = src/h_issource.o $(common_obj) $(multicompiler_obj)
+h_scanargs_obj = src/h_scanargs.o $(common_obj) src/implicit.o $(multicompiler_obj)
+h_hosts_obj = src/h_hosts.o $(common_obj) src/implicit.o $(multicompiler_obj)
 h_argvtostr_obj = src/h_argvtostr.o $(common_obj)
-h_strip_obj = src/h_strip.o $(common_obj) src/strip.o
+h_strip_obj = src/h_strip.o $(common_obj) src/implicit.o $(multicompiler_obj)
 h_parsemask_obj = src/h_parsemask.o $(common_obj) src/access.o
 h_sa2str_obj = src/h_sa2str.o $(common_obj) src/srvnet.o src/access.o
 h_ccvers_obj = src/h_ccvers.o $(common_obj) 
 
 # All source files, for the purposes of building the distribution
-SRC =	src/access.c src/arg.c src/argutil.c				\
+SRC = src/access.c src/arg.c src/argutil.c				\
 	src/backoff.c src/bulk.c					\
 	src/cleanup.c							\
 	src/climasq.c src/clinet.c src/clirpc.c src/compile.c		\
@@ -239,7 +242,8 @@
 	src/srvnet.c src/srvrpc.c src/ssh.c src/strip.c			\
 	src/tempfile.c src/timefile.c                     		\
 	src/timeval.c src/traceenv.c					\
-	src/trace.c src/util.c src/where.c				
+	src/trace.c src/util.c src/where.c \
+	src/compiler_distcc.c src/compiler_daemon.c 
 
 
 HEADERS = src/access.h							\
Index: src/h_hosts.c
===================================================================
--- src/h_hosts.c	(revision 2)
+++ src/h_hosts.c	(working copy)
@@ -58,26 +58,37 @@
 #include "util.h"
 #include "hosts.h"
 #include "exitcode.h"
+#include "implicit.h"
 
+struct dcc_distcc_compiler_functions dcc_distcc_compiler;
 const char *rs_program_name = "h_hosts";
 
-int main(int UNUSED(argc), char **argv)
+int main(int argc, char **argv)
 {
     struct dcc_hostdef *list, *e;
     int nhosts, i;
     int ret;
+    char **newargv = NULL;
 
     rs_add_logger(rs_logger_file, RS_LOG_DEBUG, NULL, STDERR_FILENO);
 
-    if (argv[1] && !strcmp(argv[1], "-v")) {
+    if (argc > 3) {
+        return 1;
+    }
+    else if (argc == 3 && !strcmp(argv[1], "-v")) {
         rs_trace_set_level(RS_LOG_DEBUG);
     }
     
-    if ((ret = dcc_get_hostlist(&list, &nhosts)) != 0) {
+    if ((ret = dcc_find_compiler(argv, &newargv)))
+    	return ret;
+    
+    if ((ret = dcc_distcc_set_compiler(newargv[0])))
+    	return ret;
+    
+    if ((ret = dcc_distcc_compiler.get_hostlist(&list, &nhosts)) != 0) {
         rs_log_error("failed to parse \"%s\"", getenv("DISTCC_HOSTS"));
         exit(ret);
     }
-
     printf("%d\n", nhosts);
     for (i = 0, e = list; i < nhosts; i++, e = e->next) {
         if (!e) {
Index: src/h_strip.c
===================================================================
--- src/h_strip.c	(revision 2)
+++ src/h_strip.c	(working copy)
@@ -36,16 +36,18 @@
 #include "distcc.h"
 #include "trace.h"
 #include "util.h"
+#include "implicit.h"	/* dcc_find_compiler */
 
 const char *rs_program_name = __FILE__;
+struct dcc_distcc_compiler_functions dcc_distcc_compiler;
 
-
 /**
  * Test harness: determine whether a file is source, and is preprocessed.
  **/
 int main(int argc, char *argv[])
 {
     char **new_args;
+    char **out_argv;
     int ret;
 
     if (argc < 2) {
@@ -53,7 +55,11 @@
         return 1;
     }
 
-    if ((ret = dcc_strip_local_args(argv + 1, &new_args))) {
+    if ((ret = dcc_find_compiler(argv, &out_argv)) ||
+        ((ret = dcc_distcc_set_compiler(out_argv[0])) == 1))
+	return ret;
+
+    if ((ret = dcc_distcc_compiler.strip_local_args(argv + 1, &new_args))) {
         return ret;
     }
 
Index: src/arg.c
===================================================================
--- src/arg.c	(revision 2)
+++ src/arg.c	(working copy)
@@ -120,7 +120,7 @@
  *
  * @returns 0 if it's ok to distribute this compilation, or an error code.
  **/
-int dcc_scan_args(char *argv[], char **input_file, char **output_file,
+int dcc_gcc_scan_args(char *argv[], char **input_file, char **output_file,
                   char ***ret_newargv)
 {
     int seen_opt_c = 0, seen_opt_s = 0;
@@ -293,8 +293,9 @@
  * Used to change "-c" or "-S" to "-E", so that we get preprocessed
  * source.
  **/
-int dcc_set_action_opt(char **a, const char *new_c)
+int dcc_gcc_set_action_opt(char **a)
 {
+    const char * new_c = "-E";
     int gotone = 0;
     
     for (; *a; a++) 
Index: src/cpp.c
===================================================================
--- src/cpp.c	(revision 2)
+++ src/cpp.c	(working copy)
@@ -61,7 +61,7 @@
 
     *cpp_pid = 0;
     
-    if (dcc_is_preprocessed(input_fname)) {
+    if (dcc_distcc_compiler.is_preprocessed(input_fname)) {
         /* TODO: Perhaps also consider the option that says not to use cpp.
          * Would anyone do that? */
         rs_trace("input is already preprocessed");
@@ -90,8 +90,8 @@
      * and objects in different directories, and who don't specify -MF.  They
      * can fix it by specifying -MF.  */
     
-    if ((ret = dcc_strip_dasho(argv, &cpp_argv))
-        || (ret = dcc_set_action_opt(cpp_argv, "-E")))
+    if ((ret = dcc_distcc_compiler.strip_dasho(argv, &cpp_argv))
+        || (ret = dcc_distcc_compiler.set_action_opt(cpp_argv)))
         return ret;
 
     /* FIXME: cpp_argv is leaked */
Index: src/hosts.c
===================================================================
--- src/hosts.c	(revision 2)
+++ src/hosts.c	(working copy)
@@ -127,7 +127,7 @@
  * taken from $DISTCC_DIR/hosts, if that exists.  Otherwise, they are taken
  * from ${sysconfdir}/distcc/hosts, if that exists.  Otherwise, we fail.
  **/
-int dcc_get_hostlist(struct dcc_hostdef **ret_list,
+int dcc_gcc_get_hostlist(struct dcc_hostdef **ret_list,
                      int *ret_nhosts)
 {
     char *env;
Index: src/strip.c
===================================================================
--- src/strip.c	(revision 2)
+++ src/strip.c	(working copy)
@@ -56,7 +56,7 @@
  * passed directly to cpp.  When given to gcc they have different
  * meanings.
  **/
-int dcc_strip_local_args(char **from, char ***out_argv)
+int dcc_gcc_strip_local_args(char **from, char ***out_argv)
 {
     char **to;
     int from_i, to_i;
@@ -136,7 +136,7 @@
  *
  * Structurally similar to dcc_strip_local_args()
  **/
-int dcc_strip_dasho(char **from, char ***out_argv)
+int dcc_gcc_strip_dasho(char **from, char ***out_argv)
 {
     char **to;
     int from_i, to_i;
Index: src/hosts.h
===================================================================
--- src/hosts.h	(revision 2)
+++ src/hosts.h	(working copy)
@@ -60,7 +60,7 @@
 
 
 /* hosts.c */
-int dcc_get_hostlist(struct dcc_hostdef **ret_list,
+int dcc_gcc_get_hostlist(struct dcc_hostdef **ret_list,
                      int *ret_nhosts);
 
 int dcc_free_hostdef(struct dcc_hostdef *host);
Index: src/where.c
===================================================================
--- src/where.c	(revision 2)
+++ src/where.c	(working copy)
@@ -89,7 +89,7 @@
     int ret;
     int n_hosts;
     
-    if ((ret = dcc_get_hostlist(&hostlist, &n_hosts)) != 0) {
+    if ((ret = dcc_distcc_compiler.get_hostlist(&hostlist, &n_hosts)) != 0) {
         return EXIT_NO_HOSTS;
     }
 
Index: src/h_issource.c
===================================================================
--- src/h_issource.c	(revision 2)
+++ src/h_issource.c	(working copy)
@@ -39,6 +39,7 @@
 
 
 const char *rs_program_name = __FILE__;
+struct dcc_distcc_compiler_functions dcc_distcc_compiler;
 
 
 /**
@@ -46,14 +47,20 @@
  **/
 int main(int argc, char *argv[])
 {
+    int result;
+
     if (argc != 2) {
-        rs_log_error("usage: %s FILENAME", argv[0]);
+        rs_log_error("usage: %s COMPILER FILENAME", argv[0]);
         return 1;
     }
+    
+    result = dcc_distcc_set_compiler(argv[0]);
+    if (result)
+        return result;
 
     printf("%s %s\n",
 	   dcc_is_source(argv[1]) ? "source" : "not-source",
-	   dcc_is_preprocessed(argv[1]) ? "preprocessed" : "not-preprocessed");
+	   dcc_distcc_compiler.is_preprocessed(argv[1]) ? "preprocessed" : "not-preprocessed");
     
     return 0;
 }
Index: src/daemon.c
===================================================================
--- src/daemon.c	(revision 2)
+++ src/daemon.c	(working copy)
@@ -80,7 +80,9 @@
 /* for trace.c */
 char const *rs_program_name = "distccd";
 
+struct dcc_daemon_compiler_functions dcc_daemon_compiler;
 
+
 static int dcc_inetd_server(void);
 static void dcc_setup_real_log(void);
 
Index: src/daemon.h
===================================================================
--- src/daemon.h	(revision 2)
+++ src/daemon.h	(working copy)
@@ -49,8 +49,18 @@
 int dcc_discard_root(void);
 extern const char *opt_user;
 
+int dcc_daemon_set_compiler (char *compilerName);
 
+struct dcc_daemon_compiler_functions{
+
+        int (*scan_args)(char *argv[], char **input_file, char **output_file, char ***ret_newargv);
+
+};
+
+extern struct dcc_daemon_compiler_functions dcc_daemon_compiler;
+
 extern int dcc_max_kids;
 extern int dcc_nkids;
 
 extern volatile pid_t dcc_master_pid;
+
Index: src/distcc.c
===================================================================
--- src/distcc.c	(revision 2)
+++ src/distcc.c	(working copy)
@@ -49,6 +49,8 @@
 #include "implicit.h"
 #include "compile.h"
 
+/* the compiler specific function table */
+struct dcc_distcc_compiler_functions dcc_distcc_compiler;
 
 /* Name of this program, for trace.c */
 const char *rs_program_name = "distcc";
@@ -187,7 +189,8 @@
         /* compiler_args is now respectively either "cc -c hello.c" or
          * "gcc -c hello.c" */
 
-#if 0
+
+#if 1
         /* I don't think we need to call this: if we reached this
          * line, our invocation name is something like 'distcc', and
          * that's never a problem for masquerading loops. */
@@ -210,6 +213,11 @@
         goto out;
     }
 
+    if (dcc_distcc_set_compiler(compiler_args[0])){
+        ret = EXIT_NO_COMPILER_SETTING;
+        goto out;
+    }
+
     ret = dcc_build_somewhere_timed(compiler_args, sg_level, &status);
 
     out:
Index: src/exitcode.h
===================================================================
--- src/exitcode.h	(revision 2)
+++ src/exitcode.h	(working copy)
@@ -54,7 +54,10 @@
     EXIT_NO_SUCH_FILE             = 115,
     EXIT_NO_HOSTS                 = 116,
     EXIT_GONE                     = 117, /**< No longer relevant */
-    EXIT_TIMEOUT                  = 118
+    EXIT_TIMEOUT                  = 118,
+    EXIT_NO_COMPILER_SETTING      = 119 /**< Unable to configure compiler 
+                                          function table for the request 
+                                          compiler */
 };
 
 
Index: src/distcc.h
===================================================================
--- src/distcc.h	(revision 2)
+++ src/distcc.h	(working copy)
@@ -208,10 +208,10 @@
                    double *rate);
 
 /* arg.c */
-int dcc_set_action_opt(char **, const char *);
+int dcc_gcc_set_action_opt(char **);
 int dcc_set_output(char **, char *);
 int dcc_set_input(char **, char *);
-int dcc_scan_args(char *argv[], /[EMAIL PROTECTED]@*/ /[EMAIL PROTECTED]@*/ char **orig_o,
+int dcc_gcc_scan_args(char *argv[], /[EMAIL PROTECTED]@*/ /[EMAIL PROTECTED]@*/ char **orig_o,
                   char **orig_i, char ***ret_newargv);
 
 /* argutil.c */
@@ -236,8 +236,8 @@
 int dcc_add_cleanup(char *filename) WARN_UNUSED;
 
 /* strip.c */
-int dcc_strip_local_args(char **from, char ***out_argv);
-int dcc_strip_dasho(char **from, char ***out_argv);
+int dcc_gcc_strip_local_args(char **from, char ***out_argv);
+int dcc_gcc_strip_dasho(char **from, char ***out_argv);
 
 /* cpp.c */
 int dcc_cpp_maybe(char **argv, char *input_fname, char **cpp_fname,
@@ -245,7 +245,7 @@
 
 /* filename.c */
 int dcc_is_source(const char *sfile);
-int dcc_is_preprocessed(const char *sfile);
+int dcc_gcc_is_preprocessed(const char *sfile);
 int dcc_is_object(const char *filename);
 int dcc_source_needs_local(const char *);
 
@@ -294,8 +294,27 @@
 /* mapfile.c */
 int dcc_map_input_file(int in_fd, off_t in_size, char **buf_ret);
 
+/* compiler.c */
+int dcc_distcc_set_compiler (char *compilerName);
 
+struct dcc_distcc_compiler_functions
+{
+    int (*is_preprocessed)(const char *);
+    
+    /* For comapatability reasons, please use dcc_parse_hosts_file() when 
+     * writting your own version of this */
+    int (*get_hostlist)(struct dcc_hostdef **, int *);
 
+    int (*set_action_opt)(char **);
+    int (*strip_dasho)(char **, char ***);
+    int (*strip_local_args)(char **, char ***);
+    int (*scan_args)(char *argv[], /[EMAIL PROTECTED]@*/ /[EMAIL PROTECTED]@*/ char **orig_o,
+                  char **orig_i, char ***ret_newargv);
+
+};
+
+extern struct dcc_distcc_compiler_functions dcc_distcc_compiler;
+
 /* XXX: Kind of kludgy, we should do dynamic allocation.  But this will do for
  * now. */
 #ifndef MAXPATHLEN
Index: src/serve.c
===================================================================
--- src/serve.c	(revision 2)
+++ src/serve.c	(working copy)
@@ -283,9 +283,12 @@
     tcp_cork_sock(out_fd, 1);
 
     if ((ret = dcc_r_request_header(in_fd, &protover))
-        || (ret = dcc_r_argv(in_fd, &argv))
-        || (ret = dcc_scan_args(argv, &orig_input, &orig_output, &argv)))
+        || (ret = dcc_r_argv(in_fd, &argv)))
         goto out_cleanup;
+
+    if ((ret = dcc_daemon_set_compiler(argv[0])) ||
+        (ret = dcc_daemon_compiler.scan_args(argv, &orig_input, &orig_output, &argv)))
+        goto out_cleanup;
     
     rs_trace("output file %s", orig_output);
 
@@ -306,7 +309,7 @@
 
     if ((compile_ret = dcc_spawn_child(argv, &cc_pid,
                                        "/dev/null", out_fname, err_fname))
-        || (compile_ret = dcc_collect_child("cc", cc_pid, &status))) {
+        || (compile_ret = dcc_collect_child(argv[0], cc_pid, &status))) {
         /* We didn't get around to finding a wait status from the actual compiler */
         status = W_EXITCODE(compile_ret, 0);
     }
Index: src/compile.c
===================================================================
--- src/compile.c	(revision 2)
+++ src/compile.c	(working copy)
@@ -45,7 +45,6 @@
 #include "timeval.h"
 #include "compile.h"
 
-
 /**
  * Invoke a compiler locally.  This is, obviously, the alternative to
  * dcc_compile_remote().
@@ -124,7 +123,7 @@
 
     /* TODO: Perhaps tidy up these gotos. */
 
-    if (dcc_scan_args(argv, &input_fname, &output_fname, &argv) != 0) {
+    if (dcc_distcc_compiler.scan_args(argv, &input_fname, &output_fname, &argv) != 0) {
         /* we need to scan the arguments even if we already know it's
          * local, so that we can pick up distcc client options. */
         goto lock_local;
@@ -149,7 +148,7 @@
     if ((ret = dcc_cpp_maybe(argv, input_fname, &cpp_fname, &cpp_pid) != 0))
         goto fallback;
 
-    if ((ret = dcc_strip_local_args(argv, &argv_stripped)))
+    if ((ret = dcc_distcc_compiler.strip_local_args(argv, &argv_stripped)))
         goto fallback;
 
     /* FIXME: argv_stripped is leaked. */
Index: src/h_scanargs.c
===================================================================
--- src/h_scanargs.c	(revision 2)
+++ src/h_scanargs.c	(working copy)
@@ -38,6 +38,7 @@
 #include "implicit.h"
 
 const char *rs_program_name = __FILE__;
+struct dcc_distcc_compiler_functions dcc_distcc_compiler;
 
 
 /**
@@ -58,12 +59,16 @@
     }
 
     result = dcc_find_compiler(argv, &newargv);
-
+    
     if (result)
 	return result;
 
-    result = dcc_scan_args(newargv, &infname, &outfname, &outargv);
+    result = dcc_distcc_set_compiler(newargv[0]);
+    if (result)
+        return result;
 
+   result = dcc_distcc_compiler.scan_args(newargv, &infname, &outfname, &outargv);
+
     printf("%s %s %s\n",
 	   result == 0 ? "distribute" : "local",
 	   infname ? infname : "(NULL)", outfname ? outfname : "(NULL)");
Index: src/filename.c
===================================================================
--- src/filename.c	(revision 2)
+++ src/filename.c	(working copy)
@@ -162,7 +162,7 @@
  * Does the extension of this file indicate that it is already
  * preprocessed?
  **/
-int dcc_is_preprocessed(const char *sfile)
+int dcc_gcc_is_preprocessed(const char *sfile)
 {
     const char *dot, *ext;
     dot = dcc_find_extension((char *) sfile);
Index: src/compiler_daemon.c
===================================================================
--- src/compiler_daemon.c	(revision 0)
+++ src/compiler_daemon.c	(revision 36)
@@ -0,0 +1,35 @@
+#include <stdlib.h>
+
+#include "config.h"
+#include "trace.h"
+#include "exitcode.h"
+#include "distcc.h"
+#include "daemon.h"
+
+/**
+ * Sets the compiler functions to be called based on the compiler's name.
+ * The compiler name is only known after argv has been passed through the netwrok.
+ * \return 0 on success
+ */
+int dcc_daemon_set_compiler (char *compiler){
+    const char * name;
+
+    if (!compiler){
+        return EXIT_NO_COMPILER_SETTING;
+    }
+    name = dcc_find_basename(compiler);
+    rs_log_info("Extracted compiler %s from %s", compiler, name);
+    
+    if (0) { }
+    /* If you wish to add a compiler please add an else if here in the following form:
+     * else if (strcmp(name, "foocc") == 0) {
+     *     //vtable assignments...
+     * } */
+    else {
+        /* Assume masquerade mode. The only compiler allowed to do this is gcc 
+         * to maintain backwards compatibility. */
+        rs_log_info("Using gcc settings.");
+        dcc_daemon_compiler.scan_args = dcc_gcc_scan_args;
+    }
+    return 0;
+}
Index: src/compiler_distcc.c
===================================================================
--- src/compiler_distcc.c	(revision 0)
+++ src/compiler_distcc.c	(revision 36)
@@ -0,0 +1,49 @@
+#include <string.h>
+#include <stdio.h>
+
+#include "config.h"
+#include "trace.h"
+#include "exitcode.h"
+#include "distcc.h"
+#include "hosts.h"
+
+/**
+ * Sets the compiler functions to be called based on the compiler's name.
+ * Defaults to the GNU's gcc compiler if a match is not found.
+ * \return 0 on success
+ */
+int dcc_distcc_set_compiler (char *compiler) {
+    const char * name;
+
+    if (!compiler) {
+        return EXIT_NO_COMPILER_SETTING;
+    }
+    name = dcc_find_basename(compiler);
+    rs_log_info("Extracted compiler %s from %s", compiler, name);
+    
+    if (0) {
+    }
+    /* If you wish to add a compiler please add an else if here in the following form:
+     * else if (strcmp(name, "foocc") == 0) {
+     *     //vtable assignments...
+     * } 
+     */
+    else {
+        /* Assume masquerade mode. The only compiler allowed to do this is gcc 
+         * to maintain backwards compatibility. */
+        
+        rs_log_info("Using gcc settings.");
+
+        dcc_distcc_compiler.get_hostlist = dcc_gcc_get_hostlist;
+        dcc_distcc_compiler.is_preprocessed = dcc_gcc_is_preprocessed;
+
+        dcc_distcc_compiler.set_action_opt = dcc_gcc_set_action_opt;
+
+        dcc_distcc_compiler.strip_dasho = dcc_gcc_strip_dasho;
+
+        dcc_distcc_compiler.strip_local_args = dcc_gcc_strip_local_args;
+        dcc_distcc_compiler.scan_args = dcc_gcc_scan_args;
+
+    }
+    return 0;
+}
__ 
distcc mailing list            http://distcc.samba.org/
To unsubscribe or change options: 
https://lists.samba.org/mailman/listinfo/distcc

Reply via email to