Commit 6cccc577 authored by jcfr's avatar jcfr

ENH: Add SlicerExtensionDescriptionSpec CMake module

* Update CMake module to Extract or Generate extension description file
to use "SlicerExtensionDescriptionSpec"

* Add tests

git-svn-id: http://svn.slicer.org/Slicer4/trunk@25213 3bd1e089-480b-0410-8dfb-8563597acbee
parent 273d9a53
......@@ -5,7 +5,7 @@
macro(add_cmakescript_test testname script)
add_test(cmake_${testname} ${CMAKE_COMMAND}
-DTEST_${testname}:BOOL=ON
-P ${CMAKE_SOURCE_DIR}/CMake/${script}.cmake)
-P ${CMAKE_SOURCE_DIR}/${script})
set_tests_properties(cmake_${testname} PROPERTIES
LABELS CMake
PASS_REGULAR_EXPRESSION "SUCCESS")
......@@ -14,5 +14,10 @@ endmacro()
#
# Add 'CMake script' Tests
#
add_cmakescript_test(slicer_setting_variable_message_test UseSlicerMacros)
add_cmakescript_test(list_to_string_test ListToString)
add_cmakescript_test(
list_to_string_test
CMake/ListToString.cmake)
add_cmakescript_test(
slicer_setting_variable_message_test
CMake/UseSlicerMacros.cmake)
......@@ -725,6 +725,7 @@ if(BUILD_TESTING)
COPYONLY)
add_subdirectory(CMake/Testing)
add_subdirectory(Extensions/CMake/Testing)
if(Slicer_BUILD_CLI_SUPPORT)
set(SEM_LAUNCH_COMMAND ${Slicer_LAUNCH_COMMAND})
......
################################################################################
#
# Program: 3D Slicer
#
# Copyright (c) Kitware Inc.
#
# See COPYRIGHT.txt
# or http://www.slicer.org/copyright/copyright.txt for details.
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
# This file was originally developed by Jean-Christophe Fillion-Robin, Kitware Inc.
# and was partially funded by NIH grant 1U24CA194354-01
#
################################################################################
#
# Once included, this module will define
#
# (1) the following variables:
#
# Slicer_EXT_METADATA_NAMES: List of metadata names (e.g SCM, SCMURL, ...)
#
# Slicer_EXT_REQUIRED_METADATA_NAMES: List of required metadata names
#
# Slicer_EXT_OPTIONAL_METADATA_NAMES: List of optional metadata names
#
# And for each metadata:
#
# Slicer_EXT_METADATA_<name>_REQUIRED: Set to 1 if mandatory.
#
# Slicer_EXT_<name>_DEFAULT : Default value if any.
#
# Slicer_EXT_<name>_DESCRIPTION : Describe the metadata.
#
# where <name> is the metadata name (e.g SCM, SCMURL, ...)
#
#
# (2) the following macro(s):
#
# slicer_extension_metadata_set_defaults(<prefix>):
#
# For each optional metadata, set variables "<prefix>_<name>"
# initialized to "Slicer_EXT_<name>_DEFAULT" if "<prefix>_<name>"
# was not already defined.
#
set(Slicer_EXT_METADATA_NAMES )
macro(_define_metadata name description required default)
set(Slicer_EXT_METADATA_${name}_REQUIRED "${required}")
set(Slicer_EXT_METADATA_${name}_DEFAULT "${default}")
set(Slicer_EXT_METADATA_${name}_DESCRIPTION "${description}")
list(APPEND Slicer_EXT_METADATA_NAMES ${name})
endmacro()
_define_metadata(
"SCM"
"Source code management system: git or svn"
1
"")
_define_metadata("SCMURL"
"Read-only url used to checkout the extension source code"
1
"")
_define_metadata("SCMREVISION"
"Revision allowing to checkout the expected source code"
1
"")
_define_metadata(
"SVNUSERNAME"
"Allow to specify username associated with svn checkout"
0
"")
_define_metadata("SVNPASSWORD"
"Allow to specify password associated with svn checkout"
0
"")
_define_metadata("DEPENDS"
"Space separated list of extensions required to build this extension"
0
"NA")
_define_metadata("BUILD_SUBDIRECTORY"
"Name of the inner build directory in case of superbuild based extension"
0
".")
_define_metadata("HOMEPAGE"
"Url of the web page describing the extension."
0
"")
_define_metadata("CONTRIBUTORS"
"Extension contributor specified as Firstname1 Lastname1 ([SubOrg1, ]Org1), Firstname2 Lastname2 ([SubOrg2, ]Org2)"
0
"")
_define_metadata("CATEGORY"
"Extension category"
0
"")
_define_metadata("ICONURL"
"Url to an icon (png, size 128x128 pixels)"
0
"")
_define_metadata("DESCRIPTION"
"One line describing what is the purpose of the extension"
0
"")
_define_metadata("SCREENSHOTURLS"
"Space separated list of urls to images"
0
"")
_define_metadata("ENABLED"
"1 or 0 - Specify if the extension should be enabled after its installation"
0
"1")
_define_metadata("STATUS"
"Give people an idea what to expect from this code"
0
"")
set(Slicer_EXT_REQUIRED_METADATA_NAMES )
set(Slicer_EXT_OPTIONAL_METADATA_NAMES )
foreach(name IN LISTS Slicer_EXT_METADATA_NAMES)
# Sanity check
foreach(var IN ITEMS "REQUIRED" "DEFAULT" "DESCRIPTION")
set(varname "Slicer_EXT_METADATA_${name}_${var}")
if(NOT DEFINED "${varname}")
message(FATAL_ERROR "Variable ${varname} is not defined")
endif()
endforeach()
if(Slicer_EXT_METADATA_${name}_REQUIRED)
list(APPEND Slicer_EXT_REQUIRED_METADATA_NAMES ${name})
else()
list(APPEND Slicer_EXT_OPTIONAL_METADATA_NAMES ${name})
endif()
endforeach()
macro(slicer_extension_metadata_set_defaults prefix)
foreach(name IN LISTS Slicer_EXT_OPTIONAL_METADATA_NAMES)
if("${${prefix}_${name}}" STREQUAL "")
set(${prefix}_${name} "${Slicer_EXT_METADATA_${name}_DEFAULT}")
endif()
endforeach()
endmacro()
################################################################################
# Testing
################################################################################
#
# cmake -DTEST_<testfunction>:BOOL=ON -P <this_script>.cmake
#
function(slicer_extension_description_spec_defaults_test)
# Check metadata count
list(LENGTH Slicer_EXT_METADATA_NAMES metadata_count)
list(LENGTH Slicer_EXT_REQUIRED_METADATA_NAMES required_metadata_count)
list(LENGTH Slicer_EXT_OPTIONAL_METADATA_NAMES optional_metadata_count)
set(expected 15)
set(actual ${metadata_count})
if(NOT ${actual} EQUAL ${expected})
message(FATAL_ERROR
"Problem with metadata_count. Expected: ${expected}, actual: ${actual}")
endif()
set(expected 3)
set(actual ${required_metadata_count})
if(NOT ${actual} EQUAL ${expected})
message(FATAL_ERROR
"Problem with metadata_count. Expected: ${expected}, actual: ${actual}")
endif()
set(expected 12)
set(actual ${optional_metadata_count})
if(NOT ${actual} EQUAL ${expected})
message(FATAL_ERROR
"Problem with metadata_count. Expected: ${expected}, actual: ${actual}")
endif()
# Check REQUIRED, DEFAULT and DESCRIPTION are defined for all metadata names
set(required
SCM
SCMURL
SCMREVISION
)
set(optional
SVNUSERNAME
SVNPASSWORD
DEPENDS
BUILD_SUBDIRECTORY
HOMEPAGE
CONTRIBUTORS
CATEGORY
ICONURL
DESCRIPTION
SCREENSHOTURLS
ENABLED
STATUS
)
foreach(name IN LISTS required optonal)
foreach(varsuffix IN ITEMS "REQUIRED" "DEFAULT" "DESCRIPTION")
set(expected_defined_varname "Slicer_EXT_METADATA_${name}_${varsuffix}")
if(NOT DEFINED "${expected_defined_varname}")
message(FATAL_ERROR "Variable ${expected_defined_varname} is NOT defined")
endif()
endforeach()
endforeach()
message("SUCCESS")
endfunction()
if(TEST_slicer_extension_description_spec_defaults_test)
slicer_extension_description_spec_defaults_test()
endif()
function(slicer_extension_metadata_set_defaults_test)
# Check that passing prefix parameter work as expected
if(DEFINED foo_BUILD_SUBDIRECTORY)
message(FATAL_ERROR "foo_BUILD_SUBDIRECTORY should not be defined")
endif()
set(foo_ENABLED 0)
slicer_extension_metadata_set_defaults("foo")
# Check variable already set are not overridden
if(NOT foo_ENABLED STREQUAL "0")
message(FATAL_ERROR "Problem with slicer_extension_metadata_set_defaults")
endif()
# Check undefined variable are initialized to a default value.
if(NOT foo_BUILD_SUBDIRECTORY STREQUAL ".")
message(FATAL_ERROR "Problem with slicer_extension_metadata_set_defaults")
endif()
# Check undefined variable or variable set to an empty string are
# initialized using default value
set(bar_ENABLED "")
unset(bar_DEPENDS)
slicer_extension_metadata_set_defaults("bar")
if(NOT bar_ENABLED STREQUAL "1")
message(FATAL_ERROR "Problem with slicer_extension_metadata_set_defaults")
endif()
if(NOT bar_DEPENDS STREQUAL "NA")
message(FATAL_ERROR "Problem with slicer_extension_metadata_set_defaults")
endif()
message("SUCCESS")
endfunction()
if(TEST_slicer_extension_metadata_set_defaults_test)
slicer_extension_metadata_set_defaults_test()
endif()
......@@ -18,6 +18,20 @@
#
################################################################################
include(CMakeParseArguments)
if(NOT DEFINED Slicer_EXTENSIONS_CMAKE_DIR)
set(Slicer_EXTENSIONS_CMAKE_DIR ${CMAKE_CURRENT_LIST_DIR})
endif()
foreach(p
CMP0054 # CMake 3.1
CMP0064 # CMake 3.4
)
if(POLICY ${p})
cmake_policy(SET ${p} NEW)
endif()
endforeach()
#
# slicerFunctionExtractExtensionDescription(EXTENSION_FILE <file> VAR_PREFIX <var-prefix>)
......@@ -64,33 +78,13 @@ function(slicerFunctionExtractExtensionDescription)
# Read file
file(READ ${MY_EXTENSION_FILE} extension_file_content)
# <token_name>:<default_value>
set(extension_description_tokens
scm:
scmurl:
svnusername:
svnpassword:""
scmrevision:
depends:
build_subdirectory:.
homepage:
contributors:
category:
iconurl:
screenshoturls:
status:
description:
enabled:1
)
foreach(token_and_default ${extension_description_tokens})
include(${Slicer_EXTENSIONS_CMAKE_DIR}/SlicerExtensionDescriptionSpec.cmake)
# Extract token and its associated default value
string(REPLACE ":" ";" token_and_default_as_list ${token_and_default})
list(GET token_and_default_as_list 0 token)
list(GET token_and_default_as_list 1 token_default_value)
foreach(name IN LISTS Slicer_EXT_METADATA_NAMES)
set(token_default_value "${Slicer_EXT_METADATA_${name}_DEFAULT}")
set(upper_case_token ${name})
string(TOLOWER ${name} token)
string(TOUPPER ${token} upper_case_token)
string(REGEX REPLACE "^(.*\n)?${token}[ ]+([^\n]+).*"
"\\2" ext_${upper_case_token} "${extension_file_content}")
......@@ -109,9 +103,133 @@ function(slicerFunctionExtractExtensionDescription)
string(REGEX REPLACE "^NA$" "" ext_${upper_case_token} "${ext_${upper_case_token}}")
string(REPLACE " " ";" ext_${upper_case_token} "${ext_${upper_case_token}}")
endif()
set(${MY_VAR_PREFIX}_EXT_${upper_case_token} "${ext_${upper_case_token}}" PARENT_SCOPE)
endforeach()
endfunction()
################################################################################
# Testing
################################################################################
#
# cmake -DTEST_<testfunction>:BOOL=ON -P <this_script>.cmake
#
function(slicer_extract_extension_description_test)
# Common properties
set(required
SCM
SCMURL
SCMREVISION
)
set(optional
#SVNUSERNAME
#SVNPASSWORD
DEPENDS
BUILD_SUBDIRECTORY
HOMEPAGE
CONTRIBUTORS
CATEGORY
ICONURL
DESCRIPTION
SCREENSHOTURLS
ENABLED
STATUS
)
set(expected_BUILD_SUBDIRECTORY ".")
set(expected_CATEGORY "Exporter")
set(expected_CONTRIBUTORS "Jean-Christophe Fillion-Robin (Kitware), Pat Marion (Kitware), Steve Pieper (Isomics), Atsushi Yamada (Shiga University of Medical Science)")
set(expected_DESCRIPTION "The SlicerToKiwiExporter module provides Slicer user with any easy way to export models into a KiwiViewer scene file.")
set(expected_ENABLED "1")
set(expected_HOMEPAGE "http://www.slicer.org/slicerWiki/index.php/Documentation/Nightly/Extensions/SlicerToKiwiExporter")
set(expected_ICONURL "http://www.slicer.org/slicerWiki/images/6/64/SlicerToKiwiExporterLogo.png")
set(expected_SCM "git")
set(expected_SCMREVISION "9d7341e978df954a2c875240290833d7528ef29c")
set(expected_SCMURL "git://github.com/jcfr/SlicerToKiwiExporter.git")
set(expected_SCREENSHOTURLS "http://www.slicer.org/slicerWiki/images/9/9e/SlicerToKiwiExporter_Kiwiviewer_8.PNG http://www.slicer.org/slicerWiki/images/a/ab/SlicerToKiwiExporter_Kiwiviewer_9.PNG http://www.slicer.org/slicerWiki/images/9/9a/SlicerToKiwiExporter_SaveDialog_Select-file-format_1.png")
set(expected_STATUS "")
# Extract extension description without depends
set(test_s4ext ${CMAKE_CURRENT_BINARY_DIR}/slicer_extract_extension_description_without_depends_test.s4ext)
file(WRITE ${test_s4ext}
"build_subdirectory ${expected_BUILD_SUBDIRECTORY}
category ${expected_CATEGORY}
contributors ${expected_CONTRIBUTORS}
depends NA
description ${expected_DESCRIPTION}
enabled ${expected_ENABLED}
homepage ${expected_HOMEPAGE}
iconurl ${expected_ICONURL}
scm ${expected_SCM}
scmrevision ${expected_SCMREVISION}
scmurl ${expected_SCMURL}
screenshoturls ${expected_SCREENSHOTURLS}
status ${expected_STATUS}")
slicerFunctionExtractExtensionDescription(
EXTENSION_FILE ${test_s4ext}
VAR_PREFIX foo
)
set(expected_DEPENDS "")
foreach(name IN LISTS required optional)
if(NOT foo_EXT_${name} STREQUAL "${expected_${name}}")
message(FATAL_ERROR "Problem with foo_EXT_${name}
Expected: [${expected_${name}}]
Actual: [${foo_EXT_${name}}]")
endif()
endforeach()
set(${MY_VAR_PREFIX}_EXT_${upper_case_token} ${ext_${upper_case_token}} PARENT_SCOPE)
list(LENGTH foo_EXT_DEPENDS depends_count)
if(NOT depends_count EQUAL 0)
message(FATAL_ERROR "Problem with foo_EXT_DEPENDS")
endif()
# Extract extension description with depends
set(test_s4ext ${CMAKE_CURRENT_BINARY_DIR}/slicer_extract_extension_description_with_depends_test.s4ext)
file(WRITE ${test_s4ext}
"build_subdirectory ${expected_BUILD_SUBDIRECTORY}
category ${expected_CATEGORY}
contributors ${expected_CONTRIBUTORS}
depends Foo Bar
description ${expected_DESCRIPTION}
enabled ${expected_ENABLED}
homepage ${expected_HOMEPAGE}
iconurl ${expected_ICONURL}
scm ${expected_SCM}
scmrevision ${expected_SCMREVISION}
scmurl ${expected_SCMURL}
screenshoturls ${expected_SCREENSHOTURLS}
status ${expected_STATUS}")
slicerFunctionExtractExtensionDescription(
EXTENSION_FILE ${test_s4ext}
VAR_PREFIX bar
)
set(expected_DEPENDS Foo Bar)
foreach(name IN LISTS required optional)
if(NOT bar_EXT_${name} STREQUAL "${expected_${name}}")
message(FATAL_ERROR "Problem with bar_EXT_${name}
Expected: [${expected_${name}}]
Actual: [${bar_EXT_${name}}]")
endif()
endforeach()
list(LENGTH bar_EXT_DEPENDS depends_count)
if(NOT depends_count EQUAL 2)
message(FATAL_ERROR "Problem with bar_EXT_DEPENDS")
endif()
message("SUCCESS")
endfunction()
if(TEST_slicer_extract_extension_description_test)
slicer_extract_extension_description_test()
endif()
......@@ -18,6 +18,8 @@
#
################################################################################
include(CMakeParseArguments)
if(NOT DEFINED Slicer_EXTENSIONS_CMAKE_DIR)
set(Slicer_EXTENSIONS_CMAKE_DIR ${CMAKE_CURRENT_LIST_DIR})
endif()
......@@ -68,19 +70,6 @@ function(slicerFunctionGenerateExtensionDescription)
# A list of extension names without spaces is expected
#TODO if()
if("${MY_EXTENSION_DEPENDS}" STREQUAL "")
set(MY_EXTENSION_DEPENDS "NA")
endif()
if(NOT DEFINED MY_EXTENSION_ENABLED)
set(MY_EXTENSION_ENABLED 1)
endif()
# If not specified, EXTENSION_BUILD_SUBDIRECTORY default to "."
if("${MY_EXTENSION_BUILD_SUBDIRECTORY}" STREQUAL "")
set(MY_EXTENSION_BUILD_SUBDIRECTORY ".")
endif()
set(expected_existing_vars DESTINATION_DIR)
foreach(var ${expected_existing_vars})
if(NOT EXISTS "${MY_${var}}")
......@@ -88,6 +77,9 @@ function(slicerFunctionGenerateExtensionDescription)
endif()
endforeach()
include(${Slicer_EXTENSIONS_CMAKE_DIR}/SlicerExtensionDescriptionSpec.cmake)
slicer_extension_metadata_set_defaults(MY_EXTENSION)
set(filename ${MY_DESTINATION_DIR}/${MY_EXTENSION_NAME}.s4ext)
set(scm_type ${MY_EXTENSION_WC_TYPE})
......@@ -114,7 +106,80 @@ function(slicerFunctionGenerateExtensionDescription)
)
message(STATUS "Extension description has been written to: ${filename}")
endfunction()
################################################################################
# Testing
################################################################################
#
# cmake -DTEST_<testfunction>:BOOL=ON -P <this_script>.cmake
#
function(slicer_generate_extension_description_test)
if(NOT DEFINED Slicer_SOURCE_DIR)
set(Slicer_SOURCE_DIR ${CMAKE_CURRENT_LIST_DIR}/../..)
endif()
set(common_args
DESTINATION_DIR ${CMAKE_CURRENT_BINARY_DIR}
EXTENSION_DESCRIPTION "The SlicerToKiwiExporter module provides Slicer user with any easy way to export models into a KiwiViewer scene file."
EXTENSION_CATEGORY "Exporter"
EXTENSION_CONTRIBUTORS "Jean-Christophe Fillion-Robin (Kitware), Pat Marion (Kitware), Steve Pieper (Isomics), Atsushi Yamada (Shiga University of Medical Science)"
EXTENSION_HOMEPAGE "http://www.slicer.org/slicerWiki/index.php/Documentation/Nightly/Extensions/SlicerToKiwiExporter"
EXTENSION_ICONURL "http://www.slicer.org/slicerWiki/images/6/64/SlicerToKiwiExporterLogo.png"
EXTENSION_NAME "SlicerToKiwiExporter"
EXTENSION_SCREENSHOTURLS "http://www.slicer.org/slicerWiki/images/9/9e/SlicerToKiwiExporter_Kiwiviewer_8.PNG http://www.slicer.org/slicerWiki/images/a/ab/SlicerToKiwiExporter_Kiwiviewer_9.PNG http://www.slicer.org/slicerWiki/images/9/9a/SlicerToKiwiExporter_SaveDialog_Select-file-format_1.png"
EXTENSION_WC_REVISION "9d7341e978df954a2c875240290833d7528ef29c"
EXTENSION_WC_ROOT "git://github.com/jcfr/SlicerToKiwiExporter.git"
EXTENSION_WC_TYPE "git"
EXTENSION_WC_URL "git://github.com/jcfr/SlicerToKiwiExporter.git"
SLICER_WC_REVISION "21510"
SLICER_WC_ROOT "http://svn.slicer.org/Slicer4"
)
# Generate description file of an extension *without* dependencies
slicerFunctionGenerateExtensionDescription(
${common_args}
#EXTENSION_BUILD_SUBDIRECTORY
#EXTENSION_DEPENDS
#EXTENSION_ENABLED
EXTENSION_STATUS "Development"
)
execute_process(
COMMAND ${CMAKE_COMMAND} -E compare_files
${CMAKE_CURRENT_BINARY_DIR}/SlicerToKiwiExporter.s4ext
${Slicer_SOURCE_DIR}/Extensions/CMake/Testing/extension_description_without_depends.s4ext
ERROR_VARIABLE error
RESULT_VARIABLE result
)
if(NOT result EQUAL 0)
message(FATAL_ERROR "${error}")
endif()
# Generate description file of an extension *with* dependencies
slicerFunctionGenerateExtensionDescription(
${common_args}
EXTENSION_BUILD_SUBDIRECTORY "inner/inner-inner-build"
EXTENSION_DEPENDS "Foo Bar"
EXTENSION_ENABLED 0
EXTENSION_STATUS ""
)
execute_process(
COMMAND ${CMAKE_COMMAND} -E compare_files
${CMAKE_CURRENT_BINARY_DIR}/SlicerToKiwiExporter.s4ext
${Slicer_SOURCE_DIR}/Extensions/CMake/Testing/extension_description_with_depends.s4ext
ERROR_VARIABLE error
RESULT_VARIABLE result
)
if(NOT result EQUAL 0)
message(FATAL_ERROR "${error}")
endif()
message("SUCCESS")
endfunction()
if(TEST_slicer_generate_extension_description_test)
slicer_generate_extension_description_test()
endif()
#
# Helper macro
#
macro(add_cmakescript_test testname script)
add_test(cmake_${testname} ${CMAKE_COMMAND}
-DTEST_${testname}:BOOL=ON
-P ${CMAKE_SOURCE_DIR}/${script})
set_tests_properties(cmake_${testname} PROPERTIES
LABELS CMake
PASS_REGULAR_EXPRESSION "SUCCESS")
endmacro()
#
# Add 'CMake script' Tests
#
add_cmakescript_test(
slicer_extension_description_spec_defaults_test
Extensions/CMake/SlicerExtensionDescriptionSpec.cmake)
add_cmakescript_test(
slicer_extension_metadata_set_defaults_test
Extensions/CMake/SlicerExtensionDescriptionSpec.cmake)
add_cmakescript_test(
slicer_extract_extension_description_test
Extensions/CMake/SlicerFunctionExtractExtensionDescription.cmake)
add_cmakescript_test(
slicer_generate_extension_description_test
Extensions/CMake/SlicerFunctionGenerateExtensionDescription.cmake)
#
# 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 git
scmurl git://github.com/jcfr/SlicerToKiwiExporter.git
scmrevision 9d7341e978df954a2c875240290833d7528ef29c
# list dependencies
# - These should be names of other modules that have .s4ext files
# - The dependencies will be built first
depends Foo Bar
# Inner build directory (default is ".")
build_subdirectory inner/inner-inner-build
# homepage
homepage http://www.slicer.org/slicerWiki/index.php/Documentation/Nightly/Extensions/SlicerToKiwiExporter
# Firstname1 Lastname1 ([SubOrg1, ]Org1), Firstname2 Lastname2 ([SubOrg2, ]Org2)
# For example: Jane Roe (Superware), John Doe (Lab1, Nowhere), Joe Bloggs (Noware)
contributors Jean-Christophe Fillion-Robin (Kitware), Pat Marion (Kitware), Steve Pieper (Isomics), Atsushi Yamada (Shiga University of Medical Science)
# Match category in the xml description of the module (where it shows up in Modules menu)
category Exporter
# url to icon (png, size 128x128 pixels)
iconurl http://www.slicer.org/slicerWiki/images/6/64/SlicerToKiwiExporterLogo.png
# Give people an idea what to expect from this code
# - Is it just a test or something you stand behind?
status
# One line stating what the module does
description The SlicerToKiwiExporter module provides Slicer user with any easy way to export models into a KiwiViewer scene file.
# Space separated list of urls
screenshoturls http://www.slicer.org/slicerWiki/images/9/9e/SlicerToKiwiExporter_Kiwiviewer_8.PNG http://www.slicer.org/slicerWiki/images/a/ab/SlicerToKiwiExporter_Kiwiviewer_9.PNG http://www.slicer.org/slicerWiki/images/9/9a/SlicerToKiwiExporter_SaveDialog_Select-file-format_1.png
# 0 or 1: Define if the extension should be enabled after its installation.
enabled 0
#
# 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 git
scmurl git://github.com/jcfr/SlicerToKiwiExporter.git
scmrevision 9d7341e978df954a2c875240290833d7528ef29c
# list dependencies
# - These should be names of other modules that have .s4ext files
# - The dependencies will be built first
depends NA
# Inner build directory (default is ".")
build_subdirectory .
# homepage
homepage http://www.slicer.org/slicerWiki/index.php/Documentation/Nightly/Extensions/SlicerToKiwiExporter
# Firstname1 Lastname1 ([SubOrg1, ]Org1), Firstname2 Lastname2 ([SubOrg2, ]Org2)
# For example: Jane Roe (Superware), John Doe (Lab1, Nowhere), Joe Bloggs (Noware)