Medical Imaging Interaction Toolkit  2018.4.99-389bf124
Medical Imaging Interaction Toolkit
usMacroCreateModule.cmake
Go to the documentation of this file.
1 # For internal use only
2 
3 macro(usMacroCreateModule _project_name)
4 
5 project(${_project_name})
6 
7 cmake_parse_arguments(${PROJECT_NAME}
8  "SKIP_EXAMPLES;SKIP_INIT"
9  "VERSION;TARGET"
10  "DEPENDS;INTERNAL_INCLUDE_DIRS;LINK_LIBRARIES;SOURCES;PRIVATE_HEADERS;PUBLIC_HEADERS;RESOURCES;BINARY_RESOURCES"
11  ${ARGN}
12 )
13 
14 if(NOT ${PROJECT_NAME}_VERSION MATCHES "^[0-9]+\\.[0-9]+\\.[0-9]+$")
15  message(SEND_ERROR "VERSION argument invalid: ${${PROJECT_NAME}_VERSION}")
16 endif()
17 
18 string(REPLACE "." ";" _version_numbers ${${PROJECT_NAME}_VERSION})
19 list(GET _version_numbers 0 ${PROJECT_NAME}_MAJOR_VERSION)
20 list(GET _version_numbers 1 ${PROJECT_NAME}_MINOR_VERSION)
21 list(GET _version_numbers 2 ${PROJECT_NAME}_PATCH_VERSION)
22 
23 if(NOT ${PROJECT_NAME}_TARGET)
24  set(${PROJECT_NAME}_TARGET us${PROJECT_NAME})
25 endif()
26 set(PROJECT_TARGET ${${PROJECT_NAME}_TARGET})
27 
28 if(${PROJECT_NAME}_DEPENDS)
29  find_package(CppMicroServices REQUIRED ${${PROJECT_NAME}_DEPENDS} QUIET
30  HINTS ${CppMicroServices_BINARY_DIR}
31  NO_DEFAULT_PATH
32  )
33 endif()
34 
35 #-----------------------------------------------------------------------------
36 # Include dirs and libraries
37 #-----------------------------------------------------------------------------
38 
39 set(${PROJECT_NAME}_INCLUDE_DIRS
40  ${CMAKE_CURRENT_SOURCE_DIR}/include
41  ${CMAKE_CURRENT_BINARY_DIR}/include
42 )
43 
44 configure_file(${CppMicroServices_SOURCE_DIR}/cmake/usExport.h.in
45  ${CMAKE_CURRENT_BINARY_DIR}/include/us${PROJECT_NAME}Export.h)
46 list(APPEND ${PROJECT_NAME}_PUBLIC_HEADERS
47  ${CMAKE_CURRENT_BINARY_DIR}/include/us${PROJECT_NAME}Export.h)
48 
49 if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/include/us${PROJECT_NAME}Config.h.in)
50  configure_file(${CMAKE_CURRENT_SOURCE_DIR}/include/us${PROJECT_NAME}Config.h.in
51  ${CMAKE_CURRENT_BINARY_DIR}/include/us${PROJECT_NAME}Config.h)
52  list(APPEND ${PROJECT_NAME}_PUBLIC_HEADERS
53  ${CMAKE_CURRENT_BINARY_DIR}/include/us${PROJECT_NAME}Config.h)
54 endif()
55 
56 set(_internal_include_dirs ${${PROJECT_NAME}_INTERNAL_INCLUDE_DIRS})
57 set(${PROJECT_NAME}_INTERNAL_INCLUDE_DIRS )
58 
59 if(_internal_include_dirs)
60  foreach(_internal_include_dir ${_internal_include_dirs})
61  if(IS_ABSOLUTE "${_internal_include_dir}")
62  list(APPEND ${PROJECT_NAME}_INTERNAL_INCLUDE_DIRS ${_internal_include_dir})
63  else()
64  list(APPEND ${PROJECT_NAME}_INTERNAL_INCLUDE_DIRS ${CMAKE_CURRENT_SOURCE_DIR}/${_internal_include_dir})
65  endif()
66  endforeach()
67 endif()
68 
69 
70 if(CMAKE_VERSION VERSION_LESS 2.8.12)
71  include_directories(
72  ${US_INCLUDE_DIRS}
73  ${${PROJECT_NAME}_INCLUDE_DIRS}
74  ${${PROJECT_NAME}_INTERNAL_INCLUDE_DIRS}
75  )
76 endif()
77 
78 #-----------------------------------------------------------------------------
79 # Create library
80 #-----------------------------------------------------------------------------
81 
82 # Generate the module init file
83 if(NOT ${PROJECT_NAME}_SKIP_INIT)
84  usFunctionGenerateModuleInit(${PROJECT_NAME}_SOURCES)
85 endif()
86 
87 if(${PROJECT_NAME}_RESOURCES OR ${PROJECT_NAME}_BINARY_RESOURCES)
88  usFunctionGetResourceSource(TARGET ${${PROJECT_NAME}_TARGET} OUT ${PROJECT_NAME}_SOURCES)
89 endif()
90 
91 # Create the module library
92 add_library(${${PROJECT_NAME}_TARGET} ${${PROJECT_NAME}_SOURCES}
93  ${${PROJECT_NAME}_PRIVATE_HEADERS} ${${PROJECT_NAME}_PUBLIC_HEADERS})
94 
95 # Compile definitions
96 set_property(TARGET ${${PROJECT_NAME}_TARGET} APPEND PROPERTY COMPILE_DEFINITIONS US_MODULE_NAME=${${PROJECT_NAME}_TARGET})
97 set_property(TARGET ${${PROJECT_NAME}_TARGET} PROPERTY US_MODULE_NAME ${${PROJECT_NAME}_TARGET})
98 set_property(TARGET ${${PROJECT_NAME}_TARGET} PROPERTY FOLDER "${MITK_ROOT_FOLDER}/CppMicroServices")
99 if(NOT US_BUILD_SHARED_LIBS)
100  set_property(TARGET ${${PROJECT_NAME}_TARGET} APPEND PROPERTY COMPILE_DEFINITIONS US_STATIC_MODULE)
101 endif()
102 
103 # Link flags
104 if(${PROJECT_NAME}_LINK_FLAGS OR US_LINK_FLAGS)
105  set_target_properties(${${PROJECT_NAME}_TARGET} PROPERTIES
106  LINK_FLAGS "${US_LINK_FLAGS} ${${PROJECT_NAME}_LINK_FLAGS}"
107  )
108 endif()
109 
110 if(CMAKE_VERSION VERSION_GREATER 2.8.11.99)
111  # Currently, public headers include private header files,
112  # so the internal include dirs need to be in the public
113  # include dir section. This needs to be fixed.
114  target_include_directories(${${PROJECT_NAME}_TARGET}
115  PUBLIC ${US_INCLUDE_DIRS} ${${PROJECT_NAME}_INCLUDE_DIRS}
116  PUBLIC ${${PROJECT_NAME}_INTERNAL_INCLUDE_DIRS}
117  )
118 endif()
119 
120 
121 set_target_properties(${${PROJECT_NAME}_TARGET} PROPERTIES
122  SOVERSION ${${PROJECT_NAME}_VERSION}
123  PUBLIC_HEADER "${${PROJECT_NAME}_PUBLIC_HEADERS}"
124  PRIVATE_HEADER "${${PROJECT_NAME}_PRIVATE_HEADERS}"
125 )
126 
127 # Link additional libraries
128 if(${PROJECT_NAME}_LINK_LIBRARIES OR US_LIBRARIES)
129  target_link_libraries(${${PROJECT_NAME}_TARGET} ${US_LIBRARIES} ${${PROJECT_NAME}_LINK_LIBRARIES})
130 endif()
131 
132 # Embed module resources
133 
134 if(${PROJECT_NAME}_RESOURCES OR US_LIBRARIES)
135  usFunctionAddResources(TARGET ${${PROJECT_NAME}_TARGET}
136  WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/resources
137  FILES ${${PROJECT_NAME}_RESOURCES}
138  ZIP_ARCHIVES ${US_LIBRARIES}
139  )
140 endif()
141 if(${PROJECT_NAME}_BINARY_RESOURCES)
142  usFunctionAddResources(TARGET ${${PROJECT_NAME}_TARGET}
143  WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/resources
144  FILES ${${PROJECT_NAME}_BINARY_RESOURCES}
145  )
146 endif()
147 usFunctionEmbedResources(TARGET ${${PROJECT_NAME}_TARGET})
148 
149 #-----------------------------------------------------------------------------
150 # Install support
151 #-----------------------------------------------------------------------------
152 
153 if(NOT US_NO_INSTALL)
154  install(TARGETS ${${PROJECT_NAME}_TARGET}
155  EXPORT us${PROJECT_NAME}Targets
156  RUNTIME DESTINATION ${RUNTIME_INSTALL_DIR} ${US_SDK_INSTALL_COMPONENT}
157  LIBRARY DESTINATION ${LIBRARY_INSTALL_DIR} ${US_SDK_INSTALL_COMPONENT}
158  ARCHIVE DESTINATION ${ARCHIVE_INSTALL_DIR} ${US_SDK_INSTALL_COMPONENT}
159  PUBLIC_HEADER DESTINATION ${HEADER_INSTALL_DIR} ${US_SDK_INSTALL_COMPONENT}
160  PRIVATE_HEADER DESTINATION ${HEADER_INSTALL_DIR} ${US_SDK_INSTALL_COMPONENT})
161 endif()
162 
163 #-----------------------------------------------------------------------------
164 # US testing
165 #-----------------------------------------------------------------------------
166 
167 if(US_BUILD_TESTING AND EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/test/CMakeLists.txt")
168  add_subdirectory(test)
169 endif()
170 
171 #-----------------------------------------------------------------------------
172 # Documentation
173 #-----------------------------------------------------------------------------
174 
175 if(US_BUILD_TESTING AND EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/doc/snippets/CMakeLists.txt")
176  # Compile source code snippets
177  add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/doc/snippets)
178 endif()
179 
180 #-----------------------------------------------------------------------------
181 # Last configuration and install steps
182 #-----------------------------------------------------------------------------
183 
184 # Version information
185 configure_file(
186  ${US_CMAKE_DIR}/usModuleConfigVersion.cmake.in
187  ${CppMicroServices_BINARY_DIR}/us${PROJECT_NAME}ConfigVersion.cmake
188  @ONLY
189  )
190 
191 export(TARGETS ${${PROJECT_NAME}_TARGET} ${US_LIBRARIES}
192  FILE ${CppMicroServices_BINARY_DIR}/us${PROJECT_NAME}Targets.cmake)
193 if(NOT US_NO_INSTALL)
194  install(EXPORT us${PROJECT_NAME}Targets
195  FILE us${PROJECT_NAME}Targets.cmake
196  DESTINATION ${AUXILIARY_CMAKE_INSTALL_DIR})
197 endif()
198 
199 # Configure config file for the build tree
200 
201 set(PACKAGE_CONFIG_INCLUDE_DIR
202  ${${PROJECT_NAME}_INCLUDE_DIRS}
203  ${${PROJECT_NAME}_INTERNAL_INCLUDE_DIRS})
204 set(PACKAGE_CONFIG_RUNTIME_LIBRARY_DIR ${CMAKE_RUNTIME_OUTPUT_DIRECTORY})
205 
206 configure_file(
207  ${US_CMAKE_DIR}/usModuleConfig.cmake.in
208  ${CppMicroServices_BINARY_DIR}/us${PROJECT_NAME}Config.cmake
209  @ONLY
210  )
211 
212 # Configure config file for the install tree
213 
214 if(NOT US_NO_INSTALL)
215  set(CONFIG_INCLUDE_DIR ${HEADER_INSTALL_DIR})
216  set(CONFIG_RUNTIME_LIBRARY_DIR ${RUNTIME_INSTALL_DIR})
217 
218  configure_package_config_file(
219  ${US_CMAKE_DIR}/usModuleConfig.cmake.in
220  ${CppMicroServices_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/us${PROJECT_NAME}Config.cmake
221  INSTALL_DESTINATION ${AUXILIARY_CMAKE_INSTALL_DIR}
222  PATH_VARS CONFIG_INCLUDE_DIR CONFIG_RUNTIME_LIBRARY_DIR
223  NO_SET_AND_CHECK_MACRO
224  NO_CHECK_REQUIRED_COMPONENTS_MACRO
225  )
226 
227  install(FILES ${CppMicroServices_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/us${PROJECT_NAME}Config.cmake
228  ${CppMicroServices_BINARY_DIR}/us${PROJECT_NAME}ConfigVersion.cmake
229  DESTINATION ${AUXILIARY_CMAKE_INSTALL_DIR}
230  ${US_SDK_INSTALL_COMPONENT})
231 endif()
232 
233 #-----------------------------------------------------------------------------
234 # Build the examples
235 #-----------------------------------------------------------------------------
236 
237 if(US_BUILD_EXAMPLES AND NOT ${PROJECT_NAME}_SKIP_EXAMPLES AND
238  EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/examples/CMakeLists.txt)
239  set(CppMicroServices_DIR ${CppMicroServices_BINARY_DIR})
240  add_subdirectory(examples)
241 endif()
242 
243 endmacro()
Follow Up Storage - Class to facilitate loading/accessing structured follow-up data.
Definition: testcase.h:28
usFunctionAddResources()
Add resources to a library or executable.
usFunctionEmbedResources()
Embed resources in a library or executable.
usMacroCreateModule(_project_name)
usFunctionGetResourceSource()
Get a source file name for handling resource dependencies.
usFunctionGenerateModuleInit(src_var)
Generate a source file which handles proper initialization of a module.
const std::string TARGET