Difference between revisions of "AHM2012-Slicer-Extension"
From NAMIC Wiki
(Created page with '== Writing an s4ext file == * Extensions are described using a simple text file. <pre> # # First token of each non-comment line is the keyword and the rest of the line # (includ…') |
m (Text replacement - "http://www.slicer.org/slicerWiki/index.php/" to "https://www.slicer.org/wiki/") |
||
(7 intermediate revisions by 2 users not shown) | |||
Line 18: | Line 18: | ||
# homepage | # homepage | ||
− | homepage | + | homepage https://www.slicer.org/wiki/Slicer4:Developers:Projects:QtSlicer/Tutorials/ExtensionWriting |
# Match category in the xml description of the module (where it shows up in Modules menu) | # Match category in the xml description of the module (where it shows up in Modules menu) | ||
Line 32: | Line 32: | ||
* This file will be automatically generated using information specified within your CMakeLists.txt | * This file will be automatically generated using information specified within your CMakeLists.txt | ||
+ | |||
+ | == Example of CMakeLists.txt == | ||
+ | <pre> | ||
+ | cmake_minimum_required(VERSION 2.8.4) | ||
+ | |||
+ | set(EXTENSION_NAME LoadableExtensionTemplate) | ||
+ | |||
+ | #----------------------------------------------------------------------------- | ||
+ | # Prerequisites | ||
+ | #----------------------------------------------------------------------------- | ||
+ | if(NOT Slicer_SOURCE_DIR) | ||
+ | set(EXTENSION_HOMEPAGE "https://www.slicer.org/wiki/Slicer4:Developers:Projects:QtSlicer/Tutorials/ExtensionWriting") | ||
+ | set(EXTENSION_CATEGORY "Examples") | ||
+ | set(EXTENSION_STATUS "Beta") | ||
+ | set(EXTENSION_DESCRIPTION "This is an example of Qt loadable module built as an extension") | ||
+ | set(EXTENSION_DEPENDS CLIExtensionTemplate) # Specified as a space separated list or 'NA' if any | ||
+ | |||
+ | find_package(Slicer REQUIRED) | ||
+ | |||
+ | # Additional C/CXX flags - Should be defined before including Slicer_USE_FILE | ||
+ | set(ADDITIONAL_C_FLAGS "" CACHE STRING "Additional ${EXTENSION_NAME} C Flags") | ||
+ | set(ADDITIONAL_CXX_FLAGS "" CACHE STRING "Additional ${EXTENSION_NAME} CXX Flags") | ||
+ | |||
+ | include(${Slicer_USE_FILE}) | ||
+ | |||
+ | set(EXTENSION_LICENSE_FILE ${Slicer_LICENSE_FILE}) | ||
+ | set(EXTENSION_README_FILE ${Slicer_README_FILE}) | ||
+ | |||
+ | include(SlicerEnableExtensionTesting) | ||
+ | |||
+ | endif() | ||
+ | |||
+ | |||
+ | # Add subdirectories | ||
+ | add_subdirectory(Logic) | ||
+ | |||
+ | #----------------------------------------------------------------------------- | ||
+ | # Sources | ||
+ | #----------------------------------------------------------------------------- | ||
+ | set(qt_module_export_directive "Q_SLICER_QTMODULES_LOADABLEEXTENSIONTEMPLATE_EXPORT") | ||
+ | |||
+ | # Additional includes - Current_{source,binary} and Slicer_{Libs,Base} already included | ||
+ | set(qt_module_include_directories | ||
+ | ${CMAKE_CURRENT_SOURCE_DIR}/Logic | ||
+ | ${CMAKE_CURRENT_BINARY_DIR}/Logic | ||
+ | ) | ||
+ | |||
+ | # Source files | ||
+ | set(qt_module_SRCS | ||
+ | qSlicerLoadableExtensionTemplateModule.cxx | ||
+ | qSlicerLoadableExtensionTemplateModule.h | ||
+ | qSlicerLoadableExtensionTemplateModuleWidget.cxx | ||
+ | qSlicerLoadableExtensionTemplateModuleWidget.h | ||
+ | ) | ||
+ | |||
+ | # Headers that should run through moc | ||
+ | set(qt_module_MOC_SRCS | ||
+ | qSlicerLoadableExtensionTemplateModule.h | ||
+ | qSlicerLoadableExtensionTemplateModuleWidget.h | ||
+ | ) | ||
+ | |||
+ | # UI files | ||
+ | set(qt_module_UI_SRCS | ||
+ | Resources/UI/qSlicerLoadableExtensionTemplateModule.ui | ||
+ | ) | ||
+ | |||
+ | # Additional Target libraries | ||
+ | set(qt_module_target_libraries | ||
+ | vtkSlicerLoadableExtensionTemplateModuleLogic | ||
+ | ) | ||
+ | |||
+ | # Resources | ||
+ | set(qt_module_resources | ||
+ | Resources/qSlicerLoadableExtensionTemplateModule.qrc | ||
+ | ) | ||
+ | |||
+ | #----------------------------------------------------------------------------- | ||
+ | # Build | ||
+ | #----------------------------------------------------------------------------- | ||
+ | slicerMacroBuildQtModule( | ||
+ | NAME ${EXTENSION_NAME} | ||
+ | EXPORT_DIRECTIVE ${qt_module_export_directive} | ||
+ | INCLUDE_DIRECTORIES ${qt_module_include_directories} | ||
+ | SRCS ${qt_module_SRCS} | ||
+ | MOC_SRCS ${qt_module_MOC_SRCS} | ||
+ | UI_SRCS ${qt_module_UI_SRCS} | ||
+ | TARGET_LIBRARIES ${qt_module_target_libraries} | ||
+ | RESOURCES ${qt_module_resources} | ||
+ | ) | ||
+ | |||
+ | #----------------------------------------------------------------------------- | ||
+ | # Testing | ||
+ | #----------------------------------------------------------------------------- | ||
+ | if(BUILD_TESTING) | ||
+ | add_subdirectory(Testing) | ||
+ | endif() | ||
+ | |||
+ | #----------------------------------------------------------------------------- | ||
+ | # Generate extension description file '<EXTENSION_NAME>.s4ext' | ||
+ | #----------------------------------------------------------------------------- | ||
+ | if(NOT Slicer_SOURCE_DIR) | ||
+ | include(SlicerFunctionGenerateExtensionDescription) | ||
+ | slicerFunctionGenerateExtensionDescription( | ||
+ | EXTENSION_NAME ${EXTENSION_NAME} | ||
+ | EXTENSION_CATEGORY ${EXTENSION_CATEGORY} | ||
+ | EXTENSION_STATUS ${EXTENSION_STATUS} | ||
+ | EXTENSION_HOMEPAGE ${EXTENSION_HOMEPAGE} | ||
+ | EXTENSION_DESCRIPTION ${EXTENSION_DESCRIPTION} | ||
+ | EXTENSION_DEPENDS ${EXTENSION_DEPENDS} | ||
+ | DESTINATION_DIR ${CMAKE_CURRENT_BINARY_DIR} | ||
+ | SLICER_WC_REVISION ${Slicer_WC_REVISION} | ||
+ | SLICER_WC_ROOT ${Slicer_WC_ROOT} | ||
+ | ) | ||
+ | endif() | ||
+ | |||
+ | #----------------------------------------------------------------------------- | ||
+ | # Packaging | ||
+ | #----------------------------------------------------------------------------- | ||
+ | if(NOT Slicer_SOURCE_DIR) | ||
+ | include(${Slicer_EXTENSION_CPACK}) | ||
+ | endif() | ||
+ | </pre> | ||
== Testing your extension == | == Testing your extension == | ||
− | * | + | * An extension is a ''container'' for one or more modules, writing test shouldn't be different. |
== How users will access your extension == | == How users will access your extension == | ||
Line 40: | Line 162: | ||
** Extension manager within Slicer | ** Extension manager within Slicer | ||
** Download from http://slicer.kitware.com/midas3/slicerpackages | ** Download from http://slicer.kitware.com/midas3/slicerpackages | ||
+ | |||
+ | == How to get started == | ||
+ | * Look at the existing template living in [https://github.com/Slicer/Slicer/tree/master/Extensions/Testing Slicer/Extensions/Testing] | ||
+ | ** [https://github.com/Slicer/Slicer/tree/master/Extensions/Testing/CLIExtensionTemplate CLIExtensionTemplate] | ||
+ | ** [https://github.com/Slicer/Slicer/tree/master/Extensions/Testing/EditorExtensionTemplate EditorExtensionTemplate] | ||
+ | ** [https://github.com/Slicer/Slicer/tree/master/Extensions/Testing/LoadableExtensionTemplate LoadableExtensionTemplate] | ||
+ | ** [https://github.com/Slicer/Slicer/tree/master/Extensions/Testing/ScriptedLoadableExtensionTemplate ScriptedLoadableExtensionTemplate] | ||
+ | ** [https://github.com/Slicer/Slicer/tree/master/Extensions/Testing/SuperBuildLoadableExtensionTemplate SuperBuildLoadableExtensionTemplate] | ||
+ | |||
+ | * Use [https://www.slicer.org/wiki/Documentation/4.1/Developers/ModuleWizard module wizard] to create an extension | ||
+ | |||
+ | * Configure and build an extension | ||
+ | <pre> | ||
+ | $ pwd | ||
+ | /path/to/MyExtension | ||
+ | $ cd .. | ||
+ | $ mkdir MyExtension-build | ||
+ | $ cd MyExtension-build | ||
+ | $ cmake -DSlicer_DIR:PATH=/path/to/Slicer-build | ||
+ | $ make -j4 | ||
+ | </pre> | ||
+ | |||
+ | |||
+ | * Test your extension and submit to CDash | ||
+ | <pre> | ||
+ | $ make Experimental | ||
+ | </pre> | ||
+ | |||
+ | * Test, submit to CDash and upload your extension on Midas | ||
+ | <pre> | ||
+ | $ make ExperimentalUpload | ||
+ | </pre> |
Latest revision as of 18:06, 10 July 2017
Home < AHM2012-Slicer-ExtensionContents
Writing an s4ext file
- Extensions are described using a simple text file.
# # First token of each non-comment line is the keyword and the rest of the line # (including spaces) is the value. # - the value can be blank # # This is source code manager (i.e. svn) scm local scmurl Testing/LoadableExtensionTemplate # list dependencies # - These should be names of other modules that have .s4ext files # - The dependencies will be built first depends NA # homepage homepage https://www.slicer.org/wiki/Slicer4:Developers:Projects:QtSlicer/Tutorials/ExtensionWriting # Match category in the xml description of the module (where it shows up in Modules menu) category Examples # Give people an idea what to expect from this code # - Is it just a test or something you stand beind? status Beta # One line stating what the module does description This is an example of Qt loadable module built as an extension
- This file will be automatically generated using information specified within your CMakeLists.txt
Example of CMakeLists.txt
cmake_minimum_required(VERSION 2.8.4) set(EXTENSION_NAME LoadableExtensionTemplate) #----------------------------------------------------------------------------- # Prerequisites #----------------------------------------------------------------------------- if(NOT Slicer_SOURCE_DIR) set(EXTENSION_HOMEPAGE "https://www.slicer.org/wiki/Slicer4:Developers:Projects:QtSlicer/Tutorials/ExtensionWriting") set(EXTENSION_CATEGORY "Examples") set(EXTENSION_STATUS "Beta") set(EXTENSION_DESCRIPTION "This is an example of Qt loadable module built as an extension") set(EXTENSION_DEPENDS CLIExtensionTemplate) # Specified as a space separated list or 'NA' if any find_package(Slicer REQUIRED) # Additional C/CXX flags - Should be defined before including Slicer_USE_FILE set(ADDITIONAL_C_FLAGS "" CACHE STRING "Additional ${EXTENSION_NAME} C Flags") set(ADDITIONAL_CXX_FLAGS "" CACHE STRING "Additional ${EXTENSION_NAME} CXX Flags") include(${Slicer_USE_FILE}) set(EXTENSION_LICENSE_FILE ${Slicer_LICENSE_FILE}) set(EXTENSION_README_FILE ${Slicer_README_FILE}) include(SlicerEnableExtensionTesting) endif() # Add subdirectories add_subdirectory(Logic) #----------------------------------------------------------------------------- # Sources #----------------------------------------------------------------------------- set(qt_module_export_directive "Q_SLICER_QTMODULES_LOADABLEEXTENSIONTEMPLATE_EXPORT") # Additional includes - Current_{source,binary} and Slicer_{Libs,Base} already included set(qt_module_include_directories ${CMAKE_CURRENT_SOURCE_DIR}/Logic ${CMAKE_CURRENT_BINARY_DIR}/Logic ) # Source files set(qt_module_SRCS qSlicerLoadableExtensionTemplateModule.cxx qSlicerLoadableExtensionTemplateModule.h qSlicerLoadableExtensionTemplateModuleWidget.cxx qSlicerLoadableExtensionTemplateModuleWidget.h ) # Headers that should run through moc set(qt_module_MOC_SRCS qSlicerLoadableExtensionTemplateModule.h qSlicerLoadableExtensionTemplateModuleWidget.h ) # UI files set(qt_module_UI_SRCS Resources/UI/qSlicerLoadableExtensionTemplateModule.ui ) # Additional Target libraries set(qt_module_target_libraries vtkSlicerLoadableExtensionTemplateModuleLogic ) # Resources set(qt_module_resources Resources/qSlicerLoadableExtensionTemplateModule.qrc ) #----------------------------------------------------------------------------- # Build #----------------------------------------------------------------------------- slicerMacroBuildQtModule( NAME ${EXTENSION_NAME} EXPORT_DIRECTIVE ${qt_module_export_directive} INCLUDE_DIRECTORIES ${qt_module_include_directories} SRCS ${qt_module_SRCS} MOC_SRCS ${qt_module_MOC_SRCS} UI_SRCS ${qt_module_UI_SRCS} TARGET_LIBRARIES ${qt_module_target_libraries} RESOURCES ${qt_module_resources} ) #----------------------------------------------------------------------------- # Testing #----------------------------------------------------------------------------- if(BUILD_TESTING) add_subdirectory(Testing) endif() #----------------------------------------------------------------------------- # Generate extension description file '<EXTENSION_NAME>.s4ext' #----------------------------------------------------------------------------- if(NOT Slicer_SOURCE_DIR) include(SlicerFunctionGenerateExtensionDescription) slicerFunctionGenerateExtensionDescription( EXTENSION_NAME ${EXTENSION_NAME} EXTENSION_CATEGORY ${EXTENSION_CATEGORY} EXTENSION_STATUS ${EXTENSION_STATUS} EXTENSION_HOMEPAGE ${EXTENSION_HOMEPAGE} EXTENSION_DESCRIPTION ${EXTENSION_DESCRIPTION} EXTENSION_DEPENDS ${EXTENSION_DEPENDS} DESTINATION_DIR ${CMAKE_CURRENT_BINARY_DIR} SLICER_WC_REVISION ${Slicer_WC_REVISION} SLICER_WC_ROOT ${Slicer_WC_ROOT} ) endif() #----------------------------------------------------------------------------- # Packaging #----------------------------------------------------------------------------- if(NOT Slicer_SOURCE_DIR) include(${Slicer_EXTENSION_CPACK}) endif()
Testing your extension
- An extension is a container for one or more modules, writing test shouldn't be different.
How users will access your extension
- Two options:
- Extension manager within Slicer
- Download from http://slicer.kitware.com/midas3/slicerpackages
How to get started
- Look at the existing template living in Slicer/Extensions/Testing
- Use module wizard to create an extension
- Configure and build an extension
$ pwd /path/to/MyExtension $ cd .. $ mkdir MyExtension-build $ cd MyExtension-build $ cmake -DSlicer_DIR:PATH=/path/to/Slicer-build $ make -j4
- Test your extension and submit to CDash
$ make Experimental
- Test, submit to CDash and upload your extension on Midas
$ make ExperimentalUpload