From: Joel Rosdahl Date: Tue, 5 May 2020 12:59:06 +0000 (+0200) Subject: C++-ify -optf/--options-file processing in process_arg X-Git-Tag: v4.0~499 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=c88ead97a67c511f0be3a2395b7aa01ee01e6bc3;p=thirdparty%2Fccache.git C++-ify -optf/--options-file processing in process_arg This also makes the implementation acually work with multiple option files delimited by commas. --- diff --git a/src/argprocessing.cpp b/src/argprocessing.cpp index 29ca36cf8..b36222c25 100644 --- a/src/argprocessing.cpp +++ b/src/argprocessing.cpp @@ -243,35 +243,23 @@ process_arg(Context& ctx, // Handle cuda "-optf" and "--options-file" argument. if (ctx.guessed_compiler == GuessedCompiler::nvcc - && (str_eq(argv[i], "-optf") || str_eq(argv[i], "--options-file"))) { - if (i == argc - 1) { - cc_log("Expected argument after %s", argv[i]); + && (args[i] == "-optf" || args[i] == "--options-file")) { + if (i == args.size() - 1) { + cc_log("Expected argument after %s", args[i].c_str()); return STATS_ARGS; } ++i; // Argument is a comma-separated list of files. - const char* str_start = argv[i]; - const char* str_end = strchr(str_start, ','); - size_t index = i + 1; - - if (!str_end) { - str_end = str_start + strlen(str_start); - } - - while (str_end) { - std::string path(str_start, str_end - str_start); - auto file_args = args_init_from_gcc_atfile(path); + auto paths = Util::split_into_strings(args[i], ","); + for (auto it = paths.rbegin(); it != paths.rend(); ++it) { + auto file_args = args_init_from_gcc_atfile(*it); if (!file_args) { - cc_log("Couldn't read cuda options file %s", path.c_str()); + cc_log("Couldn't read CUDA options file %s", it->c_str()); return STATS_ARGS; } - size_t new_index = file_args->size() + index; - args_insert(args, index, *file_args, false); - index = new_index; - str_start = str_end; - str_end = strchr(str_start, ','); + args.insert(i + 1, *file_args); } return nullopt; diff --git a/unittest/test_argument_processing.cpp b/unittest/test_argument_processing.cpp index 678029458..7e4f862c8 100644 --- a/unittest/test_argument_processing.cpp +++ b/unittest/test_argument_processing.cpp @@ -639,4 +639,26 @@ TEST(options_not_to_be_passed_to_the_preprocesor) CHECK_ARGS_EQ_FREE12(exp_cc, act_cc); } +TEST(cuda_option_file) +{ + Context ctx; + ctx.guessed_compiler = GuessedCompiler::nvcc; + + ctx.orig_args = Args::from_string("nvcc -optf foo.optf,bar.optf"); + Args exp_cpp = args_init_from_string("nvcc -g -Wall -DX"); + Args exp_extra = args_init_from_string(""); + Args exp_cc = args_init_from_string("nvcc -g -Wall -DX -c"); + Args act_cpp; + Args act_extra; + Args act_cc; + + create_file("foo.c", ""); + create_file("foo.optf", "-c foo.c -g -Wall -o"); + create_file("bar.optf", "out -DX"); + CHECK(!process_args(ctx, act_cpp, act_extra, act_cc)); + CHECK_ARGS_EQ_FREE12(exp_cpp, act_cpp); + CHECK_ARGS_EQ_FREE12(exp_extra, act_extra); + CHECK_ARGS_EQ_FREE12(exp_cc, act_cc); +} + TEST_SUITE_END