]> git.ipfire.org Git - thirdparty/ccache.git/commitdiff
Handle -MFarg, -MTarg and -MQarg compiler options correctly
authorJoel Rosdahl <joel@rosdahl.net>
Sun, 28 Nov 2010 16:04:38 +0000 (17:04 +0100)
committerJoel Rosdahl <joel@rosdahl.net>
Sun, 28 Nov 2010 16:04:38 +0000 (17:04 +0100)
GCC apparently (and undocumentedly) accepts these.

ccache.c
test/test_argument_processing.c

index 900146d6dc412a9d880031a5a291ed3e74333c6a..5e36706afceb2a13258b50b4680bffa22236f134 100644 (file)
--- a/ccache.c
+++ b/ccache.c
@@ -1357,19 +1357,31 @@ cc_process_args(struct args *orig_args, struct args **preprocessor_args,
                        continue;
                }
                if (i < argc - 1) {
-                       if (str_eq(argv[i], "-MF")) {
+                       if (str_startswith(argv[i], "-MF")) {
+                               char *arg;
                                dependency_filename_specified = true;
                                free(output_dep);
-                               output_dep = make_relative_path(x_strdup(argv[i + 1]));
                                args_add(dep_args, argv[i]);
-                               args_add(dep_args, argv[i + 1]);
-                               i++;
+                               if (strlen(argv[i]) == 3) {
+                                       /* -MF arg */
+                                       arg = argv[i + 1];
+                                       args_add(dep_args, argv[i + 1]);
+                                       i++;
+                               } else {
+                                       /* -MFarg */
+                                       arg = &argv[i][3];
+                               }
+                               output_dep = make_relative_path(x_strdup(arg));
                                continue;
-                       } else if (str_eq(argv[i], "-MQ") || str_eq(argv[i], "-MT")) {
+                       } else if (str_startswith(argv[i], "-MQ")
+                                  || str_startswith(argv[i], "-MT")) {
                                dependency_target_specified = true;
                                args_add(dep_args, argv[i]);
-                               args_add(dep_args, argv[i + 1]);
-                               i++;
+                               if (strlen(argv[i]) == 3) {
+                                       /* -MQ arg or -MT arg */
+                                       args_add(dep_args, argv[i + 1]);
+                                       i++;
+                               }
                                continue;
                        }
                }
index 9e76ae86fecfb6c4beedafae832132f3ac77765c..7408c4aebeb26b65092232b097c1e4047ffc34b7 100644 (file)
@@ -57,4 +57,21 @@ TEST(dependency_flags_should_only_be_sent_to_the_preprocessor)
        args_free(orig);
 }
 
+TEST(dependency_flags_that_take_an_argument_should_not_require_space_delimiter)
+{
+       struct args *orig = args_init_from_string(
+               "cc -c -MMD -MFfoo.d -MTmt -MQmq foo.c -o foo.o");
+       struct args *exp_cpp = args_init_from_string(
+               "cc -c -MMD -MFfoo.d -MTmt -MQmq");
+       struct args *exp_cc = args_init_from_string("cc -c");
+       struct args *act_cpp = NULL, *act_cc = NULL;
+       create_file("foo.c", "");
+
+       CHECK(cc_process_args(orig, &act_cpp, &act_cc));
+       CHECK_ARGS_EQ_FREE12(exp_cpp, act_cpp);
+       CHECK_ARGS_EQ_FREE12(exp_cc, act_cc);
+
+       args_free(orig);
+}
+
 TEST_SUITE_END