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;
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