continue;
}
- /* Same as above but options with concatenated argument. */
+ /* Same as above but short options with concatenated argument. */
if (compopt_short(compopt_takes_path, argv[i])) {
char *relpath;
char *option;
continue;
}
+ /* Same as above but long options with concatenated argument beginning with
+ * a slash. */
+ if (argv[i][0] == '-') {
+ char *slash_pos = strchr(argv[i], '/');
+ if (slash_pos) {
+ char *option = x_strndup(argv[i], slash_pos - argv[i]);
+ if (compopt_affects_cpp(option)) {
+ if (compopt_takes_concat_arg(option)) {
+ char *relpath = make_relative_path(x_strdup(slash_pos));
+ args_add(cpp_args, option);
+ args_add(cpp_args, relpath);
+ free(relpath);
+ } else {
+ args_add(cpp_args, argv[i]);
+ }
+ } else {
+ args_add(stripped_args, argv[i]);
+ }
+
+ free(option);
+ continue;
+ }
+ }
+
/* options that take an argument */
if (compopt_takes_arg(argv[i])) {
if (i == argc-1) {
{"-fplugin=libcc1plugin", TOO_HARD}, /* interaction with GDB */
{"-frepo", TOO_HARD},
{"-fworking-directory", AFFECTS_CPP},
- {"-idirafter", AFFECTS_CPP | TAKES_ARG | TAKES_PATH},
+ {"-idirafter", AFFECTS_CPP | TAKES_ARG | TAKES_CONCAT_ARG | TAKES_PATH},
{"-iframework", AFFECTS_CPP | TAKES_ARG | TAKES_CONCAT_ARG | TAKES_PATH},
- {"-imacros", AFFECTS_CPP | TAKES_ARG | TAKES_PATH},
- {"-imultilib", AFFECTS_CPP | TAKES_ARG | TAKES_PATH},
- {"-include", AFFECTS_CPP | TAKES_ARG | TAKES_PATH},
- {"-include-pch", AFFECTS_CPP | TAKES_ARG | TAKES_PATH},
+ {"-imacros", AFFECTS_CPP | TAKES_ARG | TAKES_CONCAT_ARG | TAKES_PATH},
+ {"-imultilib", AFFECTS_CPP | TAKES_ARG | TAKES_CONCAT_ARG | TAKES_PATH},
+ {"-include", AFFECTS_CPP | TAKES_ARG | TAKES_CONCAT_ARG | TAKES_PATH},
+ {"-include-pch", AFFECTS_CPP | TAKES_ARG | TAKES_CONCAT_ARG | TAKES_PATH},
{"-install_name", TAKES_ARG}, /* Darwin linker option */
- {"-iprefix", AFFECTS_CPP | TAKES_ARG | TAKES_PATH},
- {"-iquote", AFFECTS_CPP | TAKES_ARG | TAKES_PATH},
- {"-isysroot", AFFECTS_CPP | TAKES_ARG | TAKES_PATH},
- {"-isystem", AFFECTS_CPP | TAKES_ARG | TAKES_PATH},
- {"-iwithprefix", AFFECTS_CPP | TAKES_ARG | TAKES_PATH},
- {"-iwithprefixbefore", AFFECTS_CPP | TAKES_ARG | TAKES_PATH},
+ {"-iprefix", AFFECTS_CPP | TAKES_ARG | TAKES_CONCAT_ARG | TAKES_PATH},
+ {"-iquote", AFFECTS_CPP | TAKES_ARG | TAKES_CONCAT_ARG | TAKES_PATH},
+ {"-isysroot", AFFECTS_CPP | TAKES_ARG | TAKES_CONCAT_ARG | TAKES_PATH},
+ {"-isystem", AFFECTS_CPP | TAKES_ARG | TAKES_CONCAT_ARG | TAKES_PATH},
+ {"-iwithprefix", AFFECTS_CPP | TAKES_ARG | TAKES_CONCAT_ARG | TAKES_PATH},
+ {"-iwithprefixbefore",
+ AFFECTS_CPP | TAKES_ARG | TAKES_CONCAT_ARG | TAKES_PATH},
{"-nostdinc", AFFECTS_CPP},
{"-nostdinc++", AFFECTS_CPP},
{"-remap", AFFECTS_CPP},
{"-save-temps", TOO_HARD},
{"-stdlib=", AFFECTS_CPP | TAKES_CONCAT_ARG},
{"-trigraphs", AFFECTS_CPP},
- {"-u", TAKES_ARG},
+ {"-u", TAKES_ARG | TAKES_CONCAT_ARG},
};
return co && (co->type & TAKES_ARG);
}
+bool
+compopt_takes_concat_arg(const char *option)
+{
+ const struct compopt *co = find(option);
+ return co && (co->type & TAKES_CONCAT_ARG);
+}
+
/* Determines if the prefix of the option matches any option and affects the
* preprocessor.
*/
/*
- * Copyright (C) 2010-2015 Joel Rosdahl
+ * Copyright (C) 2010-2016 Joel Rosdahl
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the Free
args_free(orig);
}
+TEST(isystem_flag_with_separate_arg_should_be_rewritten_if_basedir_is_used)
+{
+ extern char *current_working_dir;
+ char *arg_string;
+ struct args *orig;
+ struct args *act_cpp = NULL, *act_cc = NULL;
+
+ create_file("foo.c", "");
+ free(conf->base_dir);
+ conf->base_dir = x_strdup("/");
+ current_working_dir = get_cwd();
+ arg_string = format("cc -isystem %s/foo -c foo.c", current_working_dir);
+ orig = args_init_from_string(arg_string);
+
+ CHECK(cc_process_args(orig, &act_cpp, &act_cc));
+ CHECK_STR_EQ("./foo", act_cpp->argv[2]);
+
+ args_free(orig);
+ args_free(act_cpp);
+ args_free(act_cc);
+}
+
+TEST(isystem_flag_with_concat_arg_should_be_rewritten_if_basedir_is_used)
+{
+ extern char *current_working_dir;
+ char *arg_string;
+ struct args *orig;
+ struct args *act_cpp = NULL, *act_cc = NULL;
+
+ create_file("foo.c", "");
+ free(conf->base_dir);
+ conf->base_dir = x_strdup("/");
+ current_working_dir = get_cwd();
+ arg_string = format("cc -isystem%s/foo -c foo.c", current_working_dir);
+ orig = args_init_from_string(arg_string);
+
+ CHECK(cc_process_args(orig, &act_cpp, &act_cc));
+ CHECK_STR_EQ("-isystem", act_cpp->argv[1]);
+ CHECK_STR_EQ("./foo", act_cpp->argv[2]);
+
+ args_free(orig);
+ args_free(act_cpp);
+ args_free(act_cc);
+}
+
TEST_SUITE_END