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(${${TYPE_EXTENSION_CMAKE}_TARGET_NAME} ${CAMITK_CORE_TARGET_LIB_NAME})
428  # add the dependency to the core automoc target
429  set_property(TARGET ${${TYPE_EXTENSION_CMAKE}_TARGET_NAME} APPEND PROPERTY AUTOGEN_TARGET_DEPENDS ${CAMITK_CORE_TARGET_LIB_NAME})
430 
431  # 2nd COMPONENTS DEPENDENCIES
432  if(${EXTENSION_NAME_CMAKE}_NEEDS_COMPONENT_EXTENSION)
433  set(COMPONENTS_DEPENDENCY_LIST "") #use for generating the project.xml file
434  foreach(COMPONENT_NEEDED ${${EXTENSION_NAME_CMAKE}_NEEDS_COMPONENT_EXTENSION})
435  # include directories from build, camitk (local or global install).
436  include_directories(${CAMITK_BUILD_INCLUDE_DIR}/components/${COMPONENT_NEEDED})
437  include_directories(${CAMITK_INCLUDE_DIR}/components/${COMPONENT_NEEDED})
438  # file dependency
439  if (MSVC)
440  set(COMPONENT_EXTENSION_LIBRARIES ${COMPONENT_EXTENSION_LIBRARIES}
441  debug ${CAMITK_BUILD_PRIVATE_LIB_DIR}/components/${COMPONENT_NEEDED}${CAMITK_DEBUG_POSTFIX}.lib
442  optimized ${COMPONENT_NEEDED}
443  )
444  else()
445  set(COMPONENT_EXTENSION_LIBRARIES ${COMPONENT_EXTENSION_LIBRARIES} ${COMPONENT_NEEDED})
446  endif()
447  # CMake / CDash dependencies
448  if(PACKAGING_NSIS)
449  add_dependencies(${${TYPE_EXTENSION_CMAKE}_TARGET_NAME} component_${COMPONENT_NEEDED})
450  # add the dependency to the component automoc target
451  set_property(TARGET ${${TYPE_EXTENSION_CMAKE}_TARGET_NAME} APPEND PROPERTY AUTOGEN_TARGET_DEPENDS component_${COMPONENT_NEEDED})
452  else()
453  add_dependencies(${${TYPE_EXTENSION_CMAKE}_TARGET_NAME} component-${COMPONENT_NEEDED})
454  set(COMPONENTS_DEPENDENCY_LIST ${COMPONENTS_DEPENDENCY_LIST} component-${COMPONENT_NEEDED})
455  # add the dependency to the component automoc target
456  set_property(TARGET ${${TYPE_EXTENSION_CMAKE}_TARGET_NAME} APPEND PROPERTY AUTOGEN_TARGET_DEPENDS component-${COMPONENT_NEEDED})
457  endif()
458  endforeach()
459  endif()
460 
461  # 3rd ACTIONS DEPENDENCIES
462  if(${EXTENSION_NAME_CMAKE}_NEEDS_ACTION_EXTENSION)
463  set(ACTIONS_DEPENDENCY_LIST "") #use for generating the project.xml file
464  foreach(ACTION_NEEDED ${${EXTENSION_NAME_CMAKE}_NEEDS_ACTION_EXTENSION})
465  # include directories from build, camitk (local or global install).
466  include_directories(${CAMITK_BUILD_INCLUDE_DIR}/actions/${ACTION_NEEDED})
467  include_directories(${CAMITK_INCLUDE_DIR}/actions/${ACTION_NEEDED})
468  # file dependency
469  if (MSVC)
470  set(ACTION_EXTENSION_LIBRARIES ${ACTION_EXTENSION_LIBRARIES}
471  debug ${CAMITK_BUILD_PRIVATE_LIB_DIR}/actions/${ACTION_NEEDED}${CAMITK_DEBUG_POSTFIX}.lib
472  optimized ${ACTION_NEEDED}
473  )
474  else()
475  set(ACTION_EXTENSION_LIBRARIES ${ACTION_EXTENSION_LIBRARIES} ${ACTION_NEEDED})
476  endif()
477  # CMake / CDash dependencies
478  if (PACKAGING_NSIS)
479  add_dependencies(${${TYPE_EXTENSION_CMAKE}_TARGET_NAME} action_${ACTION_NEEDED})
480  # add the dependency to the action automoc target
481  set_property(TARGET ${${TYPE_EXTENSION_CMAKE}_TARGET_NAME} APPEND PROPERTY AUTOGEN_TARGET_DEPENDS 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  # add the dependency to the action automoc target
486  set_property(TARGET ${${TYPE_EXTENSION_CMAKE}_TARGET_NAME} APPEND PROPERTY AUTOGEN_TARGET_DEPENDS action-${ACTION_NEEDED})
487  endif()
488  endforeach()
489  endif()
490 
491  # 4th CEP LIBRARIES DEPENDENCIES
492  if(${EXTENSION_NAME_CMAKE}_NEEDS_CEP_LIBRARIES)
493  set(CEP_LIBRARIES_DEPENDENCY_LIST "") #use for generating the project.xml file
494  foreach(CEP_LIBRARY_NEEDED ${${EXTENSION_NAME_CMAKE}_NEEDS_CEP_LIBRARIES})
495  # include directories from build, camitk (local or global install).
496  include_directories(${CAMITK_BUILD_INCLUDE_DIR}/libraries/${CEP_LIBRARY_NEEDED})
497  include_directories(${CAMITK_INCLUDE_DIR}/libraries/${CEP_LIBRARY_NEEDED})
498  # file dependency
499  if (MSVC)
500  set(CEP_LIBRARIES ${CEP_LIBRARIES} debug ${CEP_LIBRARY_NEEDED}${CAMITK_DEBUG_POSTFIX}.lib
501  optimized ${CEP_LIBRARY_NEEDED}
502  )
503  else()
504  if(PACKAGING_NSIS)
505  set(CEP_LIBRARIES ${CEP_LIBRARIES} ${CEP_LIBRARY_NEEDED})
506  else()
507  set(CEP_LIBRARIES ${CEP_LIBRARIES} ${CEP_LIBRARY_NEEDED})
508  endif()
509  endif()
510  # CMake / CDash dependencies
511  if (PACKAGING_NSIS)
512  add_dependencies(${${TYPE_EXTENSION_CMAKE}_TARGET_NAME} library_${CEP_LIBRARY_NEEDED})
513  # add the dependency to the library automoc target
514  set_property(TARGET ${${TYPE_EXTENSION_CMAKE}_TARGET_NAME} APPEND PROPERTY AUTOGEN_TARGET_DEPENDS library_${CEP_LIBRARY_NEEDED})
515  else()
516  add_dependencies(${${TYPE_EXTENSION_CMAKE}_TARGET_NAME} library-${CEP_LIBRARY_NEEDED})
517  set(CEP_LIBRARIES_DEPENDENCY_LIST ${CEP_LIBRARIES_DEPENDENCY_LIST} library-${CEP_LIBRARY_NEEDED})
518  # add the dependency to the library automoc target
519  set_property(TARGET ${${TYPE_EXTENSION_CMAKE}_TARGET_NAME} APPEND PROPERTY AUTOGEN_TARGET_DEPENDS library-${CEP_LIBRARY_NEEDED})
520  endif()
521  endforeach()
522  endif()
523 
524  # 5th DEPENDENCY ON TESTING APPLICATION
525  # Those projects are used to run unitarian test on ACTION / COMPONENT extensions.
526  set(APPLICATIONS_DEPENDENCY_LIST "")
527  if(${EXTENSION_NAME_CMAKE}_TEST_APPLICATION AND NOT PACKAGING_NSIS)
528  # Add this dependencies for automatically constructing application-testactions components dependencies
529  add_dependencies(${${TYPE_EXTENSION_CMAKE}_TARGET_NAME} application-test${TYPE_EXTENSION}s)
530  set(APPLICATIONS_DEPENDENCY_LIST "application-test${TYPE_EXTENSION}s")
531  # add the dependency to the test application automoc target
532  set_property(TARGET ${${TYPE_EXTENSION_CMAKE}_TARGET_NAME} APPEND PROPERTY AUTOGEN_TARGET_DEPENDS application-test${TYPE_EXTENSION}s)
533  endif()
534 
535  if((CEP_NAME STREQUAL "SDK") OR (CEP_NAME STREQUAL "modeling") OR (CEP_NAME STREQUAL "imaging"))
536  # 6th TEST-COMPONENT APPLICATION DEPENDENCY ON THIS COMPONENT
537  if(${EXTENSION_NAME_CMAKE}_COMPONENT_EXTENSION AND ${EXTENSION_NAME_CMAKE}_TEST_APPLICATION AND NOT PACKAGING_NSIS)
538  add_dependencies(application-testactions ${COMPONENT_TARGET_NAME})
539  # add this component automoc target to the dependency of the test application
540  set_property(TARGET application-testactions APPEND PROPERTY AUTOGEN_TARGET_DEPENDS ${COMPONENT_TARGET_NAME})
541  endif()
542 
543  # 7th TEST-ACTION APPLICATION DEPENDENCY ON ACTION-APPLICATION
544  if(${TYPE_EXTENSION_CMAKE}_TARGET_NAME STREQUAL "action-application")
545  add_dependencies(application-testcomponents action-application)
546  # add this component automoc target to the dependency of the test application
547  set_property(TARGET application-testcomponents APPEND PROPERTY AUTOGEN_TARGET_DEPENDS action-application)
548  endif()
549  endif()
550 
551 
552  #########################################################################
553  # #
554  # COMPILATION FLAG #
555  # #
556  # * Flags are options to give to the compiler #
557  # * Add user input flags #
558  # * Add platform specific flags #
559  # #
560  #########################################################################
561 
562  # USER INPUT DEFINES COMPILER FLAG
563  if(${EXTENSION_NAME_CMAKE}_DEFINES)
564  foreach (FLAG ${${EXTENSION_NAME_CMAKE}_DEFINES})
565  add_definitions(-D${FLAG})
566  endforeach()
567  endif()
568 
569  # USER INPUT CUSTOM COMPILER FLAG
570  if(${EXTENSION_NAME_CMAKE}_CXX_FLAGS)
571  foreach (FLAG ${${EXTENSION_NAME_CMAKE}_CXX_FLAGS})
572  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${FLAG}")
573  endforeach()
574  endif()
575 
576  # PLATFORM SPECIFIC COMPILER FLAG
577  # 64bits and other platform with relocation needs -fPIC
578  include(TestCXXAcceptsFlag)
579  check_cxx_accepts_flag(-fPIC FPIC_FLAG_ACCEPTED)
580  # no need to add -fPIC on mingw, otherwise it generates a warning: -fPIC ignored for target (all code is position independent) [enabled by default]
581  # msvc is also accepting the flag, but then produce warning D9002 : ignoring unknown option '-fPIC' cl
582  if(FPIC_FLAG_ACCEPTED AND NOT WIN32)
583  set_property(TARGET ${${TYPE_EXTENSION_CMAKE}_TARGET_NAME} APPEND PROPERTY COMPILE_FLAGS -fPIC)
584  endif()
585 
586 
587 
588  #########################################################################
589  # #
590  # LINKING #
591  # #
592  # * Linking is the last stage of compilation #
593  # * Indicate what libraries to use for linking the target #
594  # #
595  #########################################################################
596  # LINKING LIBRARIES
597  # Any component or action has to be linked with ${CAMITK_CORE_LIBRARIES} and with all its dependencies
598  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})
599 
600 
601 
602  #########################################################################
603  # #
604  # OUTPUT #
605  # #
606  # * Define the output directory (location and name) #
607  # * Define the output name of the library #
608  # * Add ${CAMITK_DEBUG_POSTFIX} suffix to Debug MSVC built libraries #
609  # * Additional Linux .so files information #
610  # #
611  #########################################################################
612 
613  # OUTPUT LIBRARY NAME
614  set_target_properties(${${TYPE_EXTENSION_CMAKE}_TARGET_NAME}
615  PROPERTIES OUTPUT_NAME ${${TYPE_EXTENSION_CMAKE}_OUTPUT_NAME}
616  )
617 
618  # OUTPUT DIRECTORY LOCATION AND NAME
619  # Output directory (all extensions are private)
620  set_target_properties(${${TYPE_EXTENSION_CMAKE}_TARGET_NAME} PROPERTIES LIBRARY_OUTPUT_DIRECTORY ${CAMITK_BUILD_PRIVATE_LIB_DIR}/${TYPE_EXTENSION}s
621  LIBRARY_OUTPUT_DIRECTORY_DEBUG ${CAMITK_BUILD_PRIVATE_LIB_DIR}/${TYPE_EXTENSION}s
622  LIBRARY_OUTPUT_DIRECTORY_RELEASE ${CAMITK_BUILD_PRIVATE_LIB_DIR}/${TYPE_EXTENSION}s
623  )
624  # Output directory (for dll plateform, this is still the same, extensions are private)
625  set_target_properties(${${TYPE_EXTENSION_CMAKE}_TARGET_NAME} PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${CAMITK_BUILD_PRIVATE_LIB_DIR}/${TYPE_EXTENSION}s
626  RUNTIME_OUTPUT_DIRECTORY_DEBUG ${CAMITK_BUILD_PRIVATE_LIB_DIR}/${TYPE_EXTENSION}s
627  RUNTIME_OUTPUT_DIRECTORY_RELEASE ${CAMITK_BUILD_PRIVATE_LIB_DIR}/${TYPE_EXTENSION}s
628  )
629  # Output directory (for dll plateform, this is still the same, extensions are private)
630  set_target_properties(${${TYPE_EXTENSION_CMAKE}_TARGET_NAME} PROPERTIES ARCHIVE_OUTPUT_DIRECTORY ${CAMITK_BUILD_PRIVATE_LIB_DIR}/${TYPE_EXTENSION}s
631  ARCHIVE_OUTPUT_DIRECTORY_DEBUG ${CAMITK_BUILD_PRIVATE_LIB_DIR}/${TYPE_EXTENSION}s
632  ARCHIVE_OUTPUT_DIRECTORY_RELEASE ${CAMITK_BUILD_PRIVATE_LIB_DIR}/${TYPE_EXTENSION}s
633  )
634 
635  # OUTPUT LIBRARY NAME MSVC in DEBUG mode
636  if (MSVC)
637  set_target_properties(${${TYPE_EXTENSION_CMAKE}_TARGET_NAME} PROPERTIES DEBUG_POSTFIX ${CAMITK_DEBUG_POSTFIX})
638  endif()
639 
640  # ADDITIONAL LINUX .so FILE INFORMATION
641  set(${TYPE_EXTENSION_CMAKE}_LIBRARY_PROPERTIES ${${TYPE_EXTENSION_CMAKE}_LIBRARY_PROPERTIES}
642  VERSION "${CAMITK_VERSION_MAJOR}.${CAMITK_VERSION_MINOR}.${CAMITK_VERSION_PATCH}"
643  SOVERSION "${CAMITK_VERSION_MAJOR}"
644  )
645  # set the library specific info (SONAME...)
646  set_target_properties(${${TYPE_EXTENSION_CMAKE}_TARGET_NAME} PROPERTIES ${${TYPE_EXTENSION_CMAKE}_LIBRARY_PROPERTIES} LINK_INTERFACE_LIBRARIES "")
647 
648  # see http://www.cmake.org/pipermail/cmake/2012-April/049889.html
649  # target properties (outputname and remove soname)
650  # set_property(TARGET ${${TYPE_EXTENSION_CMAKE}_TARGET_NAME} PROPERTY NO_SONAME 1)
651  # in CEP the version patch might not have been set
652  if (NOT CAMITK_VERSION_PATCH)
653  set(CAMITK_VERSION_PATCH 0)
654  endif()
655 
656 
657 
658  #########################################################################
659  # #
660  # INSTALLATION #
661  # #
662  # * When installing the project, header files (.h) and test data are #
663  # copied into a installation folder to determine. #
664  # * Indicate in this section, where to install your project and which #
665  # files to copy into that folder (during local/global installation) #
666  # #
667  #########################################################################
668 
669  # FOLDER INSTALLATION
670  # Indicate where to install the action/component
671  install(TARGETS ${${TYPE_EXTENSION_CMAKE}_TARGET_NAME}
672  # TODO always use private lib, even for runtime
673  RUNTIME DESTINATION lib/${CAMITK_SHORT_VERSION_STRING}/${TYPE_EXTENSION}s
674  LIBRARY DESTINATION lib/${CAMITK_SHORT_VERSION_STRING}/${TYPE_EXTENSION}s
675  ARCHIVE DESTINATION lib/${CAMITK_SHORT_VERSION_STRING}/${TYPE_EXTENSION}s
676  COMPONENT ${${TYPE_EXTENSION_CMAKE}_TARGET_NAME}
677  )
678 
679  # HEADERS INSTALLATION
680  # Build target to install provided headers to install (with HEADERS_TO_INSTALL option)
681  if(${EXTENSION_NAME_CMAKE}_HEADERS_TO_INSTALL)
682  export_headers(${${EXTENSION_NAME_CMAKE}_HEADERS_TO_INSTALL} COMPONENT ${${TYPE_EXTENSION_CMAKE}_TARGET_NAME} GROUP ${TYPE_EXTENSION}s)
683  endif()
684 
685  # Build target to install all header files(with INSTALL_ALL_HEADERS option)
686  if(${EXTENSION_NAME_CMAKE}_INSTALL_ALL_HEADERS)
687  export_headers(${${EXTENSION_NAME_CMAKE}_HEADERS} COMPONENT ${${TYPE_EXTENSION_CMAKE}_TARGET_NAME} GROUP ${TYPE_EXTENSION}s)
688  endif()
689 
690  # TESTDATA INSTALLATION
691  if (EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/testdata)
692  # Check test data dir directory
693  if (NOT EXISTS ${CAMITK_BUILD_TESTDATA_DIR})
694  make_directory( ${CAMITK_BUILD_TESTDATA_DIR} )
695  endif()
696 
697  # copy the files to test data directory
698  execute_process(COMMAND ${CMAKE_COMMAND} -E copy_directory testdata ${CAMITK_BUILD_TESTDATA_DIR}
699  WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
700  )
701 
702  # during installation, copy the files to install directory
703  set (TESTDATA_DEST_DIR share/${CAMITK_SHORT_VERSION_STRING}/testdata)
704  install(DIRECTORY testdata/
705  #DESTINATION share/testdata
706  #DESTINATION share/${CAMITK_SHORT_VERSION_STRING}/testdata
707  DESTINATION ${TESTDATA_DEST_DIR}
708  # COMPONENT ${${TYPE_EXTENSION_CMAKE}_TARGET_NAME}
709  PATTERN ".svn" EXCLUDE
710  PATTERN "*~" EXCLUDE
711  )
712  endif()
713 
714  # CTESTDATA INSTALLATION
715  if (EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/testdata/ctestdata)
716  # Check test data dir directory
717  if (NOT EXISTS ${CAMITK_BUILD_CTESTDATA_DIR})
718  add_custom_command(TARGET ${${TYPE_EXTENSION_CMAKE}_TARGET_NAME}
719  POST_BUILD
720  COMMAND ${CMAKE_COMMAND} -E make_directory ${CAMITK_BUILD_CTESTDATA_DIR}
721  COMMENT "Creating build-time share directory for test data ${CAMITK_BUILD_CTESTDATA_DIR}"
722  VERBATIM
723  )
724  endif()
725 
726  # At build time, copy the files to test data directory
727  add_custom_command(TARGET ${${TYPE_EXTENSION_CMAKE}_TARGET_NAME}
728  POST_BUILD
729  COMMAND ${CMAKE_COMMAND} -E copy_directory testdata/ctestdata ${CAMITK_BUILD_CTESTDATA_DIR}
730  COMMENT "Installing build-time test data for ${EXTENSION_NAME}"
731  WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
732  VERBATIM
733  )
734 
735  # during installation, copy the files to install directory
736  set (CTESTDATA_DEST_DIR share/${CAMITK_SHORT_VERSION_STRING}/testdata/ctestdata)
737  install(DIRECTORY testdata/ctestdata
738  DESTINATION ${CTESTDATA_DEST_DIR}
739  PATTERN ".svn" EXCLUDE
740  PATTERN "*~" EXCLUDE
741  )
742  endif()
743 
744 
745 
746  #########################################################################
747  # #
748  # CDASH SUBPROJECT DESCRIPTION #
749  # #
750  # * Update the XML description of the subprojects dependencies #
751  # for CDash. #
752  # #
753  #########################################################################
754  # CDASH XML SUBPROJECTS DESCRIPTION UPDATE
755  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})
756 
757 
758 
759  #########################################################################
760  # #
761  # PACKAGING CATEGORIZATION #
762  # #
763  # * On Windows, when building a package (win32 installer), the #
764  # install shield wizard proposes you to select which component #
765  # to install. #
766  # * Each component to install has a short description following its #
767  # name to understand its role. #
768  # * This section deals with the categorization and the description #
769  # of the component in this installer. #
770  # #
771  #########################################################################
772 
773  # WINDOWS INSTALLER CATEGORIZATION
774  if(${EXTENSION_NAME_CMAKE}_CEP_NAME)
775  if (${EXTENSION_NAME_CMAKE}_CEP_NAME MATCHES "SDK")
776  # The default SDK extensions are categorized as "required" and are not "unselectable" by the user at installation time
777  cpack_add_component(${${TYPE_EXTENSION_CMAKE}_TARGET_NAME}
778  DISPLAY_NAME ${${TYPE_EXTENSION_CMAKE}_TARGET_NAME}
779  DESCRIPTION ${${EXTENSION_NAME_CMAKE}_DESCRIPTION}
780  REQUIRED
781  GROUP SDK
782  )
783 
784  else()
785  # Extension is selectable for installation in the wizard of the installer
786  cpack_add_component(${${TYPE_EXTENSION_CMAKE}_TARGET_NAME}
787  DISPLAY_NAME ${${TYPE_EXTENSION_CMAKE}_TARGET_NAME}
788  DESCRIPTION ${${EXTENSION_NAME_CMAKE}_DESCRIPTION}
789  GROUP ${${EXTENSION_NAME_CMAKE}_CEP_NAME}
790  )
791  endif()
792  else()
793  # Extension if not categorized for packaging presentation
794  cpack_add_component(${${TYPE_EXTENSION_CMAKE}_TARGET_NAME}
795  DISPLAY_NAME ${${TYPE_EXTENSION_CMAKE}_TARGET_NAME}
796  DESCRIPTION ${${EXTENSION_NAME_CMAKE}_DESCRIPTION}
797  )
798  endif()
799 
800 
801  #####################################################################################
802  # #
803  # TRANSLATION #
804  # #
805  # * CAMITK_TRANSLATIONS contains the list of language to translate #
806  # the QString to. #
807  # #
808  # * Create the translate.pro file which contains 4 sections: #
809  # - HEADERS: list of .h/.hpp files to look for tr("") QString #
810  # - SOURCES: list of .cpp files to look for tr("") QString #
811  # - FORMS: list of .ui files to look for tr("") QString #
812  # - TRANSLATIONS: list of .ts files which use CAMITK_TRANSLATIONS #
813  # to define each .ts file #
814  # #
815  # * Execute lupdate program to update the .ts files with new QString #
816  # found. #
817  # #
818  # * Execute lrelease program to create .qm files (binary equivalent of #
819  # .ts files #
820  # #
821  # * Create translate.qrc which contains the list of .qm files. #
822  # * Create the flags.qrc file which contains the list of .png flags #
823  # images #
824  # #
825  #####################################################################################
826  if(CAMITK_TRANSLATE)
827  if(${EXTENSION_NAME_CMAKE}_EXTRA_TRANSLATE_LANGUAGE)
828  if(${EXTENSION_NAME} STREQUAL "application")
829  camitk_translate(USE_FLAGS
830  EXTRA_LANGUAGE ${${EXTENSION_NAME_CMAKE}_EXTRA_TRANSLATE_LANGUAGE})
831  else()
832  camitk_translate(EXTRA_LANGUAGE ${${EXTENSION_NAME_CMAKE}_EXTRA_TRANSLATE_LANGUAGE})
833  endif()
834  else()
835  if(${EXTENSION_NAME} STREQUAL "application")
836  camitk_translate(USE_FLAGS)
837  else()
839  endif()
840  endif()
841  endif()
842 
843 
844 
845  #########################################################################
846  # #
847  # CTEST - COMPONENT TESTS DESCRIPTION #
848  # #
849  #########################################################################
850  if( ${EXTENSION_NAME_CMAKE}_COMPONENT_EXTENSION AND ${EXTENSION_NAME_CMAKE}_TEST_APPLICATION AND NOT PACKAGING_NSIS)
851  camitk_init_test( ${${EXTENSION_NAME_CMAKE}_TEST_APPLICATION} )
852  camitk_parse_test_add_separator(EXTENSION_TYPE ${TYPE_EXTENSION} EXTENSION_NAME ${EXTENSION_NAME})
853 
854  # Retrieve the current directory name to properly name the test
855  get_directory_name( ${CMAKE_CURRENT_SOURCE_DIR} COMP_DIR_NAME )
856 
857  # Retrieve the files in testdata directory - a test will be applied for each of these files
858  get_subdirectoryfiles( ${CMAKE_CURRENT_SOURCE_DIR}/testdata/ctestdata TESTFILES )
859 
860  # Different the test level to proceed
861  set( LEVEL0 0 )
862  set( LEVEL1 1 )
863  set( LEVEL2 2 )
864  set( LEVEL3 3 )
865  set( TESTLEVEL ${LEVEL3} )
866 
867  # 1st test should pass because application test runs with no arguments - shows usage and exit success
868  camitk_add_test( TEST_SUFFIX "-LEVEL0-"
869  PROJECT_NAME ${${TYPE_EXTENSION_CMAKE}_TARGET_NAME}
870  )
871  camitk_parse_test_add(NAME ${CAMITK_TEST_NAME} LEVEL 0 DESCRIPTION "Launch application testcomponent with no arguments.")
872 
873  # According options defined in Cmakelist enable or disable some tests
874  set(TEST_DESCRIPTION "Test opening the component, saving it as a file and compare the saved file with the original one.")
875  if( ${EXTENSION_NAME_CMAKE}_DISABLE_TESTLEVEL1 )
876  set(TESTLEVEL 0 )
877  set(TEST_DESCRIPTION "Run camitk-config." )
878  elseif( ${EXTENSION_NAME_CMAKE}_DISABLE_TESTLEVEL2 )
879  set( TESTLEVEL ${LEVEL1} )
880  set(TEST_DESCRIPTION "Test opening the component.")
881  elseif( ${EXTENSION_NAME_CMAKE}_DISABLE_TESTLEVEL3 )
882  set( TESTLEVEL ${LEVEL2} )
883  set(TEST_DESCRIPTION "Test opening the component and saving it as a file.")
884  endif()
885 
886  set( LEVELORIGIN ${TESTLEVEL} ) #store the test level value in a const variable
887 
888  foreach( COMPONENT_TESTDATA_FILE ${TESTFILES} )
889  # Give the file name (full path cut)
890  get_directory_name( ${COMPONENT_TESTDATA_FILE} DATA_FILE )
891 
892  # Test procedure: Open an extension and a component- save it - Compare saved file to original file(level3)
893  if( ${TESTLEVEL} EQUAL ${LEVEL3} )
894  if(MSVC)
895  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}"
896  PASS_FILE_OUTPUT ${CAMITK_BUILD_TESTDATA_DIR}/ctestdata/${DATA_FILE}
897  TEST_SUFFIX "-LEVEL${TESTLEVEL}-"
898  PROJECT_NAME ${${TYPE_EXTENSION_CMAKE}_TARGET_NAME}
899  )
900  elseif(APPLE)
901  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}"
902  PASS_FILE_OUTPUT ${CAMITK_BUILD_TESTDATA_DIR}/ctestdata/${DATA_FILE}
903  TEST_SUFFIX "-LEVEL${TESTLEVEL}-"
904  PROJECT_NAME ${${TYPE_EXTENSION_CMAKE}_TARGET_NAME}
905  )
906  elseif(UNIX)
907  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}"
908  PASS_FILE_OUTPUT ${CAMITK_BUILD_TESTDATA_DIR}/ctestdata/${DATA_FILE}
909  TEST_SUFFIX "-LEVEL${TESTLEVEL}-"
910  PROJECT_NAME ${${TYPE_EXTENSION_CMAKE}_TARGET_NAME}
911  )
912  endif()
913  camitk_parse_test_add(NAME ${CAMITK_TEST_NAME} LEVEL ${TESTLEVEL} DESCRIPTION ${TEST_DESCRIPTION})
914  MATH(EXPR TESTLEVEL "${TESTLEVEL}-1") #Decrease the test level to proceed less arduous tests
915  endif()
916 
917  # Test procedure: Open an extension and a component(level1) - save it(level2)
918  while( ${TESTLEVEL} GREATER 0)
919  if(MSVC)
920  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}]
921  PROJECT_NAME ${${TYPE_EXTENSION_CMAKE}_TARGET_NAME}
922  )
923  elseif(APPLE)
924  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}"
925  TEST_SUFFIX "-LEVEL${TESTLEVEL}-"
926  PROJECT_NAME ${${TYPE_EXTENSION_CMAKE}_TARGET_NAME}
927  )
928  elseif(UNIX)
929  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}"
930  TEST_SUFFIX "-LEVEL${TESTLEVEL}-"
931  PROJECT_NAME ${${TYPE_EXTENSION_CMAKE}_TARGET_NAME}
932  )
933  endif()
934  camitk_parse_test_add(NAME ${CAMITK_TEST_NAME} LEVEL ${TESTLEVEL} DESCRIPTION ${TEST_DESCRIPTION})
935  MATH(EXPR TESTLEVEL "${TESTLEVEL}-1")# Decrease the test level to proceed less arduous tests
936  endwhile()
937  set( TESTLEVEL ${LEVELORIGIN} )
938  endforeach()
939 
940  #########################################################################
941  # #
942  # CTEST - ACTION TESTS DESCRIPTION #
943  # #
944  #########################################################################
945  elseif( ${EXTENSION_NAME_CMAKE}_ACTION_EXTENSION AND ${EXTENSION_NAME_CMAKE}_TEST_APPLICATION AND NOT PACKAGING_NSIS)
946  camitk_init_test( ${${EXTENSION_NAME_CMAKE}_TEST_APPLICATION} )
947  camitk_parse_test_add_separator(EXTENSION_TYPE ${TYPE_EXTENSION} EXTENSION_NAME ${EXTENSION_NAME})
948 
949  # Retrieve the current directory name to properly name the test
950  get_directory_name( ${CMAKE_CURRENT_SOURCE_DIR} COMP_DIR_NAME )
951 
952  # Test should pass because application test runs with no arguments - shows usage and exit success
953  camitk_add_test( TEST_SUFFIX "-LEVEL0-" PROJECT_NAME ${${TYPE_EXTENSION_CMAKE}_TARGET_NAME} )
954  camitk_parse_test_add(NAME ${CAMITK_TEST_NAME} LEVEL 0 DESCRIPTION "Launch application testaction with no arguments.")
955 
956  #get the names of actions .dlls in lib directory
957  get_subdirectoryfiles( ${CAMITK_BUILD_PRIVATE_LIB_DIR}/actions/ ACTIONSDLLS )
958 
959  foreach( ACTION_TESTDATA_FILE ${${EXTENSION_NAME_CMAKE}_TEST_FILES} )
960  # Next line is only useful macro debug => comment from now
961  # message( STATUS "Action extension: " ${${TYPE_EXTENSION_CMAKE}_OUTPUT_NAME} " Test file: " ${ACTION_TESTDATA_FILE} )
962 
963  if( NOT ( ${${TYPE_EXTENSION_CMAKE}_OUTPUT_NAME} MATCHES "application" ) )# We do not apply tests on actions like (close, save, save as)
964  # Test procedure: Open a file - load an action extension - Apply an action on the component wrapping the file
965  if(MSVC)
966  camitk_add_test( EXECUTABLE_ARGS "-i ${CAMITK_BUILD_TESTDATA_DIR}/ctestdata/${ACTION_TESTDATA_FILE} -a ${${TYPE_EXTENSION_CMAKE}_OUTPUT_NAME}${CAMITK_DEBUG_POSTFIX}.dll"
967  TEST_SUFFIX "-LEVEL1-"
968  PROJECT_NAME ${${TYPE_EXTENSION_CMAKE}_TARGET_NAME}
969  )
970  elseif(APPLE)
971  camitk_add_test( EXECUTABLE_ARGS "-i ${CAMITK_BUILD_TESTDATA_DIR}/ctestdata/${ACTION_TESTDATA_FILE} -a lib${${TYPE_EXTENSION_CMAKE}_OUTPUT_NAME}.dylib"
972  TEST_SUFFIX "-LEVEL1-"
973  PROJECT_NAME ${${TYPE_EXTENSION_CMAKE}_TARGET_NAME}
974  )
975  elseif(UNIX)
976  camitk_add_test( EXECUTABLE_ARGS "-i ${CAMITK_BUILD_TESTDATA_DIR}/ctestdata/${ACTION_TESTDATA_FILE} -a lib${${TYPE_EXTENSION_CMAKE}_OUTPUT_NAME}.so"
977  TEST_SUFFIX "-LEVEL1-"
978  PROJECT_NAME ${${TYPE_EXTENSION_CMAKE}_TARGET_NAME}
979  )
980  endif()
981  camitk_parse_test_add(NAME ${CAMITK_TEST_NAME} LEVEL 1 DESCRIPTION "Open a file, load the action and apply it on the component.")
982  endif()
983  endforeach()
984  endif()
985  endif() # endif(${TYPE_EXTENSION_CMAKE}_${EXTENSION_NAME_CMAKE})
986 
987 end(){)
988 
989 # Old macro to configure a new action to the framework
990 # Use camitk_extension macro instead
991 # TODO CAMITK_DEPRECATED. This macro is marked as deprecated. It is to be removed in CamiTK 4.0
992 action_extension(){)
993  message(WARNING "Deprecated macro action_extension detected : please use camitk_extension(ACTION_EXTENSION ...) instead.")
994  camitk_extension(ACTION_EXTENSION ${ARGN})
995 end(){)
996 
997 # Old macro to configure a new component to the framework
998 # Use camitk_extension macro instead
999 # TODO CAMITK_DEPRECATED. This macro is marked as deprecated. It is to be removed in CamiTK 4.0
1000 component_extension(){)
1001  message(WARNING "Deprecated macro component_extension detected : please use camitk_extension(COMPONENT_EXTENSION ...) instead.")
1002  camitk_extension(COMPONENT_EXTENSION ${ARGN})
1003 end(){)
1004 
1005 # 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
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
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
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