From b87c37032baaf539556bc639f677b1d6dca3d86b Mon Sep 17 00:00:00 2001 From: Jason Turner Date: Sun, 4 May 2014 10:14:42 -0600 Subject: [PATCH] Add version numbers that can be queried at runtime --- CMakeLists.txt | 18 ++++++--- include/chaiscript/chaiscript_defines.hpp | 6 ++- .../chaiscript/language/chaiscript_engine.hpp | 39 ++++++++++++++++--- 3 files changed, 52 insertions(+), 11 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index bd99de3..d0d4ad5 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -192,12 +192,12 @@ set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} ${LINKER_FLAGS}") set(CMAKE_SHARED_MODULE_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} ${LINKER_FLAGS}") -add_library(chaiscript_stdlib MODULE src/chaiscript_stdlib.cpp) -target_link_libraries(chaiscript_stdlib ${LIBS} ${CMAKE_THREAD_LIBS_INIT}) +add_library(chaiscript_stdlib-${CHAI_VERSION} MODULE src/chaiscript_stdlib.cpp) +target_link_libraries(chaiscript_stdlib-${CHAI_VERSION} ${LIBS} ${CMAKE_THREAD_LIBS_INIT}) add_executable(chai src/main.cpp ${Chai_INCLUDES}) target_link_libraries(chai ${LIBS}) -add_dependencies(chai chaiscript_stdlib) +add_dependencies(chai chaiscript_stdlib-${CHAI_VERSION}) if (BUILD_SAMPLES) add_executable(example samples/example.cpp) @@ -223,10 +223,18 @@ list(SORT UNIT_TESTS) if(BUILD_TESTING) option(UNIT_TEST_LIGHT "Unit tests light (expect module loading failures)" FALSE) + add_test(version_check chai -c "if(\"\\\${ version() };\\\${version_major()};\\\${version_minor()};\\\${version_patch()}\" != \"${CHAI_VERSION};${CPACK_PACKAGE_VERSION_MAJOR};${CPACK_PACKAGE_VERSION_MINOR};${CPACK_PACKAGE_VERSION_PATCH}\") { exit(-1) }") + set_property(TEST version_check + PROPERTY ENVIRONMENT + "CHAI_USE_PATH=${CMAKE_CURRENT_SOURCE_DIR}/unittests/" + "CHAI_MODULE_PATH=${CMAKE_CURRENT_BINARY_DIR}/" + ) + + foreach(filename ${UNIT_TESTS}) message(STATUS "Adding test ${filename}") add_test(${filename} chai ${CMAKE_CURRENT_SOURCE_DIR}/unittests/unit_test.inc ${CMAKE_CURRENT_SOURCE_DIR}/unittests/${filename}) - endforeach(filename) + endforeach(filename) set_property(TEST ${UNIT_TESTS} PROPERTY ENVIRONMENT @@ -333,7 +341,7 @@ if(BUILD_TESTING) endif() endif(BUILD_TESTING) -install(TARGETS chai chaiscript_stdlib ${MODULES} RUNTIME DESTINATION bin LIBRARY DESTINATION lib/chaiscript ) +install(TARGETS chai chaiscript_stdlib-${CHAI_VERSION} ${MODULES} RUNTIME DESTINATION bin LIBRARY DESTINATION lib/chaiscript ) install(DIRECTORY include/chaiscript DESTINATION include PATTERN "*.hpp" diff --git a/include/chaiscript/chaiscript_defines.hpp b/include/chaiscript/chaiscript_defines.hpp index 6be69c3..b8c2d87 100644 --- a/include/chaiscript/chaiscript_defines.hpp +++ b/include/chaiscript/chaiscript_defines.hpp @@ -36,7 +36,11 @@ #define CHAISCRIPT_CONSTEXPR constexpr #endif - +namespace chaiscript { + static const int version_major = 5; + static const int version_minor = 3; + static const int version_patch = 1; +} #endif diff --git a/include/chaiscript/language/chaiscript_engine.hpp b/include/chaiscript/language/chaiscript_engine.hpp index ae5990f..3924ba7 100644 --- a/include/chaiscript/language/chaiscript_engine.hpp +++ b/include/chaiscript/language/chaiscript_engine.hpp @@ -253,8 +253,6 @@ namespace chaiscript chaiscript::detail::Dispatch_Engine m_engine; - - /// Evaluates the given string in by parsing it and running the results through the evaluator Boxed_Value do_eval(const std::string &t_input, const std::string &t_filename = "__EVAL__", bool /* t_internal*/ = false) { @@ -329,7 +327,6 @@ namespace chaiscript m_engine.add(fun(&chaiscript::detail::Dispatch_Engine::function_exists, std::ref(m_engine)), "function_exists"); m_engine.add(fun(&chaiscript::detail::Dispatch_Engine::get_function_objects, std::ref(m_engine)), "get_functions"); m_engine.add(fun(&chaiscript::detail::Dispatch_Engine::get_scripting_objects, std::ref(m_engine)), "get_objects"); - m_engine.add(Proxy_Function(new dispatch::Dynamic_Proxy_Function(std::bind(&chaiscript::detail::Dispatch_Engine::call_exists, std::ref(m_engine), std::placeholders::_1))), "call_exists"); m_engine.add(fun &)>(std::bind(&chaiscript::dispatch::Proxy_Function_Base::operator(), std::placeholders::_1, std::placeholders::_2, std::ref(m_engine.conversions()))), "call"); @@ -347,6 +344,12 @@ namespace chaiscript m_engine.add(fun(&ChaiScript::internal_eval, this), "eval"); m_engine.add(fun(&ChaiScript::internal_eval_ast, this), "eval"); + m_engine.add(fun(&ChaiScript::version_major, this), "version_major"); + m_engine.add(fun(&ChaiScript::version_minor, this), "version_minor"); + m_engine.add(fun(&ChaiScript::version_patch, this), "version_patch"); + m_engine.add(fun(&ChaiScript::version, this), "version"); + + do_eval(ChaiScript_Prelude::chaiscript_prelude(), "standard prelude"); } @@ -455,12 +458,32 @@ namespace chaiscript // attempt to load the stdlib - load_module("chaiscript_stdlib"); + load_module("chaiscript_stdlib-" + version()); build_eval_system(ModulePtr()); } + int version_major() const + { + return chaiscript::version_major; + } + int version_minor() const + { + return chaiscript::version_minor; + } + + int version_patch() const + { + return chaiscript::version_patch; + } + + std::string version() const + { + std::stringstream ss; + ss << version_major() << "." << version_minor() << "." << version_patch(); + return ss.str(); + } /// \brief Loads and parses a file. If the file is already, it is not reloaded /// The use paths specified at ChaiScript construction time are searched for the @@ -655,6 +678,12 @@ namespace chaiscript std::string load_module(const std::string &t_module_name) { std::vector errors; + std::string version_stripped_name = t_module_name; + size_t version_pos = version_stripped_name.find("-"+version()); + if (version_pos != std::string::npos) + { + version_stripped_name.erase(version_pos); + } std::vector prefixes; prefixes.push_back("lib"); @@ -674,7 +703,7 @@ namespace chaiscript try { std::string name = m_modulepaths[i] + prefixes[j] + t_module_name + postfixes[k]; // std::cerr << "trying location: " << name << std::endl; - load_module(t_module_name, name); + load_module(version_stripped_name, name); return name; } catch (const chaiscript::exception::load_module_error &e) { // std::cerr << "error: " << e.what() << std::endl;