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