X-Git-Url: https://git.lizzy.rs/?a=blobdiff_plain;ds=sidebyside;f=src%2Fmain.cpp;h=35dcb708b2634ffe7ef933e61746c141aefba13f;hb=a2a280691c76d37ab1cbceb9571364d7551c0dea;hp=ca95ef874bd3826a35eb1b235f6759f9735fe2b6;hpb=bf22569019749e421e8ffe0a73cff988a9a9c846;p=minetest.git diff --git a/src/main.cpp b/src/main.cpp index ca95ef874..35dcb708b 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -20,6 +20,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "irrlichttypes.h" // must be included before anything irrlicht, see comment in the file #include "irrlicht.h" // createDevice #include "irrlichttypes_extrabloated.h" +#include "benchmark/benchmark.h" #include "chat_interface.h" #include "debug.h" #include "unittest/test.h" @@ -65,15 +66,28 @@ extern "C" { #error Minetest cannot be built without exceptions or RTTI #endif +#if defined(__MINGW32__) && !defined(__MINGW64__) && !defined(__clang__) && \ + (__GNUC__ < 11 || (__GNUC__ == 11 && __GNUC_MINOR__ < 1)) +// see e.g. https://github.com/minetest/minetest/issues/10137 +#warning ================================== +#warning 32-bit MinGW gcc before 11.1 has known issues with crashes on thread exit, you should upgrade. +#warning ================================== +#endif + #define DEBUGFILE "debug.txt" #define DEFAULT_SERVER_PORT 30000 +#define ENV_NO_COLOR "NO_COLOR" +#define ENV_CLICOLOR "CLICOLOR" +#define ENV_CLICOLOR_FORCE "CLICOLOR_FORCE" + typedef std::map OptionList; /********************************************************************** * Private functions **********************************************************************/ +static void get_env_opts(Settings &args); static bool get_cmdline_opts(int argc, char *argv[], Settings *cmd_args); static void set_allowed_options(OptionList *allowed_options); @@ -127,6 +141,7 @@ int main(int argc, char *argv[]) g_logger.addOutputMaxLevel(&stderr_output, LL_ACTION); Settings cmd_args; + get_env_opts(cmd_args); bool cmd_args_ok = get_cmdline_opts(argc, argv, &cmd_args); if (!cmd_args_ok || cmd_args.getFlag("help") @@ -204,7 +219,19 @@ int main(int argc, char *argv[]) return 1; #endif } + + // Run benchmarks + if (cmd_args.getFlag("run-benchmarks")) { +#if BUILD_BENCHMARKS + return run_benchmarks(); +#else + errorstream << "Benchmark support is not enabled in this binary. " + << "If you want to enable it, compile project with BUILD_BENCHMARKS=1 flag." + << std::endl; + return 1; #endif + } +#endif // __ANDROID__ GameStartData game_params; #ifdef SERVER @@ -248,6 +275,29 @@ int main(int argc, char *argv[]) *****************************************************************************/ +static void get_env_opts(Settings &args) +{ + // CLICOLOR is a de-facto standard option for colors + // CLICOLOR != 0: ANSI colors are supported (auto-detection, this is the default) + // CLICOLOR == 0: ANSI colors are NOT supported + const char *clicolor = std::getenv(ENV_CLICOLOR); + if (clicolor && std::string(clicolor) == "0") { + args.set("color", "never"); + } + // NO_COLOR only specifies that no color is allowed. + // Implemented according to + const char *no_color = std::getenv(ENV_NO_COLOR); + if (no_color && no_color[0]) { + args.set("color", "never"); + } + // CLICOLOR_FORCE is another option, which should turn on colors "no matter what". + const char *clicolor_force = std::getenv(ENV_CLICOLOR_FORCE); + if (clicolor_force && std::string(clicolor_force) != "0") { + // should ALWAYS have colors, so we ignore tty (no "auto") + args.set("color", "always"); + } +} + static bool get_cmdline_opts(int argc, char *argv[], Settings *cmd_args) { set_allowed_options(&allowed_options); @@ -269,6 +319,8 @@ static void set_allowed_options(OptionList *allowed_options) _("Set network port (UDP)")))); allowed_options->insert(std::make_pair("run-unittests", ValueSpec(VALUETYPE_FLAG, _("Run the unit tests and exit")))); + allowed_options->insert(std::make_pair("run-benchmarks", ValueSpec(VALUETYPE_FLAG, + _("Run the benchmarks and exit")))); allowed_options->insert(std::make_pair("map-dir", ValueSpec(VALUETYPE_STRING, _("Same as --world (deprecated)")))); allowed_options->insert(std::make_pair("world", ValueSpec(VALUETYPE_STRING, @@ -337,12 +389,14 @@ static void print_help(const OptionList &allowed_options) static void print_allowed_options(const OptionList &allowed_options) { for (const auto &allowed_option : allowed_options) { - std::ostringstream os1(std::ios::binary); - os1 << " --" << allowed_option.first; + std::string opt = " --" + allowed_option.first; if (allowed_option.second.type != VALUETYPE_FLAG) - os1 << _(" "); + opt += _(" "); - std::cout << padStringRight(os1.str(), 30); + std::string opt_padded = padStringRight(opt, 30); + std::cout << opt_padded; + if (opt == opt_padded) // Line is too long to pad + std::cout << std::endl << padStringRight("", 30); if (allowed_option.second.help) std::cout << allowed_option.second.help; @@ -432,7 +486,7 @@ static bool setup_log_params(const Settings &cmd_args) color_mode = color_mode_env; #endif } - if (color_mode != "") { + if (!color_mode.empty()) { if (color_mode == "auto") { Logger::color_mode = LOG_COLOR_AUTO; } else if (color_mode == "always") { @@ -445,14 +499,6 @@ static bool setup_log_params(const Settings &cmd_args) } } - // If trace is enabled, enable logging of certain things - if (cmd_args.getFlag("trace")) { - dstream << _("Enabling trace level debug output") << std::endl; - g_logger.setTraceEnabled(true); - dout_con_ptr = &verbosestream; // This is somewhat old - socket_enable_debug_output = true; // Sockets doesn't use log.h - } - // In certain cases, output info level on stderr if (cmd_args.getFlag("info") || cmd_args.getFlag("verbose") || cmd_args.getFlag("trace") || cmd_args.getFlag("speedtests")) @@ -462,6 +508,12 @@ static bool setup_log_params(const Settings &cmd_args) if (cmd_args.getFlag("verbose") || cmd_args.getFlag("trace")) g_logger.addOutput(&stderr_output, LL_VERBOSE); + if (cmd_args.getFlag("trace")) { + dstream << _("Enabling trace level debug output") << std::endl; + g_logger.addOutput(&stderr_output, LL_TRACE); + socket_enable_debug_output = true; + } + return true; } @@ -477,7 +529,7 @@ static bool create_userdata_path() } #else // Create user data directory - success = fs::CreateDir(porting::path_user); + success = fs::CreateAllDirs(porting::path_user); #endif return success; @@ -536,7 +588,7 @@ static void startup_message() static bool read_config_file(const Settings &cmd_args) { // Path of configuration file in use - sanity_check(g_settings_path == ""); // Sanity check + sanity_check(g_settings_path.empty()); // Sanity check if (cmd_args.exists("config")) { bool r = g_settings->readConfigFile(cmd_args.get("config").c_str()); @@ -591,7 +643,7 @@ static void init_log_streams(const Settings &cmd_args) warningstream << "Deprecated use of debug_log_level with an " "integer value; please update your configuration." << std::endl; static const char *lev_name[] = - {"", "error", "action", "info", "verbose"}; + {"", "error", "action", "info", "verbose", "trace"}; int lev_i = atoi(conf_loglev.c_str()); if (lev_i < 0 || lev_i >= (int)ARRLEN(lev_name)) { warningstream << "Supplied invalid debug_log_level!" @@ -743,7 +795,7 @@ static bool auto_select_world(GameParams *game_params) << world_path << "]" << std::endl; } - assert(world_path != ""); // Post-condition + assert(!world_path.empty()); // Post-condition game_params->world_path = world_path; return true; } @@ -799,7 +851,7 @@ static bool determine_subgame(GameParams *game_params) { SubgameSpec gamespec; - assert(game_params->world_path != ""); // Pre-condition + assert(!game_params->world_path.empty()); // Pre-condition // If world doesn't exist if (!game_params->world_path.empty() @@ -1081,14 +1133,16 @@ static bool recompress_map_database(const GameParams &game_params, const Setting iss.str(data); iss.clear(); - MapBlock mb(nullptr, v3s16(0,0,0), &server); - u8 ver = readU8(iss); - mb.deSerialize(iss, ver, true); + { + MapBlock mb(nullptr, v3s16(0,0,0), &server); + u8 ver = readU8(iss); + mb.deSerialize(iss, ver, true); - oss.str(""); - oss.clear(); - writeU8(oss, serialize_as_ver); - mb.serialize(oss, serialize_as_ver, true, -1); + oss.str(""); + oss.clear(); + writeU8(oss, serialize_as_ver); + mb.serialize(oss, serialize_as_ver, true, -1); + } db->saveBlock(*it, oss.str());