Computer Assited Medical Intervention Tool Kit  version 4.0
CamiTKExtension.h
Go to the documentation of this file.
1 # possible values : ACTION_EXTENSION or COMPONENT_EXTENSION.
39 
76 
77 
78  # Instruct CMake to run moc automatically when needed.
79  set(CMAKE_AUTOMOC ON)
80 
81 
82 
83  #########################################################################
84  # #
85  # ARGUMENTS PARSING #
86  # #
87  # * Use a macro to create the CMAKE variables according to the #
88  # provided options as input. #
89  # #
90  #########################################################################
91 
92  get_directory_name(${CMAKE_CURRENT_SOURCE_DIR} EXTENSION_NAME)
93 
94  parse_arguments(${EXTENSION_NAME_CMAKE} #prefix
95  "NEEDS_TOOLNEEDS_CEP_LIBRARIESNEEDS_COMPONENT_EXTENSIONNEEDS_ACTION_EXTENSIONINCLUDE_DIRECTORIESEXTERNAL_LIBRARIESHEADERS_TO_INSTALLDEFINESCXX_FLAGSEXTERNAL_SOURCESTARGET_NAMECEP_NAMEDESCRIPTIONTEST_APPLICATIONEXTRA_TRANSLATE_LANGUAGETEST_FILES" # possible lists
96  "NEEDS_QT_MODULESACTION_EXTENSIONCOMPONENT_EXTENSIONDISABLEDNEEDS_XERCESCNEEDS_ITKNEEDS_LIBXML2NEEDS_XSDNEEDS_QTXMLNEEDS_OPENCVNEEDS_IGSTKINSTALL_ALL_HEADERSNEEDS_GDCMDISABLE_TESTLEVEL1DISABLE_TESTLEVEL2DISABLE_TESTLEVEL3" # possible options
97  ${ARGN}
98  )
99 
100 
101 
102  #########################################################################
103  # #
104  # CREATE CMAKE VARIABLES #
105  # #
106  # * Create required and useful CMake variables for the macro #
107  # #
108  #########################################################################
109 
110  # TYPE EXTENSION : ACTION or COMPONENT
111  if (${EXTENSION_NAME_CMAKE}_ACTION_EXTENSION)
112  set(TYPE_EXTENSION "action")
113  string(TOUPPER ${TYPE_EXTENSION} TYPE_EXTENSION_CMAKE)
114  elseif(${EXTENSION_NAME_CMAKE}_COMPONENT_EXTENSION)
115  set(TYPE_EXTENSION "component")
116  string(TOUPPER ${TYPE_EXTENSION} TYPE_EXTENSION_CMAKE)
117  endif()
118 
119  # CMAKE CACHE VARIABLE
120  # if it is the first cmake run, create the extension variable with a correct initial value
121  if(NOT ${TYPE_EXTENSION_CMAKE}_${EXTENSION_NAME_CMAKE}_INTERNAL)
122  # add option to enable/disable this extension and set it to true by default
123  # Building the extension can be disabled by giving the argument DISABLED to the macro
124  # or by passing the flag -D${TYPE_EXTENSION_CMAKE}_${EXTENSION_NAME_CMAKE}_DISABLED:BOOL=TRUE
125  if(${EXTENSION_NAME_CMAKE}_DISABLED)
126  set(${TYPE_EXTENSION_CMAKE}_${EXTENSION_NAME_CMAKE}_ENABLED FALSE)
127  else()
128  set(${TYPE_EXTENSION_CMAKE}_${EXTENSION_NAME_CMAKE}_ENABLED TRUE)
129  endif()
130  set(${TYPE_EXTENSION_CMAKE}_${EXTENSION_NAME_CMAKE} ${${TYPE_EXTENSION_CMAKE}_${EXTENSION_NAME_CMAKE}_ENABLED} CACHE BOOL "Build extension ${EXTENSION_NAME}")
131  set(${TYPE_EXTENSION_CMAKE}_${EXTENSION_NAME_CMAKE}_INTERNAL TRUE CACHE INTERNAL "Is variable ${TYPE_EXTENSION_CMAKE}_${EXTENSION_NAME} already created?")
132  endif()
133 
134  # if this extension is enabled, do everything needed
135  # otherwise... do nothing
136  if (${TYPE_EXTENSION_CMAKE}_${EXTENSION_NAME_CMAKE})
137 
138  # TARGET NAME
139  # The target name is composed of the following: [action / component]-name
140  # * action / component is the type of extension as prefix
141  # * name is deduced from the input folder containing the calling CMakeLists.txt file of the extension.
142  if (${EXTENSION_NAME_CMAKE}_TARGET_NAME)
143  set(${TYPE_EXTENSION_CMAKE}_OUTPUT_NAME ${${EXTENSION_NAME_CMAKE}_TARGET_NAME})
144  else()
145  set(${TYPE_EXTENSION_CMAKE}_OUTPUT_NAME ${EXTENSION_NAME})
146  endif()
147  # replace "-" by "_" if the extension is being packaged with NSIS, the program to create a Windows installer.
148  if (PACKAGING_NSIS)
149  # NSIS requires that cpack component names do not feature space or "-" characters
150  set(${TYPE_EXTENSION_CMAKE}_TARGET_NAME ${TYPE_EXTENSION}_${${TYPE_EXTENSION_CMAKE}_OUTPUT_NAME})
151  else()
152  set(${TYPE_EXTENSION_CMAKE}_TARGET_NAME ${TYPE_EXTENSION}-${${TYPE_EXTENSION_CMAKE}_OUTPUT_NAME})
153  endif()
154 
155  message(STATUS "Building extension ${${TYPE_EXTENSION_CMAKE}_TARGET_NAME}")
156 
157 
158 
159  #########################################################################
160  # #
161  # INCLUDE DIRECTORIES #
162  # #
163  # * Include basic directories where to look header files #
164  # * Include also additional user provided directories #
165  # * These directories are used for compilation step #
166  # #
167  #########################################################################
168  # BASIC DIRECTORIES
169 
170  include_directories(${CAMITK_INCLUDE_DIRECTORIES})
171  include_directories(${CMAKE_CURRENT_BINARY_DIR})
172  include_directories(${CMAKE_CURRENT_SOURCE_DIR})
173 
174  # USER INPUT DIRECTORIES
175  include_directories(${${EXTENSION_NAME_CMAKE}_INCLUDE_DIRECTORIES})
176 
177 
178 
179  #########################################################################
180  # #
181  # GATHER RESSOURCES #
182  # #
183  # * Get all the headers (.h) and source files (.cpp) of the project #
184  # * Create the needed Qt files (using moc and uic) #
185  # * On Windows, Visual Studio, group .moc and .ui files #
186  # in subdirectories #
187  # #
188  #########################################################################
189 
190  # get all headers, sources and do what is needed for Qt
191  # one need to do this just before the add_library so that all defines, include directories and link directories
192  # are set properly (gather_headers_and_sources include the call to Qt moc and uic)
193  gather_headers_and_sources(${EXTENSION_NAME_CMAKE})
194 
195 
196 
197  #########################################################################
198  # #
199  # ADDITIONAL KNOWN EXTERNAL LIBRARY DEPENDENCIES #
200  # #
201  # * Look for specific library needed #
202  # * Specific libraries are specified as option with the #
203  # NEEDS_LIBRARY syntax (see macro syntax for more options) #
204  # * Backward compatibility : Warn user if using old NEEDS_TOOL syntax #
205  # #
206  #########################################################################
207 
208  # Looking for ITK
209  set(ITK_LIBRARIES "")
210  if(${EXTENSION_NAME_CMAKE}_NEEDS_ITK)
211  find_package(ITK REQUIRED PATHS /usr/lib/InsightToolkit)
212  if(ITK_FOUND)
213  include(${ITK_USE_FILE})
214  set(ITK_VERSION ${ITK_VERSION_MAJOR}.${ITK_VERSION_MINOR}.${ITK_VERSION_PATCH}) #ITK_VERSION is not always set
215  set(CAMITK_ITK_VERSION ${ITK_VERSION_MAJOR}.${ITK_VERSION_MINOR})
216  message(STATUS "${${TYPE_EXTENSION_CMAKE}_TARGET_NAME}: Found ITK version ${ITK_VERSION}")
217 
218  if ((${ITK_VERSION} VERSION_GREATER "4") AND (${ITK_VERSION} VERSION_LESS "5")) # ITK 4.9 on Windows, maybe a lesser version for Linux.
219  if(MSVC)
220  set(ITK_DIR ${ITK_DIR}/../..)
221  # Construct list of ITK libraries for linking = CAMITK_ITK_LIBRARIES
222  foreach(ITK_LIBRARY ${ITK_LIBRARIES})
223  string(SUBSTRING ${ITK_LIBRARY} 0 3 ${ITK_LIBRARY}_PREFIX)
224  # Some libraries have not the expected 'itk' prefix. Add it then
225  if((NOT ${${ITK_LIBRARY}_PREFIX} STREQUAL "itk") AND (NOT ${${ITK_LIBRARY}_PREFIX} STREQUAL "ITK"))
226  set(ITK_LIBRARY itk${ITK_LIBRARY})
227  endif()
228  set(CAMITK_ITK_LIBRARIES ${CAMITK_ITK_LIBRARIES} debug ${ITK_DIR}/${ITK_LIBRARY}-${CAMITK_ITK_VERSION}${CAMITK_DEBUG_POSTFIX}.lib optimized ${ITK_DIR}/${ITK_LIBRARY}-${CAMITK_ITK_VERSION}.lib)
229  endforeach()
230  elseif(UNIX)
231  set(CAMITK_ITK_LIBRARIES ${ITK_LIBRARIES})
232  elseif(APPLE)
233  message(WARNING "CamiTKExtension.cmake: ITK LIBRARY NOT SET FOR APPLE")
234  endif()
235  else()
236  message(FATAL_ERROR "Wrong version of ITK : ${ITK_VERSION}. Required is at least 4.x to 4.9")
237  endif()
238  else()
239  message(FATAL_ERROR "ITK not found but required for ${${TYPE_EXTENSION_CMAKE}_TARGET_NAME}")
240  endif()
241  endif()
242 
243  # LIBXML2
244  set(LIBXML2_LIBRARY "")
245  if(${EXTENSION_NAME_CMAKE}_NEEDS_LIBXML2)
246  # LibXml2 is required
247  find_package(Xml2)
248  if (LIBXML2_FOUND)
249  add_definitions(${LIBXML2_DEFINITIONS})
250  include_directories(${LIBXML2_INCLUDE_DIR})
251  set(LIBXML2_LIBRARY ${LIBXML2_LIBRARIES})
252  else()
253  # most probably win32 or crosscompiling
254  message(STATUS "${EXTENSION_NAME}: libxml2 required")
255  endif()
256  endif()
257 
258  # OPENCV
259  set(OpenCV_LIBRARIES "")
260  if(${EXTENSION_NAME_CMAKE}_NEEDS_OPENCV)
261  # OpenCV is required
262  find_package( OpenCV REQUIRED )
263  else ( )
264  set(OpenCV_LIBRARIES "")
265  endif()
266 
267  # IGSTK
268  set(IGSTK_LIBRARIES "")
269  if(${EXTENSION_NAME_CMAKE}_NEEDS_IGSTK)
270  find_package(IGSTK REQUIRED)
271  include(${IGSTK_USE_FILE})
272  else()
273  set(IGSTK_LIBRARIES "")
274  endif()
275 
276  # XERCES-C
277  set(XERCESC_LIBRARIES)
278  if(${EXTENSION_NAME_CMAKE}_NEEDS_XERCESC)
279  # XercesC is required
280  find_package(XercesC REQUIRED)
281  if (XERCESC_FOUND)
282  include_directories(${XERCESC_INCLUDE_DIR})
283  set(XERCESC_LIBRARIES ${XERCESC_LIBRARY})
284  else()
285  # most probably win32 or crosscompiling
286  message(FATAL_ERROR "${EXTENSION_NAME}: xerces-c required. Please provide Xerces-C path.")
287  endif()
288  endif()
289 
290  # XSD
291  if(${EXTENSION_NAME_CMAKE}_NEEDS_XSD)
292  # XercesC is required
293  find_package(XercesC REQUIRED)
294  if (XERCESC_FOUND)
295  include_directories(${XERCESC_INCLUDE_DIR})
296  set(XERCESC_LIBRARIES ${XERCESC_LIBRARY})
297  find_package(XSD REQUIRED)
298  include_directories(${XSD_INCLUDE_DIR})
299  else()
300  # most probably win32 or crosscompiling
301  message(FATAL_ERROR "${EXTENSION_NAME}: xerces-c required because of XSD cxx, please set XERCESC_INCLUDE_DIR")
302  endif()
303  endif()
304 
305  # GDCM 2.2.x
306  set(GDCM_LIBRARIES)
307  if(${EXTENSION_NAME_CMAKE}_NEEDS_GDCM)
308  if(NOT GDCM_FOUND)
309  # Look for GDCM library only if not found (for instance, ITK has already search for it)
310  # Calling find_package(GDCM ..) more than once creates CMake errors.
311  find_package(GDCM 2.0 REQUIRED)
312  endif()
313  if(GDCM_FOUND)
314  include(${GDCM_USE_FILE})
315  if (MSVC)
316  set(GDCM_LIBRARIES
317  debug ${GDCM_DIR}/../gdcmcharls${CAMITK_DEBUG_POSTFIX}.lib
318  debug ${GDCM_DIR}/../gdcmCommon${CAMITK_DEBUG_POSTFIX}.lib
319  debug ${GDCM_DIR}/../gdcmDICT${CAMITK_DEBUG_POSTFIX}.lib
320  debug ${GDCM_DIR}/../gdcmDSED${CAMITK_DEBUG_POSTFIX}.lib
321  debug ${GDCM_DIR}/../gdcmexpat${CAMITK_DEBUG_POSTFIX}.lib
322  debug ${GDCM_DIR}/../gdcmgetopt${CAMITK_DEBUG_POSTFIX}.lib
323  debug ${GDCM_DIR}/../gdcmIOD${CAMITK_DEBUG_POSTFIX}.lib
324  debug ${GDCM_DIR}/../gdcmjpeg8${CAMITK_DEBUG_POSTFIX}.lib
325  debug ${GDCM_DIR}/../gdcmjpeg12${CAMITK_DEBUG_POSTFIX}.lib
326  debug ${GDCM_DIR}/../gdcmjpeg16${CAMITK_DEBUG_POSTFIX}.lib
327  debug ${GDCM_DIR}/../gdcmMEXD${CAMITK_DEBUG_POSTFIX}.lib
328  debug ${GDCM_DIR}/../gdcmMSFF${CAMITK_DEBUG_POSTFIX}.lib
329  debug ${GDCM_DIR}/../gdcmopenjpeg${CAMITK_DEBUG_POSTFIX}.lib
330  debug ${GDCM_DIR}/../gdcmzlib${CAMITK_DEBUG_POSTFIX}.lib
331  debug ${GDCM_DIR}/../socketxx${CAMITK_DEBUG_POSTFIX}.lib
332  debug ${GDCM_DIR}/../vtkgdcm${CAMITK_DEBUG_POSTFIX}.lib
333  debug ${GDCM_DIR}/../gdcmDSED${CAMITK_DEBUG_POSTFIX}.lib
334  optimized gdcmcharls gdcmCommon gdcmDICT gdcmDSED gdcmexpat
335  optimized gdcmgetopt gdcmIOD gdcmjpeg8 gdcmjpeg12 gdcmjpeg16
336  optimized gdcmMEXD gdcmMSFF gdcmopenjpeg gdcmzlib socketxx vtkgdcm
337  optimized gdcmDSED
338  )
339  else()
340  set(GDCM_LIBRARIES gdcmCommon gdcmDICT gdcmDSED gdcmMEXD gdcmMSFF vtkgdcm)
341  endif()
342  else()
343  message(ERROR "${EXTENSION_NAME}: GDCM 2.x library required. Please install GDCM.")
344  endif()
345  endif()
346 
347  # EXTERNAL LIBRARIES
348  set(EXTERNAL_LIBRARIES)
349  if(${EXTENSION_NAME_CMAKE}_EXTERNAL_LIBRARIES)
350  foreach(EXTERNAL_LIBRARY ${${EXTENSION_NAME_CMAKE}_EXTERNAL_LIBRARIES})
351  if (MSVC)
352  set(EXTERNAL_LIBRARIES ${EXTERNAL_LIBRARIES}
353  debug ${EXTERNAL_LIBRARY}${CAMITK_DEBUG_POSTFIX}.lib
354  optimized ${EXTERNAL_LIBRARY}
355  )
356  else()
357  set(EXTERNAL_LIBRARIES ${EXTERNAL_LIBRARIES} ${EXTERNAL_LIBRARY})
358  endif()
359  endforeach()
360  endif()
361 
362  # BACKWARD COMPATIBILITY
363  # NEEDS_TOOLS option
364  # TODO CAMITK_DEPRECATED. This option is marked as deprecated. It is to be removed in CamiTK 4.0
365  if(${EXTENSION_NAME_CMAKE}_NEEDS_TOOL)
366  message(WARNING "Warning: ${CMAKE_CURRENT_SOURCE_DIR}/CMakeLists.txt: camitk_extension macro option NEEDS_TOOL is deprecated, please use NEEDS_CEP_LIBRARIES instead..")
367  set(${EXTENSION_NAME_CMAKE}_NEEDS_CEP_LIBRARIES ${${EXTENSION_NAME_CMAKE}_NEEDS_CEP_LIBRARIES} ${${EXTENSION_NAME_CMAKE}_NEEDS_TOOL})
368  endif()
369 
370 
371 
372  #########################################################################
373  # #
374  # LINK DIRECTORIES #
375  # #
376  # * Link directories are used to indicate the compiler where #
377  # to look for folder containing libraries to link with. #
378  # * Must be done BEFORE creating the CMake target with add_library #
379  # #
380  #########################################################################
381 
382  # CAMITK BASIC LIB DIRECTORIES
383  link_directories(${CAMITK_LINK_DIRECTORIES})
384 
385 
386 
387  #########################################################################
388  # #
389  # TARGET COMPILATION DEFINITION #
390  # #
391  # * Additional sources files to consider at compilation (.cpp) #
392  # * CMake project target definition #
393  # #
394  #########################################################################
395  # EXTERNAL SOURCES
396  set(${EXTENSION_NAME_CMAKE}_SOURCES ${${EXTENSION_NAME_CMAKE}_SOURCES} ${${EXTENSION_NAME_CMAKE}_EXTERNAL_SOURCES})
397 
398  # CMAKE TARGET DEFINITION
399  add_library(${${TYPE_EXTENSION_CMAKE}_TARGET_NAME} SHARED ${${EXTENSION_NAME_CMAKE}_SOURCES})
400 
401 
402 
403  #########################################################################
404  # #
405  # QT LINKING LIBRARIES #
406  # #
407  # * Set at linking the Qt5 libraries #
408  # #
409  #########################################################################
410  qt5_use_modules(${${TYPE_EXTENSION_CMAKE}_TARGET_NAME} ${CAMITK_QT_COMPONENTS})
411 
412 
413 
414  #########################################################################
415  # #
416  # CAMITK ACTION / COMPONENT / LIBRARIES DEPENDENCIES #
417  # #
418  # * Look for action / component / libraries dependencies #
419  # * Specific actions / components / libraries are specified as option #
420  # with the NEEDS_ACTION/COMPONENT_EXTENSION/CEP_LIBRARIES syntax #
421  # * Add dependencies to library-camitkcore and the testing #
422  # action/component if test are runned on it #
423  # #
424  #########################################################################
425 
426  # 1st CAMITKCORE LIBRARY DEPENDENCY
427  # add_dependencies(..) is only needed to enable parallel build during SDK build
428  # but generates an error for external CEP, where this target does not
429  # exists.
430  # Using target_link_libraries(..) is enough to link the extension to the CamiTK core library
431  if(CAMITK_SDK_BUILD)
432  add_dependencies(${${TYPE_EXTENSION_CMAKE}_TARGET_NAME} ${CAMITK_CORE_TARGET_LIB_NAME})
433  # add the dependency to the core automoc target
434  set_property(TARGET ${${TYPE_EXTENSION_CMAKE}_TARGET_NAME} APPEND PROPERTY AUTOGEN_TARGET_DEPENDS ${CAMITK_CORE_TARGET_LIB_NAME})
435  endif()
436 
437  # 2nd COMPONENTS DEPENDENCIES
438  if(${EXTENSION_NAME_CMAKE}_NEEDS_COMPONENT_EXTENSION)
439  set(COMPONENTS_DEPENDENCY_LIST "") #use for generating the project.xml file
440  foreach(COMPONENT_NEEDED ${${EXTENSION_NAME_CMAKE}_NEEDS_COMPONENT_EXTENSION})
441  # include directories from build, camitk (local or global install).
442  include_directories(${CAMITK_BUILD_INCLUDE_DIR}/components/${COMPONENT_NEEDED})
443  include_directories(${CAMITK_INCLUDE_DIR}/components/${COMPONENT_NEEDED})
444  # file dependency
445  if (MSVC)
446  set(COMPONENT_EXTENSION_LIBRARIES ${COMPONENT_EXTENSION_LIBRARIES}
447  debug ${CAMITK_BUILD_PRIVATE_LIB_DIR}/components/${COMPONENT_NEEDED}${CAMITK_DEBUG_POSTFIX}.lib
448  optimized ${COMPONENT_NEEDED}
449  )
450  else()
451  set(COMPONENT_EXTENSION_LIBRARIES ${COMPONENT_EXTENSION_LIBRARIES} ${COMPONENT_NEEDED})
452  endif()
453  # CMake / CDash dependencies
454  if(PACKAGING_NSIS)
455  add_dependencies(${${TYPE_EXTENSION_CMAKE}_TARGET_NAME} component_${COMPONENT_NEEDED})
456  else()
457  add_dependencies(${${TYPE_EXTENSION_CMAKE}_TARGET_NAME} component-${COMPONENT_NEEDED})
458  set(COMPONENTS_DEPENDENCY_LIST ${COMPONENTS_DEPENDENCY_LIST} component-${COMPONENT_NEEDED})
459  endif()
460  endforeach()
461  endif()
462 
463  # 3rd ACTIONS DEPENDENCIES
464  if(${EXTENSION_NAME_CMAKE}_NEEDS_ACTION_EXTENSION)
465  set(ACTIONS_DEPENDENCY_LIST "") #use for generating the project.xml file
466  foreach(ACTION_NEEDED ${${EXTENSION_NAME_CMAKE}_NEEDS_ACTION_EXTENSION})
467  # include directories from build, camitk (local or global install).
468  include_directories(${CAMITK_BUILD_INCLUDE_DIR}/actions/${ACTION_NEEDED})
469  include_directories(${CAMITK_INCLUDE_DIR}/actions/${ACTION_NEEDED})
470  # file dependency
471  if (MSVC)
472  set(ACTION_EXTENSION_LIBRARIES ${ACTION_EXTENSION_LIBRARIES}
473  debug ${CAMITK_BUILD_PRIVATE_LIB_DIR}/actions/${ACTION_NEEDED}${CAMITK_DEBUG_POSTFIX}.lib
474  optimized ${ACTION_NEEDED}
475  )
476  else()
477  set(ACTION_EXTENSION_LIBRARIES ${ACTION_EXTENSION_LIBRARIES} ${ACTION_NEEDED})
478  endif()
479  # CMake / CDash dependencies
480  if (PACKAGING_NSIS)
481  add_dependencies(${${TYPE_EXTENSION_CMAKE}_TARGET_NAME} action_${ACTION_NEEDED})
482  else()
483  add_dependencies(${${TYPE_EXTENSION_CMAKE}_TARGET_NAME} action-${ACTION_NEEDED})
484  set(ACTIONS_DEPENDENCY_LIST ${ACTIONS_DEPENDENCY_LIST} action-${ACTION_NEEDED})
485  endif()
486  endforeach()
487  endif()
488 
489  # 4th CEP LIBRARIES DEPENDENCIES
490  if(${EXTENSION_NAME_CMAKE}_NEEDS_CEP_LIBRARIES)
491  set(CEP_LIBRARIES_DEPENDENCY_LIST "") #use for generating the project.xml file
492  foreach(CEP_LIBRARY_NEEDED ${${EXTENSION_NAME_CMAKE}_NEEDS_CEP_LIBRARIES})
493  # include directories from build, camitk (local or global install).
494  include_directories(${CAMITK_BUILD_INCLUDE_DIR}/libraries/${CEP_LIBRARY_NEEDED})
495  include_directories(${CAMITK_INCLUDE_DIR}/libraries/${CEP_LIBRARY_NEEDED})
496  # file dependency
497  if (MSVC)
498  set(CEP_LIBRARIES ${CEP_LIBRARIES} debug ${CEP_LIBRARY_NEEDED}${CAMITK_DEBUG_POSTFIX}.lib
499  optimized ${CEP_LIBRARY_NEEDED}
500  )
501  else()
502  if(PACKAGING_NSIS)
503  set(CEP_LIBRARIES ${CEP_LIBRARIES} ${CEP_LIBRARY_NEEDED})
504  else()
505  set(CEP_LIBRARIES ${CEP_LIBRARIES} ${CEP_LIBRARY_NEEDED})
506  endif()
507  endif()
508  # CMake / CDash dependencies
509  if (PACKAGING_NSIS)
510  add_dependencies(${${TYPE_EXTENSION_CMAKE}_TARGET_NAME} library_${CEP_LIBRARY_NEEDED})
511  else()
512  add_dependencies(${${TYPE_EXTENSION_CMAKE}_TARGET_NAME} library-${CEP_LIBRARY_NEEDED})
513  set(CEP_LIBRARIES_DEPENDENCY_LIST ${CEP_LIBRARIES_DEPENDENCY_LIST} library-${CEP_LIBRARY_NEEDED})
514  # add the dependency to the library automoc target
515  set_property(TARGET ${${TYPE_EXTENSION_CMAKE}_TARGET_NAME} APPEND PROPERTY AUTOGEN_TARGET_DEPENDS library-${CEP_LIBRARY_NEEDED})
516  endif()
517  endforeach()
518  endif()
519 
520  # 5th DEPENDENCY ON TESTING APPLICATION
521  # Those projects are used to run unitarian test on ACTION / COMPONENT extensions.
522  set(APPLICATIONS_DEPENDENCY_LIST "")
523  if(${EXTENSION_NAME_CMAKE}_TEST_APPLICATION AND NOT PACKAGING_NSIS AND BUILD_TESTING)
524  # Add this dependencies for automatically constructing application-testactions components dependencies
525  add_dependencies(${${TYPE_EXTENSION_CMAKE}_TARGET_NAME} application-test${TYPE_EXTENSION}s)
526  set(APPLICATIONS_DEPENDENCY_LIST "application-test${TYPE_EXTENSION}s")
527  # add the dependency to the test application automoc target
528  set_property(TARGET ${${TYPE_EXTENSION_CMAKE}_TARGET_NAME} APPEND PROPERTY AUTOGEN_TARGET_DEPENDS application-test${TYPE_EXTENSION}s)
529  endif()
530 
531  if((CEP_NAME STREQUAL "SDK") OR (CEP_NAME STREQUAL "modeling") OR (CEP_NAME STREQUAL "imaging"))
532  # 6th TEST-COMPONENT APPLICATION DEPENDENCY ON THIS COMPONENT
533  if(${EXTENSION_NAME_CMAKE}_COMPONENT_EXTENSION AND ${EXTENSION_NAME_CMAKE}_TEST_APPLICATION AND NOT PACKAGING_NSIS AND BUILD_TESTING)
534  add_dependencies(application-testactions ${COMPONENT_TARGET_NAME})
535  # add this component automoc target to the dependency of the test application
536  set_property(TARGET application-testactions APPEND PROPERTY AUTOGEN_TARGET_DEPENDS ${COMPONENT_TARGET_NAME})
537  endif()
538 
539  # 7th TEST-ACTION APPLICATION DEPENDENCY ON ACTION-APPLICATION
540  if(${TYPE_EXTENSION_CMAKE}_TARGET_NAME STREQUAL "action-application" AND BUILD_TESTING)
541  add_dependencies(application-testcomponents action-application)
542  # add this component automoc target to the dependency of the test application
543  set_property(TARGET application-testcomponents APPEND PROPERTY AUTOGEN_TARGET_DEPENDS action-application)
544  endif()
545  endif()
546 
547 
548  #########################################################################
549  # #
550  # COMPILATION FLAG #
551  # #
552  # * Flags are options to give to the compiler #
553  # * Add user input flags #
554  # * Add platform specific flags #
555  # #
556  #########################################################################
557 
558  # USER INPUT DEFINES COMPILER FLAG
559  if(${EXTENSION_NAME_CMAKE}_DEFINES)
560  foreach (FLAG ${${EXTENSION_NAME_CMAKE}_DEFINES})
561  add_definitions(-D${FLAG})
562  endforeach()
563  endif()
564 
565  # USER INPUT CUSTOM COMPILER FLAG
566  if(${EXTENSION_NAME_CMAKE}_CXX_FLAGS)
567  foreach (FLAG ${${EXTENSION_NAME_CMAKE}_CXX_FLAGS})
568  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${FLAG}")
569  endforeach()
570  endif()
571 
572  # PLATFORM SPECIFIC COMPILER FLAG
573  # 64bits and other platform with relocation needs -fPIC
574  include(TestCXXAcceptsFlag)
575  check_cxx_accepts_flag(-fPIC FPIC_FLAG_ACCEPTED)
576  # no need to add -fPIC on mingw, otherwise it generates a warning: -fPIC ignored for target (all code is position independent) [enabled by default]
577  # msvc is also accepting the flag, but then produce warning D9002 : ignoring unknown option '-fPIC' cl
578  if(FPIC_FLAG_ACCEPTED AND NOT WIN32)
579  set_property(TARGET ${${TYPE_EXTENSION_CMAKE}_TARGET_NAME} APPEND PROPERTY COMPILE_FLAGS -fPIC)
580  endif()
581 
582 
583 
584  #########################################################################
585  # #
586  # LINKING #
587  # #
588  # * Linking is the last stage of compilation #
589  # * Indicate what libraries to use for linking the target #
590  # #
591  #########################################################################
592  # LINKING LIBRARIES
593  # Any component or action has to be linked with ${CAMITK_CORE_LIBRARIES} and with all its dependencies
594  target_link_libraries(${${TYPE_EXTENSION_CMAKE}_TARGET_NAME} ${CAMITK_CORE_LIBRARIES} ${CAMITK_LIBRARIES} ${COMPONENT_EXTENSION_LIBRARIES} ${ACTION_EXTENSION_LIBRARIES} ${CEP_LIBRARIES} ${CAMITK_ITK_LIBRARIES} ${LIBXML2_LIBRARY} ${OpenCV_LIBRARIES} ${IGSTK_LIBRARIES} ${XERCESC_LIBRARIES} ${GDCM_LIBRARIES} ${EXTERNAL_LIBRARIES})
595 
596 
597 
598  #########################################################################
599  # #
600  # OUTPUT #
601  # #
602  # * Define the output directory (location and name) #
603  # * Define the output name of the library #
604  # * Add ${CAMITK_DEBUG_POSTFIX} suffix to Debug MSVC built libraries #
605  # * Additional Linux .so files information #
606  # #
607  #########################################################################
608 
609  # OUTPUT LIBRARY NAME
610  set_target_properties(${${TYPE_EXTENSION_CMAKE}_TARGET_NAME}
611  PROPERTIES OUTPUT_NAME ${${TYPE_EXTENSION_CMAKE}_OUTPUT_NAME}
612  )
613 
614  # OUTPUT DIRECTORY LOCATION AND NAME
615  # Output directory (all extensions are private)
616  set_target_properties(${${TYPE_EXTENSION_CMAKE}_TARGET_NAME} PROPERTIES LIBRARY_OUTPUT_DIRECTORY ${CAMITK_BUILD_PRIVATE_LIB_DIR}/${TYPE_EXTENSION}s
617  LIBRARY_OUTPUT_DIRECTORY_DEBUG ${CAMITK_BUILD_PRIVATE_LIB_DIR}/${TYPE_EXTENSION}s
618  LIBRARY_OUTPUT_DIRECTORY_RELEASE ${CAMITK_BUILD_PRIVATE_LIB_DIR}/${TYPE_EXTENSION}s
619  )
620  # Output directory (for dll plateform, this is still the same, extensions are private)
621  set_target_properties(${${TYPE_EXTENSION_CMAKE}_TARGET_NAME} PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${CAMITK_BUILD_PRIVATE_LIB_DIR}/${TYPE_EXTENSION}s
622  RUNTIME_OUTPUT_DIRECTORY_DEBUG ${CAMITK_BUILD_PRIVATE_LIB_DIR}/${TYPE_EXTENSION}s
623  RUNTIME_OUTPUT_DIRECTORY_RELEASE ${CAMITK_BUILD_PRIVATE_LIB_DIR}/${TYPE_EXTENSION}s
624  )
625  # Output directory (for dll plateform, this is still the same, extensions are private)
626  set_target_properties(${${TYPE_EXTENSION_CMAKE}_TARGET_NAME} PROPERTIES ARCHIVE_OUTPUT_DIRECTORY ${CAMITK_BUILD_PRIVATE_LIB_DIR}/${TYPE_EXTENSION}s
627  ARCHIVE_OUTPUT_DIRECTORY_DEBUG ${CAMITK_BUILD_PRIVATE_LIB_DIR}/${TYPE_EXTENSION}s
628  ARCHIVE_OUTPUT_DIRECTORY_RELEASE ${CAMITK_BUILD_PRIVATE_LIB_DIR}/${TYPE_EXTENSION}s
629  )
630 
631  # OUTPUT LIBRARY NAME MSVC in DEBUG mode
632  if (MSVC)
633  set_target_properties(${${TYPE_EXTENSION_CMAKE}_TARGET_NAME} PROPERTIES DEBUG_POSTFIX ${CAMITK_DEBUG_POSTFIX})
634  endif()
635 
636  # ADDITIONAL LINUX .so FILE INFORMATION
637  set(${TYPE_EXTENSION_CMAKE}_LIBRARY_PROPERTIES ${${TYPE_EXTENSION_CMAKE}_LIBRARY_PROPERTIES}
638  VERSION "${CAMITK_VERSION_MAJOR}.${CAMITK_VERSION_MINOR}.${CAMITK_VERSION_PATCH}"
639  SOVERSION "${CAMITK_VERSION_MAJOR}"
640  )
641  # set the library specific info (SONAME...)
642  set_target_properties(${${TYPE_EXTENSION_CMAKE}_TARGET_NAME} PROPERTIES ${${TYPE_EXTENSION_CMAKE}_LIBRARY_PROPERTIES} LINK_INTERFACE_LIBRARIES "")
643 
644  # see http://www.cmake.org/pipermail/cmake/2012-April/049889.html
645  # target properties (outputname and remove soname)
646  # set_property(TARGET ${${TYPE_EXTENSION_CMAKE}_TARGET_NAME} PROPERTY NO_SONAME 1)
647  # in CEP the version patch might not have been set
648  if (NOT CAMITK_VERSION_PATCH)
649  set(CAMITK_VERSION_PATCH 0)
650  endif()
651 
652 
653 
654  #########################################################################
655  # #
656  # INSTALLATION #
657  # #
658  # * When installing the project, header files (.h) and test data are #
659  # copied into a installation folder to determine. #
660  # * Indicate in this section, where to install your project and which #
661  # files to copy into that folder (during local/global installation) #
662  # #
663  #########################################################################
664 
665  # FOLDER INSTALLATION
666  # Indicate where to install the action/component
667  install(TARGETS ${${TYPE_EXTENSION_CMAKE}_TARGET_NAME}
668  # TODO always use private lib, even for runtime
669  RUNTIME DESTINATION lib/${CAMITK_SHORT_VERSION_STRING}/${TYPE_EXTENSION}s
670  LIBRARY DESTINATION lib/${CAMITK_SHORT_VERSION_STRING}/${TYPE_EXTENSION}s
671  ARCHIVE DESTINATION lib/${CAMITK_SHORT_VERSION_STRING}/${TYPE_EXTENSION}s
672  COMPONENT ${${TYPE_EXTENSION_CMAKE}_TARGET_NAME}
673  )
674 
675  # HEADERS INSTALLATION
676  # Build target to install provided headers to install (with HEADERS_TO_INSTALL option)
677  if(${EXTENSION_NAME_CMAKE}_HEADERS_TO_INSTALL)
678  export_headers(${${EXTENSION_NAME_CMAKE}_HEADERS_TO_INSTALL} COMPONENT ${${TYPE_EXTENSION_CMAKE}_TARGET_NAME} GROUP ${TYPE_EXTENSION}s)
679  endif()
680 
681  # Build target to install all header files(with INSTALL_ALL_HEADERS option)
682  if(${EXTENSION_NAME_CMAKE}_INSTALL_ALL_HEADERS)
683  export_headers(${${EXTENSION_NAME_CMAKE}_HEADERS} COMPONENT ${${TYPE_EXTENSION_CMAKE}_TARGET_NAME} GROUP ${TYPE_EXTENSION}s)
684  endif()
685 
686  # TESTDATA INSTALLATION
687  if (EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/testdata)
688  # Check test data dir directory
689  if (NOT EXISTS ${CAMITK_BUILD_TESTDATA_DIR})
690  make_directory( ${CAMITK_BUILD_TESTDATA_DIR} )
691  endif()
692 
693  # copy the files to test data directory
694  execute_process(COMMAND ${CMAKE_COMMAND} -E copy_directory testdata ${CAMITK_BUILD_TESTDATA_DIR}
695  WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
696  )
697 
698  # during installation, copy the files to install directory
699  set (TESTDATA_DEST_DIR share/${CAMITK_SHORT_VERSION_STRING}/testdata)
700  install(DIRECTORY testdata/
701  #DESTINATION share/testdata
702  #DESTINATION share/${CAMITK_SHORT_VERSION_STRING}/testdata
703  DESTINATION ${TESTDATA_DEST_DIR}
704  # COMPONENT ${${TYPE_EXTENSION_CMAKE}_TARGET_NAME}
705  PATTERN ".svn" EXCLUDE
706  PATTERN "*~" EXCLUDE
707  )
708  endif()
709 
710  # CTESTDATA INSTALLATION
711  if (EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/testdata/ctestdata)
712  # Check test data dir directory
713  if (NOT EXISTS ${CAMITK_BUILD_CTESTDATA_DIR})
714  add_custom_command(TARGET ${${TYPE_EXTENSION_CMAKE}_TARGET_NAME}
715  POST_BUILD
716  COMMAND ${CMAKE_COMMAND} -E make_directory ${CAMITK_BUILD_CTESTDATA_DIR}
717  COMMENT "Creating build-time share directory for test data ${CAMITK_BUILD_CTESTDATA_DIR}"
718  VERBATIM
719  )
720  endif()
721 
722  # At build time, copy the files to test data directory
723  add_custom_command(TARGET ${${TYPE_EXTENSION_CMAKE}_TARGET_NAME}
724  POST_BUILD
725  COMMAND ${CMAKE_COMMAND} -E copy_directory testdata/ctestdata ${CAMITK_BUILD_CTESTDATA_DIR}
726  COMMENT "Installing build-time test data for ${EXTENSION_NAME}"
727  WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
728  VERBATIM
729  )
730 
731  # during installation, copy the files to install directory
732  set (CTESTDATA_DEST_DIR share/${CAMITK_SHORT_VERSION_STRING}/testdata/ctestdata)
733  install(DIRECTORY testdata/ctestdata
734  DESTINATION ${CTESTDATA_DEST_DIR}
735  PATTERN ".svn" EXCLUDE
736  PATTERN "*~" EXCLUDE
737  )
738  endif()
739 
740 
741 
742  #########################################################################
743  # #
744  # CDASH SUBPROJECT DESCRIPTION #
745  # #
746  # * Update the XML description of the subprojects dependencies #
747  # for CDash. #
748  # #
749  #########################################################################
750  # CDASH XML SUBPROJECTS DESCRIPTION UPDATE
751  camitk_sub_project_add(${TYPE_EXTENSION_CMAKE} ${${TYPE_EXTENSION_CMAKE}_TARGET_NAME} DEPENDENCIES library-camitkcore ${COMPONENTS_DEPENDENCY_LIST} ${ACTIONS_DEPENDENCY_LIST} ${CEP_LIBRARIES_DEPENDENCY_LIST} ${APPLICATIONS_DEPENDENCY_LIST})
752 
753 
754 
755  #########################################################################
756  # #
757  # PACKAGING CATEGORIZATION #
758  # #
759  # * On Windows, when building a package (win32 installer), the #
760  # install shield wizard proposes you to select which component #
761  # to install. #
762  # * Each component to install has a short description following its #
763  # name to understand its role. #
764  # * This section deals with the categorization and the description #
765  # of the component in this installer. #
766  # #
767  #########################################################################
768 
769  # WINDOWS INSTALLER CATEGORIZATION
770  if(${EXTENSION_NAME_CMAKE}_CEP_NAME)
771  if (${EXTENSION_NAME_CMAKE}_CEP_NAME MATCHES "SDK")
772  # The default SDK extensions are categorized as "required" and are not "unselectable" by the user at installation time
773  cpack_add_component(${${TYPE_EXTENSION_CMAKE}_TARGET_NAME}
774  DISPLAY_NAME ${${TYPE_EXTENSION_CMAKE}_TARGET_NAME}
775  DESCRIPTION ${${EXTENSION_NAME_CMAKE}_DESCRIPTION}
776  REQUIRED
777  GROUP SDK
778  )
779 
780  else()
781  # Extension is selectable for installation in the wizard of the installer
782  cpack_add_component(${${TYPE_EXTENSION_CMAKE}_TARGET_NAME}
783  DISPLAY_NAME ${${TYPE_EXTENSION_CMAKE}_TARGET_NAME}
784  DESCRIPTION ${${EXTENSION_NAME_CMAKE}_DESCRIPTION}
785  GROUP ${${EXTENSION_NAME_CMAKE}_CEP_NAME}
786  )
787  endif()
788  else()
789  # Extension if not categorized for packaging presentation
790  cpack_add_component(${${TYPE_EXTENSION_CMAKE}_TARGET_NAME}
791  DISPLAY_NAME ${${TYPE_EXTENSION_CMAKE}_TARGET_NAME}
792  DESCRIPTION ${${EXTENSION_NAME_CMAKE}_DESCRIPTION}
793  )
794  endif()
795 
796 
797  #####################################################################################
798  # #
799  # TRANSLATION #
800  # #
801  # * CAMITK_TRANSLATIONS contains the list of language to translate #
802  # the QString to. #
803  # #
804  # * Create the translate.pro file which contains 4 sections: #
805  # - HEADERS: list of .h/.hpp files to look for tr("") QString #
806  # - SOURCES: list of .cpp files to look for tr("") QString #
807  # - FORMS: list of .ui files to look for tr("") QString #
808  # - TRANSLATIONS: list of .ts files which use CAMITK_TRANSLATIONS #
809  # to define each .ts file #
810  # #
811  # * Execute lupdate program to update the .ts files with new QString #
812  # found. #
813  # #
814  # * Execute lrelease program to create .qm files (binary equivalent of #
815  # .ts files #
816  # #
817  # * Create translate.qrc which contains the list of .qm files. #
818  # * Create the flags.qrc file which contains the list of .png flags #
819  # images #
820  # #
821  #####################################################################################
822  if(CAMITK_TRANSLATE)
823  if(${EXTENSION_NAME_CMAKE}_EXTRA_TRANSLATE_LANGUAGE)
824  if(${EXTENSION_NAME} STREQUAL "application")
825  camitk_translate(USE_FLAGS
826  EXTRA_LANGUAGE ${${EXTENSION_NAME_CMAKE}_EXTRA_TRANSLATE_LANGUAGE})
827  else()
828  camitk_translate(EXTRA_LANGUAGE ${${EXTENSION_NAME_CMAKE}_EXTRA_TRANSLATE_LANGUAGE})
829  endif()
830  else()
831  if(${EXTENSION_NAME} STREQUAL "application")
832  camitk_translate(USE_FLAGS)
833  else()
835  endif()
836  endif()
837  endif()
838 
839 
840 
841  #########################################################################
842  # #
843  # CTEST - COMPONENT TESTS DESCRIPTION #
844  # #
845  #########################################################################
846  if( ${EXTENSION_NAME_CMAKE}_COMPONENT_EXTENSION AND ${EXTENSION_NAME_CMAKE}_TEST_APPLICATION AND NOT PACKAGING_NSIS AND BUILD_TESTING)
847  camitk_init_test( ${${EXTENSION_NAME_CMAKE}_TEST_APPLICATION} )
848  camitk_parse_test_add_separator(EXTENSION_TYPE ${TYPE_EXTENSION} EXTENSION_NAME ${EXTENSION_NAME})
849 
850  # Retrieve the current directory name to properly name the test
851  get_directory_name( ${CMAKE_CURRENT_SOURCE_DIR} COMP_DIR_NAME )
852 
853  # Retrieve the files in testdata directory - a test will be applied for each of these files
854  get_subdirectoryfiles( ${CMAKE_CURRENT_SOURCE_DIR}/testdata/ctestdata TESTFILES )
855 
856  # Different the test level to proceed
857  set( LEVEL0 0 )
858  set( LEVEL1 1 )
859  set( LEVEL2 2 )
860  set( LEVEL3 3 )
861  set( TESTLEVEL ${LEVEL3} )
862 
863  # 1st test should pass because application test runs with no arguments - shows usage and exit success
864  camitk_add_test( TEST_SUFFIX "-LEVEL0-"
865  PROJECT_NAME ${${TYPE_EXTENSION_CMAKE}_TARGET_NAME}
866  )
867  camitk_parse_test_add(NAME ${CAMITK_TEST_NAME} LEVEL 0 DESCRIPTION "Launch application testcomponent with no arguments.")
868 
869  # According options defined in Cmakelist enable or disable some tests
870  set(TEST_DESCRIPTION "Test opening the component, saving it as a file and compare the saved file with the original one.")
871  if( ${EXTENSION_NAME_CMAKE}_DISABLE_TESTLEVEL1 )
872  set(TESTLEVEL 0 )
873  set(TEST_DESCRIPTION "Run camitk-config." )
874  elseif( ${EXTENSION_NAME_CMAKE}_DISABLE_TESTLEVEL2 )
875  set( TESTLEVEL ${LEVEL1} )
876  set(TEST_DESCRIPTION "Test opening the component.")
877  elseif( ${EXTENSION_NAME_CMAKE}_DISABLE_TESTLEVEL3 )
878  set( TESTLEVEL ${LEVEL2} )
879  set(TEST_DESCRIPTION "Test opening the component and saving it as a file.")
880  endif()
881 
882  set( LEVELORIGIN ${TESTLEVEL} ) #store the test level value in a const variable
883 
884  foreach( COMPONENT_TESTDATA_FILE ${TESTFILES} )
885  # Give the file name (full path cut)
886  get_directory_name( ${COMPONENT_TESTDATA_FILE} DATA_FILE )
887 
888  # Test procedure: Open an extension and a component- save it - Compare saved file to original file(level3)
889  if( ${TESTLEVEL} EQUAL ${LEVEL3} )
890  if(MSVC)
891  camitk_add_test( EXECUTABLE_ARGS "-i ${CAMITK_BUILD_TESTDATA_DIR}/ctestdata/${DATA_FILE} -c ${CAMITK_BUILD_PRIVATE_LIB_DIR}/${TYPE_EXTENSION}s/${${TYPE_EXTENSION_CMAKE}_OUTPUT_NAME}${CAMITK_DEBUG_POSTFIX}.dll -l ${TESTLEVEL}"
892  PASS_FILE_OUTPUT ${CAMITK_BUILD_TESTDATA_DIR}/ctestdata/${DATA_FILE}
893  TEST_SUFFIX "-LEVEL${TESTLEVEL}-"
894  PROJECT_NAME ${${TYPE_EXTENSION_CMAKE}_TARGET_NAME}
895  )
896  elseif(APPLE)
897  camitk_add_test( EXECUTABLE_ARGS "-i ${CAMITK_BUILD_TESTDATA_DIR}/ctestdata/${DATA_FILE} -c ${CAMITK_BUILD_PRIVATE_LIB_DIR}/${TYPE_EXTENSION}s/lib${${TYPE_EXTENSION_CMAKE}_OUTPUT_NAME}.dylib -l ${TESTLEVEL}"
898  PASS_FILE_OUTPUT ${CAMITK_BUILD_TESTDATA_DIR}/ctestdata/${DATA_FILE}
899  TEST_SUFFIX "-LEVEL${TESTLEVEL}-"
900  PROJECT_NAME ${${TYPE_EXTENSION_CMAKE}_TARGET_NAME}
901  )
902  elseif(UNIX)
903  camitk_add_test( EXECUTABLE_ARGS "-i ${CAMITK_BUILD_TESTDATA_DIR}/ctestdata/${DATA_FILE} -c ${CAMITK_BUILD_PRIVATE_LIB_DIR}/${TYPE_EXTENSION}s/lib${${TYPE_EXTENSION_CMAKE}_OUTPUT_NAME}.so -l ${TESTLEVEL}"
904  PASS_FILE_OUTPUT ${CAMITK_BUILD_TESTDATA_DIR}/ctestdata/${DATA_FILE}
905  TEST_SUFFIX "-LEVEL${TESTLEVEL}-"
906  PROJECT_NAME ${${TYPE_EXTENSION_CMAKE}_TARGET_NAME}
907  )
908  endif()
909  camitk_parse_test_add(NAME ${CAMITK_TEST_NAME} LEVEL ${TESTLEVEL} DESCRIPTION ${TEST_DESCRIPTION})
910  MATH(EXPR TESTLEVEL "${TESTLEVEL}-1") #Decrease the test level to proceed less arduous tests
911  endif()
912 
913  # Test procedure: Open an extension and a component(level1) - save it(level2)
914  while( ${TESTLEVEL} GREATER 0)
915  if(MSVC)
916  camitk_add_test( EXECUTABLE_ARGS "-i ${CAMITK_BUILD_TESTDATA_DIR}/ctestdata/${DATA_FILE} -c ${CAMITK_BUILD_PRIVATE_LIB_DIR}/${TYPE_EXTENSION}s/${${TYPE_EXTENSION_CMAKE}_OUTPUT_NAME}${CAMITK_DEBUG_POSTFIX}.dll -l ${TESTLEVEL}" TEST_SUFFIX [LEVEL${TESTLEVEL}]
917  PROJECT_NAME ${${TYPE_EXTENSION_CMAKE}_TARGET_NAME}
918  )
919  elseif(APPLE)
920  camitk_add_test( EXECUTABLE_ARGS "-i ${CAMITK_BUILD_TESTDATA_DIR}/ctestdata/${DATA_FILE} -c ${CAMITK_BUILD_PRIVATE_LIB_DIR}/${TYPE_EXTENSION}s/lib${${TYPE_EXTENSION_CMAKE}_OUTPUT_NAME}.dylib -l ${TESTLEVEL}"
921  TEST_SUFFIX "-LEVEL${TESTLEVEL}-"
922  PROJECT_NAME ${${TYPE_EXTENSION_CMAKE}_TARGET_NAME}
923  )
924  elseif(UNIX)
925  camitk_add_test( EXECUTABLE_ARGS "-i ${CAMITK_BUILD_TESTDATA_DIR}/ctestdata/${DATA_FILE} -c ${CAMITK_BUILD_PRIVATE_LIB_DIR}/${TYPE_EXTENSION}s/lib${${TYPE_EXTENSION_CMAKE}_OUTPUT_NAME}.so -l ${TESTLEVEL}"
926  TEST_SUFFIX "-LEVEL${TESTLEVEL}-"
927  PROJECT_NAME ${${TYPE_EXTENSION_CMAKE}_TARGET_NAME}
928  )
929  endif()
930  camitk_parse_test_add(NAME ${CAMITK_TEST_NAME} LEVEL ${TESTLEVEL} DESCRIPTION ${TEST_DESCRIPTION})
931  MATH(EXPR TESTLEVEL "${TESTLEVEL}-1")# Decrease the test level to proceed less arduous tests
932  endwhile()
933  set( TESTLEVEL ${LEVELORIGIN} )
934  endforeach()
935 
936  #########################################################################
937  # #
938  # CTEST - ACTION TESTS DESCRIPTION #
939  # #
940  #########################################################################
941  elseif( ${EXTENSION_NAME_CMAKE}_ACTION_EXTENSION AND ${EXTENSION_NAME_CMAKE}_TEST_APPLICATION AND NOT PACKAGING_NSIS)
942  camitk_init_test( ${${EXTENSION_NAME_CMAKE}_TEST_APPLICATION} )
943  camitk_parse_test_add_separator(EXTENSION_TYPE ${TYPE_EXTENSION} EXTENSION_NAME ${EXTENSION_NAME})
944 
945  # Retrieve the current directory name to properly name the test
946  get_directory_name( ${CMAKE_CURRENT_SOURCE_DIR} COMP_DIR_NAME )
947 
948  # Test should pass because application test runs with no arguments - shows usage and exit success
949  camitk_add_test( TEST_SUFFIX "-LEVEL0-" PROJECT_NAME ${${TYPE_EXTENSION_CMAKE}_TARGET_NAME} )
950  camitk_parse_test_add(NAME ${CAMITK_TEST_NAME} LEVEL 0 DESCRIPTION "Launch application testaction with no arguments.")
951 
952  #get the names of actions .dlls in lib directory
953  get_subdirectoryfiles( ${CAMITK_BUILD_PRIVATE_LIB_DIR}/actions/ ACTIONSDLLS )
954 
955  foreach( ACTION_TESTDATA_FILE ${${EXTENSION_NAME_CMAKE}_TEST_FILES} )
956  # Next line is only useful macro debug => comment from now
957  # message( STATUS "Action extension: " ${${TYPE_EXTENSION_CMAKE}_OUTPUT_NAME} " Test file: " ${ACTION_TESTDATA_FILE} )
958 
959  if( NOT ( ${${TYPE_EXTENSION_CMAKE}_OUTPUT_NAME} MATCHES "application" ) )# We do not apply tests on actions like (close, save, save as)
960  # Test procedure: Open a file - load an action extension - Apply an action on the component wrapping the file
961  if(MSVC)
962  camitk_add_test( EXECUTABLE_ARGS "-i ${CAMITK_BUILD_TESTDATA_DIR}/ctestdata/${ACTION_TESTDATA_FILE} -a ${${TYPE_EXTENSION_CMAKE}_OUTPUT_NAME}${CAMITK_DEBUG_POSTFIX}.dll"
963  TEST_SUFFIX "-LEVEL1-"
964  PROJECT_NAME ${${TYPE_EXTENSION_CMAKE}_TARGET_NAME}
965  )
966  elseif(APPLE)
967  camitk_add_test( EXECUTABLE_ARGS "-i ${CAMITK_BUILD_TESTDATA_DIR}/ctestdata/${ACTION_TESTDATA_FILE} -a lib${${TYPE_EXTENSION_CMAKE}_OUTPUT_NAME}.dylib"
968  TEST_SUFFIX "-LEVEL1-"
969  PROJECT_NAME ${${TYPE_EXTENSION_CMAKE}_TARGET_NAME}
970  )
971  elseif(UNIX)
972  camitk_add_test( EXECUTABLE_ARGS "-i ${CAMITK_BUILD_TESTDATA_DIR}/ctestdata/${ACTION_TESTDATA_FILE} -a lib${${TYPE_EXTENSION_CMAKE}_OUTPUT_NAME}.so"
973  TEST_SUFFIX "-LEVEL1-"
974  PROJECT_NAME ${${TYPE_EXTENSION_CMAKE}_TARGET_NAME}
975  )
976  endif()
977  camitk_parse_test_add(NAME ${CAMITK_TEST_NAME} LEVEL 1 DESCRIPTION "Open a file, load the action and apply it on the component.")
978  endif()
979  endforeach()
980  endif()
981  endif() # endif(${TYPE_EXTENSION_CMAKE}_${EXTENSION_NAME_CMAKE})
982 
983 end(){)
984 
985 # Old macro to configure a new action to the framework
986 # Use camitk_extension macro instead
987 # TODO CAMITK_DEPRECATED. This macro is marked as deprecated. It is to be removed in CamiTK 4.0
988 action_extension(){)
989  message(WARNING "Deprecated macro action_extension detected : please use camitk_extension(ACTION_EXTENSION ...) instead.")
990  camitk_extension(ACTION_EXTENSION ${ARGN})
991 end(){)
992 
993 # Old macro to configure a new component to the framework
994 # Use camitk_extension macro instead
995 # TODO CAMITK_DEPRECATED. This macro is marked as deprecated. It is to be removed in CamiTK 4.0
996 component_extension(){)
997  message(WARNING "Deprecated macro component_extension detected : please use camitk_extension(COMPONENT_EXTENSION ...) instead.")
998  camitk_extension(COMPONENT_EXTENSION ${ARGN})
999 end(){)
1000 
1001 # TODO write a viewer_extension macro in CamiTK
A pseudo-namespace used to group CMake macros and functions.
Definition: itkImageToVTKImageFilter.h:39
camitk_add_test()
camitk_add_test is a macro to add a new test to the CTest infrastructure It encapsulates CMake add_te...
Definition: CamiTKAddTest.h:51
get_directory_name()
macro get_directory_name set the variable VariableName to the name of the last directory of FullPathD...
Definition: GetDirectoryName.h:14
camitk_translate()
macro camitk_translate allows to perform the translation of any project (action, component, application and libraries) in several languages.
Definition: CamiTKTranslate.h:16
Definition: Action.cpp:40
export_headers()
export_headers is a macro that install header files at build and install time
Definition: ExportHeaders.h:40
camitk_init_test()
camitk_init_test is a macro to initialize a group of test (for the same command) It is used to initia...
Definition: CamiTKInitTest.h:37
camitk_parse_test_add_separator()
macro camitk_parse_test_add_separator adds an extension (action or component) separator entry...
Definition: CamiTKParseTestAddSeparator.h:16
parse_arguments()
macro parse_arguments is a fork from CMakeMacroParseArguments see http://www.cmake.org/Wiki/CMakeMacroParseArguments for more information
Definition: ParseArguments.h:13
camitk_parse_test_add()
macro camitk_parse_test_add adds an extension (action or component) automatic test level information ...
Definition: CamiTKParseTestAdd.h:18
camitk_extension()
Macro camitk_extension simplifies writing a camitk extension (component, action)
Definition: CamiTKExtension.h:75
gather_headers_and_sources()
macro gather_headers_and_sources find all headers, sources, including the qt ui, moc and resources an...
Definition: GatherHeadersAndSources.h:15
test result execute_process(COMMAND ${CMAKE_COMMAND} -E remove -f ${CAMITK_TEST_COMMAND_FILE} ${CAMITK_TEST_COMMAND_RESULT_FILE} ${CAMITK_TEST_COMMAND_OUTPUT_FILE} ${CAMITK_TEST_PASS_FILE_COMMAND_FILE} ${CAMITK_TEST_PASS_FILE_OUTPUT_FILE} ${CAMITK_TEST_PASS_FILE_RESULT_FILE}) file(WRITE $
Definition: CamiTKTestPassFile.h:19
void usage(char *appName)
Definition: applications/actionstatemachine/main.cpp:39
camitk_sub_project_add()
macro camitk_sub_project_add adds a subproject definition from targets and its dependencies (if any) ...
Definition: CamiTKSubProjectAdd.h:17
static void include(QRect &r, const QRect &rect)
Definition: canvas_typed/qtcanvas.cpp:98
get_subdirectoryfiles()
macro get_subdirectoryfiles get the names of all the files (and not directories) contained in a defin...
Definition: GetSubdirectoryFiles.h:20