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 */
}
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 (!dependency_target_specified) {
- args_add(dep_args, "-MT");
+ args_add(dep_args, "-MQ");
args_add(dep_args, output_obj);
}
}
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", "");
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", "");
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", "");
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", "");
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