diff --git a/CMakeLists.txt b/CMakeLists.txt index 80d5d806f..e42817b3e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -93,7 +93,7 @@ message(STATUS "StoRM - CMAKE_BUILD_TYPE (ENV): $ENV{CMAKE_BUILD_TYPE}") set(CONVERSIONHELPER_TARGET "${PROJECT_SOURCE_DIR}/src/utility/ConversionHelper.cpp") if(CMAKE_COMPILER_IS_GNUCC) - message(STATUS "StoRM - Using Compiler Configuration: GCC") + set(STORM_COMPILED_BY "GCC") # Set standard flags for GCC set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -funroll-loops") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -Wall -pedantic -DBOOST_RESULT_OF_USE_TR1") @@ -109,7 +109,7 @@ if(CMAKE_COMPILER_IS_GNUCC) # Set the no-strict-aliasing target for GCC set_source_files_properties(${CONVERSIONHELPER_TARGET} PROPERTIES COMPILE_FLAGS " -fno-strict-aliasing ") elseif(MSVC) - message(STATUS "StoRM - Using Compiler Configuration: MSVC") + set(STORM_COMPILED_BY "MSVC") # required for GMM to compile, ugly error directive in their code add_definitions(/D_SCL_SECURE_NO_DEPRECATE /D_CRT_SECURE_NO_WARNINGS) # required as the PRCTL Parser bloats object files (COFF) beyond their maximum size (see http://msdn.microsoft.com/en-us/library/8578y171(v=vs.110).aspx) @@ -128,7 +128,7 @@ elseif(MSVC) # MSVC does not do strict-aliasing, so no option needed else(CLANG) - message(STATUS "StoRM - Using Compiler Configuration: Clang (LLVM)") + set(STORM_COMPILED_BY "Clang (LLVM)") # As CLANG is not set as a variable, we need to set it in case we have not matched another compiler. set (CLANG ON) # Set standard flags for clang @@ -159,6 +159,8 @@ else(CLANG) set_source_files_properties(${CONVERSIONHELPER_TARGET} PROPERTIES COMPILE_FLAGS " -fno-strict-aliasing ") endif() +message(STATUS "StoRM - Using Compiler Configuration: ${STORM_COMPILED_BY}") + ############################################################# ## ## CMake-generated Config File for StoRM @@ -219,8 +221,8 @@ configure_file ( # Configure a header file to pass the storm version to the source code configure_file ( - "${PROJECT_SOURCE_DIR}/storm-version.h.in" - "${PROJECT_BINARY_DIR}/include/storm-version.h" + "${PROJECT_SOURCE_DIR}/storm-version.cpp.in" + "${PROJECT_SOURCE_DIR}/src/utility/storm-version.cpp" ) # Add the binary dir include directory for storm-config.h @@ -266,6 +268,7 @@ file(GLOB_RECURSE STORM_PERFORMANCE_TEST_FILES ${STORM_CPP_TESTS_BASE_PATH}/perf # Additional include files like the storm-config.h file(GLOB_RECURSE STORM_BUILD_HEADERS ${PROJECT_BINARY_DIR}/include/*.h) + # Group the headers and sources source_group(main FILES ${STORM_MAIN_FILE}) source_group(adapters FILES ${STORM_ADAPTERS_FILES}) @@ -275,7 +278,7 @@ source_group(properties\\csl FILES ${STORM_PROPERTIES_CSL_FILES}) source_group(properties\\ltl FILES ${STORM_PROPERTIES_LTL_FILES}) source_group(properties\\prctl FILES ${STORM_PROPERTIES_PRCTL_FILES}) source_group(properties\\actions FILES ${STORM_PROPERTIES_ACTIONS_FILES}) -source_group(generated FILES ${STORM_BUILD_HEADERS}) +source_group(generated FILES ${STORM_BUILD_HEADERS} ${STORM_BUILD_SOURCES}) source_group(modelchecker FILES ${STORM_MODELCHECKER_FILES}) source_group(counterexamples FILES ${STORM_COUNTEREXAMPLES_FILES}) source_group(models FILES ${STORM_MODELS_FILES}) diff --git a/src/settings/SettingsManager.cpp b/src/settings/SettingsManager.cpp index 26fb6070d..5c311c602 100644 --- a/src/settings/SettingsManager.cpp +++ b/src/settings/SettingsManager.cpp @@ -11,6 +11,7 @@ #include "src/exceptions/IllegalFunctionCallException.h" #include "src/exceptions/OptionParserException.h" +#include "src/utility/storm-version.h" namespace storm { namespace settings { @@ -229,6 +230,11 @@ namespace storm { STORM_PRINT(std::endl); } + void SettingsManager::printVersion() const { + STORM_PRINT(storm::utility::StormVersion::shortVersionString()); + STORM_PRINT(std::endl); + } + uint_fast64_t SettingsManager::getPrintLengthOfLongestOption() const { uint_fast64_t length = 0; for (auto const& moduleName : this->moduleNames) { diff --git a/src/settings/SettingsManager.h b/src/settings/SettingsManager.h index 41383f336..3daa43beb 100644 --- a/src/settings/SettingsManager.h +++ b/src/settings/SettingsManager.h @@ -91,6 +91,11 @@ namespace storm { */ void printHelpForModule(std::string const& moduleName, uint_fast64_t maxLength = 30) const; + /*! + * This function prints the version string to the command line. + */ + void printVersion() const; + /*! * Retrieves the only existing instance of a settings manager. * diff --git a/src/settings/modules/GeneralSettings.cpp b/src/settings/modules/GeneralSettings.cpp index 585bcfdfb..e310a68c8 100644 --- a/src/settings/modules/GeneralSettings.cpp +++ b/src/settings/modules/GeneralSettings.cpp @@ -11,6 +11,7 @@ namespace storm { const std::string GeneralSettings::moduleName = "general"; const std::string GeneralSettings::helpOptionName = "help"; const std::string GeneralSettings::helpOptionShortName = "h"; + const std::string GeneralSettings::versionOptionName = "version"; const std::string GeneralSettings::verboseOptionName = "verbose"; const std::string GeneralSettings::verboseOptionShortName = "v"; const std::string GeneralSettings::precisionOptionName = "precision"; @@ -46,6 +47,7 @@ namespace storm { GeneralSettings::GeneralSettings(storm::settings::SettingsManager& settingsManager) : ModuleSettings(settingsManager, moduleName) { this->addOption(storm::settings::OptionBuilder(moduleName, helpOptionName, false, "Shows all available options, arguments and descriptions.").setShortName(helpOptionShortName) .addArgument(storm::settings::ArgumentBuilder::createStringArgument("hint", "A regular expression to show help for all matching entities or 'all' for the complete help.").setDefaultValueString("all").build()).build()); + this->addOption(storm::settings::OptionBuilder(moduleName, versionOptionName, false, "Prints the version information.").build()); this->addOption(storm::settings::OptionBuilder(moduleName, verboseOptionName, false, "Enables more verbose output.").setShortName(verboseOptionShortName).build()); this->addOption(storm::settings::OptionBuilder(moduleName, precisionOptionName, false, "The internally used precision.").setShortName(precisionOptionShortName) .addArgument(storm::settings::ArgumentBuilder::createDoubleArgument("value", "The precision to use.").setDefaultValueDouble(1e-06).addValidationFunctionDouble(storm::settings::ArgumentValidators::doubleRangeValidatorExcluding(0.0, 1.0)).build()).build()); @@ -98,6 +100,10 @@ namespace storm { return this->getOption(helpOptionName).getHasOptionBeenSet(); } + bool GeneralSettings::isVersionSet() const { + return this->getOption(versionOptionName).getHasOptionBeenSet(); + } + std::string GeneralSettings::getHelpModuleName() const { return this->getOption(helpOptionName).getArgumentByName("hint").getValueAsString(); } diff --git a/src/settings/modules/GeneralSettings.h b/src/settings/modules/GeneralSettings.h index 75f48d8f1..912053083 100644 --- a/src/settings/modules/GeneralSettings.h +++ b/src/settings/modules/GeneralSettings.h @@ -32,6 +32,14 @@ namespace storm { */ bool isHelpSet() const; + /*! + * Retrieves whether the version option was set. + * + * @return True if the version option was set. + */ + bool isVersionSet() const; + + /*! * Retrieves the name of the module for which to show the help or "all" to indicate that the full help * needs to be shown. @@ -323,6 +331,7 @@ namespace storm { // Define the string names of the options as constants. static const std::string helpOptionName; static const std::string helpOptionShortName; + static const std::string versionOptionName; static const std::string verboseOptionName; static const std::string verboseOptionShortName; static const std::string precisionOptionName; diff --git a/src/utility/cli.h b/src/utility/cli.h index 4ceb64a95..ebd8a9bc7 100644 --- a/src/utility/cli.h +++ b/src/utility/cli.h @@ -29,6 +29,7 @@ log4cplus::Logger logger; // Headers that provide auxiliary functionality. +#include "src/utility/storm-version.h" #include "src/utility/OsDetection.h" #include "src/settings/SettingsManager.h" @@ -49,6 +50,7 @@ log4cplus::Logger logger; // Headers related to exception handling. #include "src/exceptions/InvalidSettingsException.h" +#include "src/exceptions/InvalidTypeException.h" namespace storm { namespace utility { @@ -108,17 +110,9 @@ namespace storm { void printHeader(const int argc, const char* argv[]) { std::cout << "StoRM" << std::endl; std::cout << "-----" << std::endl << std::endl; - - std::cout << "Version: " << STORM_CPP_VERSION_MAJOR << "." << STORM_CPP_VERSION_MINOR << "." << STORM_CPP_VERSION_PATCH; - if (STORM_CPP_VERSION_COMMITS_AHEAD != 0) { - std::cout << " (+" << STORM_CPP_VERSION_COMMITS_AHEAD << " commits)"; - } - std::cout << " build from revision " << STORM_CPP_VERSION_HASH; - if (STORM_CPP_VERSION_DIRTY == 1) { - std::cout << " (DIRTY)"; - } - std::cout << "." << std::endl; - + + + std::cout << storm::utility::StormVersion::longVersionString() << std::endl; #ifdef STORM_HAVE_INTELTBB std::cout << "Linked with Intel Threading Building Blocks v" << TBB_VERSION_MAJOR << "." << TBB_VERSION_MINOR << " (Interface version " << TBB_INTERFACE_VERSION << ")." << std::endl; #endif @@ -208,6 +202,12 @@ namespace storm { storm::settings::manager().printHelp(storm::settings::generalSettings().getHelpModuleName()); return false; } + + if (storm::settings::generalSettings().isVersionSet()) { + storm::settings::manager().printVersion(); + return false; + } + if (storm::settings::generalSettings().isVerboseSet()) { logger.getAppender("mainConsoleAppender")->setThreshold(log4cplus::INFO_LOG_LEVEL); diff --git a/src/utility/storm-version.h b/src/utility/storm-version.h new file mode 100644 index 000000000..12a92f142 --- /dev/null +++ b/src/utility/storm-version.h @@ -0,0 +1,66 @@ +/** + * @file: storm-version.h + * @author: Sebastian Junges + * + * @since October 7, 2014 + */ + +#pragma once +#include +#include + +namespace storm +{ + namespace utility { + struct StormVersion + { + /// The major version of StoRM + const static unsigned versionMajor; + /// The minor version of StoRM + const static unsigned versionMinor; + /// The patch version of StoRM + const static unsigned versionPatch; + /// The short hash of the git commit this build is bases on + const static std::string gitRevisionHash; + /// How many commits passed since the tag was last set + const static unsigned commitsAhead; + /// 0 iff there no files were modified in the checkout, 1 else + const static unsigned dirty; + /// The system which has compiled storm + const static std::string systemName; + /// The system version which has compiled storm + const static std::string systemVersion; + /// The build type that was used to build storm + const static std::string buildType; + /// The compiler version that was used to build storm + const static std::string cxxCompiler; + + static std::string shortVersionString() { + std::stringstream sstream; + sstream << "StoRM " << versionMajor << "." << versionMinor << "." << versionPatch; + return sstream.str(); + } + + static std::string longVersionString() { + std::stringstream sstream; + sstream << "Version: " << versionMajor << "." << versionMinor << "." << versionPatch; + if (commitsAhead != 0) { + sstream << " (+" << commitsAhead << " commits)"; + } + sstream << " build from revision " << gitRevisionHash; + if (dirty == 1) { + sstream << " (DIRTY)"; + } + sstream << "." << std::endl; + return sstream.str(); + } + + static std::string buildInfo() { + std::stringstream sstream; + sstream << "Compiled on " << systemName << " " << systemVersion << ","; + sstream << "using " << cxxCompiler << " with " << buildType << " flags."; + return sstream.str(); + } + }; + } +} diff --git a/storm-version.cpp.in b/storm-version.cpp.in new file mode 100644 index 000000000..c35b0c2af --- /dev/null +++ b/storm-version.cpp.in @@ -0,0 +1,28 @@ +#include "src/utility/storm-version.h" + +namespace storm +{ +namespace utility +{ +// The major version of StoRM +const unsigned StormVersion::versionMajor = @STORM_CPP_VERSION_MAJOR@; +// The minor version of StoRM +const unsigned StormVersion::versionMinor = @STORM_CPP_VERSION_MINOR@; +// The patch version of StoRM +const unsigned StormVersion::versionPatch = @STORM_CPP_VERSION_PATCH@; +// The short hash of the git commit this build is bases on +const std::string StormVersion::gitRevisionHash = "@STORM_CPP_VERSION_HASH@"; +// How many commits passed since the tag was last set +const unsigned StormVersion::commitsAhead = @STORM_CPP_VERSION_COMMITS_AHEAD@; +// 0 iff there no files were modified in the checkout, 1 else +const unsigned StormVersion::dirty = @STORM_CPP_VERSION_DIRTY@; +// The system which has compiled storm +const std::string StormVersion::systemName = "@CMAKE_SYSTEM_NAME@"; +// The system version which has compiled storm +const std::string StormVersion::systemVersion = "@CMAKE_SYSTEM_VERSION@"; +// The build type that was used to build storm +const std::string StormVersion::buildType = "@CMAKE_BUILD_TYPE@"; +// The compiler version that was used to build storm +const std::string StormVersion::cxxCompiler = "@STORM_COMPILED_BY@ @CMAKE_CXX_COMPILER_VERSION@"; +} +} \ No newline at end of file diff --git a/storm-version.h.in b/storm-version.h.in deleted file mode 100644 index 5ccac6125..000000000 --- a/storm-version.h.in +++ /dev/null @@ -1,12 +0,0 @@ -#ifndef STORM_GENERATED_VERSION_H_ -#define STORM_GENERATED_VERSION_H_ - -// Version Information -#define STORM_CPP_VERSION_MAJOR @STORM_CPP_VERSION_MAJOR@ // The major version of StoRM -#define STORM_CPP_VERSION_MINOR @STORM_CPP_VERSION_MINOR@ // The minor version of StoRM -#define STORM_CPP_VERSION_PATCH @STORM_CPP_VERSION_PATCH@ // The patch version of StoRM -#define STORM_CPP_VERSION_COMMITS_AHEAD @STORM_CPP_VERSION_COMMITS_AHEAD@ // How many commits passed since the tag was last set -#define STORM_CPP_VERSION_HASH "@STORM_CPP_VERSION_HASH@" // The short hash of the git commit this build is bases on -#define STORM_CPP_VERSION_DIRTY @STORM_CPP_VERSION_DIRTY@ // 0 iff there no files were modified in the checkout, 1 else - -#endif \ No newline at end of file