These indicate to the compiler that additional command line options
should be read from a text file. If encountered, read the file,
tokenize any arguments, and if any are found, do an in-place replacement
of the '@' parameter with the arguments within the file.

Signed-off-by: Andrew Boie <andrew.p.b...@intel.com>
---
 ccache.c |   56 +++++++++++++++++++++++++++++++++++++++++++++++++++++++-
 1 file changed, 55 insertions(+), 1 deletion(-)

diff --git a/ccache.c b/ccache.c
index 692b222..4b7ff6a 100644
--- a/ccache.c
+++ b/ccache.c
@@ -1432,9 +1432,63 @@ cc_process_args(struct args *orig_args, struct args 
**preprocessor_args,
                        goto out;
                }
 
+               if (str_startswith(argv[i], "@")) {
+                       char *argpath = argv[i] + 1;
+                       struct args *file_args;
+                       char *argdata;
+                       int j;
+
+                       if (!(argdata = read_text_file(argpath, 0))) {
+                               cc_log("Coudln't read arg file %s", argpath);
+                               stats_update(STATS_ARGS);
+                               result = false;
+                               goto out;
+                       }
+
+                       file_args = args_init_from_string(argdata);
+                       free(argdata);
+
+                       if (file_args->argc == 0) {
+                               args_free(file_args);
+                               continue;
+                       }
+
+                       free(argv[i]); /* Will be replaced */
+                       if (file_args->argc == 1) {
+                               argv[i] = x_strdup(file_args->argv[0]);
+                               args_free(file_args);
+                               i--;
+                               continue;
+                       }
+
+                       /* Expand argv to hold both current and file
+                        * arguments */
+                       orig_args->argv = (char**)x_realloc(orig_args->argv,
+                                       (orig_args->argc + file_args->argc) *
+                                       sizeof(char *));
+                       /* Move all unprocessed arguments to the end of the
+                        * new list */
+                       for (j = orig_args->argc; j > i; j--) {
+                               orig_args->argv[j + file_args->argc - 1] =
+                                       orig_args->argv[j];
+                       }
+                       /* Fill in the space we just made with the
+                        * new arguments. Current '@' argument gets
+                        * replaced */
+                       for (j = 0; j < file_args->argc; j++) {
+                               orig_args->argv[j + i] =
+                                       x_strdup(file_args->argv[j]);
+                       }
+                       orig_args->argc += file_args->argc - 1;
+                       args_free(file_args);
+                       argc = orig_args->argc;
+                       argv = orig_args->argv;
+                       i--;
+                       continue;
+               }
+
                /* These are always too hard. */
                if (compopt_too_hard(argv[i])
-                   || str_startswith(argv[i], "@")
                    || str_startswith(argv[i], "-fdump-")) {
                        cc_log("Compiler option %s is unsupported", argv[i]);
                        stats_update(STATS_UNSUPPORTED);
-- 
1.7.9.5

_______________________________________________
ccache mailing list
ccache@lists.samba.org
https://lists.samba.org/mailman/listinfo/ccache

Reply via email to