62 #########################################################################
66 # * Use a macro to create the CMAKE variables according to the #
67 # provided options as input. #
69 #########################################################################
74 "SOURCESNEEDS_CEP_LIBRARIESEXTERNAL_LIBRARIESINCLUDE_DIRECTORIESLIBNAMEDEFINESLINK_DIRECTORIESHEADERS_TO_INSTALLCEP_NAMEDESCRIPTION" # possible lists
75 "SHAREDSTATICNEEDS_LIBXML2NEEDS_XERCESCNEEDS_XSDNEEDS_QT_MODULESPUBLIC" # possible options
81 #########################################################################
83 # CREATE CMAKE VARIABLES #
85 # * Create required and usefull
CMake variables
for the macro #
87 #########################################################################
90 # The target name is composed of the following: librart-name
91 # * library is the suffix
92 # * name is deduced from the input folder containing the calling CMakeLists.txt file of the extension.
93 #
"-" is replaced by
"_" if configuring
for packaging with NSIS, the program to create a Windows installer.
95 if (
"${${DEFAULT_LIBRARY_NAME_CMAKE}_LIBNAME}" STREQUAL
"")
96 set(LIBRARY_TARGET_NAME library_${DEFAULT_LIBRARY_NAME})
98 set(LIBRARY_TARGET_NAME library_${${DEFAULT_LIBRARY_NAME_CMAKE}_LIBNAME})
101 if (
"${${DEFAULT_LIBRARY_NAME_CMAKE}_LIBNAME}" STREQUAL
"")
102 set(LIBRARY_TARGET_NAME library-${DEFAULT_LIBRARY_NAME})
104 set(LIBRARY_TARGET_NAME library-${${DEFAULT_LIBRARY_NAME_CMAKE}_LIBNAME})
110 #########################################################################
112 # INCLUDE DIRECTORIES #
114 # * Include library directories where to look for header files #
115 # * Include also additional user provided directories #
116 # * These directories are used for compilation step #
118 #########################################################################
120 include_directories ( ${${DEFAULT_LIBRARY_NAME_CMAKE}_INCLUDE_DIRECTORIES} # USER PROVIDED ADDITIONAL DIRECTORIEs
121 ${CMAKE_CURRENT_SOURCE_DIR} # BASIC CAMITK DIRECTORIES
122 ${CMAKE_CURRENT_BINARY_DIR} # LIBRARY DIRECTORIES
127 #########################################################################
129 # ADDITIONAL KNOWN LIBRARY DEPENDENCIES #
131 # * Look
for specific library needed #
132 # * Specific libraries are specified as option with the #
133 # NEEDS_LIBRARY syntax (see macro syntax
for more options)
#
134 # * Backward compatibility : Warn user if using old NEEDS_TOOL syntax #
136 #########################################################################
139 set(LIBXML2_LIBRARY
"")
140 if(${DEFAULT_LIBRARY_NAME_CMAKE}_NEEDS_LIBXML2)
141 # LibXml2 is required
144 add_definitions(${LIBXML2_DEFINITIONS})
145 include_directories(${LIBXML2_INCLUDE_DIR})
146 set(LIBXML2_LIBRARY ${LIBXML2_LIBRARIES})
148 # most probably win32 or crosscompiling
149 message(WARNING
"${LIBRARY_TARGET_NAME}: libxml2 required")
154 set(XERCESC_LIBRARIES)
155 if(${DEFAULT_LIBRARY_NAME_CMAKE}_NEEDS_XERCESC)
156 # XercesC is required
157 find_package(XercesC REQUIRED)
159 include_directories(${XERCESC_INCLUDE_DIR})
160 set(XERCESC_LIBRARIES ${XERCESC_LIBRARY})
162 # most probably win32 or crosscompiling
163 message(FATAL_ERROR
"${DEFAULT_LIBRARY_NAME}: xerces-c required. Please provide Xerces-C path.")
168 if(${DEFAULT_LIBRARY_NAME_CMAKE}_NEEDS_XSD)
169 # XercesC is required
170 find_package(XercesC REQUIRED)
172 include_directories(${XERCESC_INCLUDE_DIR})
173 set(XERCESC_LIBRARIES ${XERCESC_LIBRARY})
174 find_package(XSD REQUIRED)
175 include_directories(${XSD_INCLUDE_DIR})
177 # most probably win32 or crosscompiling
178 message(FATAL_ERROR
"${LIBRARY_TARGET_NAME}: xerces-c required because of XSD cxx, please set XERCESC_INCLUDE_DIR")
182 # ADDITIONAL QT MODULES
183 set(QT_MODULES_LIBRARIES)
184 if(${DEFAULT_LIBRARY_NAME_CMAKE}_NEEDS_QT_MODULES)
185 find_package(Qt4
"4.7" COMPONENTS QtCore QtGui QtXml QtXmlPatterns QtWebkit QtOpenGL QtScript QtSQL QtNetwork REQUIRED)
187 message(SEND_ERROR
"${DEFAULT_LIBRARY_NAME} : Failed to find Qt 4.7 or greater. This is needed by CamiTK.")
190 # CMake will add the Qt modules specific include directories
191 include(${QT_USE_FILE})
193 # Qt additional modules are required
for linking
194 set(QT_MODULES_LIBRARIES ${QT_LIBRARIES})
199 if(${DEFAULT_LIBRARY_NAME_CMAKE}_NEEDS_CEP_LIBRARIES)
200 foreach(CEP_LIBRARY_NEEDED ${${DEFAULT_LIBRARY_NAME_CMAKE}_NEEDS_CEP_LIBRARIES})
201 string(TOUPPER ${CEP_LIBRARY_NEEDED} ${CEP_LIBRARY_NEEDED}_INTERNAL)
202 set(LIBRARY_${${CEP_LIBRARY_NEEDED}_INTERNAL} ON CACHE BOOL
"Required by action extension ${EXTENSION_NAME}" FORCE )
204 set(CEP_LIBRARIES ${CEP_LIBRARIES} debug ${CEP_LIBRARY_NEEDED}${CAMITK_DEBUG_POSTFIX}
205 optimized ${CEP_LIBRARY_NEEDED}
209 set(CEP_LIBRARIES ${CEP_LIBRARIES} ${CEP_LIBRARY_NEEDED})
211 set(CEP_LIBRARIES ${CEP_LIBRARIES} ${CEP_LIBRARY_NEEDED})
214 include_directories(${CAMITK_INCLUDE_DIR}/libraries/${CEP_LIBRARY_NEEDED})
215 include_directories(${CAMITK_USER_INCLUDE_DIR}/libraries/${CEP_LIBRARY_NEEDED})
216 include_directories(${CAMITK_BUILD_INCLUDE_DIR}/libraries/${CEP_LIBRARY_NEEDED})
217 include_directories(${CMAKE_CURRENT_SOURCE_DIR}/../../libraries/${CEP_LIBRARY_NEEDED})
221 # EXTERNAL DEPENDENCIES
222 set(LINKER_EXTERNAL_LIBRARIES)
223 if(${DEFAULT_LIBRARY_NAME_CMAKE}_EXTERNAL_LIBRARIES)
224 foreach(EXTERNAL_LIBRARY ${${DEFAULT_LIBRARY_NAME_CMAKE}_EXTERNAL_LIBRARIES})
226 set(LINKER_EXTERNAL_LIBRARIES ${LINKER_EXTERNAL_LIBRARIES}
227 debug ${EXTERNAL_LIBRARY}${CAMITK_DEBUG_POSTFIX}
228 optimized ${EXTERNAL_LIBRARY}
230 message(STATUS
"LINKER_EXTERNAL_LIBRARIES = ${LINKER_EXTERNAL_LIBRARIES}")
232 set(LINKER_EXTERNAL_LIBRARIES ${LINKER_EXTERNAL_LIBRARIES} ${EXTERNAL_LIBRARY})
239 #########################################################################
243 # * Link directories are used to indicate the compiler where #
244 # to look for folder containing libraries to link with. #
245 # * Additional link directories provided by the user #
247 #########################################################################
248 # CAMITK BASIC LIB DIRECTORIES
249 link_directories(${CAMITK_LINK_DIRECTORIES})
251 # ADDITIONAL LINK DIRECTORIES
252 if (NOT
"${${DEFAULT_LIBRARY_NAME_CMAKE}_LINK_DIRECTORIES}" STREQUAL
"")
253 link_directories(${${DEFAULT_LIBRARY_NAME_CMAKE}_LINK_DIRECTORIES})
258 #########################################################################
260 # TARGET COMPILATION DEFINITION #
262 # * Additional sources files to consider at compilation (.cpp) #
263 # * CMake project target definition depending on library type #
266 #########################################################################
267 # CMAKE TARGET DEFINITION DEPENDENDING ON THE LIBRARY TYPE (SHARED or STATIC)
268 if (${DEFAULT_LIBRARY_NAME_CMAKE}_SHARED) # shared library
269 message(STATUS
"Adding shared library: ${LIBRARY_TARGET_NAME}")
270 add_library(${LIBRARY_TARGET_NAME} SHARED ${${DEFAULT_LIBRARY_NAME_CMAKE}_SOURCES})
271 # prepare the library specific info (SONAME...)
272 set(${LIBRARY_TARGET_NAME}_LIBRARY_PROPERTIES ${${LIBRARY_TARGET_NAME}_LIBRARY_PROPERTIES}
273 VERSION
"${CAMITK_VERSION_MAJOR}.${CAMITK_VERSION_MINOR}.${CAMITK_VERSION_PATCH}"
274 SOVERSION
"${CAMITK_VERSION_MAJOR}"
276 #
set the library specific info (SONAME...)
277 set_target_properties(${LIBRARY_TARGET_NAME} PROPERTIES ${${LIBRARY_TARGET_NAME}_LIBRARY_PROPERTIES} LINK_INTERFACE_LIBRARIES
"")
278 elseif (${DEFAULT_LIBRARY_NAME_CMAKE}_STATIC) #
static library
279 message(STATUS
"Adding static library: ${LIBRARY_TARGET_NAME}")
280 add_library(${LIBRARY_TARGET_NAME} STATIC ${${DEFAULT_LIBRARY_NAME_CMAKE}_SOURCES})
282 message(FATAL_ERROR
"In adding static library ${LIBRARY_TARGET_NAME}.\n Please specify the library type: SHARED or STATIC")
287 #########################################################################
291 # * Linking is the last stage of compilation #
292 # * Indicate what libraries to use for linking the target #
294 #########################################################################
296 target_link_libraries(${LIBRARY_TARGET_NAME} ${CEP_LIBRARIES} ${LINKER_EXTERNAL_LIBRARIES} ${LIBXML2_LIBRARY} ${QT_MODULES_LIBRARIES} ${XERCESC_LIBRARIES})
300 #########################################################################
304 # * Define the output directory (location and name)
#
305 # * Define the output name of the library #
306 # * Add ${CAMITK_DEBUG_POSTFIX} suffix to Debug MSVC built libraries #
308 #########################################################################
310 # OUTPUT DIRECTORY LOCATION and NAME depending on the type of the library (PUBLIC or PRIVATE)
311 # DEBGUG POSTFIX FOR MSVC
312 if (${DEFAULT_LIBRARY_NAME_CMAKE}_PUBLIC) # Public library => build in the bin folder
314 # With Visual Studio, public libraries are built in build\bin directory, else it's in build\lib
315 set_target_properties(${LIBRARY_TARGET_NAME} PROPERTIES LIBRARY_OUTPUT_DIRECTORY ${CAMITK_BUILD_BIN_DIR}
316 LIBRARY_OUTPUT_DIRECTORY_DEBUG ${CAMITK_BUILD_BIN_DIR}
317 LIBRARY_OUTPUT_DIRECTORY_RELEASE ${CAMITK_BUILD_BIN_DIR}
319 set_target_properties(${LIBRARY_TARGET_NAME} PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${CAMITK_BUILD_BIN_DIR}
320 RUNTIME_OUTPUT_DIRECTORY_DEBUG ${CAMITK_BUILD_BIN_DIR}
321 RUNTIME_OUTPUT_DIRECTORY_RELEASE ${CAMITK_BUILD_BIN_DIR}
323 set_target_properties(${LIBRARY_TARGET_NAME} PROPERTIES ARCHIVE_OUTPUT_DIRECTORY ${CAMITK_BUILD_BIN_DIR}
324 ARCHIVE_OUTPUT_DIRECTORY_DEBUG ${CAMITK_BUILD_BIN_DIR}
325 ARCHIVE_OUTPUT_DIRECTORY_RELEASE ${CAMITK_BUILD_BIN_DIR}
327 set_target_properties(${LIBRARY_TARGET_NAME} PROPERTIES DEBUG_POSTFIX ${CAMITK_DEBUG_POSTFIX})
329 set_target_properties(${LIBRARY_TARGET_NAME} PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${CAMITK_BUILD_PUBLIC_LIB_DIR})
330 set_target_properties(${LIBRARY_TARGET_NAME} PROPERTIES LIBRARY_OUTPUT_DIRECTORY ${CAMITK_BUILD_PUBLIC_LIB_DIR})
331 set_target_properties(${LIBRARY_TARGET_NAME} PROPERTIES ARCHIVE_OUTPUT_DIRECTORY ${CAMITK_BUILD_PUBLIC_LIB_DIR})
333 else() # Private library => build in lib folder
335 set_target_properties(${LIBRARY_TARGET_NAME} PROPERTIES LIBRARY_OUTPUT_DIRECTORY ${CAMITK_BUILD_PRIVATE_LIB_DIR}
336 LIBRARY_OUTPUT_DIRECTORY_DEBUG ${CAMITK_BUILD_PRIVATE_LIB_DIR}
337 LIBRARY_OUTPUT_DIRECTORY_RELEASE ${CAMITK_BUILD_PRIVATE_LIB_DIR}
339 set_target_properties(${LIBRARY_TARGET_NAME} PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${CAMITK_BUILD_PRIVATE_LIB_DIR}
340 RUNTIME_OUTPUT_DIRECTORY_DEBUG ${CAMITK_BUILD_PRIVATE_LIB_DIR}
341 RUNTIME_OUTPUT_DIRECTORY_RELEASE ${CAMITK_BUILD_PRIVATE_LIB_DIR}
343 set_target_properties(${LIBRARY_TARGET_NAME} PROPERTIES ARCHIVE_OUTPUT_DIRECTORY ${CAMITK_BUILD_PRIVATE_LIB_DIR}
344 ARCHIVE_OUTPUT_DIRECTORY_DEBUG ${CAMITK_BUILD_PRIVATE_LIB_DIR}
345 ARCHIVE_OUTPUT_DIRECTORY_RELEASE ${CAMITK_BUILD_PRIVATE_LIB_DIR}
347 set_target_properties(${LIBRARY_TARGET_NAME} PROPERTIES DEBUG_POSTFIX ${CAMITK_DEBUG_POSTFIX})
349 set_target_properties(${LIBRARY_TARGET_NAME} PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${CAMITK_BUILD_PRIVATE_LIB_DIR})
350 set_target_properties(${LIBRARY_TARGET_NAME} PROPERTIES LIBRARY_OUTPUT_DIRECTORY ${CAMITK_BUILD_PRIVATE_LIB_DIR})
351 set_target_properties(${LIBRARY_TARGET_NAME} PROPERTIES ARCHIVE_OUTPUT_DIRECTORY ${CAMITK_BUILD_PRIVATE_LIB_DIR})
355 # OUTUPUT LIBRARY NAME (without the prefix "library-").
356 string(REGEX REPLACE
"^library_|^library-" "" LIBRARY_NAME ${LIBRARY_TARGET_NAME})
357 set_target_properties(${LIBRARY_TARGET_NAME}
358 PROPERTIES OUTPUT_NAME ${LIBRARY_NAME}
363 #########################################################################
367 # * Flags are options to give to the compiler #
368 # * Add user input flags #
369 # * Add platform specific flags #
371 #########################################################################
373 # USER INPUT COMPILER FLAG
374 if(${DEFAULT_LIBRARY_NAME_CMAKE}_DEFINES)
375 foreach (FLAG ${${DEFAULT_LIBRARY_NAME_CMAKE}_DEFINES})
376 add_definitions(-D${FLAG})
380 # PLATFORM SPECIFIC COMPILER FLAG
381 # 64bits and other platform with relocation needs -fPIC
382 include(TestCXXAcceptsFlag)
383 check_cxx_accepts_flag(-fPIC FPIC_FLAG_ACCEPTED)
384 # no need to add -fPIC on mingw, otherwise it generates a warning: -fPIC ignored for target (all code is position independent) [enabled by default]
385 # msvc is also accepting the flag, but then produce warning D9002 : ignoring unknown option '-fPIC' cl
386 if(FPIC_FLAG_ACCEPTED AND NOT WIN32)
387 set_property(TARGET ${LIBRARY_TARGET_NAME} APPEND PROPERTY COMPILE_FLAGS -fPIC)
392 #########################################################################
396 # * When installing the project, header files (.h) and test data are #
397 # copied into an installation folder to determine. #
398 # * Indicate in this section, where to install your project and which #
399 # files to copy into that folder (during local/global installation) #
401 #########################################################################
403 # FOLDER INSTALLATION
404 # Indicate where to install the library, dependending on its property (public / private)
405 if (${DEFAULT_LIBRARY_NAME_CMAKE}_PUBLIC) #
public library
407 # public library -> install in bin folder
408 install(TARGETS ${LIBRARY_TARGET_NAME}
409 RUNTIME DESTINATION bin
410 LIBRARY DESTINATION lib
411 ARCHIVE DESTINATION lib/${CAMITK_SHORT_VERSION_STRING}
412 COMPONENT ${LIBRARY_NAME_INSTALL}
415 # other public libraries -> install in lib folder
416 install(TARGETS ${LIBRARY_TARGET_NAME}
417 RUNTIME DESTINATION lib
418 LIBRARY DESTINATION lib
419 ARCHIVE DESTINATION lib
420 COMPONENT ${LIBRARY_NAME_INSTALL}
424 # private library -> install in lib/camitk-version folder
425 install(TARGETS ${LIBRARY_TARGET_NAME}
426 RUNTIME DESTINATION lib/${CAMITK_SHORT_VERSION_STRING}
427 LIBRARY DESTINATION lib/${CAMITK_SHORT_VERSION_STRING}
428 ARCHIVE DESTINATION lib/${CAMITK_SHORT_VERSION_STRING}
429 COMPONENT ${LIBRARY_NAME_INSTALL}
433 # HEADER FILES (.h) INSTALLATION
434 # generate an install target for headers in include/{camitk-version}/libraries
435 if(${DEFAULT_LIBRARY_NAME_CMAKE}_HEADERS_TO_INSTALL)
436 export_headers(${${DEFAULT_LIBRARY_NAME_CMAKE}_HEADERS_TO_INSTALL} COMPONENT ${LIBRARY_TARGET_NAME} GROUP libraries)
441 #########################################################################
443 # PROJECT DEPENDENCIES #
445 # * Add in this section library dependencies to other camitk projects #
446 # to keep a correct build order. #
448 #########################################################################
450 # CEP LIBRARIES DEPENDENCIES
451 if(${DEFAULT_LIBRARY_NAME_CMAKE}_NEEDS_CEP_LIBRARIES)
452 foreach(CEP_LIBRARY_NEEDED ${${DEFAULT_LIBRARY_NAME_CMAKE}_NEEDS_CEP_LIBRARIES})
454 add_dependencies(${LIBRARY_TARGET_NAME} library_${CEP_LIBRARY_NEEDED})
456 add_dependencies(${LIBRARY_TARGET_NAME} library-${CEP_LIBRARY_NEEDED})
463 #########################################################################
465 # CDASH SUBPROJECT DESCRIPTION #
467 # * Update the XML descriton of the subprojects dependencies #
470 #########################################################################
471 # CDASH XML SUBPROJECTS DESCRIPTION UPDATE
476 #########################################################################
478 # PACKAGING CATEGORIZATION #
480 # * On Windows, when building a package (win32 installer), the #
481 # install shield wizard proposes you to select which component #
483 # * Each component to install has a short description following its #
484 # name to understand its role. #
485 # * This section deals with the categorization and the description #
486 # of the component in this installer. #
488 #########################################################################
490 # WINDOWS INSTALLER CATEGORIZATION
491 if(${DEFAULT_LIBRARY_NAME_CMAKE}_CEP_NAME) # This input variable describes the category
492 if (${DEFAULT_LIBRARY_NAME_CMAKE}_CEP_NAME MATCHES
"SDK")
493 # The
default SDK extensions are categorized as
"required" and are not
"unselectable" by the user at installation time
494 cpack_add_component(${LIBRARY_TARGET_NAME}
495 DISPLAY_NAME ${LIBRARY_TARGET_NAME}
496 DESCRIPTION ${${DEFAULT_LIBRARY_NAME_CMAKE}_DESCRIPTION}
502 # Extension is selectable for installation in the wizard of the installer
503 cpack_add_component(${LIBRARY_TARGET_NAME}
504 DISPLAY_NAME ${LIBRARY_TARGET_NAME}
505 DESCRIPTION ${${DEFAULT_LIBRARY_NAME_CMAKE}_DESCRIPTION}
506 GROUP ${${DEFAULT_LIBRARY_NAME_CMAKE}_CEP_NAME}
510 # Extension if not categorized for packaging presentation
511 cpack_add_component(${LIBRARY_TARGET_NAME}
512 DISPLAY_NAME ${LIBRARY_TARGET_NAME}
513 DESCRIPTION ${${DEFAULT_LIBRARY_NAME_CMAKE}_DESCRIPTION}
520 # Old macro to configure a tool
522 # TODO CAMITK_DEPRECATED. This macro is marked as deprecated. It is to be removed in CamiTK 4.0
524 message(WARNING
"Warning: ${CMAKE_CURRENT_SOURCE_DIR}/CMakeLists.txt: camitk_tool macro is deprecated, please usecamitk_library(...) instead (use the same parameters).")
525 # string(REPLACE "NEEDS_TOOL" "NEEDS_CEP_LIBRARIES" OBSOLETE_ARGN ${ARGN})
526 # message(STATUS "**************************************** ${ARGN} ===>>> ${OBSOLETE_ARGN} ")
A pseudo-namespace used to group CMake macros and functions.
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_library()
macro camitk_library simplifies the declaration of a library inside CamiTK and is to be used for all ...
Definition: CamiTKLibrary.h:60
export_headers()
export_headers is a macro that install header files at build and install time
Definition: ExportHeaders.h:40
parse_arguments()
macro parse_arguments is a fork from CMakeMacroParseArguments see http://www.cmake.org/Wiki/CMakeMacroParseArguments for more information
Definition: ParseArguments.h:13
set(CAMITK_TEST_COMMAND_FILE ${CAMITK_TEST_OUTPUT_DIR}/command) set(CAMITK_TEST_COMMAND_RESULT_FILE $
This CMake file run a command and put the output in a given file.
Definition: CamiTKTestPassFile.h:11
camitk_sub_project_add()
macro camitk_sub_project_add adds a subproject definition from targets and its dependencies (if any) ...
Definition: CamiTKSubProjectAdd.h:17