#! #! \addtogroup CamiTKMacros #! #! Macro camitk_extension simplifies writing a camitk extension (component, action) #! #! The name of the extension is automatically the name of the directory from where this macro #! is called, unless it is overriden by the TARGET_NAME parameter. #! #! usage: #! \code #! extension( #! [DISABLED] #! [NEEDS_QT_MODULES] #! [NEEDS_ITK] #! [NEEDS_LIBXML2] #! [NEEDS_OPENCV] #! [NEEDS_IGSTK] #! [NEEDS_XSD] #! [NEEDS_GDCM] #! [NEEDS_ACTION_EXTENSION action1 action2 ...] #! [NEEDS_COMPONENT_EXTENSION component1 component2 ...] #! [NEEDS_CEP_LIBRARIES CEPLib1 CEPLib2 ...] #! [INCLUDE_DIRECTORIES dir1 dir2 ...] #! [DEFINES flag1 flag2 ...] #! [EXTERNAL_SOURCES file1 file2 ...] #! [EXTERNAL_LIBRARIES lib1 lib2 ...] #! [HEADERS_TO_INSTALL header1.h header2.h ...] #! [INSTALL_ALL_HEADERS] #! [TARGET_NAME non-default-targetname] #! ) #! \endcode #! #! \param = The selected type of extension you wish to build. # possible values : ACTION_EXTENSION or COMPONENT_EXTENSION. #! \param DISABLED = means this is a not a default extension, it will not be compiled automatically #! \param NEEDS_QT_MODULES = add this if your library depends on Qt modules, such as QtCore, QtGui, QtMultimedia, QtNetwork, QtOpenGL, QtScript, QtScriptTools, QtSql, QtSvg, QtWebkit, QtXml, QtXmlPatterns, QtDeclarative #! \param NEEDS_ITK = add this if your component needs itk. #! Do not forget to add the needed list of itk libraries in the LIBRARIES parameter #! \param NEEDS_LIBXML2 = add this if your component needs libxml2 #! \param NEEDS_XSD = add this if your action needs Codesynthesis xsd cxx (xml schema compiler) #! \param NEEDS_OPENCV = add this if your component needs OpenCV #! \param NEEDS_IGSTK = add this if your component needs IgsTK #! \param NEEDS_XERCESC = add this if your action / component needs XercesC library #! \param NEEDS_CEP_LIBRARIES = list of needed CEP libraries (not external dependencies) #! \param NEEDS_COMPONENT_EXTENSION = list of needed component extensions #! \param NEEDS_ACTION_EXTENSION = list of needed component extensions #! \param INCLUDE_DIRECTORIES = additional include directories #! \param DEFINES = list of define flags to add at compilation time #! \param EXTERNAL_SOURCES = list of extra source/headers files (external to the current directory) #! that needed to be added to the SOURCES variable. #! Note: EXTERNAL_SOURCES are not installed #! \param EXTERNAL_LIBRARIES = external libraries to add to the link command #! \param HEADERS_TO_INSTALL = list of headers to install, if present this will automatically #! create an "install-COMPONENT_NAMEcomponent" target, that can be used #! anywhere else to manage dependencies to this component. #! The headers are installed ${CAMITK_BUILD_INCLUDE_DIR}/COMPONENT_NAME #! when the target "install-COMPONENT_NAMEcomponent" is called. #! \param INSTALL_ALL_HEADERS = install all of the headers (this is the lazy solution, please consider #! making a list and using HEADERS_TO_INSTALL parameter instead! #! \param TARGET_NAME = specify a target name different than the default (default is the action/component directory name) #! this can be very useful for example when you have action/component directory in your CEP that has #! the same name as one in the camitk opensource. #! \param CEP_NAME = specify the CEP_NAME, which is used to categorized the extension for packaging purpose #! No CEP_NAME provided will result in default categorization (generic extension). #! \param DESCRIPTION = Simple description of the extension. Used for packaging presentation for instance. #! \param NEEDS_GDCM = Add this, if your extension requires GDCM 2.x library macro(camitk_extension) ######################################################################### # # # ARGUMENTS PARSING # # # # * Use a macro to create the CMAKE variables according to the # # provided options as input. # # # ######################################################################### get_directory_name(${CMAKE_CURRENT_SOURCE_DIR} EXTENSION_NAME) parse_arguments(${EXTENSION_NAME_CMAKE} #prefix "NEEDS_TOOL;NEEDS_CEP_LIBRARIES;NEEDS_COMPONENT_EXTENSION;NEEDS_ACTION_EXTENSION;INCLUDE_DIRECTORIES;EXTERNAL_LIBRARIES;HEADERS_TO_INSTALL;DEFINES;EXTERNAL_SOURCES;TARGET_NAME;CEP_NAME;DESCRIPTION;TEST_APPLICATION" # possible lists "NEEDS_QT_MODULES;ACTION_EXTENSION;COMPONENT_EXTENSION;DISABLED;NEEDS_XERCESC;NEEDS_ITK;NEEDS_LIBXML2;NEEDS_XSD;NEEDS_QTXML;NEEDS_OPENCV;NEEDS_IGSTK;INSTALL_ALL_HEADERS;NEEDS_GDCM;" # possible options ${ARGN} ) ######################################################################### # # # CREATE CMAKE VARIABLES # # # # * Create required and useful CMake variables for the macro # # # ######################################################################### # TYPE EXTENSION : ACTION or COMPONENT if (${EXTENSION_NAME_CMAKE}_ACTION_EXTENSION) set(TYPE_EXTENSION "action") string(TOUPPER ${TYPE_EXTENSION} TYPE_EXTENSION_CMAKE) elseif(${EXTENSION_NAME_CMAKE}_COMPONENT_EXTENSION) set(TYPE_EXTENSION "component") string(TOUPPER ${TYPE_EXTENSION} TYPE_EXTENSION_CMAKE) endif() # CMAKE CACHE VARIABLE # if it is the first cmake run, create the extension variable with a correct initial value if(NOT ${TYPE_EXTENSION_CMAKE}_${EXTENSION_NAME_CMAKE}_INTERNAL) # add option to enable/disable this extension and set it to true by default # Building the extension can be disabled by giving the argument DISABLED to the macro # or by passing the flag -D${TYPE_EXTENSION_CMAKE}_${EXTENSION_NAME_CMAKE}_DISABLED:BOOL=TRUE if(${EXTENSION_NAME_CMAKE}_DISABLED) set(${TYPE_EXTENSION_CMAKE}_${EXTENSION_NAME_CMAKE}_ENABLED FALSE) else() set(${TYPE_EXTENSION_CMAKE}_${EXTENSION_NAME_CMAKE}_ENABLED TRUE) endif() set(${TYPE_EXTENSION_CMAKE}_${EXTENSION_NAME_CMAKE} ${${TYPE_EXTENSION_CMAKE}_${EXTENSION_NAME_CMAKE}_ENABLED} CACHE BOOL "Build extension ${EXTENSION_NAME}") set(${TYPE_EXTENSION_CMAKE}_${EXTENSION_NAME_CMAKE}_INTERNAL TRUE CACHE INTERNAL "Is variable ${TYPE_EXTENSION_CMAKE}_${EXTENSION_NAME} already created?") endif() # if this extension is enabled, do everything needed # otherwise... do nothing if (${TYPE_EXTENSION_CMAKE}_${EXTENSION_NAME_CMAKE}) # TARGET NAME # The target name is composed of the following: [action / component]-name # * action / component is the type of extension as prefix # * name is deduced from the input folder containing the calling CMakeLists.txt file of the extension. if (${EXTENSION_NAME_CMAKE}_TARGET_NAME) set(${TYPE_EXTENSION_CMAKE}_OUTPUT_NAME ${${EXTENSION_NAME_CMAKE}_TARGET_NAME}) else() set(${TYPE_EXTENSION_CMAKE}_OUTPUT_NAME ${EXTENSION_NAME}) endif() # replace "-" by "_" if the extension is being packaged with NSIS, the program to create a Windows installer. if (PACKAGING_NSIS) # NSIS requires that cpack component names do not feature space or "-" characters set(${TYPE_EXTENSION_CMAKE}_TARGET_NAME ${TYPE_EXTENSION}_${${TYPE_EXTENSION_CMAKE}_OUTPUT_NAME}) else() set(${TYPE_EXTENSION_CMAKE}_TARGET_NAME ${TYPE_EXTENSION}-${${TYPE_EXTENSION_CMAKE}_OUTPUT_NAME}) endif() message(STATUS "Building extension ${${TYPE_EXTENSION_CMAKE}_TARGET_NAME}") ######################################################################### # # # INCLUDE DIRECTORIES # # # # * Include basic directories where to look header files # # * Include also additional user provided directories # # * These directories are used for compilation step # # # ######################################################################### # BASIC DIRECTORIES include_directories(${CAMITK_INCLUDE_DIRECTORIES}) include_directories(${CMAKE_CURRENT_BINARY_DIR}) include_directories(${CMAKE_CURRENT_SOURCE_DIR}) # USER INPUT DIRECTORIES include_directories(${${EXTENSION_NAME_CMAKE}_INCLUDE_DIRECTORIES}) ######################################################################### # # # GATHER RESSOURCES # # # # * Get all the headers (.h) and source files (.cpp) of the project # # * Create the needed Qt files (using moc and uic) # # # ######################################################################### # get all headers, sources and do what is needed for Qt # one need to do this just before the add_library so that all defines, include directories and link directories # are set properly (gather_headers_and_sources include the call to Qt moc and uic) gather_headers_and_sources(${EXTENSION_NAME_CMAKE}) ######################################################################### # # # ADDITIONAL KNOWN LIBRARY DEPENDENCIES # # # # * Look for specific library needed # # * Specific libraries are specified as option with the # # NEEDS_LIBRARY syntax (see macro syntax for more options) # # * Backward compatibility : Warn user if using old NEEDS_TOOL syntax # # # ######################################################################### # Looking for ITK set(ITK_LIBRARIES "") if(${EXTENSION_NAME_CMAKE}_NEEDS_ITK) # ITK is required if (MSVC) # Visual Studio compiler if(MSVC90 OR MSVC10) # Visual Studion 2008/2010 => use ITK 3.20.1 find_package(ITK REQUIRED) if(ITK_FOUND) message(STATUS "${${TYPE_EXTENSION_CMAKE}_TARGET_NAME} : Found suitable version of ITK : ${ITK_VERSION} (required is 3.20.1)") include(${ITK_USE_FILE}) set(ITK_LIBRARIES debug ITKBasicFilters${CAMITK_DEBUG_POSTFIX} optimized ITKBasicFilters debug ITKCommon${CAMITK_DEBUG_POSTFIX} optimized ITKCommon debug ITKIO${CAMITK_DEBUG_POSTFIX} optimized ITKIO debug ITKNrrdIO${CAMITK_DEBUG_POSTFIX}.lib debug itkgdcm${CAMITK_DEBUG_POSTFIX}.lib debug itkjpeg12${CAMITK_DEBUG_POSTFIX}.lib debug itkjpeg16${CAMITK_DEBUG_POSTFIX}.lib debug itkopenjpeg${CAMITK_DEBUG_POSTFIX}.lib debug itkpng${CAMITK_DEBUG_POSTFIX}.lib debug itktiff${CAMITK_DEBUG_POSTFIX}.lib debug itkjpeg8${CAMITK_DEBUG_POSTFIX}.lib debug ITKSpatialObject${CAMITK_DEBUG_POSTFIX}.lib debug itkvnl_inst${CAMITK_DEBUG_POSTFIX}.lib debug itkvnl_algo${CAMITK_DEBUG_POSTFIX}.lib debug itkv3p_netlib${CAMITK_DEBUG_POSTFIX}.lib debug itkvnl${CAMITK_DEBUG_POSTFIX}.lib debug itkvcl${CAMITK_DEBUG_POSTFIX}.lib debug itkv3p_lsqr${CAMITK_DEBUG_POSTFIX}.lib debug ITKMetaIO${CAMITK_DEBUG_POSTFIX}.lib debug itksys${CAMITK_DEBUG_POSTFIX}.lib debug ITKDICOMParser${CAMITK_DEBUG_POSTFIX}.lib debug ITKEXPAT${CAMITK_DEBUG_POSTFIX}.lib debug ITKniftiio${CAMITK_DEBUG_POSTFIX}.lib debug ITKznz${CAMITK_DEBUG_POSTFIX}.lib debug itkzlib${CAMITK_DEBUG_POSTFIX}.lib debug snmpapi.lib debug rpcrt4.lib debug ws2_32.lib debug comctl32.lib debug wsock32.lib debug opengl32.lib ) else() message(FATAL_ERROR "ITK ( >= 3.20.1) is required by ${${TYPE_EXTENSION_CMAKE}_TARGET_NAME}") endif() elseif(MSVC11) # Visual Studion 2012 => use ITK 4.3.2 at least find_package(ITK 4.3.2 REQUIRED) if(ITK_FOUND) message(STATUS "${${TYPE_EXTENSION_CMAKE}_TARGET_NAME} : Found suitable version of ITK : ${ITK_VERSION} (required is 4.3.2)") include(${ITK_USE_FILE}) link_directories(${ITK_DIR}/../..) set(ITK_LIBRARIES # Debug libraries debug ITKCommon-4.3${CAMITK_DEBUG_POSTFIX}.lib debug ITKNrrdIO-4.3${CAMITK_DEBUG_POSTFIX}.lib debug itkgdcmCommon-4.3${CAMITK_DEBUG_POSTFIX}.lib debug itkjpeg-4.3${CAMITK_DEBUG_POSTFIX}.lib debug itkopenjpeg-4.3${CAMITK_DEBUG_POSTFIX}.lib debug itkpng-4.3${CAMITK_DEBUG_POSTFIX}.lib debug itktiff-4.3${CAMITK_DEBUG_POSTFIX}.lib debug ITKSpatialObjects-4.3${CAMITK_DEBUG_POSTFIX}.lib debug itkvnl_algo-4.3${CAMITK_DEBUG_POSTFIX}.lib debug itkv3p_netlib-4.3${CAMITK_DEBUG_POSTFIX}.lib debug itkvnl-4.3${CAMITK_DEBUG_POSTFIX}.lib debug itkvcl-4.3${CAMITK_DEBUG_POSTFIX}.lib debug itkv3p_lsqr-4.3${CAMITK_DEBUG_POSTFIX}.lib debug ITKMetaIO-4.3${CAMITK_DEBUG_POSTFIX}.lib debug itksys-4.3${CAMITK_DEBUG_POSTFIX}.lib debug ITKDICOMParser-4.3${CAMITK_DEBUG_POSTFIX}.lib debug ITKEXPAT-4.3${CAMITK_DEBUG_POSTFIX}.lib debug ITKniftiio-4.3${CAMITK_DEBUG_POSTFIX}.lib debug ITKznz-4.3${CAMITK_DEBUG_POSTFIX}.lib debug itkzlib-4.3${CAMITK_DEBUG_POSTFIX}.lib debug snmpapi.lib debug rpcrt4.lib debug ws2_32.lib debug comctl32.lib debug wsock32.lib debug opengl32.lib debug ITKIOGIPL-4.3${CAMITK_DEBUG_POSTFIX}.lib debug ITKIONIFTI-4.3${CAMITK_DEBUG_POSTFIX}.lib debug ITKIONRRD-4.3${CAMITK_DEBUG_POSTFIX}.lib debug ITKIOPNG-4.3${CAMITK_DEBUG_POSTFIX}.lib debug itkgdcmDICT-4.3${CAMITK_DEBUG_POSTFIX}.lib debug itkgdcmDSED-4.3${CAMITK_DEBUG_POSTFIX}.lib debug itkgdcmIOD-4.3${CAMITK_DEBUG_POSTFIX}.lib debug itkgdcmjpeg8-4.3${CAMITK_DEBUG_POSTFIX}.lib debug itkgdcmjpeg12-4.3${CAMITK_DEBUG_POSTFIX}.lib debug itkgdcmjpeg16-4.3${CAMITK_DEBUG_POSTFIX}.lib debug itkgdcmMSFF-4.3${CAMITK_DEBUG_POSTFIX}.lib debug ITKgiftiio-4.3${CAMITK_DEBUG_POSTFIX}.lib debug itkhdf5_cpp-4.3${CAMITK_DEBUG_POSTFIX}.lib debug itkhdf5-4.3${CAMITK_DEBUG_POSTFIX}.lib debug ITKMetaIO-4.3${CAMITK_DEBUG_POSTFIX}.lib debug ITKIOBioRad-4.3${CAMITK_DEBUG_POSTFIX}.lib debug ITKIOStimulate-4.3${CAMITK_DEBUG_POSTFIX}.lib debug ITKIOTIFF-4.3${CAMITK_DEBUG_POSTFIX}.lib debug ITKIOVTK-4.3${CAMITK_DEBUG_POSTFIX}.lib debug ITKIOPNG-4.3${CAMITK_DEBUG_POSTFIX}.lib debug ITKBiasCorrection-4.3${CAMITK_DEBUG_POSTFIX}.lib debug ITKBioCell-4.3${CAMITK_DEBUG_POSTFIX}.lib debug ITKFEM-4.3${CAMITK_DEBUG_POSTFIX}.lib debug ITKIOBMP-4.3${CAMITK_DEBUG_POSTFIX}.lib debug ITKIOCSV-4.3${CAMITK_DEBUG_POSTFIX}.lib debug ITKIOGDCM-4.3${CAMITK_DEBUG_POSTFIX}.lib debug ITKIOGE-4.3${CAMITK_DEBUG_POSTFIX}.lib debug ITKIOGIPL-4.3${CAMITK_DEBUG_POSTFIX}.lib debug ITKIOHDF5-4.3${CAMITK_DEBUG_POSTFIX}.lib debug ITKIOImageBase-4.3${CAMITK_DEBUG_POSTFIX}.lib debug ITKIOIPL-4.3${CAMITK_DEBUG_POSTFIX}.lib debug ITKIOJPEG-4.3${CAMITK_DEBUG_POSTFIX}.lib debug ITKIOLSM-4.3${CAMITK_DEBUG_POSTFIX}.lib debug ITKIOMesh-4.3${CAMITK_DEBUG_POSTFIX}.lib debug ITKIOMeta-4.3${CAMITK_DEBUG_POSTFIX}.lib debug ITKIOSiemens-4.3${CAMITK_DEBUG_POSTFIX}.lib debug ITKIOSpatialObjects-4.3${CAMITK_DEBUG_POSTFIX}.lib debug ITKIOTransformBase-4.3${CAMITK_DEBUG_POSTFIX}.lib debug ITKIOTransformHDF5-4.3${CAMITK_DEBUG_POSTFIX}.lib debug ITKIOTransformInsightLegacy-4.3${CAMITK_DEBUG_POSTFIX}.lib debug ITKIOTransformMatlab-4.3${CAMITK_DEBUG_POSTFIX}.lib debug ITKIOXML-4.3${CAMITK_DEBUG_POSTFIX}.lib debug ITKKLMRegionGrowing-4.3${CAMITK_DEBUG_POSTFIX}.lib debug ITKLabelMap-4.3${CAMITK_DEBUG_POSTFIX}.lib debug ITKMesh-4.3${CAMITK_DEBUG_POSTFIX}.lib debug ITKMetaIO-4.3${CAMITK_DEBUG_POSTFIX}.lib debug itkNetlibSlatec-4.3${CAMITK_DEBUG_POSTFIX}.lib debug itkopenjpeg-4.3${CAMITK_DEBUG_POSTFIX}.lib debug ITKOptimizers-4.3${CAMITK_DEBUG_POSTFIX}.lib debug ITKOptimizersv4-4.3${CAMITK_DEBUG_POSTFIX}.lib debug ITKPath-4.3${CAMITK_DEBUG_POSTFIX}.lib debug itkpng-4.3${CAMITK_DEBUG_POSTFIX}.lib debug ITKPolynomials-4.3${CAMITK_DEBUG_POSTFIX}.lib debug ITKQuadEdgeMesh-4.3${CAMITK_DEBUG_POSTFIX}.lib debug ITKReview-4.3${CAMITK_DEBUG_POSTFIX}.lib debug ITKStatistics-4.3${CAMITK_DEBUG_POSTFIX}.lib debug itkv3p_lsqr-4.3${CAMITK_DEBUG_POSTFIX}.lib debug itkv3p_netlib-4.3${CAMITK_DEBUG_POSTFIX}.lib debug itkvcl-4.3${CAMITK_DEBUG_POSTFIX}.lib debug ITKVideoCore-4.3${CAMITK_DEBUG_POSTFIX}.lib debug ITKVideoIO-4.3${CAMITK_DEBUG_POSTFIX}.lib debug ITKVTK-4.3${CAMITK_DEBUG_POSTFIX}.lib debug ITKVNLInstantiation-4.3${CAMITK_DEBUG_POSTFIX}.lib debug ITKWatersheds-4.3${CAMITK_DEBUG_POSTFIX}.lib # Release librariesdebug optimized ITKCommon-4.3.lib optimized ITKNrrdIO-4.3.lib optimized itkgdcmCommon-4.3.lib optimized itkjpeg-4.3.lib optimized itkopenjpeg-4.3.lib optimized itkpng-4.3.lib optimized itktiff-4.3.lib optimized ITKSpatialObjects-4.3.lib optimized itkvnl_algo-4.3.lib optimized itkv3p_netlib-4.3.lib optimized itkvnl-4.3.lib optimized itkvcl-4.3.lib optimized itkv3p_lsqr-4.3.lib optimized ITKMetaIO-4.3.lib optimized itksys-4.3.lib optimized ITKDICOMParser-4.3.lib optimized ITKEXPAT-4.3.lib optimized ITKniftiio-4.3.lib optimized ITKznz-4.3.lib optimized itkzlib-4.3.lib optimized snmpapi.lib optimized rpcrt4.lib optimized ws2_32.lib optimized comctl32.lib optimized wsock32.lib optimized opengl32.lib optimized ITKIOGIPL-4.3.lib optimized ITKIONIFTI-4.3.lib optimized ITKIONRRD-4.3.lib optimized ITKIOPNG-4.3.lib optimized itkgdcmDICT-4.3.lib optimized itkgdcmDSED-4.3.lib optimized itkgdcmIOD-4.3.lib optimized itkgdcmjpeg8-4.3.lib optimized itkgdcmjpeg12-4.3.lib optimized itkgdcmjpeg16-4.3.lib optimized itkgdcmMSFF-4.3.lib optimized ITKgiftiio-4.3.lib optimized itkhdf5_cpp-4.3.lib optimized itkhdf5-4.3.lib optimized ITKMetaIO-4.3.lib optimized ITKIOBioRad-4.3.lib optimized ITKIOStimulate-4.3.lib optimized ITKIOTIFF-4.3.lib optimized ITKIOVTK-4.3.lib optimized ITKIOPNG-4.3.lib optimized ITKBiasCorrection-4.3.lib optimized ITKBioCell-4.3.lib optimized ITKFEM-4.3.lib optimized ITKIOBMP-4.3.lib optimized ITKIOCSV-4.3.lib optimized ITKIOGDCM-4.3.lib optimized ITKIOGE-4.3.lib optimized ITKIOGIPL-4.3.lib optimized ITKIOHDF5-4.3.lib optimized ITKIOImageBase-4.3.lib optimized ITKIOIPL-4.3.lib optimized ITKIOJPEG-4.3.lib optimized ITKIOLSM-4.3.lib optimized ITKIOMesh-4.3.lib optimized ITKIOMeta-4.3.lib optimized ITKIOSiemens-4.3.lib optimized ITKIOSpatialObjects-4.3.lib optimized ITKIOTransformBase-4.3.lib optimized ITKIOTransformHDF5-4.3.lib optimized ITKIOTransformInsightLegacy-4.3.lib optimized ITKIOTransformMatlab-4.3.lib optimized ITKIOXML-4.3.lib optimized ITKKLMRegionGrowing-4.3.lib optimized ITKLabelMap-4.3.lib optimized ITKMesh-4.3.lib optimized ITKMetaIO-4.3.lib optimized itkNetlibSlatec-4.3.lib optimized itkopenjpeg-4.3.lib optimized ITKOptimizers-4.3.lib optimized ITKOptimizersv4-4.3.lib optimized ITKPath-4.3.lib optimized itkpng-4.3.lib optimized ITKPolynomials-4.3.lib optimized ITKQuadEdgeMesh-4.3.lib optimized ITKReview-4.3.lib optimized ITKStatistics-4.3.lib optimized itkv3p_lsqr-4.3.lib optimized itkv3p_netlib-4.3.lib optimized itkvcl-4.3.lib optimized ITKVideoCore-4.3.lib optimized ITKVideoIO-4.3.lib optimized ITKVTK-4.3.lib optimized ITKVNLInstantiation-4.3.lib optimized ITKWatersheds-4.3.lib ) else() message(FATAL_ERROR "ITK ( >= 4.3.2) is required by ${${TYPE_EXTENSION_CMAKE}_TARGET_NAME}") endif() else() # New version of VS compiler not supported yet message(FATAL_ERROR "ITK : Unsupported version of Visual Studio compiler. Please update CamiTK, downgrade your VS version to 2008/2010/2012 or contact CamiTK team support.") endif() else() if (MINGW) # MinGW compiler find_package(ITK 4.3.2 REQUIRED) if(ITK_FOUND) message(STATUS "${${TYPE_EXTENSION_CMAKE}_TARGET_NAME} : Found suitable version of ITK : ${ITK_VERSION} (required is 4.3.2)") include(${ITK_USE_FILE}) link_directories(${ITK_DIR}/../..) set(ITK_LIBRARIES ITKCommon-4.3 ITKNrrdIO-4.3 itkgdcmCommon-4.3 itkjpeg-4.3 itkopenjpeg-4.3 itkpng-4.3 itktiff-4.3 ITKSpatialObjects-4.3 itkvnl_algo-4.3 itkv3p_netlib-4.3 itkvnl-4.3 itkvcl-4.3 itkv3p_lsqr-4.3 ITKMetaIO-4.3 itksys-4.3 ITKDICOMParser-4.3 ITKEXPAT-4.3 ITKniftiio-4.3 ITKznz-4.3 itkzlib-4.3 snmpapi rpcrt4 ws2_32 comctl32 wsock32 opengl32 ITKIOGIPL-4.3 ITKIONIFTI-4.3 ITKIONRRD-4.3 ITKIOPNG-4.3 itkgdcmDICT-4.3 itkgdcmDSED-4.3 itkgdcmIOD-4.3 itkgdcmjpeg8-4.3 itkgdcmjpeg12-4.3 itkgdcmjpeg16-4.3 itkgdcmMSFF-4.3 ITKgiftiio-4.3 itkhdf5_cpp-4.3 itkhdf5-4.3 ITKMetaIO-4.3 ITKIOBioRad-4.3 ITKIOStimulate-4.3 ITKIOTIFF-4.3 ITKIOVTK-4.3 ITKIOPNG-4.3 ITKBiasCorrection-4.3 ITKBioCell-4.3 ITKFEM-4.3 ITKIOBMP-4.3 ITKIOCSV-4.3 ITKIOGDCM-4.3 ITKIOGE-4.3 ITKIOGIPL-4.3 ITKIOHDF5-4.3 ITKIOImageBase-4.3 ITKIOIPL-4.3 ITKIOJPEG-4.3 ITKIOLSM-4.3 ITKIOMesh-4.3 ITKIOMeta-4.3 ITKIOSiemens-4.3 ITKIOSpatialObjects-4.3 ITKIOTransformBase-4.3 ITKIOTransformHDF5-4.3 ITKIOTransformInsightLegacy-4.3 ITKIOTransformMatlab-4.3 ITKIOXML-4.3 ITKKLMRegionGrowing-4.3 ITKLabelMap-4.3 ITKMesh-4.3 ITKMetaIO-4.3 itkNetlibSlatec-4.3 itkopenjpeg-4.3 ITKOptimizers-4.3 ITKOptimizersv4-4.3 ITKPath-4.3 itkpng-4.3 ITKPolynomials-4.3 ITKQuadEdgeMesh-4.3 ITKReview-4.3 ITKStatistics-4.3 itkv3p_lsqr-4.3 itkv3p_netlib-4.3 itkvcl-4.3 ITKVideoCore-4.3 ITKVideoIO-4.3 ITKVTK-4.3 ITKVNLInstantiation-4.3 ITKWatersheds-4.3 ) else() message(FATAL_ERROR "ITK ( >= 4.3.2) is required by ${${TYPE_EXTENSION_CMAKE}_TARGET_NAME}") endif() else() # Linux / MacOS compilers find_package(ITK REQUIRED) if(ITK_FOUND) message(STATUS "${${TYPE_EXTENSION_CMAKE}_TARGET_NAME} : Found suitable version of ITK : ${ITK_VERSION} (required is 3.20.1)") include(${ITK_USE_FILE}) set(ITK_LIBRARIES ITKBasicFilters ITKCommon ITKIO) else() message(FATAL_ERROR "ITK ( >= 3.20.1) is required by ${${TYPE_EXTENSION_CMAKE}_TARGET_NAME}") endif() endif() endif() endif() # LIBXML2 set(LIBXML2_LIBRARY "") if(${EXTENSION_NAME_CMAKE}_NEEDS_LIBXML2) # LibXml2 is required find_package(Xml2) if (LIBXML2_FOUND) add_definitions(${LIBXML2_DEFINITIONS}) include_directories(${LIBXML2_INCLUDE_DIR}) set(LIBXML2_LIBRARY ${LIBXML2_LIBRARIES}) else() # most probably win32 or crosscompiling message(STATUS "${EXTENSION_NAME}: libxml2 required") endif() endif() # OPENCV set(OpenCV_LIBRARIES "") if(${EXTENSION_NAME_CMAKE}_NEEDS_OPENCV) # OpenCV is required find_package( OpenCV REQUIRED ) else ( ) set(OpenCV_LIBRARIES "") endif() # IGSTK set(IGSTK_LIBRARIES "") if(${EXTENSION_NAME_CMAKE}_NEEDS_IGSTK) find_package(IGSTK REQUIRED) include(${IGSTK_USE_FILE}) else() set(IGSTK_LIBRARIES "") endif() # XERCES-C set(XERCESC_LIBRARIES) if(${EXTENSION_NAME_CMAKE}_NEEDS_XERCESC) # XercesC is required find_package(XercesC REQUIRED) if (XERCESC_FOUND) include_directories(${XERCESC_INCLUDE_DIR}) set(XERCESC_LIBRARIES ${XERCESC_LIBRARY}) else() # most probably win32 or crosscompiling message(FATAL_ERROR "${APPLICATION_NAME}: xerces-c required. Please provide Xerces-C path.") endif() endif() # XSD if(${EXTENSION_NAME_CMAKE}_NEEDS_XSD) # XercesC is required find_package(XercesC REQUIRED) if (XERCESC_FOUND) include_directories(${XERCESC_INCLUDE_DIR}) set(XERCESC_LIBRARIES ${XERCESC_LIBRARY}) find_package(XSD REQUIRED) include_directories(${XSD_INCLUDE_DIR}) else() # most probably win32 or crosscompiling message(FATAL_ERROR "${EXTENSION_NAME}: xerces-c required because of XSD cxx, please set XERCESC_INCLUDE_DIR") endif() endif() # GDCM 2.2.x set(GDCM_LIBRARIES) if(${EXTENSION_NAME_CMAKE}_NEEDS_GDCM) if(NOT GDCM_FOUND) # Look for GDCM library only if not found (for instance, ITK has already search for it) # Calling find_package(GDCM ..) more than once creates CMake errors. find_package(GDCM 2.0 REQUIRED) endif() if(GDCM_FOUND) include(${GDCM_USE_FILE}) if (MSVC) set(GDCM_LIBRARIES debug ${GDCM_DIR}/../vtkgdcm${CAMITK_DEBUG_POSTFIX} debug ${GDCM_DIR}/../gdcmDSED${CAMITK_DEBUG_POSTFIX} optimized vtkgdcm gdcmDSED ) else() set(GDCM_LIBRARIES vtkgdcm gdcmDSED) endif() else() message(ERROR "${EXTENSION_NAME}: GDCM 2.x library required. Please install GDCM.") endif() endif() # ADDTIONAL QT MODULES set(QT_MODULES_LIBRARIES) if(${DEFAULT_LIBRARY_NAME_CMAKE}_NEEDS_QT_MODULES) # Qt additional modules are required for linking set(QT_MODULES_LIBRARIES ${QT_LIBRARIES}) endif() # CEP LIBRARIES set(CEP_LIBRARIES) if(${EXTENSION_NAME_CMAKE}_NEEDS_CEP_LIBRARIES) foreach(CEP_LIBRARY_NEEDED ${${EXTENSION_NAME_CMAKE}_NEEDS_CEP_LIBRARIES}) string(TOUPPER ${CEP_LIBRARY_NEEDED} ${CEP_LIBRARY_NEEDED}_INTERNAL) set(LIBRARY_${${CEP_LIBRARY_NEEDED}_INTERNAL} ON CACHE BOOL "Required by action extension ${EXTENSION_NAME}" FORCE ) if (MSVC) set(CEP_LIBRARIES ${CEP_LIBRARIES} debug ${CEP_LIBRARY_NEEDED}${CAMITK_DEBUG_POSTFIX} optimized ${CEP_LIBRARY_NEEDED} ) else() if(PACKAGING_NSIS) set(CEP_LIBRARIES ${CEP_LIBRARIES} ${CEP_LIBRARY_NEEDED}) else() set(CEP_LIBRARIES ${CEP_LIBRARIES} ${CEP_LIBRARY_NEEDED}) endif() endif() include_directories(${CAMITK_INCLUDE_DIR}/libraries/${CEP_LIBRARY_NEEDED}) include_directories(${CAMITK_USER_INCLUDE_DIR}/libraries/${CEP_LIBRARY_NEEDED}) include_directories(${CAMITK_BUILD_INCLUDE_DIR}/libraries/${CEP_LIBRARY_NEEDED}) endforeach() endif() # EXTERNAL LIBRARIES set(EXTERNAL_LIBRARIES) if(${EXTENSION_NAME_CMAKE}_EXTERNAL_LIBRARIES) foreach(EXTERNAL_LIBRARY ${${EXTENSION_NAME_CMAKE}_EXTERNAL_LIBRARIES}) if (MSVC) set(EXTERNAL_LIBRARIES ${EXTERNAL_LIBRARIES} debug ${EXTERNAL_LIBRARY}${CAMITK_DEBUG_POSTFIX} optimized ${EXTERNAL_LIBRARY} ) else() set(EXTERNAL_LIBRARIES ${EXTERNAL_LIBRARIES} ${EXTERNAL_LIBRARY}) endif() endforeach() endif() # BACKWARD COMPATIBILITY # NEEDS_TOOLS option # TODO CAMITK_OBSOLETE. This option is marked as obsolete. It is to be removed in CamiTK 4.0 if(${EXTENSION_NAME_CMAKE}_NEEDS_TOOL) message(WARNING "Warning: ${CMAKE_CURRENT_SOURCE_DIR}/CMakeLists.txt: camitk_extension macro option NEEDS_TOOL is deprecated, please use NEEDS_CEP_LIBRARIES instead..") set(${EXTENSION_NAME_CMAKE}_NEEDS_CEP_LIBRARIES ${${EXTENSION_NAME_CMAKE}_NEEDS_CEP_LIBRARIES} ${${EXTENSION_NAME_CMAKE}_NEEDS_TOOL}) endif() ######################################################################### # # # CAMITK ACTION / COMPONENT DEPENDENCIES # # # # * Look for action / component dependencies # # * Specific actions / components are specified as option with the # # NEEDS_ACTION/COMPONENT_EXTENSION syntax # # # ######################################################################### # COMPONENT EXTENSION DEPENDENCIES set(COMPONENT_EXTENSION_LIBRARIES) if(${EXTENSION_NAME_CMAKE}_NEEDS_COMPONENT_EXTENSION) foreach(COMPONENT_NEEDED ${${EXTENSION_NAME_CMAKE}_NEEDS_COMPONENT_EXTENSION}) string(TOUPPER ${COMPONENT_NEEDED} ${COMPONENT_NEEDED}_INTERNAL) set(COMPONENT_${${COMPONENT_NEEDED}_INTERNAL} ON CACHE BOOL "Required by extension ${EXTENSION_NAME}" FORCE ) if (MSVC) set(COMPONENT_EXTENSION_LIBRARIES ${COMPONENT_EXTENSION_LIBRARIES} debug ${CAMITK_BUILD_PRIVATE_LIB_DIR}/components/${COMPONENT_NEEDED}${CAMITK_DEBUG_POSTFIX} optimized ${COMPONENT_NEEDED} ) else() set(COMPONENT_EXTENSION_LIBRARIES ${COMPONENT_EXTENSION_LIBRARIES} ${COMPONENT_NEEDED}) endif() include_directories(${CAMITK_INCLUDE_DIR}/components/${COMPONENT_NEEDED}) include_directories(${CAMITK_USER_INCLUDE_DIR}/components/${COMPONENT_NEEDED}) include_directories(${CAMITK_BUILD_INCLUDE_DIR}/components/${COMPONENT_NEEDED}) endforeach() endif() # ACTION EXTENSION DEPENDENCIES set(ACTION_EXTENSION_LIBRARIES) if(${EXTENSION_NAME_CMAKE}_NEEDS_ACTION_EXTENSION) foreach(ACTION_NEEDED ${${EXTENSION_NAME_CMAKE}_NEEDS_ACTION_EXTENSION}) string(TOUPPER ${ACTION_NEEDED} ${ACTION_NEEDED}_INTERNAL) set(ACTION_${${ACTION_NEEDED}_INTERNAL} ON CACHE BOOL "Required by extension ${EXTENSION_NAME}" FORCE ) if (MSVC) set(ACTION_EXTENSION_LIBRARIES ${ACTION_EXTENSION_LIBRARIES} debug ${CAMITK_BUILD_PRIVATE_LIB_DIR}/actions/${ACTION_NEEDED}${CAMITK_DEBUG_POSTFIX} optimized ${ACTION_NEEDED} ) else() set(ACTION_EXTENSION_LIBRARIES ${ACTION_EXTENSION_LIBRARIES} ${ACTION_NEEDED}) endif() include_directories(${CAMITK_INCLUDE_DIR}/actions/${ACTION_NEEDED}) include_directories(${CAMITK_USER_INCLUDE_DIR}/actions/${ACTION_NEEDED}) include_directories(${CAMITK_BUILD_INCLUDE_DIR}/actions/${ACTION_NEEDED}) endforeach() endif() ######################################################################### # # # LINK DIRECTORIES # # # # * Link directories are used to indicate the compiler where # # to look for folder containing libraries to link with. # # # ######################################################################### # CAMITK BASIC LIB DIRECTORIES link_directories(${CAMITK_LINK_DIRECTORIES}) ######################################################################### # # # TARGET COMPILATION DEFINITION # # # # * Additional sources files to consider at compilation (.cpp) # # * CMake project target definition # # # ######################################################################### # EXTERNAL SOURCES set(${EXTENSION_NAME_CMAKE}_SOURCES ${${EXTENSION_NAME_CMAKE}_SOURCES} ${${EXTENSION_NAME_CMAKE}_EXTERNAL_SOURCES}) # CMAKE TARGET DEFINITION add_library(${${TYPE_EXTENSION_CMAKE}_TARGET_NAME} SHARED ${${EXTENSION_NAME_CMAKE}_SOURCES}) ######################################################################### # # # COMPILATION FLAG # # # # * Flags are options to give to the compiler # # * Add user input flags # # * Add platform specific flags # # # ######################################################################### # USER INPUT COMPILER FLAG if(${EXTENSION_NAME_CMAKE}_DEFINES) foreach (FLAG ${${EXTENSION_NAME_CMAKE}_DEFINES}) add_definitions(-D${FLAG}) endforeach() endif() # PLATFORM SPECIFIC COMPILER FLAG # 64bits and other platform with relocation needs -fPIC include(TestCXXAcceptsFlag) check_cxx_accepts_flag(-fPIC FPIC_FLAG_ACCEPTED) # no need to add -fPIC on mingw, otherwise it generates a warning: -fPIC ignored for target (all code is position independent) [enabled by default] # msvc is also accepting the flag, but then produce warning D9002 : ignoring unknown option '-fPIC' cl if(FPIC_FLAG_ACCEPTED AND NOT WIN32) set_property(TARGET ${${TYPE_EXTENSION_CMAKE}_TARGET_NAME} APPEND PROPERTY COMPILE_FLAGS -fPIC) endif() ######################################################################### # # # LINKING # # # # * Linking is the last stage of compilation # # * Indicate what libraries to use for linking the target # # # ######################################################################### # LINKING LIBRARIES # Any component or action has to be linked with ${CAMITK_CORE_LIBRARIES} and with all its dependencies target_link_libraries(${${TYPE_EXTENSION_CMAKE}_TARGET_NAME} ${CAMITK_CORE_LIBRARIES} ${CAMITK_LIBRARIES} ${COMPONENT_EXTENSION_LIBRARIES} ${ACTION_EXTENSION_LIBRARIES} ${CEP_LIBRARIES} ${QT_MODULES_LIBRARIES} ${ITK_LIBRARIES} ${LIBXML2_LIBRARY} ${OpenCV_LIBRARIES} ${IGSTK_LIBRARIES} ${XERCESC_LIBRARIES} ${GDCM_LIBRARIES} ${EXTERNAL_LIBRARIES}) ######################################################################### # # # OUTPUT # # # # * Define the output directory (location and name) # # * Define the output name of the library # # * Add ${CAMITK_DEBUG_POSTFIX} suffix to Debug MSVC built libraries # # * Additional Linux .so files information # # # ######################################################################### # OUTPUT LIBRARY NAME set_target_properties(${${TYPE_EXTENSION_CMAKE}_TARGET_NAME} PROPERTIES OUTPUT_NAME ${${TYPE_EXTENSION_CMAKE}_OUTPUT_NAME} ) # OUTPUT DIRECTORY LOCATION AND NAME # Output directory (all extensions are private) set_target_properties(${${TYPE_EXTENSION_CMAKE}_TARGET_NAME} PROPERTIES LIBRARY_OUTPUT_DIRECTORY ${CAMITK_BUILD_PRIVATE_LIB_DIR}/${TYPE_EXTENSION}s LIBRARY_OUTPUT_DIRECTORY_DEBUG ${CAMITK_BUILD_PRIVATE_LIB_DIR}/${TYPE_EXTENSION}s LIBRARY_OUTPUT_DIRECTORY_RELEASE ${CAMITK_BUILD_PRIVATE_LIB_DIR}/${TYPE_EXTENSION}s ) # Output directory (for dll plateform, this is still the same, extensions are private) set_target_properties(${${TYPE_EXTENSION_CMAKE}_TARGET_NAME} PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${CAMITK_BUILD_PRIVATE_LIB_DIR}/${TYPE_EXTENSION}s RUNTIME_OUTPUT_DIRECTORY_DEBUG ${CAMITK_BUILD_PRIVATE_LIB_DIR}/${TYPE_EXTENSION}s RUNTIME_OUTPUT_DIRECTORY_RELEASE ${CAMITK_BUILD_PRIVATE_LIB_DIR}/${TYPE_EXTENSION}s ) # Output directory (for dll plateform, this is still the same, extensions are private) set_target_properties(${${TYPE_EXTENSION_CMAKE}_TARGET_NAME} PROPERTIES ARCHIVE_OUTPUT_DIRECTORY ${CAMITK_BUILD_PRIVATE_LIB_DIR}/${TYPE_EXTENSION}s ARCHIVE_OUTPUT_DIRECTORY_DEBUG ${CAMITK_BUILD_PRIVATE_LIB_DIR}/${TYPE_EXTENSION}s ARCHIVE_OUTPUT_DIRECTORY_RELEASE ${CAMITK_BUILD_PRIVATE_LIB_DIR}/${TYPE_EXTENSION}s ) # OUTPUT LIBRARY NAME MSVC in DEBUG mode if (MSVC) set_target_properties(${${TYPE_EXTENSION_CMAKE}_TARGET_NAME} PROPERTIES DEBUG_POSTFIX ${CAMITK_DEBUG_POSTFIX}) endif() # ADDITIONAL LINUX .so FILE INFORMATION set(${TYPE_EXTENSION_CMAKE}_LIBRARY_PROPERTIES ${${TYPE_EXTENSION_CMAKE}_LIBRARY_PROPERTIES} VERSION "${CAMITK_VERSION_MAJOR}.${CAMITK_VERSION_MINOR}.${CAMITK_VERSION_PATCH}" SOVERSION "${CAMITK_VERSION_MAJOR}" ) # set the library specific info (SONAME...) set_target_properties(${${TYPE_EXTENSION_CMAKE}_TARGET_NAME} PROPERTIES ${${TYPE_EXTENSION_CMAKE}_LIBRARY_PROPERTIES} LINK_INTERFACE_LIBRARIES "") # see http://www.cmake.org/pipermail/cmake/2012-April/049889.html # target properties (outputname and remove soname) # set_property(TARGET ${${TYPE_EXTENSION_CMAKE}_TARGET_NAME} PROPERTY NO_SONAME 1) # in CEP the version patch might not have been set if (NOT CAMITK_VERSION_PATCH) set(CAMITK_VERSION_PATCH 0) endif() ######################################################################### # # # INSTALLATION # # # # * When installing the project, header files (.h) and test data are # # copied into a installation folder to determine. # # * Indicate in this section, where to install your project and which # # files to copy into that folder (during local/global installation) # # # ######################################################################### # FOLDER INSTALLATION # Indicate where to install the action/component install(TARGETS ${${TYPE_EXTENSION_CMAKE}_TARGET_NAME} # TODO always use private lib, even for runtime RUNTIME DESTINATION lib/${CAMITK_SHORT_VERSION_STRING}/${TYPE_EXTENSION}s LIBRARY DESTINATION lib/${CAMITK_SHORT_VERSION_STRING}/${TYPE_EXTENSION}s ARCHIVE DESTINATION lib/${CAMITK_SHORT_VERSION_STRING}/${TYPE_EXTENSION}s COMPONENT ${${TYPE_EXTENSION_CMAKE}_TARGET_NAME} ) # HEADERS INSTALLATION # Build target to install provided headers to install (with HEADERS_TO_INSTALL option) if(${EXTENSION_NAME_CMAKE}_HEADERS_TO_INSTALL) export_headers(${${EXTENSION_NAME_CMAKE}_HEADERS_TO_INSTALL} COMPONENT ${${TYPE_EXTENSION_CMAKE}_TARGET_NAME} GROUP ${TYPE_EXTENSION}s) endif() # Build target to install all header files(with HEADERS_ALL_HEADERS option) if(${EXTENSION_NAME_CMAKE}_INSTALL_ALL_HEADERS) export_headers(${${EXTENSION_NAME_CMAKE}_HEADERS} COMPONENT ${${TYPE_EXTENSION_CMAKE}_TARGET_NAME} GROUP ${TYPE_EXTENSION}s) endif() # TESTDATA INSTALLATION if (EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/testdata) # Check test data dir directory if (NOT EXISTS ${CAMITK_BUILD_TESTDATA_DIR}) add_custom_command(TARGET ${${TYPE_EXTENSION_CMAKE}_TARGET_NAME} POST_BUILD COMMAND ${CMAKE_COMMAND} -E make_directory ${CAMITK_BUILD_TESTDATA_DIR} COMMENT "Creating build-time share directory for test data ${CAMITK_BUILD_TESTDATA_DIR}" VERBATIM ) endif() # At build time, copy the files to test data directory add_custom_command(TARGET ${${TYPE_EXTENSION_CMAKE}_TARGET_NAME} POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy_directory testdata ${CAMITK_BUILD_TESTDATA_DIR} COMMENT "Installing build-time test data for ${EXTENSION_NAME}" WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} VERBATIM ) # during installation, copy the files to install directory set (TESTDATA_DEST_DIR share/${CAMITK_SHORT_VERSION_STRING}/testdata) install(DIRECTORY testdata/ #DESTINATION share/testdata #DESTINATION share/${CAMITK_SHORT_VERSION_STRING}/testdata DESTINATION ${TESTDATA_DEST_DIR} # COMPONENT ${${TYPE_EXTENSION_CMAKE}_TARGET_NAME} PATTERN ".svn" EXCLUDE PATTERN "*~" EXCLUDE ) endif() # CTESTDATA INSTALLATION if (EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/testdata/ctestdata) # Check test data dir directory if (NOT EXISTS ${CAMITK_BUILD_CTESTDATA_DIR}) add_custom_command(TARGET ${${TYPE_EXTENSION_CMAKE}_TARGET_NAME} POST_BUILD COMMAND ${CMAKE_COMMAND} -E make_directory ${CAMITK_BUILD_CTESTDATA_DIR} COMMENT "Creating build-time share directory for test data ${CAMITK_BUILD_CTESTDATA_DIR}" VERBATIM ) endif() # At build time, copy the files to test data directory add_custom_command(TARGET ${${TYPE_EXTENSION_CMAKE}_TARGET_NAME} POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy_directory testdata/ctestdata ${CAMITK_BUILD_CTESTDATA_DIR} COMMENT "Installing build-time test data for ${EXTENSION_NAME}" WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} VERBATIM ) # during installation, copy the files to install directory set (CTESTDATA_DEST_DIR share/${CAMITK_SHORT_VERSION_STRING}/testdata/ctestdata) install(DIRECTORY testdata/ctestdata DESTINATION ${CTESTDATA_DEST_DIR} PATTERN ".svn" EXCLUDE PATTERN "*~" EXCLUDE ) endif() ######################################################################### # # # PROJECT DEPENDENCIES # # # # * Add in this section library dependencies to other camitk projects # # to keep a correct build order. # # # ######################################################################### # CAMITKCORE LIBRARY DEPENDENCY add_dependencies(${${TYPE_EXTENSION_CMAKE}_TARGET_NAME} ${CAMITK_CORE_TARGET_LIB_NAME}) # COMPONENTS DEPENDENCIES if(${EXTENSION_NAME_CMAKE}_NEEDS_COMPONENT_EXTENSION) foreach(COMPONENT_NEEDED ${${EXTENSION_NAME_CMAKE}_NEEDS_COMPONENT_EXTENSION}) string(TOUPPER ${COMPONENT_NEEDED} COMPONENT_NEEDED_CMAKE) # if this is not true, then the dependencies is from an external build, do not use add_dependencies if (${TYPE_EXTENSION_CMAKE}_${EXTENSION_NAME_CMAKE}_INTERNAL) # TODO add IMPORTED add_dependencies(${${TYPE_EXTENSION_CMAKE}_TARGET_NAME} component-${COMPONENT_NEEDED}) endif() endforeach() endif() # ACTIONS DEPENDENCIES if(${EXTENSION_NAME_CMAKE}_NEEDS_ACTION_EXTENSION) foreach(ACTION_NEEDED ${${EXTENSION_NAME_CMAKE}_NEEDS_ACTION_EXTENSION}) string(TOUPPER ${ACTION_NEEDED} ACTION_NEEDED_CMAKE) # if this is not true, then the dependencies is from an external build, do not use add_dependencies if (${TYPE_EXTENSION_CMAKE}_${EXTENSION_NAME_CMAKE}_INTERNAL) # TODO add IMPORTED add_dependencies(${${TYPE_EXTENSION_CMAKE}_TARGET_NAME} action-${ACTION_NEEDED}) endif() endforeach() endif() # CEP LIBRARIES DEPENDENCIES if(${EXTENSION_NAME_CMAKE}_NEEDS_CEP_LIBRARIES) foreach(CEP_LIBRARY_NEEDED ${${EXTENSION_NAME_CMAKE}_NEEDS_CEP_LIBRARIES}) # TODO add IMPORTED if (PACKAGING_NSIS) add_dependencies(${${TYPE_EXTENSION_CMAKE}_TARGET_NAME} library_${CEP_LIBRARY_NEEDED}) else() add_dependencies(${${TYPE_EXTENSION_CMAKE}_TARGET_NAME} library-${CEP_LIBRARY_NEEDED}) endif() endforeach() endif() ######################################################################### # # # CDASH SUBPROJECT DESCRIPTION # # # # * Update the XML description of the subprojects dependencies # # for CDash. # # # ######################################################################### # CDASH XML SUBPROJECTS DESCRIPTION UPDATE camitk_sub_project_add(${TYPE_EXTENSION_CMAKE} ${${TYPE_EXTENSION_CMAKE}_TARGET_NAME} DEPENDENCIES ${CAMITK_CORE_LIBRARIES} ${COMPONENT_EXTENSION_LIBRARIES} ${ACTION_EXTENSION_LIBRARIES} ${CEP_LIBRARIES}) ######################################################################### # # # PACKAGING CATEGORIZATION # # # # * On Windows, when building a package (win32 installer), the # # install shield wizard proposes you to select which component # # to install. # # * Each component to install has a short description following its # # name to understand its role. # # * This section deals with the categorization and the description # # of the component in this installer. # # # ######################################################################### # WINDOWS INSTALLER CATEGORIZATION if(${EXTENSION_NAME_CMAKE}_CEP_NAME) if (${EXTENSION_NAME_CMAKE}_CEP_NAME MATCHES "SDK") # The default SDK extensions are categorized as "required" and are not "unselectable" by the user at installation time cpack_add_component(${${TYPE_EXTENSION_CMAKE}_TARGET_NAME} DISPLAY_NAME ${${TYPE_EXTENSION_CMAKE}_TARGET_NAME} DESCRIPTION ${${EXTENSION_NAME_CMAKE}_DESCRIPTION} REQUIRED GROUP SDK ) else() # Extension is selectable for installation in the wizard of the installer cpack_add_component(${${TYPE_EXTENSION_CMAKE}_TARGET_NAME} DISPLAY_NAME ${${TYPE_EXTENSION_CMAKE}_TARGET_NAME} DESCRIPTION ${${EXTENSION_NAME_CMAKE}_DESCRIPTION} GROUP ${${EXTENSION_NAME_CMAKE}_CEP_NAME} ) endif() else() # Extension if not categorized for packaging presentation cpack_add_component(${${TYPE_EXTENSION_CMAKE}_TARGET_NAME} DISPLAY_NAME ${${TYPE_EXTENSION_CMAKE}_TARGET_NAME} DESCRIPTION ${${EXTENSION_NAME_CMAKE}_DESCRIPTION} ) endif() ######################################################################### # # # CTEST - COMPONENT TESTS DESCRIPTION # # # ######################################################################### if( ${EXTENSION_NAME_CMAKE}_COMPONENT_EXTENSION AND ${EXTENSION_NAME_CMAKE}_TEST_APPLICATION ) message( "GENERATE CTEST TESTS - TARGETNAME IS " ${${TYPE_EXTENSION_CMAKE}_TARGET_NAME} " TEST APPLICATION IS " ${${EXTENSION_NAME_CMAKE}_TEST_APPLICATION} ) camitk_init_test( ${${EXTENSION_NAME_CMAKE}_TEST_APPLICATION} ) # Retrieve the current directory name to properly name the test get_directory_name( ${CMAKE_CURRENT_SOURCE_DIR} COMP_DIR_NAME ) # Test should pass because application test runs with no arguments - shows usage and exit success camitk_add_test( TEST_SUFFIX ${COMP_DIR_NAME} PROJECT_NAME ${${TYPE_EXTENSION_CMAKE}_TARGET_NAME} ) # Retrieve the files in testdata directory - a test will be applied for each of these files get_subdirectoryfiles( ${CMAKE_CURRENT_SOURCE_DIR}/testdata/ctestdata TESTFILES ) foreach( COMPONENT_TESTDATA_FILE ${TESTFILES} ) # Give the file name (full path cut) get_directory_name( ${COMPONENT_TESTDATA_FILE} DATA_FILE ) # Test procedure: Open a file - save it - Compare saved file to original file camitk_add_test( EXECUTABLE_ARGS "-i ${CAMITK_BUILD_TESTDATA_DIR}/ctestdata/${DATA_FILE}" PASS_FILE_OUTPUT ${CAMITK_BUILD_TESTDATA_DIR}/ctestdata/${DATA_FILE} TEST_SUFFIX ${COMP_DIR_NAME} PROJECT_NAME ${${TYPE_EXTENSION_CMAKE}_TARGET_NAME} ) endforeach() # Test should pass because invoking application-test with a faulty arguments results in printing # an "Usage error" message (and exit failure) camitk_add_test( EXECUTABLE_ARGS "-error" PASS_REGULAR_EXPRESSION "Usage" TEST_SUFFIX ${COMP_DIR_NAME} PROJECT_NAME ${${TYPE_EXTENSION_CMAKE}_TARGET_NAME} ) ######################################################################### # # # CTEST - ACTION TESTS DESCRIPTION # # # ######################################################################### elseif( ${EXTENSION_NAME_CMAKE}_ACTION_EXTENSION AND ${EXTENSION_NAME_CMAKE}_TEST_APPLICATION ) message( "GENERATE CTEST TESTS - TARGETNAME IS " ${${TYPE_EXTENSION_CMAKE}_TARGET_NAME} " TEST APPLICATION IS " ${${EXTENSION_NAME_CMAKE}_TEST_APPLICATION} ) camitk_init_test( ${${EXTENSION_NAME_CMAKE}_TEST_APPLICATION} ) # Retrieve the current directory name to properly name the test get_directory_name( ${CMAKE_CURRENT_SOURCE_DIR} COMP_DIR_NAME ) # Test should pass because application test runs with no arguments - shows usage and exit success camitk_add_test( PROJECT_NAME ${${TYPE_EXTENSION_CMAKE}_TARGET_NAME} ) # Test should pass because invoking application-test with a faulty arguments results in printing # an "Usage error" message (and exit failure) camitk_add_test( EXECUTABLE_ARGS "-error" PASS_REGULAR_EXPRESSION "Usage" PROJECT_NAME ${${TYPE_EXTENSION_CMAKE}_TARGET_NAME} ) # Retrieve the files in ctestdata directory - tests will be applied for each of these files get_subdirectoryfiles( ${CAMITK_BUILD_TESTDATA_DIR}/ctestdata TESTFILES ) #get the names of actions .dlls in lib directory get_subdirectoryfiles( ${CAMITK_BUILD_PRIVATE_LIB_DIR}/actions/ ACTIONSDLLS ) foreach( ACTION_TESTDATA_FILE ${TESTFILES} ) # Give the file name (full path cut) get_directory_name( ${ACTION_TESTDATA_FILE} DATA_FILE ) if( NOT ( ${${TYPE_EXTENSION_CMAKE}_OUTPUT_NAME} MATCHES "application" ) )#We do not apply tests on actions like (close, save, save as) # Test procedure: Open a file - load an action extension - Apply an action on the component wrapping the file if(MSVC) camitk_add_test( EXECUTABLE_ARGS "-i ${CAMITK_BUILD_TESTDATA_DIR}/ctestdata/${DATA_FILE} -a ${${TYPE_EXTENSION_CMAKE}_OUTPUT_NAME}${CAMITK_DEBUG_POSTFIX}.dll" PROJECT_NAME ${${TYPE_EXTENSION_CMAKE}_TARGET_NAME} ) else() camitk_add_test( EXECUTABLE_ARGS "-i ${CAMITK_BUILD_TESTDATA_DIR}/ctestdata/${DATA_FILE} -a ${${TYPE_EXTENSION_CMAKE}_OUTPUT_NAME}.dll" PROJECT_NAME ${${TYPE_EXTENSION_CMAKE}_TARGET_NAME} ) endif() endif() endforeach() endif() endif() # endif(${TYPE_EXTENSION_CMAKE}_${EXTENSION_NAME_CMAKE}) endmacro() # Old macro to configure a new action to the framework # Use camitk_extension macro instead # TODO CAMITK_OBSOLETE. This macro is marked as obsolete. It is to be removed in CamiTK 4.0 macro(action_extension) message(WARNING "Deprecated macro action_extension detected : please use camitk_extension(ACTION_EXTENSION ...) instead.") camitk_extension(ACTION_EXTENSION ${ARGN}) endmacro() # Old macro to configure a new component to the framework # Use camitk_extension macro instead # TODO CAMITK_OBSOLETE. This macro is marked as obsolete. It is to be removed in CamiTK 4.0 macro(component_extension) message(WARNING "Deprecated macro component_extension detected : please use camitk_extension(COMPONENT_EXTENSION ...) instead.") camitk_extension(COMPONENT_EXTENSION ${ARGN}) endmacro() # TODO write a viewer_extension macro in CamiTK