]> git.ipfire.org Git - thirdparty/ccache.git/commitdiff
Be bug compatible with GCC for -MTarg and -MQarg
authorJoel Rosdahl <joel@rosdahl.net>
Sun, 17 Apr 2011 15:55:14 +0000 (17:55 +0200)
committerJoel Rosdahl <joel@rosdahl.net>
Sun, 17 Apr 2011 15:55:14 +0000 (17:55 +0200)
It's strange, but apparently, GCC behaves differently for -MT arg and
-MTarg (and similar for -MQ): in the latter case, but not in the former,
an implicit dependency for the object file is added to the dependency file.

ccache.c
test/test_argument_processing.c

index 4e76f29af29c33f798f5c5122b89595d71a25e3c..66d813b7eb40d2715dc4b266bc6ca956b5afc9b9 100644 (file)
--- a/ccache.c
+++ b/ccache.c
@@ -1389,7 +1389,6 @@ cc_process_args(struct args *orig_args, struct args **preprocessor_args,
                        continue;
                }
                if (str_startswith(argv[i], "-MQ") || str_startswith(argv[i], "-MT")) {
-                       dependency_target_specified = true;
                        args_add(dep_args, argv[i]);
                        if (strlen(argv[i]) == 3) {
                                /* -MQ arg or -MT arg */
@@ -1401,6 +1400,13 @@ cc_process_args(struct args *orig_args, struct args **preprocessor_args,
                                }
                                args_add(dep_args, argv[i + 1]);
                                i++;
+                               /*
+                                * Yes, that's right. It's strange, but apparently, GCC behaves
+                                * differently for -MT arg and -MTarg (and similar for -MQ): in the
+                                * latter case, but not in the former, an implicit dependency for the
+                                * object file is added to the dependency file.
+                                */
+                               dependency_target_specified = true;
                        }
                        continue;
                }
@@ -1686,7 +1692,7 @@ cc_process_args(struct args *orig_args, struct args **preprocessor_args,
                }
 
                if (!dependency_target_specified) {
-                       args_add(dep_args, "-MT");
+                       args_add(dep_args, "-MQ");
                        args_add(dep_args, output_obj);
                }
        }
index 75f3a2e8e9e1ca68fb80fc72e9d9d44be075a380..11f33f3a02e1b1f4df4a246e9fe3106727339ca3 100644 (file)
@@ -72,9 +72,9 @@ TEST(dependency_flags_should_only_be_sent_to_the_preprocessor)
 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");
+               "cc -c -MMD -MFfoo.d -MT mt -MTmt -MQmq foo.c -o foo.o");
        struct args *exp_cpp = args_init_from_string(
-               "cc -c -MMD -MFfoo.d -MTmt -MQmq");
+               "cc -c -MMD -MFfoo.d -MT mt -MTmt -MQmq");
        struct args *exp_cc = args_init_from_string("cc -c");
        struct args *act_cpp = NULL, *act_cc = NULL;
        create_file("foo.c", "");
@@ -89,9 +89,9 @@ TEST(dependency_flags_that_take_an_argument_should_not_require_space_delimiter)
 TEST(MF_flag_with_immediate_argument_should_work_as_last_argument)
 {
        struct args *orig = args_init_from_string(
-               "cc -c foo.c -o foo.o -MMD -MTbar -MFfoo.d");
+               "cc -c foo.c -o foo.o -MMD -MT bar -MFfoo.d");
        struct args *exp_cpp = args_init_from_string(
-               "cc -c -MMD -MTbar -MFfoo.d");
+               "cc -c -MMD -MT bar -MFfoo.d");
        struct args *exp_cc = args_init_from_string("cc -c");
        struct args *act_cpp = NULL, *act_cc = NULL;
        create_file("foo.c", "");
@@ -106,9 +106,9 @@ TEST(MF_flag_with_immediate_argument_should_work_as_last_argument)
 TEST(MT_flag_with_immediate_argument_should_work_as_last_argument)
 {
        struct args *orig = args_init_from_string(
-               "cc -c foo.c -o foo.o -MMD -MFfoo.d -MTbar");
+               "cc -c foo.c -o foo.o -MMD -MFfoo.d -MT foo -MTbar");
        struct args *exp_cpp = args_init_from_string(
-               "cc -c -MMD -MFfoo.d -MTbar");
+               "cc -c -MMD -MFfoo.d -MT foo -MTbar");
        struct args *exp_cc = args_init_from_string("cc -c");
        struct args *act_cpp = NULL, *act_cc = NULL;
        create_file("foo.c", "");
@@ -123,9 +123,9 @@ TEST(MT_flag_with_immediate_argument_should_work_as_last_argument)
 TEST(MQ_flag_with_immediate_argument_should_work_as_last_argument)
 {
        struct args *orig = args_init_from_string(
-               "cc -c foo.c -o foo.o -MMD -MFfoo.d -MQbar");
+               "cc -c foo.c -o foo.o -MMD -MFfoo.d -MQ foo -MQbar");
        struct args *exp_cpp = args_init_from_string(
-               "cc -c -MMD -MFfoo.d -MQbar");
+               "cc -c -MMD -MFfoo.d -MQ foo -MQbar");
        struct args *exp_cc = args_init_from_string("cc -c");
        struct args *act_cpp = NULL, *act_cc = NULL;
        create_file("foo.c", "");
@@ -137,4 +137,77 @@ TEST(MQ_flag_with_immediate_argument_should_work_as_last_argument)
        args_free(orig);
 }
 
+TEST(MQ_flag_without_immediate_argument_should_not_add_MQobj)
+{
+       struct args *orig = args_init_from_string(
+               "gcc -c -MD -MP -MFfoo.d -MQ foo.d foo.c");
+       struct args *exp_cpp = args_init_from_string(
+               "gcc -c -MD -MP -MFfoo.d -MQ foo.d");
+       struct args *exp_cc = args_init_from_string(
+               "gcc -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(MT_flag_without_immediate_argument_should_not_add_MTobj)
+{
+       struct args *orig = args_init_from_string(
+               "gcc -c -MD -MP -MFfoo.d -MT foo.d foo.c");
+       struct args *exp_cpp = args_init_from_string(
+               "gcc -c -MD -MP -MFfoo.d -MT foo.d");
+       struct args *exp_cc = args_init_from_string(
+               "gcc -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(MQ_flag_with_immediate_argument_should_add_MQobj)
+{
+       struct args *orig = args_init_from_string(
+               "gcc -c -MD -MP -MFfoo.d -MQfoo.d foo.c");
+       struct args *exp_cpp = args_init_from_string(
+               "gcc -c -MD -MP -MFfoo.d -MQfoo.d -MQ foo.o");
+       struct args *exp_cc = args_init_from_string(
+               "gcc -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(MT_flag_with_immediate_argument_should_add_MQobj)
+{
+       struct args *orig = args_init_from_string(
+               "gcc -c -MD -MP -MFfoo.d -MTfoo.d foo.c");
+       struct args *exp_cpp = args_init_from_string(
+               "gcc -c -MD -MP -MFfoo.d -MTfoo.d -MQ foo.o");
+       struct args *exp_cc = args_init_from_string(
+               "gcc -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