Difference between revisions of "Documentation/Nightly/Developers/Tutorials/BundleModulesIntoExtension"
(4.1 -> Nightly) |
m (Text replacement - "\[http:\/\/www\.slicer\.org\/slicerWiki\/images\/([^ ]+) ([^]]+)]" to "[http://www.slicer.org/w/img_auth.php/$1 $2]") |
||
| (16 intermediate revisions by 2 users not shown) | |||
| Line 1: | Line 1: | ||
| − | + | <noinclude>{{documentation/versioncheck}}</noinclude> | |
| + | = Overview = | ||
Extensions are packaged against a specific version of Slicer, to be distributed and available for a revision X of Slicer, extensions have to be build against that same revision of Slicer. Otherwise, an extension will be considered as [[Documentation/{{documentation/version}}/SlicerApplication/ExtensionsManager#Incompatible_extensions|incompatible]]. | Extensions are packaged against a specific version of Slicer, to be distributed and available for a revision X of Slicer, extensions have to be build against that same revision of Slicer. Otherwise, an extension will be considered as [[Documentation/{{documentation/version}}/SlicerApplication/ExtensionsManager#Incompatible_extensions|incompatible]]. | ||
| + | <ol style="list-style-type:none; border-left:thick solid darkgreen; padding-left:1em;"> | ||
| + | <li>If you are not familiar with the extension creation and contribution process, consider reading [[Documentation/{{documentation/version}}/Developers/Tutorials/BuildTestPackageDistributeExtensions|Step-by-step: How to create, publish and distribute an extension]].</li> | ||
| + | </ol> | ||
| − | + | = CMake variables = | |
| − | + | To create an extension, the following CMake variables should be defined: | |
| − | |||
| − | |||
| − | |||
| − | |||
{|class="wikitable alternance" style="text-align:left; width:70%; border:1px solid black;" | {|class="wikitable alternance" style="text-align:left; width:70%; border:1px solid black;" | ||
| Line 63: | Line 63: | ||
|} | |} | ||
| − | + | = Project layout = | |
The code should be organized as illustrated below: | The code should be organized as illustrated below: | ||
| Line 96: | Line 96: | ||
</pre> | </pre> | ||
| − | + | = Top-level CMakeLists.txt = | |
The top-level <code>CMakeLists.txt</code> could be organized as reported below: | The top-level <code>CMakeLists.txt</code> could be organized as reported below: | ||
<pre> | <pre> | ||
| − | cmake_minimum_required(VERSION 2.8. | + | cmake_minimum_required(VERSION 2.8.9) |
#----------------------------------------------------------------------------- | #----------------------------------------------------------------------------- | ||
| − | + | # Extension meta-information <- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - EXTENSION SPECIFIC | |
| − | + | set(EXTENSION_NAME MyExtension) <- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - EXTENSION SPECIFIC | |
| − | + | set(EXTENSION_HOMEPAGE "http://www.slicer.org/slicerWiki/index.php/Documentation/4.1/Extensions/${EXTENSION_NAME}") <- - - - EXTENSION SPECIFIC | |
| − | + | set(EXTENSION_CATEGORY "Examples") <- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - EXTENSION SPECIFIC | |
| − | + | set(EXTENSION_CONTRIBUTORS "Jean-Christophe Fillion-Robin (Kitware)") <- - - - - - - - - - - - - - - - - - - - - - - - - - - EXTENSION SPECIFIC | |
| − | + | set(EXTENSION_DESCRIPTION "This is an example of extension bundling a CLI, a loadable and a scripted module") <- - - - - - - EXTENSION SPECIFIC | |
| − | + | set(EXTENSION_ICONURL "http://viewvc.slicer.org/viewvc.cgi/Slicer4/trunk/Extensions/Testing/LoadableExtensionTemplate/Resources/Icons/LoadableExtensionTemplate.png?revision=19437&view=co") | |
| − | |||
#----------------------------------------------------------------------------- | #----------------------------------------------------------------------------- | ||
| − | + | find_package(Slicer REQUIRED) | |
| − | + | include(${Slicer_USE_FILE}) | |
| − | |||
| − | |||
#----------------------------------------------------------------------------- | #----------------------------------------------------------------------------- | ||
| Line 125: | Line 122: | ||
#----------------------------------------------------------------------------- | #----------------------------------------------------------------------------- | ||
| − | + | include(${Slicer_EXTENSION_CPACK}) <- - - - - EXTENSION SPECIFIC | |
| − | |||
| − | |||
</pre> | </pre> | ||
| − | + | = Possible tweak of Module level CMakeLists.txt = | |
During the development process, it could be useful to be able to build each module against a given slicer build tree without having to build the complete extensions, to do so the <code>CMakeLists.txt</code> of each module could include <code>find_package(Slicer REQUIRED)</code>. | During the development process, it could be useful to be able to build each module against a given slicer build tree without having to build the complete extensions, to do so the <code>CMakeLists.txt</code> of each module could include <code>find_package(Slicer REQUIRED)</code>. | ||
| Line 138: | Line 133: | ||
<pre> | <pre> | ||
| − | cmake_minimum_required(VERSION 2.8. | + | cmake_minimum_required(VERSION 2.8.9) |
#----------------------------------------------------------------------------- | #----------------------------------------------------------------------------- | ||
| Line 144: | Line 139: | ||
#----------------------------------------------------------------------------- | #----------------------------------------------------------------------------- | ||
| − | + | find_package(Slicer REQUIRED) | |
| − | + | include(${Slicer_USE_FILE}) | |
| − | |||
| − | |||
[...] | [...] | ||
</pre> | </pre> | ||
| + | <!-- | ||
= Extension bundles 1 module = | = Extension bundles 1 module = | ||
| Line 183: | Line 177: | ||
<pre> | <pre> | ||
| − | cmake_minimum_required(VERSION 2.8. | + | cmake_minimum_required(VERSION 2.8.9) |
#----------------------------------------------------------------------------- | #----------------------------------------------------------------------------- | ||
| − | + | # Extension meta-information <- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - EXTENSION SPECIFIC | |
| − | + | set(EXTENSION_NAME MyLoadableModuleExtension) <- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - EXTENSION SPECIFIC | |
| − | + | set(EXTENSION_HOMEPAGE "http://www.slicer.org/slicerWiki/index.php/Documentation/4.1/Extensions/${MODULE_NAME}") <- - - - - EXTENSION SPECIFIC | |
| − | + | set(EXTENSION_CATEGORY "Examples") <- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - EXTENSION SPECIFIC | |
| − | + | set(EXTENSION_CONTRIBUTORS "Jean-Christophe Fillion-Robin (Kitware)") <- - - - - - - - - - - - - - - - - - - - - - - - - - - EXTENSION SPECIFIC | |
| − | + | set(EXTENSION_DESCRIPTION "This is an example of Qt loadable module built as an extension") <- - - - - - - - - - - - - - - - EXTENSION SPECIFIC | |
| − | + | set(EXTENSION_ICONURL "http://viewvc.slicer.org/viewvc.cgi/Slicer4/trunk/Extensions/Testing/LoadableExtensionTemplate/Resources/Icons/LoadableExtensionTemplate.png?revision=19437&view=co") | |
| − | |||
#----------------------------------------------------------------------------- | #----------------------------------------------------------------------------- | ||
| Line 202: | Line 195: | ||
#----------------------------------------------------------------------------- | #----------------------------------------------------------------------------- | ||
| − | + | find_package(Slicer REQUIRED) | |
| − | + | include(${Slicer_USE_FILE}) | |
| − | |||
| − | |||
#----------------------------------------------------------------------------- | #----------------------------------------------------------------------------- | ||
| Line 234: | Line 225: | ||
#----------------------------------------------------------------------------- | #----------------------------------------------------------------------------- | ||
| − | + | include(${Slicer_EXTENSION_CPACK}) <- - - - - EXTENSION SPECIFIC | |
| − | |||
| − | |||
</pre> | </pre> | ||
| + | --> | ||
= Additional documentation = | = Additional documentation = | ||
| − | * [http://www.slicer.org/ | + | * [[Documentation/{{documentation/version}}/Developers/Tutorials/BuildTestPackageDistributeExtensions|Step-by-step: How to create, publish and distribute an extension]] |
| + | * [http://www.slicer.org/w/img_auth.php/a/a1/AHM-2011-SlicerExtensions-final.ppt AHM 2011 SlicerExtensions presentation] | ||
| + | * Read [[Documentation/{{documentation/version}}/FAQ|FAQ]] | ||
Latest revision as of 12:39, 27 November 2019
Home < Documentation < Nightly < Developers < Tutorials < BundleModulesIntoExtension
|
For the latest Slicer documentation, visit the read-the-docs. |
Contents
Overview
Extensions are packaged against a specific version of Slicer, to be distributed and available for a revision X of Slicer, extensions have to be build against that same revision of Slicer. Otherwise, an extension will be considered as incompatible.
- If you are not familiar with the extension creation and contribution process, consider reading Step-by-step: How to create, publish and distribute an extension.
CMake variables
To create an extension, the following CMake variables should be defined:
List of partially supported CMake variables:
| CMake variable | Description |
|---|---|
EXTENSION_STATUS
|
Give people an idea what to expect from this code |
Project layout
The code should be organized as illustrated below:
MyExtension <- - - - - - - - - - - - - - - - - - - - - - Top-level folder of the extension project
|
|-- CMakeLists.txt
|
|-- MyExtension.png
|
|-- MyCLIModule
| |
| |-- CMakeLists.txt
| |
| |-- MyCLIModule.cxx
| |
| |-- MyCLIModule.xml
. .
. .
|
|-- MyLoadableModule
|
|-- CMakeLists.txt
|
|-- qSlicerMyLoadableModuleModule.cxx
|
|-- qSlicerMyLoadableModuleModule.h
.
.
Top-level CMakeLists.txt
The top-level CMakeLists.txt could be organized as reported below:
cmake_minimum_required(VERSION 2.8.9)
#-----------------------------------------------------------------------------
# Extension meta-information <- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - EXTENSION SPECIFIC
set(EXTENSION_NAME MyExtension) <- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - EXTENSION SPECIFIC
set(EXTENSION_HOMEPAGE "http://www.slicer.org/slicerWiki/index.php/Documentation/4.1/Extensions/${EXTENSION_NAME}") <- - - - EXTENSION SPECIFIC
set(EXTENSION_CATEGORY "Examples") <- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - EXTENSION SPECIFIC
set(EXTENSION_CONTRIBUTORS "Jean-Christophe Fillion-Robin (Kitware)") <- - - - - - - - - - - - - - - - - - - - - - - - - - - EXTENSION SPECIFIC
set(EXTENSION_DESCRIPTION "This is an example of extension bundling a CLI, a loadable and a scripted module") <- - - - - - - EXTENSION SPECIFIC
set(EXTENSION_ICONURL "http://viewvc.slicer.org/viewvc.cgi/Slicer4/trunk/Extensions/Testing/LoadableExtensionTemplate/Resources/Icons/LoadableExtensionTemplate.png?revision=19437&view=co")
#-----------------------------------------------------------------------------
find_package(Slicer REQUIRED)
include(${Slicer_USE_FILE})
#-----------------------------------------------------------------------------
add_subdirectory(MyCLIModule)
add_subdirectory(MyLoadableModule)
[...]
#-----------------------------------------------------------------------------
include(${Slicer_EXTENSION_CPACK}) <- - - - - EXTENSION SPECIFIC
Possible tweak of Module level CMakeLists.txt
During the development process, it could be useful to be able to build each module against a given slicer build tree without having to build the complete extensions, to do so the CMakeLists.txt of each module could include find_package(Slicer REQUIRED).
For example, the CMakeLists.txt of MyCLIModule module that would be bundled into MyExtension could include the following code:
cmake_minimum_required(VERSION 2.8.9)
#-----------------------------------------------------------------------------
set(MODULE_NAME MyCLIModule) # Do not use 'project()'
#-----------------------------------------------------------------------------
find_package(Slicer REQUIRED)
include(${Slicer_USE_FILE})
[...]