Author: zaroth
Date: Thu Jun 9 11:52:42 2011
New Revision: 49808
URL: http://svn.gna.org/viewcvs/wesnoth?rev=49808&view=rev
Log:
added --preprocess, --preprocess-defines and --preprocess-input-macros
to commandline_options
Modified:
trunk/src/commandline_options.cpp
trunk/src/game.cpp
trunk/src/tests/test_commandline_options.cpp
Modified: trunk/src/commandline_options.cpp
URL:
http://svn.gna.org/viewcvs/wesnoth/trunk/src/commandline_options.cpp?rev=49808&r1=49807&r2=49808&view=diff
==============================================================================
--- trunk/src/commandline_options.cpp (original)
+++ trunk/src/commandline_options.cpp Thu Jun 9 11:52:42 2011
@@ -19,6 +19,19 @@
#include "util.hpp"
namespace po = boost::program_options;
+
+class two_strings : public boost::tuple<std::string,std::string> {};
+
+void validate(boost::any& v, const std::vector<std::string>& values,
+ two_strings*, int)
+{
+ two_strings ret_val;
+ if (values.size() != 2)
+ throw
po::validation_error(po::validation_error::invalid_option_value);
+ ret_val.get<0>() = values.at(0);
+ ret_val.get<1>() = values.at(1);
+ v = ret_val;
+}
commandline_options::commandline_options ( int argc, char** argv ) :
bpp(),
@@ -107,6 +120,9 @@
("new-syntax", "enables the new campaign syntax parsing.")
("nocache", "disables caching of game data.")
("path", "prints the path to the data directory and exits.")
+ ("preprocess,p", po::value<two_strings>()->multitoken(),
"requires two arguments: <file/folder> <target directory>. Preprocesses a
specified file/folder. The preprocessed file(s) will be written in the
specified target directory: a plain cfg file and a processed cfg file.")
+ ("preprocess-defines", po::value<std::string>(), "comma
separated list of defines to be used by '--preprocess' command. If 'SKIP_CORE'
is in the define list the data/core won't be preprocessed. Example:
--preprocess-defines=FOO,BAR")
+ ("preprocess-input-macros", po::value<std::string>(), "used
only by the '--preprocess' command. Specifies source file <arg> that contains
[preproc_define]s to be included before preprocessing.")
("preprocess-output-macros",
po::value<std::string>()->implicit_value(std::string()), "used only by the
'--preprocess' command. Will output all preprocessed macros in the target file
<arg>. If the file is not specified the output will be file '_MACROS_.cfg' in
the target directory of preprocess's command.")
("rng-seed", po::value<unsigned int>(), "seeds the random
number generator with number <arg>. Example: --rng-seed 0")
("validcache", "assumes that the cache is valid. (dangerous)")
@@ -135,7 +151,8 @@
all_.add(visible_).add(hidden_);
po::variables_map vm;
- po::store(po::parse_command_line(argc_,argv_,all_),vm);
+ const int parsing_style = po::command_line_style::default_style ^
po::command_line_style::allow_guessing;
+ po::store(po::parse_command_line(argc_,argv_,all_,parsing_style),vm);
if (vm.count("ai-config"))
multiplayer_ai_config =
parse_to_int_string_tuples_(vm["ai-config"].as<std::vector<std::string> >());
@@ -175,6 +192,16 @@
nocache = true;
if (vm.count("path"))
path = true;
+ if (vm.count("preprocess"))
+ {
+ preprocess = true;
+ preprocess_path = vm["preprocess"].as<two_strings>().get<0>();
+ preprocess_target = vm["preprocess"].as<two_strings>().get<1>();
+ }
+ if (vm.count("preprocess-defines"))
+ preprocess_defines =
utils::split(vm["preprocess-defines"].as<std::string>(), ',');
+ if (vm.count("preprocess-input-macros"))
+ preprocess_input_macros =
vm["preprocess-input-macros"].as<std::string>();
if (vm.count("preprocess-output-macros"))
preprocess_output_macros =
vm["preprocess-output-macros"].as<std::string>();
if (vm.count("rng-seed"))
Modified: trunk/src/game.cpp
URL:
http://svn.gna.org/viewcvs/wesnoth/trunk/src/game.cpp?rev=49808&r1=49807&r2=49808&view=diff
==============================================================================
--- trunk/src/game.cpp (original)
+++ trunk/src/game.cpp Thu Jun 9 11:52:42 2011
@@ -167,6 +167,7 @@
game_config::wesnoth_program_dir = directory_name(program);
preprocess_options preproc;
+ // Options that don't change behaviour based on any others should be
checked alphabetically below.
if(cmdline_opts.config_dir) {
set_preferences_dir(*cmdline_opts.config_dir);
}
@@ -224,7 +225,31 @@
std::cout << game_config::path << "\n";
return 0;
}
- if (cmdline_opts.preprocess_output_macros) {
+ if(cmdline_opts.preprocess_input_macros) {
+ std::string file = *cmdline_opts.preprocess_input_macros;
+ if (file_exists(file) == false)
+ {
+ std::cerr << "please specify an existing file. File "<<
file <<" doesn't exist.\n";
+ return 1;
+ }
+
+ std::cerr << SDL_GetTicks() << " Reading cached defines from: "
<< file << "\n";
+
+ config cfg;
+ std::string error_log;
+ scoped_istream stream = istream_file(file);
+ read(cfg, *stream);
+
+ int read = 0;
+ // use static preproc_define::read_pair(config) to make a object
+ foreach (const config::any_child &value,
cfg.all_children_range()) {
+ const preproc_map::value_type def =
preproc_define::read_pair(value.cfg);
+ preproc.input_macros_[def.first] = def.second;
+ ++read;
+ }
+ std::cerr << SDL_GetTicks() << " Read " << read << "
defines.\n";
+ }
+ if(cmdline_opts.preprocess_output_macros) {
if (cmdline_opts.preprocess_output_macros->empty())
preproc.output_macros_path_ = "true";
else
@@ -235,6 +260,100 @@
}
if(cmdline_opts.version) {
std::cout << "Battle for Wesnoth" << " " <<
game_config::version << "\n";
+ return 0;
+ }
+
+ // Options changing their behaviour dependant on some others should be
checked below.
+
+ //TODO should be rewritten so that preprocess_input_macros and
preprocess_output_macros are used inside, not before
+ if (cmdline_opts.preprocess) {
+ const std::string
resourceToProcess(*cmdline_opts.preprocess_path);
+ const std::string targetDir(*cmdline_opts.preprocess_target);
+
+ Uint32 startTime = SDL_GetTicks();
+ // if the users add the SKIP_CORE define we won't preprocess
data/core
+ bool skipCore = false;
+ bool skipTerrainGFX = false;
+ // the 'core_defines_map' is the one got from data/core macros
+ preproc_map defines_map(preproc.input_macros_);
+ std::string error_log;
+
+ if (cmdline_opts.preprocess_defines)
+ {
+ // add the specified defines
+ foreach (const std::string &define,
*cmdline_opts.preprocess_defines)
+ {
+ if (define.empty()){
+ std::cerr << "empty define supplied\n";
+ continue;
+ }
+
+ LOG_PREPROC<<"adding define: "<< define<<'\n';
+ defines_map.insert(std::make_pair(define,
+ preproc_define(define)));
+ if (define == "SKIP_CORE")
+ {
+ std::cerr << "'SKIP_CORE' defined.\n";
+ skipCore = true;
+ }
+ else if (define == "NO_TERRAIN_GFX")
+ {
+ std::cerr << "'NO_TERRAIN_GFX'
defined.\n";
+ skipTerrainGFX = true;
+ }
+ }
+ }
+
+ std::cerr << "added " << defines_map.size() << " defines.\n";
+
+ // preprocess core macros first if we don't skip the core
+ if (skipCore == false)
+ {
+ std::cerr << "preprocessing common macros from
'data/core' ...\n";
+
+ // process each folder explicitly to gain speed
+ preprocess_resource(game_config::path +
"/data/core/macros",&defines_map);
+ if (skipTerrainGFX == false)
+ preprocess_resource(game_config::path +
"/data/core/terrain-graphics",&defines_map);
+
+ std::cerr << "acquired " << (defines_map.size() -
preproc.input_macros_.size())
+ << " 'data/core' defines.\n";
+ }
+ else
+ std::cerr << "skipped 'data/core'\n";
+
+ // preprocess resource
+ std::cerr << "preprocessing specified resource: "
+ << resourceToProcess << " ...\n";
+ preprocess_resource(resourceToProcess, &defines_map, true,true,
targetDir);
+ std::cerr << "acquired " << (defines_map.size() -
preproc.input_macros_.size())
+ << " total defines.\n";
+
+ if (preproc.output_macros_path_ != "false")
+ {
+ std::string outputPath = targetDir + "/_MACROS_.cfg";
+ if (preproc.output_macros_path_ != "true")
+ outputPath = preproc.output_macros_path_;
+
+ std::cerr << "writing '" << outputPath << "' with "
+ << defines_map.size() << "
defines.\n";
+
+ scoped_ostream out = ostream_file(outputPath);
+ if (!out->fail())
+ {
+ config_writer writer(*out,false);
+
+ for(preproc_map::iterator itor =
defines_map.begin();
+ itor != defines_map.end(); ++itor)
+ {
+ (*itor).second.write(writer,
(*itor).first);
+ }
+ }
+ else
+ std::cerr << "couldn't open the file.\n";
+ }
+
+ std::cerr << "preprocessing finished. Took "<< SDL_GetTicks() -
startTime << " ticks.\n";
return 0;
}
@@ -275,146 +394,6 @@
return 2;
}
p = q;
- }
- } else if (val == "--preprocess-input-macros") {
- if (arg + 1 < argc)
- {
- ++arg;
- std::string file = argv[arg];
- if (file_exists(file) == false)
- {
- std::cerr << "please specify an
existing file. File "<< file <<" doesn't exist.\n";
- return 1;
- }
-
- std::cerr << SDL_GetTicks() << " Reading cached
defines from: " << file << "\n";
-
- config cfg;
- std::string error_log;
- scoped_istream stream = istream_file(file);
- read(cfg, *stream);
-
- int read = 0;
- // use static preproc_define::read_pair(config)
to make a object
- foreach (const config::any_child &value,
cfg.all_children_range()) {
- const preproc_map::value_type def =
preproc_define::read_pair(value.cfg);
- preproc.input_macros_[def.first] =
def.second;
- ++read;
- }
- std::cerr << SDL_GetTicks() << " Read " << read
<< " defines.\n";
- }
- else {
- std::cerr << "please specify input macros
file.\n";
- return 2;
- }
- } else if (val.find("--preprocess") == 0 || val.find("-p") ==
0){
- if (arg + 2 < argc){
- ++arg;
- const std::string resourceToProcess(argv[arg]);
- ++arg;
- const std::string targetDir(argv[arg]);
-
- Uint32 startTime = SDL_GetTicks();
- // if the users add the SKIP_CORE define we
won't preprocess data/core
- bool skipCore = false;
- bool skipTerrainGFX = false;
- // the 'core_defines_map' is the one got from
data/core macros
- preproc_map defines_map(preproc.input_macros_);
- std::string error_log;
-
- // add the specified defines
- size_t pos=std::string::npos;
- if (val.find("--preprocess=") == 0)
- pos = val.find("=");
- else if (val.find("-p=") == 0)
- pos = val.find("=");
-
- // we have some defines specified
- if (pos != std::string::npos)
- {
- std::string tmp_val = val.substr(pos+1);
- while (pos != std::string::npos)
- {
- size_t tmpPos = val.find(',',
pos+1);
- tmp_val = val.substr(pos + 1,
- tmpPos ==
std::string::npos ? tmpPos : tmpPos - (pos+1));
- pos = tmpPos;
-
- if (tmp_val.empty()){
- std::cerr << "empty
define supplied\n";
- continue;
- }
-
- LOG_PREPROC<<"adding define:
"<< tmp_val<<'\n';
-
defines_map.insert(std::make_pair(tmp_val,
-
preproc_define(tmp_val)));
- if (tmp_val == "SKIP_CORE")
- {
- std::cerr <<
"'SKIP_CORE' defined.\n";
- skipCore = true;
- }
- else if (tmp_val ==
"NO_TERRAIN_GFX")
- {
- std::cerr <<
"'NO_TERRAIN_GFX' defined.\n";
- skipTerrainGFX = true;
- }
- }
- std::cerr << "added " <<
defines_map.size() << " defines.\n";
- }
-
- // preprocess core macros first if we don't
skip the core
- if (skipCore == false)
- {
- std::cerr << "preprocessing common
macros from 'data/core' ...\n";
-
- // process each folder explicitly to
gain speed
- preprocess_resource(game_config::path +
"/data/core/macros",&defines_map);
- if (skipTerrainGFX == false)
-
preprocess_resource(game_config::path +
"/data/core/terrain-graphics",&defines_map);
-
- std::cerr << "acquired " <<
(defines_map.size() - preproc.input_macros_.size())
- << " 'data/core' defines.\n";
- }
- else
- std::cerr << "skipped 'data/core'\n";
-
- // preprocess resource
- std::cerr << "preprocessing specified resource:
"
- << resourceToProcess << "
...\n";
- preprocess_resource(resourceToProcess,
&defines_map, true,true, targetDir);
- std::cerr << "acquired " << (defines_map.size()
- preproc.input_macros_.size())
- << " total defines.\n";
-
- if (preproc.output_macros_path_ != "false")
- {
- std::string outputPath = targetDir +
"/_MACROS_.cfg";
- if (preproc.output_macros_path_ !=
"true")
- outputPath =
preproc.output_macros_path_;
-
- std::cerr << "writing '" << outputPath
<< "' with "
- << defines_map.size()
<< " defines.\n";
-
- scoped_ostream out =
ostream_file(outputPath);
- if (!out->fail())
- {
- config_writer
writer(*out,false);
-
- for(preproc_map::iterator itor
= defines_map.begin();
- itor !=
defines_map.end(); ++itor)
- {
-
(*itor).second.write(writer, (*itor).first);
- }
- }
- else
- std::cerr << "couldn't open the
file.\n";
- }
-
- std::cerr << "preprocessing finished. Took "<<
SDL_GetTicks() - startTime << " ticks.\n";
- return 0;
- }
- else{
- std::cerr << "Please specify a source
file/folder and a target folder\n";
- return 2;
}
}
}
Modified: trunk/src/tests/test_commandline_options.cpp
URL:
http://svn.gna.org/viewcvs/wesnoth/trunk/src/tests/test_commandline_options.cpp?rev=49808&r1=49807&r2=49808&view=diff
==============================================================================
--- trunk/src/tests/test_commandline_options.cpp (original)
+++ trunk/src/tests/test_commandline_options.cpp Thu Jun 9 11:52:42 2011
@@ -195,6 +195,9 @@
"--new-widgets",
"--nocache",
"--path",
+ "--preprocess", "preppathfoo", "preptargfoo",
+ "--preprocess-defines=DEFFOO,DEFBAR",
+ "--preprocess-input-macros=inmfoo",
"--preprocess-output-macros=outmfoo",
"--rng-seed=1234",
"--validcache",
@@ -228,9 +231,9 @@
BOOST_CHECK(co.logdomains && *co.logdomains == "filterfoo");
BOOST_CHECK(co.multiplayer);
BOOST_CHECK(co.multiplayer_ai_config);
- BOOST_CHECK((*co.multiplayer_ai_config).size() == 2);
- BOOST_CHECK((*co.multiplayer_ai_config)[0].get<0>() == 1 &&
(*co.multiplayer_ai_config)[0].get<1>() == "aifoo");
- BOOST_CHECK((*co.multiplayer_ai_config)[1].get<0>() == 2 &&
(*co.multiplayer_ai_config)[1].get<1>() == "aibar");
+ BOOST_CHECK(co.multiplayer_ai_config->size() == 2);
+ BOOST_CHECK(co.multiplayer_ai_config->at(0).get<0>() == 1 &&
co.multiplayer_ai_config->at(0).get<1>() == "aifoo");
+ BOOST_CHECK(co.multiplayer_ai_config->at(1).get<0>() == 2 &&
co.multiplayer_ai_config->at(1).get<1>() == "aibar");
BOOST_CHECK(!co.multiplayer_algorithm);
BOOST_CHECK(!co.multiplayer_controller);
BOOST_CHECK(!co.multiplayer_era);
@@ -248,12 +251,12 @@
BOOST_CHECK(co.new_syntax);
BOOST_CHECK(co.new_widgets);
BOOST_CHECK(co.path);
- BOOST_CHECK(!co.preprocess);
- BOOST_CHECK(!co.preprocess_defines);
- BOOST_CHECK(!co.preprocess_input_macros);
+ BOOST_CHECK(co.preprocess && co.preprocess_path &&
co.preprocess_target);
+ BOOST_CHECK(*co.preprocess_path == "preppathfoo" &&
*co.preprocess_target == "preptargfoo");
+ BOOST_CHECK(co.preprocess_defines && co.preprocess_defines->size() ==
2);
+ BOOST_CHECK(co.preprocess_defines->at(0) == "DEFFOO" &&
co.preprocess_defines->at(1) == "DEFBAR");
+ BOOST_CHECK(co.preprocess_input_macros && *co.preprocess_input_macros
== "inmfoo");
BOOST_CHECK(co.preprocess_output_macros && *co.preprocess_output_macros
== "outmfoo");
- BOOST_CHECK(!co.preprocess_path);
- BOOST_CHECK(!co.preprocess_target);
BOOST_CHECK(!co.proxy);
BOOST_CHECK(!co.proxy_address);
BOOST_CHECK(!co.proxy_password);
_______________________________________________
Wesnoth-commits mailing list
[email protected]
https://mail.gna.org/listinfo/wesnoth-commits