From c56840f03cf139d60c6d90b55cf16e70f6ae2bc2 Mon Sep 17 00:00:00 2001 From: Trygve Laugstøl Date: Sun, 21 Jun 2015 00:15:04 +0200 Subject: o Going all header file based and single-executable to launch all apps. o Ading CMake magic to generate the launcher --- apps/launcher.cpp | 94 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 94 insertions(+) create mode 100644 apps/launcher.cpp (limited to 'apps/launcher.cpp') diff --git a/apps/launcher.cpp b/apps/launcher.cpp new file mode 100644 index 0000000..dc31abd --- /dev/null +++ b/apps/launcher.cpp @@ -0,0 +1,94 @@ +#include "apps.h" +#include "apps-list.gen.h" +#include +#include +#include + +using namespace trygvis::apps; +using namespace std; + +const po::options_description logging_options() { + po::options_description desc; + + return desc; +} + +void setup_logging(po::variables_map vm) { + Appender *console = new ConsoleAppender(true, true); + PatternLayout *layout = new PatternLayout(LOG4CPLUS_TEXT("%-5p" /*" %6r"*/ " %-20c %m%n")); + console->setLayout(auto_ptr(layout)); + + Hierarchy &h = Logger::getDefaultHierarchy(); + h.getRoot().addAppender(SharedAppenderPtr(console)); +} + +template +int launch_app(int argc, const char *argv[]) { + App app; + + po::options_description all("Options"); + + auto all_options = all.add_options(); + app.add_options(all_options); + + all.add(logging_options()); + app.add_extra_options(all); + + po::variables_map vm; + + try { + auto parsed = po::parse_command_line(argc, argv, all); + po::store(parsed, vm); + + po::notify(vm); + + auto unrecognized = po::collect_unrecognized(parsed.options, po::include_positional); + + if (vm.count("help")) { + cerr << all << "\n"; + return EXIT_FAILURE; + } + + if (unrecognized.size()) { + cerr << "Unrecognized option: " << unrecognized.at(0) << "\n"; + return EXIT_FAILURE; + } + + setup_logging(vm); + + Logger logger = Logger::getInstance(LOG4CPLUS_TEXT(app.app_name)); + + app_execution execution(all, vm, logger); + + return app.main(execution); + } catch (po::required_option &e) { + cerr << "Missing required option: " << e.get_option_name() << endl; + cerr << all << endl; + return EXIT_FAILURE; + } catch (po::unknown_option &e) { + cerr << e.what() << endl; + return EXIT_FAILURE; + } +} + +int main(int argc, const char *argv[]) { + if (argc == 0) { + return EXIT_FAILURE; + } + + string app_name; + if (boost::ends_with(argv[0], "launcher")) { + if (argc <= 1) { + cerr << "Missing required argument: app" << endl; + return EXIT_FAILURE; + } + + app_name = argv[1]; + --argc; + argv = &argv[1]; + } else { + app_name = argv[0]; + } + + return launch(app_name, argc, argv); +} -- cgit v1.2.3