mirror of
https://gitlab.com/OpenMW/openmw.git
synced 2025-01-04 02:41:19 +00:00
Initial stab at OSG plugin checker
It doesn't work yet due to osgDB::listAllAvailablePlugins returning a list of paths to dynamic libraries. That means: * the check fails when the required plugin is linked statically. * we're going to have to do something to slice up the filenames. * there'll probably be unicode errors when the OpenMW installation path isn't representable by the current eight-bit code page on Windows. Alternatively, we can switch to listing the required file extension support, and use osgDB::Registry::instance()->getReaderWriterList() and each element's supportedExtensions() function, but I don't think we've actually got that list of extensions anywhere and it might get desynced with the existing list of plugins if we add more.
This commit is contained in:
parent
99164b3a0e
commit
c2d1a4c861
@ -2,6 +2,7 @@
|
|||||||
#include <components/fallback/fallback.hpp>
|
#include <components/fallback/fallback.hpp>
|
||||||
#include <components/fallback/validate.hpp>
|
#include <components/fallback/validate.hpp>
|
||||||
#include <components/files/configurationmanager.hpp>
|
#include <components/files/configurationmanager.hpp>
|
||||||
|
#include <components/misc/osgpluginchecker.hpp>
|
||||||
#include <components/misc/rng.hpp>
|
#include <components/misc/rng.hpp>
|
||||||
#include <components/platform/platform.hpp>
|
#include <components/platform/platform.hpp>
|
||||||
#include <components/version/version.hpp>
|
#include <components/version/version.hpp>
|
||||||
@ -228,6 +229,9 @@ int runApplication(int argc, char* argv[])
|
|||||||
|
|
||||||
if (parseOptions(argc, argv, *engine, cfgMgr))
|
if (parseOptions(argc, argv, *engine, cfgMgr))
|
||||||
{
|
{
|
||||||
|
if (!Misc::checkRequiredOSGPluginsArePresent())
|
||||||
|
return 1;
|
||||||
|
|
||||||
engine->go();
|
engine->go();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -40,6 +40,11 @@ endif (GIT_CHECKOUT)
|
|||||||
|
|
||||||
list (APPEND COMPONENT_FILES "${OpenMW_BINARY_DIR}/${VERSION_CPP_FILE}")
|
list (APPEND COMPONENT_FILES "${OpenMW_BINARY_DIR}/${VERSION_CPP_FILE}")
|
||||||
|
|
||||||
|
# OSG plugin checker
|
||||||
|
set(OSG_PLUGIN_CHECKER_CPP_FILE "components/misc/osgpluginchecker.cpp")
|
||||||
|
configure_file("${OpenMW_SOURCE_DIR}/${OSG_PLUGIN_CHECKER_CPP_FILE}.in" "${OpenMW_BINARY_DIR}/${OSG_PLUGIN_CHECKER_CPP_FILE}")
|
||||||
|
list(APPEND COMPONENT_FILES "${OpenMW_BINARY_DIR}/${OSG_PLUGIN_CHECKER_CPP_FILE}")
|
||||||
|
|
||||||
# source files
|
# source files
|
||||||
|
|
||||||
add_component_dir (lua
|
add_component_dir (lua
|
||||||
@ -274,8 +279,8 @@ add_component_dir (esm4
|
|||||||
|
|
||||||
add_component_dir (misc
|
add_component_dir (misc
|
||||||
barrier budgetmeasurement color compression constants convert coordinateconverter display endianness float16 frameratelimiter
|
barrier budgetmeasurement color compression constants convert coordinateconverter display endianness float16 frameratelimiter
|
||||||
guarded math mathutil messageformatparser notnullptr objectpool osguservalues progressreporter resourcehelpers rng
|
guarded math mathutil messageformatparser notnullptr objectpool osgpluginchecker osguservalues progressreporter resourcehelpers
|
||||||
strongtypedef thread timeconvert timer tuplehelpers tuplemeta utf8stream weakcache windows
|
rng strongtypedef thread timeconvert timer tuplehelpers tuplemeta utf8stream weakcache windows
|
||||||
)
|
)
|
||||||
|
|
||||||
add_component_dir (misc/strings
|
add_component_dir (misc/strings
|
||||||
|
47
components/misc/osgpluginchecker.cpp.in
Normal file
47
components/misc/osgpluginchecker.cpp.in
Normal file
@ -0,0 +1,47 @@
|
|||||||
|
#include "components/misc/osgpluginchecker.hpp"
|
||||||
|
|
||||||
|
#include <components/debug/debuglog.hpp>
|
||||||
|
|
||||||
|
#include <osgDB/PluginQuery>
|
||||||
|
|
||||||
|
#include <algorithm>
|
||||||
|
#include <string_view>
|
||||||
|
|
||||||
|
namespace Misc
|
||||||
|
{
|
||||||
|
namespace
|
||||||
|
{
|
||||||
|
std::string_view USED_OSG_PLUGINS = "${USED_OSG_PLUGINS}";
|
||||||
|
|
||||||
|
constexpr std::vector<std::string_view> getRequiredOSGPlugins()
|
||||||
|
{
|
||||||
|
std::vector<std::string_view> requiredOSGPlugins;
|
||||||
|
auto currentStart = USED_OSG_PLUGINS.begin();
|
||||||
|
while (currentStart != USED_OSG_PLUGINS.end())
|
||||||
|
{
|
||||||
|
auto currentEnd = std::find(currentStart, USED_OSG_PLUGINS.end(), ';');
|
||||||
|
requiredOSGPlugins.emplace_back(currentStart, currentEnd);
|
||||||
|
if (currentEnd == USED_OSG_PLUGINS.end())
|
||||||
|
break;
|
||||||
|
currentStart = currentEnd + 1;
|
||||||
|
}
|
||||||
|
return requiredOSGPlugins;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool checkRequiredOSGPluginsArePresent()
|
||||||
|
{
|
||||||
|
auto availableOSGPlugins = osgDB::listAllAvailablePlugins();
|
||||||
|
auto requiredOSGPlugins = getRequiredOSGPlugins();
|
||||||
|
bool haveAllPlugins = true;
|
||||||
|
for (std::string_view plugin : requiredOSGPlugins)
|
||||||
|
{
|
||||||
|
if (std::find(availableOSGPlugins.begin(), availableOSGPlugins.end(), plugin) == availableOSGPlugins.end())
|
||||||
|
{
|
||||||
|
Log(Debug::Error) << "Missing OSG plugin: " << plugin;
|
||||||
|
haveAllPlugins = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return haveAllPlugins;
|
||||||
|
}
|
||||||
|
}
|
9
components/misc/osgpluginchecker.hpp
Normal file
9
components/misc/osgpluginchecker.hpp
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
#ifndef OPENMW_COMPONENTS_MISC_OSGPLUGINCHECKER_HPP
|
||||||
|
#define OPENMW_COMPONENTS_MISC_OSGPLUGINCHECKER_HPP
|
||||||
|
|
||||||
|
namespace Misc
|
||||||
|
{
|
||||||
|
bool checkRequiredOSGPluginsArePresent();
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
Loading…
Reference in New Issue
Block a user