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

initial commit

parents
Branches
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