The Gaudi Framework  master (181af51f)
Loading...
Searching...
No Matches
GaudiMain.cpp
Go to the documentation of this file.
1/***********************************************************************************\
2* (c) Copyright 1998-2019 CERN for the benefit of the LHCb and ATLAS collaborations *
3* *
4* This software is distributed under the terms of the Apache version 2 licence, *
5* copied verbatim in the file "LICENSE". *
6* *
7* In applying this licence, CERN does not waive the privileges and immunities *
8* granted to it by virtue of its status as an Intergovernmental Organization *
9* or submit itself to any jurisdiction. *
10\***********************************************************************************/
11//------------------------------------------------------------------------------
12//
13// Description: Main Program for Gaudi applications
14//
15//------------------------------------------------------------------------------
16#include <Gaudi/Application.h>
17#include <gsl/span>
18#include <iostream>
19#include <string_view>
20#include <type_traits>
21
22extern "C" GAUDI_API int GaudiMain( int argc, char** argv ) {
24
25 std::string_view appType{ "Gaudi::Application" };
26 std::string_view optsFile;
27
28 gsl::span args{ argv, static_cast<std::remove_cv_t<decltype( gsl::dynamic_extent )>>( argc ) };
29
30 auto usage = [name = args[0]]( std::ostream& out ) -> std::ostream& {
31 return out << "usage: " << name << " [options] option_file\n";
32 };
33
34 auto arg = args.begin();
35 ++arg; // ignore application name
36 while ( arg != args.end() ) {
37 std::string_view opt{ *arg };
38 if ( opt == "--application" )
39 appType = *++arg;
40 else if ( opt == "-h" || opt == "--help" ) {
41 usage( std::cout );
42 std::cout << R"(
43Options:
44 -h, --help show this help message and exit
45 --application APPLICATION
46 name of the application class to use [default: Gaudi::Application]
47)";
48 return EXIT_SUCCESS;
49 } else if ( opt[0] == '-' ) {
50 std::cerr << "error: unknown option " << opt << '\n';
51 usage( std::cerr );
52 return EXIT_FAILURE;
53 } else {
54 optsFile = *arg++;
55 break; // we stop after the first positional argument
56 }
57 ++arg;
58 }
59 if ( arg != args.end() ) { std::cerr << "warning: ignoring extra positional arguments\n"; }
60 if ( optsFile.empty() ) {
61 std::cerr << "error: missing option file argument\n";
62 usage( std::cerr );
63 return EXIT_FAILURE;
64 }
65
66 if ( optsFile.size() > 3 && optsFile.substr( optsFile.size() - 3 ) == ".py" ) {
67 opts["ApplicationMgr.EvtSel"] = "NONE";
68 opts["ApplicationMgr.JobOptionsType"] = "NONE";
69 opts["ApplicationMgr.DLLs"] = "['GaudiPython']";
70 opts["ApplicationMgr.Runable"] = "PythonScriptingSvc";
71 } else {
72 opts["ApplicationMgr.JobOptionsPath"] = optsFile;
73 }
74
75 auto app = Gaudi::Application::create( appType, std::move( opts ) );
76 if ( !app ) {
77 std::cerr << "error: failure creating " << appType << '\n';
78 return EXIT_FAILURE;
79 }
80
81 return app->run();
82}
GAUDI_API int GaudiMain(int argc, char **argv)
Definition GaudiMain.cpp:22
#define GAUDI_API
Definition Kernel.h:49
create(cls, appType, opts)
Definition __init__.py:129
std::map< std::string, std::string > Options
Definition Application.h:29
void usage(const std::string &argv0)