From: Joel Rosdahl Date: Sun, 17 Apr 2011 15:55:14 +0000 (+0200) Subject: Be bug compatible with GCC for -MTarg and -MQarg X-Git-Tag: v3.1.5~5 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=8c3039d676d71564e98d50f1ca8ba029d1efa46c;p=thirdparty%2Fccache.git Be bug compatible with GCC for -MTarg and -MQarg 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. --- diff --git a/ccache.c b/ccache.c index 4e76f29af..66d813b7e 100644 --- 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); } } diff --git a/test/test_argument_processing.c b/test/test_argument_processing.c index 75f3a2e8e..11f33f3a0 100644 --- a/test/test_argument_processing.c +++ b/test/test_argument_processing.c @@ -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