35#include <boost/algorithm/string/predicate.hpp>
36#include <boost/filesystem/operations.hpp>
37#include <boost/program_options.hpp>
52using log4cpp::Priority;
105 log.warn() <<
"The " <<
conf_name <<
" default configuration file cannot be found in:";
107 log.warn() <<
" " <<
loc;
111 log.warn() <<
"Trying " <<
conf_name <<
".";
117 log.debug() <<
"Couldn't find " <<
conf_name <<
" default configuration file.";
127 Path::Item
full_path = getExecutablePath();
134 Path::Item
full_path = getExecutablePath();
139template <
class charT>
144 if (
o.string_key ==
"config-file") {
145 if (
o.value.
size() != 1) {
146 cerr <<
"Wrong usage of the --config-file option" << endl;
151 cerr <<
"The " <<
conf_file <<
" configuration file doesn't exist!" << endl;
167 using boost::program_options::collect_unrecognized;
168 using boost::program_options::command_line_parser;
169 using boost::program_options::include_positional;
170 using boost::program_options::notify;
171 using boost::program_options::parse_config_file;
172 using boost::program_options::store;
173 using boost::program_options::value;
191 "Log level: FATAL, ERROR, WARN, INFO (default), DEBUG")(
228 if (
var_map.count(
"help") > 0) {
234 if (
var_map.count(
"version") > 0) {
266 if (boost::starts_with(e.what(),
"unrecognised option")
or
267 boost::starts_with(e.what(),
"too many positional options")) {
282 log.log(
m_elements_loglevel,
"##########################################################");
283 log.log(
m_elements_loglevel,
"##########################################################");
292 log.log(
m_elements_loglevel,
"##########################################################");
296 log.log(
m_elements_loglevel,
"##########################################################");
297 log.log(
m_elements_loglevel,
"##########################################################");
306 log.log(
m_elements_loglevel,
"##########################################################");
318 if (
v.second.value().type() ==
typeid(
string)) {
321 }
else if (
v.second.value().type() ==
typeid(
double)) {
324 }
else if (
v.second.value().type() ==
typeid(int64_t)) {
327 }
else if (
v.second.value().type() ==
typeid(
int)) {
330 }
else if (
v.second.value().type() ==
typeid(
bool)) {
333 }
else if (
v.second.value().type() ==
typeid(Path::Item)) {
334 log_message <<
v.first <<
" = " <<
v.second.as<Path::Item>();
336 }
else if (
v.second.value().type() ==
typeid(
vector<int>)) {
361 log_message <<
"Option " <<
v.first <<
" of type " <<
v.second.value().type().name()
362 <<
" not supported in logging !" << endl;
374 log.debug() <<
"##########################################################";
376 log.debug() <<
"# Environment of the Run";
377 log.debug() <<
"# ---------------------------";
380 for (
const auto&
v : Path::VARIABLE) {
381 log.debug() <<
v.second <<
": " <<
m_env[
v.second];
395 return boost::filesystem::complete(s);
406 using Path::joinPath;
407 using Path::multiPathAppend;
409 for (
const auto&
v : Path::VARIABLE) {
410 if (
m_env[
v.second].exists()) {
430 log.fatal() <<
"# Elements Exception : " << e.what();
459 log.debug() <<
"# Exit Code: " <<
int(
c);
491 log.fatal() <<
"Crash detected";
492 log.fatal() <<
"This is the back trace:";
494 log.fatal() <<
level;
502 log.fatal() <<
"# Elements Exception : " <<
exc1.what();
509 log.fatal() <<
"# Standard Exception : " <<
exc2.what();
513 log.fatal() <<
"# An exception of unknown type occurred, "
514 <<
"i.e., an exception not deriving from std::exception ";
provide functions to retrieve configuration files
defines the base Elements exception class
define a list of standard exit codes for executables
OS specific details to access at run-time the module configuration of the process.
define an exception for unrecognized commandline options and arguments
provide functions to retrieve resources pointed by environment variables
define an abstract class for all Elements program
This file is intended to iron out all the differences between systems (currently Linux and MacOSX)
Macro to silence unused variables warnings from the compiler.
Elements base exception class.
static Logging getLogger(const std::string &name="")
static void setLogFile(const Path::Item &fileName)
Sets the file to store the log messages.
static void setLevel(std::string level)
Sets the global message level.
void setup(int argc, char *argv[])
Program setup taking care of command line options and logging initialization.
Path::Item m_program_name
virtual ~ProgramManager()
Destructor.
std::unique_ptr< Program > m_program_ptr
std::string m_parent_module_name
static void onTerminate() noexcept
This is the set_terminate handler that is used in the MAIN_FOR macro.
const Path::Item & getProgramName() const
Getter.
ExitCode run(int argc, char *argv[])
This is the public entry point, i.e., the only method called from the main.
void bootstrapEnvironment(char *arg0)
Bootstrap the Environment from the executable location and the install path computed at install time.
static const Path::Item getDefaultConfigFile(const Path::Item &program_name, const std::string &module_name="")
Get a default configuration file name and path, to be used if not provided as a command line option.
void logTheEnvironment() const
Log the program environment.
std::string m_parent_project_name
std::vector< std::string > m_search_dirs
void logHeader(std::string program_name) const
Log Header.
void checkCommandLineOptions(const boost::program_options::basic_parsed_options< charT > &cmd_line_options)
check the explicit command line arguments. For the moment, it only checks if the configuration file b...
const Program::VariablesMap getProgramOptions(int argc, char *argv[])
Get the program options from the command line into thevariables_map.
static const Path::Item setProgramName(char *arg0)
Strip the path from argv[0] to set the program name.
Path::Item m_program_path
ProgramManager(std::unique_ptr< Program > program_ptr, const std::string &parent_project_version="", const std::string &parent_project_name="", const std::string &parent_project_vcs_version="", const std::string &parent_module_version="", const std::string &parent_module_name="", const std::vector< std::string > &search_dirs={}, const log4cpp::Priority::Value &elements_loglevel=log4cpp::Priority::DEBUG)
Constructor.
std::string getVersion() const
This function returns the version of the program computed at compile time. This is the same as the pr...
log4cpp::Priority::Value m_elements_loglevel
std::string m_parent_project_vcs_version
const Path::Item & getProgramPath() const
Getter.
void tearDown(const ExitCode &)
void logFooter(std::string program_name) const
Log Footer.
Program::VariablesMap m_variables_map
static const Path::Item setProgramPath(char *arg0)
Strip the name from argv[0] to set the program path.
void logAllOptions() const
Log all program options.
options_description OptionsDescription
variables_map VariablesMap
T current_exception(T... args)
ExitCode
Strongly typed exit numbers.
@ NOT_OK
Generic unknown failure.
@ CONFIG
configuration error
@ USAGE
command line usage error
ELEMENTS_API Path::Item getConfigurationPath(const T &file_name, bool raise_exception=true)
ELEMENTS_API std::vector< Path::Item > getConfigurationLocations(bool exist_only=false)
ELEMENTS_API int backTrace(ELEMENTS_UNUSED std::shared_ptr< void * > addresses, ELEMENTS_UNUSED const int depth)
ELEMENTS_API Path::Item getExecutablePath()
Get the full executable path.
Program::VariablesMap VariablesMap
Program::OptionsDescription OptionsDescription
T rethrow_exception(T... args)