The Gaudi Framework  master (da3d77e1)
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 
22 extern "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"(
43 Options:
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.Application.create
def create(cls, appType, opts)
Definition: __init__.py:127
Read.app
app
Definition: Read.py:36
std::move
T move(T... args)
plotBacklogPyRoot.argc
argc
Definition: plotBacklogPyRoot.py:173
gaudirun.opts
opts
Definition: gaudirun.py:336
std::ostream
STL class.
Application.h
std::map< std::string, std::string >
ConditionsStallTest.name
name
Definition: ConditionsStallTest.py:77
GaudiMain
GAUDI_API int GaudiMain(int argc, char **argv)
Definition: GaudiMain.cpp:22
usage
void usage(const std::string &argv0)
Definition: listcomponents.cpp:40
gaudirun.args
args
Definition: gaudirun.py:336
GAUDI_API
#define GAUDI_API
Definition: Kernel.h:81
gaudirun.argv
list argv
Definition: gaudirun.py:327
PrepareBase.out
out
Definition: PrepareBase.py:20