Skip to content
Snippets Groups Projects
Commit 2aaa7489 authored by gregor's avatar gregor
Browse files

initial commit

parents
No related branches found
No related tags found
No related merge requests found
macro(VSSourceGroups ROOT_PATH)
file(
GLOB_RECURSE sources
LIST_DIRECTORIES false
"${ROOT_PATH}/*.c*"
"${ROOT_PATH}/*.h*"
"${ROOT_PATH}/*.ui*"
)
foreach(source IN ITEMS ${sources})
get_filename_component(path "${source}" PATH)
file(RELATIVE_PATH rel_path "${ROOT_PATH}" "${path}")
string(REPLACE "/" "\\" group_path "${rel_path}")
source_group("${group_path}" FILES "${source}")
endforeach()
endmacro()
\ No newline at end of file
cmake_minimum_required(VERSION 3.12)
exec_program("git" ${CMAKE_CURRENT_SOURCE_DIR} ARGS "describe --tags --abbrev=0" OUTPUT_VARIABLE GIT_TAG)
cmake_policy (SET CMP0020 NEW)
project(RF_behavior_loader
VERSION ${GIT_TAG}
LANGUAGES CXX)
include(GNUInstallDirs)
set(INSTALL_BINDIR ${CMAKE_INSTALL_BINDIR} CACHE PATH "Installation directory for executables")
set(INSTALL_LIBDIR ${CMAKE_INSTALL_LIBDIR} CACHE PATH "Installation directory for libraries")
set(INSTALL_INCLUDEDIR ${CMAKE_INSTALL_INCLUDEDIR}/${PROJECT_NAME} CACHE PATH "Installation directory for header files")
set(INSTALL_CONFIGDIR ${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME} CACHE STRING "Installation directory for cmake configuration files")
set(TN RF_behavior_loader)
add_library(${TN} STATIC)
set_target_properties(${TN} PROPERTIES OUTPUT_NAME RF_behavior_loader)
include(SrcUtility/CMakeLists.txt)
install(
TARGETS
RF_behavior_loader
EXPORT
${PROJECT_NAME}Targets
RUNTIME DESTINATION "${INSTALL_BINDIR}"
ARCHIVE DESTINATION "${INSTALL_LIBDIR}"
)
foreach(file ${RF_behavior_loader_PUBLIC_HEADERS})
file(RELATIVE_PATH rel_path "${CMAKE_CURRENT_LIST_DIR}/SrcBehaviorLoader" ${file})
get_filename_component(install_path ${rel_path} DIRECTORY)
install(FILES ${file} DESTINATION "${INSTALL_INCLUDEDIR}/${install_path}")
endforeach()
export(
TARGETS
RF_behavior_loader
FILE "${PROJECT_BINARY_DIR}/${PROJECT_NAME}Targets.cmake"
)
install(EXPORT ${PROJECT_NAME}Targets
FILE ${PROJECT_NAME}Targets.cmake
DESTINATION ${INSTALL_CONFIGDIR}
)
include(CMakePackageConfigHelpers)
write_basic_package_version_file(
${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}ConfigVersion.cmake
VERSION ${PROJECT_VERSION}
COMPATIBILITY AnyNewerVersion
)
configure_package_config_file(
${CMAKE_CURRENT_LIST_DIR}/cmake/${PROJECT_NAME}Config.cmake.in
${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}Config.cmake
INSTALL_DESTINATION ${INSTALL_CONFIGDIR}
)
install(
FILES
${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}Config.cmake
${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}ConfigVersion.cmake
DESTINATION ${INSTALL_CONFIGDIR}
)
install(
FILES
${CMAKE_CURRENT_SOURCE_DIR}/cmake/BehaviourPlugin.cmake
${CMAKE_CURRENT_SOURCE_DIR}/cmake/VSSugar.cmake
DESTINATION ${INSTALL_CONFIGDIR}/Modules/${PROJECT_NAME}
)
set(CPACK_GENERATOR "TXZ")
set(CPACK_PACKAGE_VERSION ${GIT_TAG})
include(CPack)
target_include_directories(${TN} PUBLIC
$<BUILD_INTERFACE:${CMAKE_CURRENT_LIST_DIR}>
$<INSTALL_INTERFACE:${INSTALL_INCLUDEDIR}>
)
find_package(RF_Interfaces 0.1 REQUIRED)
target_link_libraries(${TN} RF_Interfaces)
set_target_properties(${TN} PROPERTIES POSITION_INDEPENDENT_CODE ON)
set_target_properties(${TN} PROPERTIES AUTOMOC ON AUTOUIC ON AUTORCC ON)
set_target_properties(${TN} PROPERTIES
CXX_STANDARD 17
CXX_STANDARD_REQUIRED YES
CXX_EXTENSIONS NO
)
target_sources(${TN}
PRIVATE
"${CMAKE_CURRENT_LIST_DIR}/PluginLoader.cpp"
)
set(${TN}_PUBLIC_HEADERS
"${CMAKE_CURRENT_LIST_DIR}/PluginLoader.h"
)
#include "PluginLoader.h"
#include <QDebug>
PluginLoader::PluginLoader(QObject *parent)
{
m_PluginLoader = new QPluginLoader(this);
}
bool PluginLoader::loadPluginFromFilename(QString const& filename)
{
bool retval = false;
if (m_PluginLoader->isLoaded()) {
m_PluginLoader->unload();
}
bool isLib = QLibrary::isLibrary(filename);
if (isLib) {
m_PluginLoader->setFileName(filename);
readMetaDataFromPlugin();
retval = m_PluginLoader->load();
QString s = m_PluginLoader->errorString();
std::string ss = s.toStdString();
if (!m_PluginLoader->isLoaded())
{
qWarning() << ss.c_str();
}
}
else {
retval = false;
}
return retval;
}
IBehaviourFactory* PluginLoader::getPluginInstance()
{
return qobject_cast<IBehaviourFactory*>(m_PluginLoader->instance());
}
QJsonObject PluginLoader::getPluginMetaData() const
{
return m_MetaData;
}
void PluginLoader::readMetaDataFromPlugin()
{
m_MetaData = m_PluginLoader->metaData().value("MetaData").toObject();
}
#ifndef PLUGINLOADER_H
#define PLUGINLOADER_H
#include "QPluginLoader"
#include "QStringListModel"
#include "IBehaviourFactory.h"
#include "QPointer"
class PluginLoader : QObject
{
Q_OBJECT
public:
explicit PluginLoader(QObject *parent = 0);
bool loadPluginFromFilename(QString const& filename);
IBehaviourFactory *getPluginInstance();
QJsonObject getPluginMetaData() const;
private:
void readMetaDataFromPlugin();
QPluginLoader *m_PluginLoader;
QJsonObject m_MetaData;
};
#endif // PLUGINLOADER_H
\ No newline at end of file
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment