]> git.ipfire.org Git - thirdparty/ccache.git/commitdiff
Merge branch 'maint'
authorJoel Rosdahl <joel@rosdahl.net>
Sun, 17 Apr 2011 16:48:37 +0000 (18:48 +0200)
committerJoel Rosdahl <joel@rosdahl.net>
Sun, 17 Apr 2011 16:48:37 +0000 (18:48 +0200)
* maint:
  Be bug compatible with GCC for -MTarg and -MQarg
  Log original command line
  Correctly handle -MF/-MT/-MQ with concatenated argument last on commandline

Conflicts:
test/test_argument_processing.c

1  2 
ccache.c
test/test_argument_processing.c

diff --cc ccache.c
index cf1882e7858a70d13c5bf651c8480ceee10eeea7,66d813b7eb40d2715dc4b266bc6ca956b5afc9b9..ce6982f2e80291b5bb4165af53a8d8778dbcf72a
+++ b/ccache.c
@@@ -1435,43 -1365,51 +1435,59 @@@ cc_process_args(struct args *orig_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")) {
+                       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++;
+                               /*
+                                * 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;
                }
 +              if (str_startswith(argv[i], "--sysroot=")) {
 +                      char *relpath = make_relative_path(x_strdup(argv[i] + 10));
 +                      char *option = format("--sysroot=%s", relpath);
 +                      args_add(stripped_args, option);
 +                      free(relpath);
 +                      free(option);
 +                      continue;
 +              }
                if (str_startswith(argv[i], "-Wp,")) {
                        if (str_startswith(argv[i], "-Wp,-MD,") && !strchr(argv[i] + 8, ',')) {
                                generating_dependencies = true;
index 7103c8dd3b3b29dc164feeea10a01e1e59262602,11f33f3a02e1b1f4df4a246e9fe3106727339ca3..a1fdb81689d79ed493093e31095747b6b4a8ae55
@@@ -72,9 -72,9 +72,9 @@@ TEST(dependency_flags_should_only_be_se
  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 -MMD -MFfoo.d -MTmt -MQmq");
 -              "cc -c -MMD -MFfoo.d -MT mt -MTmt -MQmq");
++              "cc -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", "");
        args_free(orig);
  }
  
 -              "cc -c -MMD -MT bar -MFfoo.d");
 +TEST(sysroot_should_be_rewritten_if_basedir_is_used)
 +{
 +      extern char *base_dir;
 +      extern char *current_working_dir;
 +      struct args *orig =
 +              args_init_from_string("cc --sysroot=/some/directory -c foo.c");
 +      struct args *act_cpp = NULL, *act_cc = NULL;
 +      create_file("foo.c", "");
 +
 +      CHECK(cc_process_args(orig, &act_cpp, &act_cc));
 +      CHECK_STR_EQ(act_cpp->argv[1], "--sysroot=/some/directory");
 +      args_free(act_cpp);
 +      args_free(act_cc);
 +      cc_reset();
 +
 +      base_dir = "/some";
 +      current_working_dir = get_cwd();
 +      CHECK(cc_process_args(orig, &act_cpp, &act_cc));
 +      CHECK(str_startswith(act_cpp->argv[1], "--sysroot=../"));
 +      args_free(orig);
 +      args_free(act_cpp);
 +      args_free(act_cc);
 +      cc_reset();
 +}
 +
+ 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 -MT bar -MFfoo.d");
+       struct args *exp_cpp = args_init_from_string(
 -              "cc -c -MMD -MFfoo.d -MT foo -MTbar");
++              "cc -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", "");
+       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 -MT foo -MTbar");
+       struct args *exp_cpp = args_init_from_string(
 -              "cc -c -MMD -MFfoo.d -MQ foo -MQbar");
++              "cc -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", "");
+       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 -MQ foo -MQbar");
+       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");
++              "cc -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", "");
+       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_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 -MT foo.d");
 -      struct args *exp_cc = args_init_from_string(
 -              "gcc -c");
++              "gcc -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 -MQfoo.d -MQ foo.o");
 -      struct args *exp_cc = args_init_from_string(
 -              "gcc -c");
++              "gcc -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 -MTfoo.d -MQ foo.o");
 -      struct args *exp_cc = args_init_from_string(
 -              "gcc -c");
++              "gcc -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 -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