0026388: Setting debugging environment of the Visual Studio solution of OCCT generate...
[occt.git] / adm / cmake / occt_macros.cmake
1 #
2 macro (OCCT_CHECK_AND_UNSET VARNAME)
3   if (DEFINED ${VARNAME})
4     unset (${VARNAME} CACHE)
5   endif()
6 endmacro()
7
8 macro (OCCT_CHECK_AND_UNSET_GROUP VARNAME)
9   OCCT_CHECK_AND_UNSET ("${VARNAME}_DIR")
10
11   OCCT_CHECK_AND_UNSET ("${VARNAME}_INCLUDE_DIR")
12
13   OCCT_CHECK_AND_UNSET ("${VARNAME}_LIBRARY")
14   OCCT_CHECK_AND_UNSET ("${VARNAME}_LIBRARY_DIR")
15
16   if (WIN32)
17     OCCT_CHECK_AND_UNSET ("${VARNAME}_DLL")
18     OCCT_CHECK_AND_UNSET ("${VARNAME}_DLL_DIR")
19   endif()
20 endmacro()
21
22 # BUILD_POSTFIX, IS_BUILD_DEBUG variables
23 macro (OCCT_MAKE_BUILD_POSTFIX)
24   if ("${BUILD_CONFIGURATION}" STREQUAL "Debug")
25     set (BUILD_POSTFIX "d")
26     set (IS_BUILD_DEBUG "")
27   else()
28     set (BUILD_POSTFIX "")
29     OCCT_CHECK_AND_UNSET (IS_BUILD_DEBUG)
30   endif()
31 endmacro()
32
33 # COMPILER_BITNESS variable
34 macro (OCCT_MAKE_COMPILER_BITNESS)
35   math (EXPR COMPILER_BITNESS "32 + 32*(${CMAKE_SIZEOF_VOID_P}/8)")
36 endmacro()
37
38 # OS_WITH_BIT
39 macro (OCCT_MAKE_OS_WITH_BITNESS)
40
41   OCCT_MAKE_COMPILER_BITNESS()
42
43   if (WIN32)
44     set (OS_WITH_BIT "win${COMPILER_BITNESS}")
45   elseif(APPLE)
46     set (OS_WITH_BIT "mac${COMPILER_BITNESS}")
47   else()
48     set (OS_WITH_BIT "lin${COMPILER_BITNESS}")
49   endif()
50 endmacro()
51
52 # COMPILER variable
53 macro (OCCT_MAKE_COMPILER_SHORT_NAME)
54   if (MSVC)
55     if (MSVC70)
56       set (COMPILER vc7)
57     elseif (MSVC80)
58       set (COMPILER vc8)
59     elseif (MSVC90)
60       set (COMPILER vc9)
61     elseif (MSVC10)
62       set (COMPILER vc10)
63     elseif (MSVC11)
64       set (COMPILER vc11)
65     elseif (MSVC12)
66       set (COMPILER vc12)
67     endif()
68   elseif (DEFINED CMAKE_COMPILER_IS_GNUCC)
69     set (COMPILER gcc)
70   elseif (DEFINED CMAKE_COMPILER_IS_GNUCXX)
71     set (COMPILER gxx)
72   elseif ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang")
73     set (COMPILER clang)
74   elseif ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Intel")
75     set (COMPILER icc)
76   else()
77     set (COMPILER ${CMAKE_GENERATOR})
78     string (REGEX REPLACE " " "" COMPILER ${COMPILER})
79   endif()
80 endmacro()
81
82 function (SUBDIRECTORY_NAMES MAIN_DIRECTORY RESULT)
83   file (GLOB SUB_ITEMS "${MAIN_DIRECTORY}/*")
84
85   foreach (ITEM ${SUB_ITEMS})
86     if (IS_DIRECTORY "${ITEM}")
87       get_filename_component (ITEM_NAME "${ITEM}" NAME)
88       list (APPEND LOCAL_RESULT "${ITEM_NAME}")
89     endif()
90   endforeach()
91   set (${RESULT} ${LOCAL_RESULT} PARENT_SCOPE)
92 endfunction()
93
94 function (FIND_PRODUCT_DIR ROOT_DIR PRODUCT_NAME RESULT)
95   OCCT_MAKE_COMPILER_SHORT_NAME()
96   OCCT_MAKE_COMPILER_BITNESS()
97
98   string (TOLOWER "${PRODUCT_NAME}" lower_PRODUCT_NAME)
99
100   list (APPEND SEARCH_TEMPLATES "${lower_PRODUCT_NAME}.*${COMPILER}.*${COMPILER_BITNESS}")
101   list (APPEND SEARCH_TEMPLATES "${lower_PRODUCT_NAME}.*[0-9.]+.*${COMPILER}.*${COMPILER_BITNESS}")
102   list (APPEND SEARCH_TEMPLATES "${lower_PRODUCT_NAME}.*[0-9.]+.*${COMPILER_BITNESS}")
103   list (APPEND SEARCH_TEMPLATES "${lower_PRODUCT_NAME}.*[0-9.]+")
104   list (APPEND SEARCH_TEMPLATES "${lower_PRODUCT_NAME}")
105
106   SUBDIRECTORY_NAMES ("${ROOT_DIR}" SUBDIR_NAME_LIST)
107
108   foreach (SEARCH_TEMPLATE ${SEARCH_TEMPLATES})
109     if (LOCAL_RESULT)
110       BREAK()
111     endif()
112
113     foreach (SUBDIR_NAME ${SUBDIR_NAME_LIST})
114       string (TOLOWER "${SUBDIR_NAME}" lower_SUBDIR_NAME)
115
116       string (REGEX MATCH "${SEARCH_TEMPLATE}" DUMMY_VAR "${lower_SUBDIR_NAME}")
117       if (DUMMY_VAR)
118         list (APPEND LOCAL_RESULT ${SUBDIR_NAME})
119       endif()
120     endforeach()
121   endforeach()
122
123   if (LOCAL_RESULT)
124     list (LENGTH "${LOCAL_RESULT}" LOC_LEN)
125     math (EXPR LAST_ELEMENT_INDEX "${LOC_LEN}-1")
126     list (GET LOCAL_RESULT ${LAST_ELEMENT_INDEX} DUMMY)
127     set (${RESULT} ${DUMMY} PARENT_SCOPE)
128   endif()
129 endfunction()
130
131 macro (OCCT_INSTALL_FILE_OR_DIR BEING_INSTALLED_OBJECT DESTINATION_PATH)
132   if (BUILD_PATCH_DIR AND EXISTS "${BUILD_PATCH_DIR}/${BEING_INSTALLED_OBJECT}")
133     if (IS_DIRECTORY "${BUILD_PATCH_DIR}/${BEING_INSTALLED_OBJECT}")
134       # first of all, install original files
135       install (DIRECTORY "${CMAKE_SOURCE_DIR}/${BEING_INSTALLED_OBJECT}" DESTINATION  "${DESTINATION_PATH}")
136
137       # secondly, rewrite original files with patched ones
138       install (DIRECTORY "${BUILD_PATCH_DIR}/${BEING_INSTALLED_OBJECT}" DESTINATION  "${DESTINATION_PATH}")
139     else()
140       install (FILES     "${BUILD_PATCH_DIR}/${BEING_INSTALLED_OBJECT}" DESTINATION  "${DESTINATION_PATH}")
141     endif()
142   else()
143     if (IS_DIRECTORY "${CMAKE_SOURCE_DIR}/${BEING_INSTALLED_OBJECT}")
144       install (DIRECTORY "${CMAKE_SOURCE_DIR}/${BEING_INSTALLED_OBJECT}" DESTINATION  "${DESTINATION_PATH}")
145     else()
146       install (FILES     "${CMAKE_SOURCE_DIR}/${BEING_INSTALLED_OBJECT}" DESTINATION  "${DESTINATION_PATH}")
147     endif()
148   endif()
149 endmacro()
150
151 macro (OCCT_CONFIGURE_AND_INSTALL BEING_CONGIRUGED_FILE FINAL_NAME DESTINATION_PATH)
152   if (BUILD_PATCH_DIR AND EXISTS "${BUILD_PATCH_DIR}/${BEING_CONGIRUGED_FILE}")
153     configure_file("${BUILD_PATCH_DIR}/${BEING_CONGIRUGED_FILE}" "${FINAL_NAME}" @ONLY)
154   else()
155     configure_file("${CMAKE_SOURCE_DIR}/${BEING_CONGIRUGED_FILE}" "${FINAL_NAME}" @ONLY)
156   endif()
157
158   install(FILES "${OCCT_BINARY_DIR}/${FINAL_NAME}" DESTINATION  "${DESTINATION_PATH}")
159 endmacro()
160
161 macro (COLLECT_AND_INSTALL_OCCT_HEADER_FILES ROOT_OCCT_DIR TEMPLATE_HEADER_PATH ROOT_TARGET_OCCT_DIR OCCT_USED_TOOLKITS)
162   set (OCCT_SOURCE_DIRS)
163
164   foreach (OCCT_USED_TOOLKIT ${OCCT_USED_TOOLKITS})
165     # append parent folder
166     list (APPEND OCCT_SOURCE_DIRS ${OCCT_USED_TOOLKIT})
167
168     # append all required package folders
169     set (OCCT_USED_TOOLKIT_DEPS)
170     if (EXISTS "${ROOT_OCCT_DIR}/src/${OCCT_USED_TOOLKIT}/PACKAGES")
171       file (STRINGS "${ROOT_OCCT_DIR}/src/${OCCT_USED_TOOLKIT}/PACKAGES" OCCT_USED_TOOLKIT_DEPS)
172     endif()
173
174     foreach (OCCT_USED_TOOLKIT_DEP ${OCCT_USED_TOOLKIT_DEPS})
175       list (APPEND OCCT_SOURCE_DIRS ${OCCT_USED_TOOLKIT_DEP})
176     endforeach()
177   endforeach()
178
179   foreach (OCCT_SOURCE_DIR ${OCCT_SOURCE_DIRS})
180     # get all header files from each src folder 
181     file (GLOB OCCT_HEADER_FILES "${ROOT_OCCT_DIR}/src/${OCCT_SOURCE_DIR}/*.[hgl]xx" "${ROOT_OCCT_DIR}/src/${OCCT_SOURCE_DIR}/*.h")
182
183     install (FILES ${OCCT_HEADER_FILES} DESTINATION "${INSTALL_DIR}/inc")
184
185     # create new file including found header
186     foreach (OCCT_HEADER_FILE ${OCCT_HEADER_FILES})
187       get_filename_component (HEADER_FILE_NAME ${OCCT_HEADER_FILE} NAME)
188       configure_file ("${TEMPLATE_HEADER_PATH}" "${ROOT_TARGET_OCCT_DIR}/inc/${HEADER_FILE_NAME}" @ONLY)
189     endforeach()
190   endforeach()
191 endmacro()
192
193 macro (OCCT_COPY_FILE_OR_DIR BEING_COPIED_OBJECT DESTINATION_PATH)
194   # first of all, copy original files
195   file (COPY "${CMAKE_SOURCE_DIR}/${BEING_COPIED_OBJECT}" DESTINATION  "${DESTINATION_PATH}")
196
197   if (BUILD_PATCH_DIR AND EXISTS "${BUILD_PATCH_DIR}/${BEING_COPIED_OBJECT}")
198     # secondly, rewrite original files with patched ones
199     file (COPY "${BUILD_PATCH_DIR}/${BEING_COPIED_OBJECT}" DESTINATION  "${DESTINATION_PATH}")
200   endif()
201 endmacro()
202
203 macro (OCCT_CONFIGURE BEING_CONGIRUGED_FILE FINAL_NAME)
204   if (BUILD_PATCH_DIR AND EXISTS "${BUILD_PATCH_DIR}/${BEING_CONGIRUGED_FILE}")
205     configure_file("${BUILD_PATCH_DIR}/${BEING_CONGIRUGED_FILE}" "${FINAL_NAME}" @ONLY)
206   else()
207     configure_file("${CMAKE_SOURCE_DIR}/${BEING_CONGIRUGED_FILE}" "${FINAL_NAME}" @ONLY)
208   endif()
209 endmacro()
210
211 function (OCCT_IS_PRODUCT_REQUIRED CSF_VAR_NAME USE_PRODUCT)
212   set (${USE_PRODUCT} OFF PARENT_SCOPE)
213
214   if (NOT USED_TOOLKITS)
215     message(STATUS "Warning: the list of being used toolkits is empty")
216   else()
217     foreach (USED_TOOLKIT ${USED_TOOLKITS})
218       if (BUILD_PATCH_DIR AND EXISTS "${BUILD_PATCH_DIR}/src/${USED_TOOLKIT}/EXTERNLIB")
219         file (READ "${BUILD_PATCH_DIR}/src/${USED_TOOLKIT}/EXTERNLIB" FILE_CONTENT)
220       elseif (EXISTS "${CMAKE_SOURCE_DIR}/src/${USED_TOOLKIT}/EXTERNLIB")
221         file (READ "${CMAKE_SOURCE_DIR}/src/${USED_TOOLKIT}/EXTERNLIB" FILE_CONTENT)
222       endif()
223
224       string (REGEX MATCH "${CSF_VAR_NAME}" DOES_FILE_CONTAIN "${FILE_CONTENT}")
225
226       if (DOES_FILE_CONTAIN)
227         set (${USE_PRODUCT} ON PARENT_SCOPE)
228         break()
229       endif()
230     endforeach()
231   endif()
232 endfunction()
233
234 function (FILE_TO_LIST FILE_NAME FILE_CONTENT)
235   set (LOCAL_FILE_CONTENT)
236   if (BUILD_PATCH_DIR AND EXISTS "${BUILD_PATCH_DIR}/${FILE_NAME}")
237     file (STRINGS "${BUILD_PATCH_DIR}/${FILE_NAME}" LOCAL_FILE_CONTENT)
238   elseif (EXISTS "${CMAKE_SOURCE_DIR}/${FILE_NAME}")
239     file (STRINGS "${CMAKE_SOURCE_DIR}/${FILE_NAME}" LOCAL_FILE_CONTENT)
240   endif()
241
242   set (${FILE_CONTENT} ${LOCAL_FILE_CONTENT} PARENT_SCOPE)
243 endfunction()
244
245 # Function to determine if TOOLKIT is OCCT toolkit
246 function (IS_OCCT_TOOLKIT TOOLKIT_NAME MODULES IS_TOOLKIT_FOUND)
247   set (${IS_TOOLKIT_FOUND} OFF PARENT_SCOPE)
248   foreach (MODULE ${${MODULES}})
249     set (TOOLKITS ${${MODULE}_TOOLKITS})
250     list (FIND TOOLKITS ${TOOLKIT_NAME} FOUND)
251
252     if (NOT ${FOUND} EQUAL -1)
253       set (${IS_TOOLKIT_FOUND} ON PARENT_SCOPE)
254     endif()
255   endforeach(MODULE)
256 endfunction()
257
258 # TOOLKIT_DEPS is defined with dependencies from file src/TOOLKIT_NAME/EXTERNLIB.
259 # CSF_ variables are ignored
260 function (OCCT_TOOLKIT_DEP TOOLKIT_NAME TOOLKIT_DEPS)
261   FILE_TO_LIST ("src/${TOOLKIT_NAME}/EXTERNLIB" FILE_CONTENT)
262
263   #list (APPEND LOCAL_TOOLKIT_DEPS ${TOOLKIT_NAME})
264   set (LOCAL_TOOLKIT_DEPS)
265   foreach (FILE_CONTENT_LINE ${FILE_CONTENT})
266     string (REGEX MATCH "^TK" TK_FOUND ${FILE_CONTENT_LINE})
267     if ("${FILE_CONTENT_LINE}" STREQUAL "DRAWEXE" OR NOT "${TK_FOUND}" STREQUAL "")
268       list (APPEND LOCAL_TOOLKIT_DEPS ${FILE_CONTENT_LINE})
269     endif()
270   endforeach()
271
272   set (${TOOLKIT_DEPS} ${LOCAL_TOOLKIT_DEPS} PARENT_SCOPE)
273 endfunction()
274
275 # TOOLKIT_FULL_DEPS is defined with complete dependencies (all levels)
276 function (OCCT_TOOLKIT_FULL_DEP TOOLKIT_NAME TOOLKIT_FULL_DEPS)
277   # first level dependencies are stored in LOCAL_TOOLKIT_FULL_DEPS
278   OCCT_TOOLKIT_DEP (${TOOLKIT_NAME} LOCAL_TOOLKIT_FULL_DEPS)
279
280   list (LENGTH LOCAL_TOOLKIT_FULL_DEPS LIST_LENGTH)
281   set (LIST_INDEX 0)
282   while (LIST_INDEX LESS LIST_LENGTH)
283     list (GET LOCAL_TOOLKIT_FULL_DEPS ${LIST_INDEX} CURRENT_TOOLKIT)
284     OCCT_TOOLKIT_DEP (${CURRENT_TOOLKIT} CURRENT_TOOLKIT_DEPS)
285
286     # append toolkits are not contained
287     foreach (CURRENT_TOOLKIT_DEP ${CURRENT_TOOLKIT_DEPS})
288       set (CURRENT_TOOLKIT_DEP_FOUND OFF)
289       foreach (LOCAL_TOOLKIT_FULL_DEP ${LOCAL_TOOLKIT_FULL_DEPS})
290         if ("${CURRENT_TOOLKIT_DEP}" STREQUAL "${LOCAL_TOOLKIT_FULL_DEP}")
291           set (CURRENT_TOOLKIT_DEP_FOUND ON)
292           break()
293         endif()
294       endforeach()
295       if ("${CURRENT_TOOLKIT_DEP_FOUND}" STREQUAL "OFF")
296         list (APPEND LOCAL_TOOLKIT_FULL_DEPS ${CURRENT_TOOLKIT_DEP})
297       endif()
298     endforeach()
299
300     # increment the list index
301     MATH(EXPR LIST_INDEX "${LIST_INDEX}+1")
302
303     # calculate new length
304     list (LENGTH LOCAL_TOOLKIT_FULL_DEPS LIST_LENGTH)
305   endwhile()
306
307   set (${TOOLKIT_FULL_DEPS} ${LOCAL_TOOLKIT_FULL_DEPS} PARENT_SCOPE)
308 endfunction()
309
310 # Function to get list of modules and toolkits from file adm/MODULES.
311 # Creates list <$MODULE_LIST> to store list of MODULES and
312 # <NAME_OF_MODULE>_TOOLKITS foreach module to store its toolkits.
313 function (OCCT_MODULES_AND_TOOLKITS MODULE_LIST)
314   FILE_TO_LIST ("adm/MODULES" FILE_CONTENT)
315
316   foreach (CONTENT_LINE ${FILE_CONTENT})
317     string (REPLACE " " ";" CONTENT_LINE ${CONTENT_LINE})
318     list (GET CONTENT_LINE 0 MODULE_NAME)
319     list (REMOVE_AT CONTENT_LINE 0)
320     list (APPEND ${MODULE_LIST} ${MODULE_NAME})
321     # (!) REMOVE THE LINE BELOW (implicit variables)
322     set (${MODULE_NAME}_TOOLKITS ${CONTENT_LINE} PARENT_SCOPE)
323   endforeach()
324
325   set (${MODULE_LIST} ${${MODULE_LIST}} PARENT_SCOPE)
326 endfunction()
327