Difference between revisions of "Documentation/4.1/Developers/Tutorials/ExternalModuleWriting"
From Slicer Wiki
m |
m |
||
Line 1: | Line 1: | ||
This tutorial describes how to make a (Slicer4 / QT) loadable module that is compiled outside of the slicer build tree. | This tutorial describes how to make a (Slicer4 / QT) loadable module that is compiled outside of the slicer build tree. | ||
− | Consider also reading | + | = Consider also reading = |
:[[Media:QtPortInSlicer.ppt|QtPortInSlicer - How to write a module]] | :[[Media:QtPortInSlicer.ppt|QtPortInSlicer - How to write a module]] | ||
:[[Documentation/{{documentation/version}}/Developers/Tutorials/ModuleWriting|How to write a module inside Slicer]] | :[[Documentation/{{documentation/version}}/Developers/Tutorials/ModuleWriting|How to write a module inside Slicer]] | ||
− | + | = Initialization = | |
− | + | === 1) Create the module directory === | |
− | + | ||
− | + | {{:{{FULLPAGENAME}}/CreateModuleDirectory}} | |
− | + | ||
− | + | === 1) Create the module directory === | |
− | + | ||
− | + | === 2) Setting up your CMakeLists.txt === | |
− | + | ||
+ | * [http://forge.abcd.harvard.edu/gf/project/plastimatch/scmsvn/?action=browse&path=%2F%2Acheckout%2A%2Fplastimatch%2Ftrunk%2Fcmake%2FFindSlicer.cmake Download FindSlicer.cmake] | ||
+ | * Edit CMakeLists.txt, and make it (1) detect Slicer, (2) load the Slicer "Use file", and (3) add your module subdirectory. | ||
find_package (Slicer QUIET) | find_package (Slicer QUIET) | ||
if (SLICER_FOUND) | if (SLICER_FOUND) | ||
Line 38: | Line 40: | ||
* You might need to copy over TestingMacros.h, it depends how you set up your include directories above. | * You might need to copy over TestingMacros.h, it depends how you set up your include directories above. | ||
$ cp ${SD}/TestingMacros.h MY_MODULE_NAME | $ cp ${SD}/TestingMacros.h MY_MODULE_NAME | ||
+ | |||
+ | === 3) Compile your module === | ||
+ | |||
* Compile your module. At this point, it will compile. You may see some warnings from CMake | * Compile your module. At this point, it will compile. You may see some warnings from CMake | ||
CMake Warning at /home/gsharp/build/slicer-4/Slicer4/CMake/vtkMacroKitPythonWrap.cmake:86 (ADD_LIBRARY): | CMake Warning at /home/gsharp/build/slicer-4/Slicer4/CMake/vtkMacroKitPythonWrap.cmake:86 (ADD_LIBRARY): |
Revision as of 22:25, 25 May 2012
Home < Documentation < 4.1 < Developers < Tutorials < ExternalModuleWritingThis tutorial describes how to make a (Slicer4 / QT) loadable module that is compiled outside of the slicer build tree.
Contents
Consider also reading
Initialization
1) Create the module directory
Documentation/4.1/Developers/Tutorials/ExternalModuleWriting/CreateModuleDirectory
1) Create the module directory
2) Setting up your CMakeLists.txt
- Download FindSlicer.cmake
- Edit CMakeLists.txt, and make it (1) detect Slicer, (2) load the Slicer "Use file", and (3) add your module subdirectory.
find_package (Slicer QUIET) if (SLICER_FOUND) include ("${Slicer_USE_FILE}") if (SLICER_IS_SLICER4) add_subdirectory (MY_MODULE_NAME) endif () endif ()
- You might need to undo some of Slicer's settings. If you don't think you need this, then you probably don't. But if you need it, you can do something like this:
if (Slicer_USE_FILE) get_directory_property (OLD_INCLUDE_DIR INCLUDE_DIRECTORIES) set_directory_properties (PROPERTIES INCLUDE_DIRECTORIES "") set (OLD_CFLAGS ${CMAKE_C_FLAGS}) set (OLD_CXXFLAGS ${CMAKE_CXX_FLAGS}) include ("${Slicer_USE_FILE}") get_directory_property (SLICER_INCLUDE_DIRS INCLUDE_DIRECTORIES) set_directory_properties (PROPERTIES INCLUDE_DIRECTORIES "${OLD_INCLUDE_DIR}") set (CMAKE_C_FLAGS "${OLD_CFLAGS}" CACHE STRING "CMake CXX Flags" FORCE) set (CMAKE_CXX_FLAGS "${OLD_CXXFLAGS}" CACHE STRING "CMake CXX Flags" FORCE) endif ()
- You might need to copy over TestingMacros.h, it depends how you set up your include directories above.
$ cp ${SD}/TestingMacros.h MY_MODULE_NAME
3) Compile your module
- Compile your module. At this point, it will compile. You may see some warnings from CMake
CMake Warning at /home/gsharp/build/slicer-4/Slicer4/CMake/vtkMacroKitPythonWrap.cmake:86 (ADD_LIBRARY): Cannot generate a safe runtime search path for target vtkSlicerMY_MODULE_NAMEModuleLogicPython because files in some directories may conflict with libraries in implicit directories: runtime library [libpython2.6.so.1.0] in /usr/lib may be hidden by files in: /home/gsharp/build/slicer-4/Slicer4-Build/python-build/lib Some of these libraries may not be found correctly. Call Stack (most recent call first): /home/gsharp/build/slicer-4/Slicer4/CMake/SlicerMacroPythonWrapModuleLibrary.cmake:66 (vtkMacroKitPythonWrap) /home/gsharp/build/slicer-4/Slicer4/CMake/SlicerMacroBuildModuleLogic.cmake:76 (SlicerMacroPythonWrapModuleLibrary) src/slicer/QTModules/MY_MODULE_NAME/Logic/CMakeLists.txt:28 (SlicerMacroBuildModuleLogic)
These warnings are benign. Anyone know how to turn them off?
- The above setup will put the shared libraries directly into the slicer build directory. I guess this isn't what you want, but now is a good time to test that everything is working. Make sure the files are there.
On unix:
$ cd ${SLICER_BUILD}/Slicer-build $ find . -name "*MY*" -print ./bin/MY_MODULE_NAMECxxTests ./bin/libvtkSlicerMY_MODULE_NAMEModuleLogicPythonD.so ./bin/vtkSlicerMY_MODULE_NAMEModuleLogicPython.so ./bin/Python/slicer/modulelogic/vtkSlicerMY_MODULE_NAMEModuleLogic.py ./bin/Python/slicer/modulelogic/vtkSlicerMY_MODULE_NAMEModuleLogic.pyc ./lib/Slicer3/QTLoadableModules/libvtkSlicerMY_MODULE_NAMEModuleLogic.so ./lib/Slicer3/QTLoadableModules/libqSlicerMY_MODULE_NAMEModule.so
When you fire up slicer, you should see the module. For me, it looks like this:
- It is possible (with some work), to tell your program to build the module in your own directory instead of Slicer's. However, there is not yet any way to tell slicer to look in your own directory. So we leave the tutorial and await further developments.