Explorar el Código

ENH: first draft for a plugin dependency system

Sascha Zelzer hace 14 años
padre
commit
69d7a65278

+ 4 - 3
CMake/ctkMacroGeneratePluginManifest.cmake

@@ -3,7 +3,7 @@
 #  CTK/CMake/ctkMacroParseArguments.cmake
 #
 
-MACRO(ctkMacroGeneratePluginManifest QRC_SRCS)
+FUNCTION(ctkFunctionGeneratePluginManifest QRC_SRCS)
 
   CtkMacroParseArguments(MY
     "ACTIVATIONPOLICY;CATEGORY;CONTACT_ADDRESS;COPYRIGHT;DESCRIPTION;DOC_URL;ICON;LICENSE;NAME;REQUIRE_PLUGIN;SYMBOLIC_NAME;VENDOR;VERSION"
@@ -60,7 +60,8 @@ MACRO(ctkMacroGeneratePluginManifest QRC_SRCS)
   ENDIF()
 
   IF(DEFINED MY_REQUIRE_PLUGIN)
-    SET(_manifest_content "${_manifest_content}\nRequire-Plugin: ${MY_REQUIRE_PLUGIN}")
+    STRING(REPLACE ";" "," require_plugin "${MY_REQUIRE_PLUGIN}")
+    SET(_manifest_content "${_manifest_content}\nRequire-Plugin: ${require_plugin}")
   ENDIF()
 
   IF(DEFINED MY_VENDOR)
@@ -89,4 +90,4 @@ MACRO(ctkMacroGeneratePluginManifest QRC_SRCS)
 
   QT4_ADD_RESOURCES(${QRC_SRCS} ${_manifest_qrc_filepath})
 
-ENDMACRO()
+ENDFUNCTION()

+ 41 - 34
CMake/ctkMacroBuildPlugin.cmake

@@ -42,21 +42,17 @@
 # Plugin-License
 # Plugin-Name
 # Require-Plugin
-# Plugin-SymbolicName
 # Plugin-Vendor
 # Plugin-Version
 #
 MACRO(ctkMacroBuildPlugin)
   CtkMacroParseArguments(MY
-    "NAME;EXPORT_DIRECTIVE;SRCS;MOC_SRCS;UI_FORMS;INCLUDE_DIRECTORIES;TARGET_LIBRARIES;RESOURCES;CACHED_RESOURCEFILES;LIBRARY_TYPE"
+    "EXPORT_DIRECTIVE;SRCS;MOC_SRCS;UI_FORMS;INCLUDE_DIRECTORIES;TARGET_LIBRARIES;RESOURCES;CACHED_RESOURCEFILES;LIBRARY_TYPE"
     ""
     ${ARGN}
     )
 
   # Sanity checks
-  IF(NOT DEFINED MY_NAME)
-    MESSAGE(SEND_ERROR "NAME is mandatory")
-  ENDIF()
   IF(NOT DEFINED MY_EXPORT_DIRECTIVE)
     MESSAGE(SEND_ERROR "EXPORT_DIRECTIVE is mandatory")
   ENDIF()
@@ -65,7 +61,35 @@ MACRO(ctkMacroBuildPlugin)
   ENDIF()
 
   # Define library name
-  SET(lib_name ${MY_NAME})
+  SET(lib_name ${PROJECT_NAME})
+
+  # Clear the variables for the manifest headers
+  SET(Plugin-ActivationPolicy )
+  SET(Plugin-Category )
+  SET(Plugin-ContactAddress )
+  SET(Plugin-Copyright )
+  SET(Plugin-Description )
+  SET(Plugin-DocURL )
+  SET(Plugin-Icon )
+  SET(Plugin-License )
+  SET(Plugin-Name )
+  SET(Require-Plugin )
+  SET(Plugin-SymbolicName )
+  SET(Plugin-Vendor )
+  SET(Plugin-Version )
+
+  # If a file named manifest_headers.cmake exists, read it
+  SET(manifest_headers_dep )
+  IF(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/manifest_headers.cmake")
+    INCLUDE(${CMAKE_CURRENT_SOURCE_DIR}/manifest_headers.cmake)
+    SET(manifest_headers_dep "${CMAKE_CURRENT_SOURCE_DIR}/manifest_headers.cmake")
+  ENDIF()
+
+  STRING(REPLACE "_" "." Plugin-SymbolicName ${lib_name})
+
+  # Create a list of plugin dependencies
+  STRING(REPLACE "." "_" require_plugin "${Require-Plugin}")
+  MESSAGE("require_plugin: ${require_plugin}")
 
   # --------------------------------------------------------------------------
   # Include dirs
@@ -75,6 +99,15 @@ MACRO(ctkMacroBuildPlugin)
     ${CMAKE_CURRENT_BINARY_DIR}
     ${MY_INCLUDE_DIRECTORIES}
     )
+
+  # Add the include directories from the plugin dependencies
+  FOREACH(plugin ${require_plugin})
+    LIST(APPEND my_includes
+         ${${plugin}_SOURCE_DIR}
+         ${${plugin}_BINARY_DIR}
+         )
+  ENDFOREACH()
+
   INCLUDE_DIRECTORIES(
     ${my_includes}
     )
@@ -102,36 +135,9 @@ MACRO(ctkMacroBuildPlugin)
     QT4_ADD_RESOURCES(MY_QRC_SRCS ${MY_RESOURCES})
   ENDIF()
 
-  # Clear the variables for the manifest headers
-  SET(Plugin-ActivationPolicy )
-  SET(Plugin-Category )
-  SET(Plugin-ContactAddress )
-  SET(Plugin-Copyright )
-  SET(Plugin-Description )
-  SET(Plugin-DocURL )
-  SET(Plugin-Icon )
-  SET(Plugin-License )
-  SET(Plugin-Name )
-  SET(Require-Plugin )
-  SET(Plugin-SymbolicName )
-  SET(Plugin-Vendor )
-  SET(Plugin-Version )
-
-  # If a file named manifest_headers.cmake exists, read it
-  SET(manifest_headers_dep )
-  IF(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/manifest_headers.cmake")
-    INCLUDE(${CMAKE_CURRENT_SOURCE_DIR}/manifest_headers.cmake)
-    SET(manifest_headers_dep "${CMAKE_CURRENT_SOURCE_DIR}/manifest_headers.cmake")
-  ENDIF()
-
-  # Set the plugin_symbolicname to the library name if it is not set
-  IF(NOT Plugin-SymbolicName)
-    STRING(REPLACE "_" "." Plugin-SymbolicName ${lib_name})
-  ENDIF()
-
   # Add the generated manifest qrc file
   SET(manifest_qrc_src )
-  ctkMacroGeneratePluginManifest(manifest_qrc_src
+  ctkFunctionGeneratePluginManifest(manifest_qrc_src
     ACTIVATIONPOLICY ${Plugin-ActivationPolicy}
     CATEGORY ${Plugin-Category}
     CONTACT_ADDRESS ${Plugin-ContactAddress}
@@ -199,6 +205,7 @@ MACRO(ctkMacroBuildPlugin)
   
   SET(my_libs
     ${MY_TARGET_LIBRARIES}
+    ${require_plugin}
     )
   TARGET_LINK_LIBRARIES(${lib_name} ${my_libs})
   

+ 29 - 0
CMake/ctkMacroGeneratePluginList.cmake

@@ -0,0 +1,29 @@
+#
+# Depends on:
+#  CTK/CMake/ctkMacroParseArguments.cmake
+#
+
+MACRO(ctkMacroGeneratePluginList )
+
+  CtkMacroParseArguments(MY
+    "FILE;DIRECTORIES"
+    ""
+    ${ARGN}
+    )
+
+  # Sanity checks
+  IF(NOT DEFINED MY_FILE)
+    MESSAGE(SEND_ERROR "FILE is mandatory")
+  ENDIF()
+
+  SET(_content )
+  FOREACH(plugin ${MY_DIRECTORIES})
+    SET(_content "${_content}\n
+
+  ENDFOREACH()
+
+
+  FILE(WRITE "${_manifest_filepath}" "${_manifest_content}")
+  FILE(WRITE "${_manifest_qrc_filepath}" "${_manifest_qrc_content}")
+
+ENDMACRO()

+ 17 - 2
CMakeLists.txt

@@ -148,7 +148,7 @@ INCLUDE(CMake/ctkMacroValidateBuildOptions.cmake)
 INCLUDE(CMake/ctkMacroAddCtkLibraryOptions.cmake)
 INCLUDE(CMake/ctkFunctionGenerateDGraphInput.cmake)
 INCLUDE(CMake/ctkFunctionGenerateProjectXml.cmake)
-INCLUDE(CMake/ctkMacroGeneratePluginManifest.cmake)
+INCLUDE(CMake/ctkFunctionGeneratePluginManifest.cmake)
 INCLUDE(CMake/ctkMacroGeneratePluginResourceFile.cmake)
 INCLUDE(CMake/ctkFunctionCheckCompilerFlags.cmake)
 
@@ -277,6 +277,9 @@ SET(CTK_LIBS
 # CTK Plugins - Use ON or OFF to indicate if the plugin should be built by default
 #
 SET(CTK_PLUGINS
+  org.commontk.a:OFF
+  org.commontk.b:OFF
+  org.commontk.c:OFF
   org.commontk.eventbus:ON
   org.commontk.cli:OFF
   )
@@ -343,6 +346,18 @@ FOREACH(plugin ${CTK_PLUGINS})
   LIST(APPEND CTK_PLUGINS_SUBDIRS "${plugin_name}")
 ENDFOREACH()
 
+# Create a file with variables containing the paths to the source, binary, and library directory
+# of each enabled plugin. This is needed to setup include and library dependencies to other plugins
+#SET(CTK_PLUGIN_LIST "${CMAKE_CURRENT_BINARY_DIR}/ctkPluginList.cmake")
+#SET(CTK_PLUGINS_SUBDIRS_ENABLED )
+#FOREACH(plugin ${CTK_PLUGINS_SUBDIRS})
+#  IF (CTK_PLUGIN_${plugin})
+#    LIST(APPEND CTK_PLUGINS_SUBDIRS_ENABLED Plugins/${plugin})
+#  ENDIF()
+#ENDFOREACH()
+#ctkMacroGeneratePluginList(FILE ${CTK_PLUGIN_LIST}
+#                           DIRECTORIES ${CTK_PLUGINS_SUBDIRS_ENABLED})
+
 # Build options associated with CTK applications
 FOREACH(app ${CTK_APPLICATIONS})
   ctkFunctionExtractOptionNameAndValue(${app} app_name app_value)
@@ -482,7 +497,7 @@ ENDFOREACH()
 # Add CTK plugin subdirectories
 #
 FOREACH(plugin ${CTK_PLUGINS_SUBDIRS})
-  IF (CTK_PLUGIN_${plugin})
+  IF(CTK_PLUGIN_${plugin})
     ADD_SUBDIRECTORY(Plugins/${plugin})
   ENDIF()
 ENDFOREACH()

+ 1 - 1
Libs/PluginFramework/CMakeLists.txt

@@ -101,7 +101,7 @@ SET(KIT_resources
 
 # Create a MANIFEST.MF resource for the PluginFramework library,
 # pretending that is is a plugin (the system plugin)
-ctkMacroGeneratePluginManifest(KIT_SRCS
+ctkFunctionGeneratePluginManifest(KIT_SRCS
   SYMBOLIC_NAME "system.plugin"
   VERSION "0.9.9"
   )

+ 25 - 0
Plugins/org.commontk.a/CMakeLists.txt

@@ -0,0 +1,25 @@
+PROJECT(org_commontk_a)
+
+SET(PLUGIN_export_directive "org_commontk_a_EXPORT")
+
+SET(PLUGIN_SRCS
+  ctkAPlugin.cpp
+)
+
+SET(PLUGIN_MOC_SRCS
+  ctkAPlugin.h
+)
+
+SET(PLUGIN_resources
+
+)
+
+ctkMacroGetTargetLibraries(PLUGIN_target_libraries)
+
+ctkMacroBuildPlugin(
+  EXPORT_DIRECTIVE ${PLUGIN_export_directive}
+  SRCS ${PLUGIN_SRCS}
+  MOC_SRCS ${PLUGIN_MOC_SRCS}
+  RESOURCES ${PLUGIN_resources}
+  TARGET_LIBRARIES ${PLUGIN_target_libraries}
+)

+ 26 - 0
Plugins/org.commontk.a/ctkAPlugin.cpp

@@ -0,0 +1,26 @@
+/*
+ * ctkAPlugin.cxx
+ *
+ *  Created on: Mar 29, 2010
+ *      Author: zelzer
+ */
+
+#include "ctkAPlugin.h"
+
+#include <QtPlugin>
+
+#include <iostream>
+
+void ctkAPlugin::start(ctkPluginContext* context)
+{
+  Q_UNUSED(context)
+  std::cout << "A Plugin started\n";
+}
+
+void ctkAPlugin::stop(ctkPluginContext* context)
+{
+  Q_UNUSED(context)
+  std::cout << "A Plugin stopped\n";
+}
+
+Q_EXPORT_PLUGIN2(org_commontk_a, ctkAPlugin)

+ 20 - 0
Plugins/org.commontk.a/ctkAPlugin.h

@@ -0,0 +1,20 @@
+#ifndef CTKAPLUGIN_H
+#define CTKAPLUGIN_H
+
+#include <ctkPluginActivator.h>
+
+class ctkAPlugin : public QObject,
+                   public ctkPluginActivator
+{
+  Q_OBJECT
+  Q_INTERFACES(ctkPluginActivator)
+
+public:
+
+  void start(ctkPluginContext* context);
+  void stop(ctkPluginContext* context);
+
+};
+
+
+#endif // CTKAPLUGIN_H

+ 9 - 0
Plugins/org.commontk.a/target_libraries.cmake

@@ -0,0 +1,9 @@
+#
+# See CMake/ctkMacroGetTargetLibraries.cmake
+# 
+# This file should list the libraries required to build the current CTK application.
+# 
+
+SET(target_libraries
+  CTKPluginFramework
+  )

+ 25 - 0
Plugins/org.commontk.b/CMakeLists.txt

@@ -0,0 +1,25 @@
+PROJECT(org_commontk_b)
+
+SET(PLUGIN_export_directive "org_commontk_b_EXPORT")
+
+SET(PLUGIN_SRCS
+  ctkBPlugin.cpp
+)
+
+SET(PLUGIN_MOC_SRCS
+  ctkBPlugin.h
+)
+
+SET(PLUGIN_resources
+
+)
+
+ctkMacroGetTargetLibraries(PLUGIN_target_libraries)
+
+ctkMacroBuildPlugin(
+  EXPORT_DIRECTIVE ${PLUGIN_export_directive}
+  SRCS ${PLUGIN_SRCS}
+  MOC_SRCS ${PLUGIN_MOC_SRCS}
+  RESOURCES ${PLUGIN_resources}
+  TARGET_LIBRARIES ${PLUGIN_target_libraries}
+)

+ 26 - 0
Plugins/org.commontk.b/ctkBPlugin.cpp

@@ -0,0 +1,26 @@
+/*
+ * ctkBPlugin.cxx
+ *
+ *  Created on: Mar 29, 2010
+ *      Author: zelzer
+ */
+
+#include "ctkBPlugin.h"
+
+#include <QtPlugin>
+
+#include <iostream>
+
+void ctkBPlugin::start(ctkPluginContext* context)
+{
+  Q_UNUSED(context)
+  std::cout << "B Plugin started\n";
+}
+
+void ctkBPlugin::stop(ctkPluginContext* context)
+{
+  Q_UNUSED(context)
+  std::cout << "B Plugin stopped\n";
+}
+
+Q_EXPORT_PLUGIN2(org_commontk_b, ctkBPlugin)

+ 20 - 0
Plugins/org.commontk.b/ctkBPlugin.h

@@ -0,0 +1,20 @@
+#ifndef CTKBPLUGIN_H
+#define CTKBPLUGIN_H
+
+#include <ctkPluginActivator.h>
+
+class ctkBPlugin : public QObject,
+                   public ctkPluginActivator
+{
+  Q_OBJECT
+  Q_INTERFACES(ctkPluginActivator)
+
+public:
+
+  void start(ctkPluginContext* context);
+  void stop(ctkPluginContext* context);
+
+};
+
+
+#endif // CTKBPLUGIN_H

+ 1 - 0
Plugins/org.commontk.b/manifest_headers.cmake

@@ -0,0 +1 @@
+SET(Require-Plugin org.commontk.a)

+ 9 - 0
Plugins/org.commontk.b/target_libraries.cmake

@@ -0,0 +1,9 @@
+#
+# See CMake/ctkMacroGetTargetLibraries.cmake
+# 
+# This file should list the libraries required to build the current CTK application.
+# 
+
+SET(target_libraries
+  CTKPluginFramework
+  )

+ 25 - 0
Plugins/org.commontk.c/CMakeLists.txt

@@ -0,0 +1,25 @@
+PROJECT(org_commontk_c)
+
+SET(PLUGIN_export_directive "org_commontk_c_EXPORT")
+
+SET(PLUGIN_SRCS
+  ctkCPlugin.cpp
+)
+
+SET(PLUGIN_MOC_SRCS
+  ctkCPlugin.h
+)
+
+SET(PLUGIN_resources
+
+)
+
+ctkMacroGetTargetLibraries(PLUGIN_target_libraries)
+
+ctkMacroBuildPlugin(
+  EXPORT_DIRECTIVE ${PLUGIN_export_directive}
+  SRCS ${PLUGIN_SRCS}
+  MOC_SRCS ${PLUGIN_MOC_SRCS}
+  RESOURCES ${PLUGIN_resources}
+  TARGET_LIBRARIES ${PLUGIN_target_libraries}
+)

+ 26 - 0
Plugins/org.commontk.c/ctkCPlugin.cpp

@@ -0,0 +1,26 @@
+/*
+ * ctkCPlugin.cxx
+ *
+ *  Created on: Mar 29, 2010
+ *      Author: zelzer
+ */
+
+#include "ctkCPlugin.h"
+
+#include <QtPlugin>
+
+#include <iostream>
+
+void ctkCPlugin::start(ctkPluginContext* context)
+{
+  Q_UNUSED(context)
+  std::cout << "C Plugin started\n";
+}
+
+void ctkCPlugin::stop(ctkPluginContext* context)
+{
+  Q_UNUSED(context)
+  std::cout << "C Plugin stopped\n";
+}
+
+Q_EXPORT_PLUGIN2(org_commontk_c, ctkCPlugin)

+ 20 - 0
Plugins/org.commontk.c/ctkCPlugin.h

@@ -0,0 +1,20 @@
+#ifndef CTKCPLUGIN_H
+#define CTKCPLUGIN_H
+
+#include <ctkPluginActivator.h>
+
+class ctkCPlugin : public QObject,
+                   public ctkPluginActivator
+{
+  Q_OBJECT
+  Q_INTERFACES(ctkPluginActivator)
+
+public:
+
+  void start(ctkPluginContext* context);
+  void stop(ctkPluginContext* context);
+
+};
+
+
+#endif // CTKCPLUGIN_H

+ 9 - 0
Plugins/org.commontk.c/target_libraries.cmake

@@ -0,0 +1,9 @@
+#
+# See CMake/ctkMacroGetTargetLibraries.cmake
+# 
+# This file should list the libraries required to build the current CTK application.
+# 
+
+SET(target_libraries
+  CTKPluginFramework
+  )

+ 0 - 1
Plugins/org.commontk.eventbus/CMakeLists.txt

@@ -20,7 +20,6 @@ SET(PLUGIN_resources
 ctkMacroGetTargetLibraries(PLUGIN_target_libraries)
 
 ctkMacroBuildPlugin(
-  NAME ${PROJECT_NAME}
   EXPORT_DIRECTIVE ${PLUGIN_export_directive}
   SRCS ${PLUGIN_SRCS}
   MOC_SRCS ${PLUGIN_MOC_SRCS}