I’m writing a program in C++ that is a wrapper for some benchmarks that contains some setup code at the beginning and analisys code in the end.
I want to run up to two benchmarks in parallel. The original commandlines for these are:
/path0/benchmark0 -switch0 -switch1 -switch2
/path1/benchmark1 -arg0 -arg1 -arg2 -arg4
And I want to put these on my wrapper’s commandline:
wrapper -setup_arg0 -setup_arg1 -analysis_arg0 --command0 /path0/benchmark0 -switch0 -switch1 -switch2 --command1 /path1/benchmark1 -arg0 -arg1 -arg2 -arg4
Where I want to get two std::vector<std::string>s, one for each of command0 and command1, containing the original commandlines. This is how I’m doing it (using boost::program_options):
("command0", po::value<std::vector< std::string> >(&command0)->multitoken(), "command line for thread 0")
("command1", po::value<std::vector< std::string> >(&command1)->multitoken(), "command line for thread 1")
and this basically works. However, if the benchmark’s arguments begin with - (as most switches on most programs I’ve seen do), the program_options tries to parse them as part of the wrapper’s switches, because it doesn’t know that they should be grouped together under command0 or command1.
Does program_options support that? If so, how?
Example:
Where I work there is a convention for doing this by “terminating” the multitoken like this:
wrapper <snip> --command0 /path0/benchmark0 -switch0 -switch1 -switch2 -command0-
(in this example I terminated --command0 with -command0-.)
How can I make program_options handle it like this?
I think it’s best if you take
command0andcommand1‘s values as a single string. e.g.,Yes, there’s more work for you in that you have to
wordexpyour respective command strings (unless you’re already just passing those strings straight to the shell ;-)), but it more cleanly separates out what’s for the wrapper and what’s for the invoked commands.