From 192b6d1b6167be03d69b56117b24b9528822491d Mon Sep 17 00:00:00 2001 From: Joel Rosdahl Date: Wed, 13 Apr 2011 21:58:29 +0200 Subject: [PATCH] Correctly handle -MF/-MT/-MQ with concatenated argument last on commandline --- ccache.c | 60 +++++++++++++++++++-------------- test/test_argument_processing.c | 51 ++++++++++++++++++++++++++++ 2 files changed, 86 insertions(+), 25 deletions(-) diff --git a/ccache.c b/ccache.c index 6786ee399..b5b1c4084 100644 --- a/ccache.c +++ b/ccache.c @@ -1365,34 +1365,44 @@ cc_process_args(struct args *orig_args, struct args **preprocessor_args, args_add(dep_args, argv[i]); continue; } - if (i < argc - 1) { - if (str_startswith(argv[i], "-MF")) { - char *arg; - dependency_filename_specified = true; - free(output_dep); - args_add(dep_args, argv[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]; + if (str_startswith(argv[i], "-MF")) { + char *arg; + dependency_filename_specified = true; + free(output_dep); + args_add(dep_args, argv[i]); + if (strlen(argv[i]) == 3) { + /* -MF arg */ + if (i >= argc - 1) { + cc_log("Missing argument to %s", argv[i]); + stats_update(STATS_ARGS); + result = false; + goto out; } - output_dep = make_relative_path(x_strdup(arg)); - continue; - } else 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 */ - args_add(dep_args, argv[i + 1]); - i++; + 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; + } + 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 */ + if (i >= argc - 1) { + cc_log("Missing argument to %s", argv[i]); + stats_update(STATS_ARGS); + result = false; + goto out; } - continue; + args_add(dep_args, argv[i + 1]); + i++; } + continue; } if (str_startswith(argv[i], "-Wp,")) { if (str_startswith(argv[i], "-Wp,-MD,") && !strchr(argv[i] + 8, ',')) { diff --git a/test/test_argument_processing.c b/test/test_argument_processing.c index 4ebf93f54..75f3a2e8e 100644 --- a/test/test_argument_processing.c +++ b/test/test_argument_processing.c @@ -86,4 +86,55 @@ TEST(dependency_flags_that_take_an_argument_should_not_require_space_delimiter) args_free(orig); } +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"); + struct args *exp_cpp = args_init_from_string( + "cc -c -MMD -MTbar -MFfoo.d"); + 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(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"); + struct args *exp_cpp = args_init_from_string( + "cc -c -MMD -MFfoo.d -MTbar"); + 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(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"); + struct args *exp_cpp = args_init_from_string( + "cc -c -MMD -MFfoo.d -MQbar"); + 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 -- 2.47.2