0026916: Configuration, CMake - configure variables to customize installation path...
[occt.git] / adm / cmake / 3rdparty_macro.cmake
1 ##
2
3 if(3RDPARTY_MACRO_ALREADY_INCLUDED)
4   return()
5 endif()
6 set(3RDPARTY_MACRO_ALREADY_INCLUDED 1)
7
8
9 macro (THIRDPARTY_PRODUCT PRODUCT_NAME HEADER_NAME LIBRARY_NAME LIBRARY_NAME_DEBUG)
10
11   if (NOT DEFINED INSTALL_${PRODUCT_NAME})
12     set (INSTALL_${PRODUCT_NAME} OFF CACHE BOOL "${INSTALL_${PRODUCT_NAME}_DESCR}")
13   endif()
14
15   if (NOT DEFINED 3RDPARTY_${PRODUCT_NAME}_DIR)
16     set (3RDPARTY_${PRODUCT_NAME}_DIR "" CACHE PATH "The directory containing ${PRODUCT_NAME}")
17   endif()
18
19   # include occt macros. compiler_bitness, os_wiht_bit, compiler
20   OCCT_INCLUDE_CMAKE_FILE ("adm/cmake/occt_macros")
21
22   # specify product folder in connectin with 3RDPARTY_DIR
23   if (3RDPARTY_DIR AND EXISTS "${3RDPARTY_DIR}")
24     #CHECK_PATH_FOR_CONSISTENCY (3RDPARTY_DIR 3RDPARTY_${PRODUCT_NAME}_DIR PATH "The directory containing ${PRODUCT_NAME}")
25
26     if (NOT 3RDPARTY_${PRODUCT_NAME}_DIR OR NOT EXISTS "${3RDPARTY_${PRODUCT_NAME}_DIR}")
27       FIND_PRODUCT_DIR ("${3RDPARTY_DIR}" ${PRODUCT_NAME} ${PRODUCT_NAME}_DIR_NAME)
28       if (${PRODUCT_NAME}_DIR_NAME)
29         set (3RDPARTY_${PRODUCT_NAME}_DIR "${3RDPARTY_DIR}/${${PRODUCT_NAME}_DIR_NAME}" CACHE PATH "The directory containing ${PRODUCT_NAME}" FORCE)
30       endif()
31     endif()
32   else()
33     #set (3RDPARTY_${PRODUCT_NAME}_DIR "" CACHE PATH "The directory containing ${PRODUCT_NAME}" FORCE)
34   endif()
35
36   if (NOT DEFINED 3RDPARTY_${PRODUCT_NAME}_INCLUDE_DIR)
37     set (3RDPARTY_${PRODUCT_NAME}_INCLUDE_DIR           "" CACHE PATH "the path of ${HEADER_NAME}")
38   endif()
39
40   if (NOT DEFINED 3RDPARTY_${PRODUCT_NAME}_LIBRARY OR NOT 3RDPARTY_${PRODUCT_NAME}_LIBRARY_DIR OR NOT EXISTS "${3RDPARTY_${PRODUCT_NAME}_LIBRARY_DIR}")
41     set (3RDPARTY_${PRODUCT_NAME}_LIBRARY               "" CACHE FILEPATH "${PRODUCT_NAME} library" FORCE)
42   endif()
43
44   if (NOT DEFINED 3RDPARTY_${PRODUCT_NAME}_LIBRARY_DIR)
45     set (3RDPARTY_${PRODUCT_NAME}_LIBRARY_DIR           "" CACHE PATH "The directory containing ${PRODUCT_NAME} library")
46   endif()
47
48   if (WIN32)
49     if (NOT DEFINED 3RDPARTY_${PRODUCT_NAME}_DLL OR NOT 3RDPARTY_${PRODUCT_NAME}_DLL_DIR OR NOT EXISTS "${3RDPARTY_${PRODUCT_NAME}_DLL_DIR}")
50       set (3RDPARTY_${PRODUCT_NAME}_DLL                 "" CACHE FILEPATH "${PRODUCT_NAME} shared library" FORCE)
51     endif()
52   endif()
53
54   if (WIN32)
55     if (NOT DEFINED 3RDPARTY_${PRODUCT_NAME}_DLL_DIR)
56       set (3RDPARTY_${PRODUCT_NAME}_DLL_DIR             "" CACHE PATH "The directory containing ${PRODUCT_NAME} shared library")
57     endif()
58   endif()
59
60   # check 3RDPARTY_${PRODUCT_NAME}_ paths for consistency with specified 3RDPARTY_${PRODUCT_NAME}_DIR
61   if (3RDPARTY_${PRODUCT_NAME}_DIR AND EXISTS "${3RDPARTY_${PRODUCT_NAME}_DIR}")
62     CHECK_PATH_FOR_CONSISTENCY (3RDPARTY_${PRODUCT_NAME}_DIR 3RDPARTY_${PRODUCT_NAME}_INCLUDE_DIR PATH "the path to ${PRODUCT_NAME}")
63     CHECK_PATH_FOR_CONSISTENCY (3RDPARTY_${PRODUCT_NAME}_DIR 3RDPARTY_${PRODUCT_NAME}_LIBRARY FILEPATH "the path to ${PRODUCT_NAME} library")
64
65     if (3RDPARTY_${PRODUCT_NAME}_LIBRARY AND EXISTS "${3RDPARTY_${PRODUCT_NAME}_LIBRARY}")
66       get_filename_component (3RDPARTY_${PRODUCT_NAME}_LIBRARY_DIR "${3RDPARTY_${PRODUCT_NAME}_LIBRARY}" PATH)
67       set (3RDPARTY_${PRODUCT_NAME}_LIBRARY_DIR "${3RDPARTY_${PRODUCT_NAME}_LIBRARY_DIR}" CACHE PATH "The directory containing ${PRODUCT_NAME} library" FORCE)
68     else()
69       CHECK_PATH_FOR_CONSISTENCY (3RDPARTY_${PRODUCT_NAME}_DIR 3RDPARTY_${PRODUCT_NAME}_LIBRARY_DIR PATH "The directory containing ${PRODUCT_NAME} library")
70     endif()
71
72     if (WIN32)
73       CHECK_PATH_FOR_CONSISTENCY (3RDPARTY_${PRODUCT_NAME}_DIR 3RDPARTY_${PRODUCT_NAME}_DLL FILEPATH "the path to ${PRODUCT_NAME} shared library")
74
75       if (3RDPARTY_${PRODUCT_NAME}_DLL AND EXISTS "${3RDPARTY_${PRODUCT_NAME}_DLL}")
76         get_filename_component (3RDPARTY_${PRODUCT_NAME}_DLL_DIR "${3RDPARTY_${PRODUCT_NAME}_DLL}" PATH)
77         set (3RDPARTY_${PRODUCT_NAME}_DLL_DIR "${3RDPARTY_${PRODUCT_NAME}_DLL_DIR}" CACHE PATH "The directory containing ${PRODUCT_NAME} shared library" FORCE)
78       else()
79       
80       CHECK_PATH_FOR_CONSISTENCY (3RDPARTY_${PRODUCT_NAME}_DIR 3RDPARTY_${PRODUCT_NAME}_DLL_DIR PATH "The directory containing ${PRODUCT_NAME} shared library")
81       endif()
82     endif()
83   endif()
84
85   # header
86   if (NOT 3RDPARTY_${PRODUCT_NAME}_INCLUDE_DIR OR NOT EXISTS "${3RDPARTY_${PRODUCT_NAME}_INCLUDE_DIR}")
87
88     # set 3RDPARTY_${PRODUCT_NAME}_INCLUDE_DIR as notfound, otherwise find_library can't assign a new value to 3RDPARTY_${PRODUCT_NAME}_INCLUDE_DIR
89     set (3RDPARTY_${PRODUCT_NAME}_INCLUDE_DIR "3RDPARTY_${PRODUCT_NAME}_INCLUDE_DIR-NOTFOUND" CACHE FILEPATH "the path to ${HEADER_NAME}" FORCE)
90
91     if (3RDPARTY_${PRODUCT_NAME}_DIR AND EXISTS "${3RDPARTY_${PRODUCT_NAME}_DIR}")
92       find_path (3RDPARTY_${PRODUCT_NAME}_INCLUDE_DIR NAMES ${HEADER_NAME}
93                                                       PATHS ${3RDPARTY_${PRODUCT_NAME}_DIR}
94                                                       PATH_SUFFIXES include
95                                                       CMAKE_FIND_ROOT_PATH_BOTH
96                                                       NO_DEFAULT_PATH)
97     else()
98       find_path (3RDPARTY_${PRODUCT_NAME}_INCLUDE_DIR NAMES ${HEADER_NAME}
99                                                       PATH_SUFFIXES include
100                                                       CMAKE_FIND_ROOT_PATH_BOTH)
101     endif()
102   endif()
103
104   if (3RDPARTY_${PRODUCT_NAME}_INCLUDE_DIR AND EXISTS "${3RDPARTY_${PRODUCT_NAME}_INCLUDE_DIR}")
105     list (APPEND 3RDPARTY_INCLUDE_DIRS "${3RDPARTY_${PRODUCT_NAME}_INCLUDE_DIR}")
106   else()
107     list (APPEND 3RDPARTY_NOT_INCLUDED 3RDPARTY_${PRODUCT_NAME}_INCLUDE_DIR)
108
109     set (3RDPARTY_${PRODUCT_NAME}_INCLUDE_DIR "" CACHE FILEPATH "The path to ${HEADER_NAME}" FORCE)
110   endif()
111
112   # library
113   if (NOT 3RDPARTY_${PRODUCT_NAME}_LIBRARY OR NOT EXISTS "${3RDPARTY_${PRODUCT_NAME}_LIBRARY}")
114     set (CMAKE_FIND_LIBRARY_SUFFIXES .lib .so .dylib)
115
116     set (${PRODUCT_NAME}_PATH_SUFFIXES lib)
117     if (ANDROID)
118       set (${PRODUCT_NAME}_PATH_SUFFIXES ${${PRODUCT_NAME}_PATH_SUFFIXES} libs/${ANDROID_ABI})
119     endif()
120
121     # set 3RDPARTY_${PRODUCT_NAME}_LIBRARY as notfound, otherwise find_library can't assign a new value to 3RDPARTY_${PRODUCT_NAME}_LIBRARY
122     set (3RDPARTY_${PRODUCT_NAME}_LIBRARY "3RDPARTY_${PRODUCT_NAME}_LIBRARY-NOTFOUND" CACHE FILEPATH "The path to ${PRODUCT_NAME} library" FORCE)
123
124     if (3RDPARTY_${PRODUCT_NAME}_DIR AND EXISTS "${3RDPARTY_${PRODUCT_NAME}_DIR}")
125       find_library (3RDPARTY_${PRODUCT_NAME}_LIBRARY NAMES ${LIBRARY_NAME}
126                                                      PATHS "${3RDPARTY_${PRODUCT_NAME}_LIBRARY_DIR}" "${3RDPARTY_${PRODUCT_NAME}_DIR}"
127                                                      PATH_SUFFIXES ${${PRODUCT_NAME}_PATH_SUFFIXES}
128                                                      CMAKE_FIND_ROOT_PATH_BOTH
129                                                      NO_DEFAULT_PATH)
130     else()
131       find_library (3RDPARTY_${PRODUCT_NAME}_LIBRARY NAMES ${LIBRARY_NAME} 
132                                                      PATH_SUFFIXES ${${PRODUCT_NAME}_PATH_SUFFIXES}
133                                                      CMAKE_FIND_ROOT_PATH_BOTH)
134     endif()
135
136     if (3RDPARTY_${PRODUCT_NAME}_LIBRARY AND EXISTS "${3RDPARTY_${PRODUCT_NAME}_LIBRARY}")
137       get_filename_component (3RDPARTY_${PRODUCT_NAME}_LIBRARY_DIR "${3RDPARTY_${PRODUCT_NAME}_LIBRARY}" PATH)
138       set (3RDPARTY_${PRODUCT_NAME}_LIBRARY_DIR "${3RDPARTY_${PRODUCT_NAME}_LIBRARY_DIR}" CACHE PATH "The directory containing ${PRODUCT_NAME} library" FORCE)
139     else()
140       set (3RDPARTY_${PRODUCT_NAME}_LIBRARY_DIR "" CACHE PATH "The directory containing ${PRODUCT_NAME} library" FORCE)
141     endif()
142   endif()
143
144   if (3RDPARTY_${PRODUCT_NAME}_LIBRARY_DIR AND EXISTS "${3RDPARTY_${PRODUCT_NAME}_LIBRARY_DIR}")
145     list (APPEND 3RDPARTY_LIBRARY_DIRS "${3RDPARTY_${PRODUCT_NAME}_LIBRARY_DIR}")
146   else()
147     list (APPEND 3RDPARTY_NOT_INCLUDED 3RDPARTY_${PRODUCT_NAME}_LIBRARY_DIR)
148
149     set (3RDPARTY_${PRODUCT_NAME}_LIBRARY "" CACHE FILEPATH "The path to ${PRODUCT_NAME} library" FORCE)
150   endif()
151
152   # shared library
153   if (WIN32)
154     if (NOT 3RDPARTY_${PRODUCT_NAME}_DLL OR NOT EXISTS "${3RDPARTY_${PRODUCT_NAME}_DLL}")
155       
156       set (CMAKE_FIND_LIBRARY_SUFFIXES .dll)
157
158       # set 3RDPARTY_${PRODUCT_NAME}_DLL as notfound, otherwise find_library can't assign a new value to 3RDPARTY_${PRODUCT_NAME}_DLL
159       set (3RDPARTY_${PRODUCT_NAME}_DLL "3RDPARTY_${PRODUCT_NAME}_DLL-NOTFOUND" CACHE FILEPATH "The path to ${PRODUCT_NAME} shared library" FORCE)
160
161       if (3RDPARTY_${PRODUCT_NAME}_DIR AND EXISTS "${3RDPARTY_${PRODUCT_NAME}_DIR}")
162         find_library (3RDPARTY_${PRODUCT_NAME}_DLL  NAMES ${LIBRARY_NAME}
163                                                     PATHS "${3RDPARTY_${PRODUCT_NAME}_DIR}"
164                                                     PATH_SUFFIXES bin
165                                                     NO_DEFAULT_PATH)
166       else()
167         find_library (3RDPARTY_${PRODUCT_NAME}_DLL NAMES ${LIBRARY_NAME} PATH_SUFFIXES bin)
168       endif()
169
170       if (3RDPARTY_${PRODUCT_NAME}_DLL AND EXISTS "${3RDPARTY_${PRODUCT_NAME}_DLL}")
171         get_filename_component (3RDPARTY_${PRODUCT_NAME}_DLL_DIR "${3RDPARTY_${PRODUCT_NAME}_DLL}" PATH)
172         set (3RDPARTY_${PRODUCT_NAME}_DLL_DIR "${3RDPARTY_${PRODUCT_NAME}_DLL_DIR}" CACHE PATH "The directory containing ${PRODUCT_NAME} library" FORCE)
173       else()
174         set (3RDPARTY_${PRODUCT_NAME}_DLL_DIR "" CACHE PATH "The directory containing ${PRODUCT_NAME} shared library" FORCE)
175
176         set (3RDPARTY_${PRODUCT_NAME}_DLL "" CACHE FILEPATH "${PRODUCT_NAME} shared library" FORCE)
177       endif()
178     endif()
179
180     if (3RDPARTY_${PRODUCT_NAME}_DLL_DIR OR EXISTS "${3RDPARTY_${PRODUCT_NAME}_DLL_DIR}")
181       list (APPEND 3RDPARTY_DLL_DIRS "${3RDPARTY_${PRODUCT_NAME}_DLL_DIR}")
182     else()
183       list (APPEND 3RDPARTY_NOT_INCLUDED 3RDPARTY_${PRODUCT_NAME}_DLL_DIR)
184     endif()
185   endif()
186
187   set (USED_3RDPARTY_${PRODUCT_NAME}_DIR "")
188
189   if (INSTALL_${PRODUCT_NAME})
190     OCCT_MAKE_OS_WITH_BITNESS()
191     OCCT_MAKE_COMPILER_SHORT_NAME()
192
193     if (WIN32)
194       if (DEFINED INSTALL_BIN_DIR)
195         install (FILES "${3RDPARTY_${PRODUCT_NAME}_DLL}" DESTINATION "${INSTALL_BIN_DIR}")
196       else()
197         install (FILES "${3RDPARTY_${PRODUCT_NAME}_DLL}" 
198                  CONFIGURATIONS Release
199                  DESTINATION "${INSTALL_DIR}/${OS_WITH_BIT}/${COMPILER}/bin")
200         install (FILES "${3RDPARTY_${PRODUCT_NAME}_DLL}" 
201                  CONFIGURATIONS RelWithDebInfo
202                  DESTINATION "${INSTALL_DIR}/${OS_WITH_BIT}/${COMPILER}/bini")
203         install (FILES "${3RDPARTY_${PRODUCT_NAME}_DLL}" 
204                  CONFIGURATIONS Debug
205                  DESTINATION "${INSTALL_DIR}/${OS_WITH_BIT}/${COMPILER}/bind")
206       endif()
207     else()
208       get_filename_component(ABS_PATH ${3RDPARTY_${PRODUCT_NAME}_LIBRARY} REALPATH)
209
210       if ("${PRODUCT_NAME}" STREQUAL "FREEIMAGE")
211         get_filename_component(FREEIMLIB ${3RDPARTY_${PRODUCT_NAME}_LIBRARY} NAME)
212
213         if (DEFINED INSTALL_LIB_DIR)
214           install (FILES "${ABS_PATH}" DESTINATION "${INSTALL_LIB_DIR}" RENAME ${FREEIMLIB}.3)
215         else()
216           install (FILES "${ABS_PATH}"
217                    CONFIGURATIONS Release
218                    DESTINATION "${INSTALL_DIR}/${OS_WITH_BIT}/${COMPILER}/lib"
219                    RENAME ${FREEIMLIB}.3)
220           install (FILES "${ABS_PATH}"
221                    CONFIGURATIONS RelWithDebInfo
222                    DESTINATION "${INSTALL_DIR}/${OS_WITH_BIT}/${COMPILER}/libi"
223                    RENAME ${FREEIMLIB}.3)
224           install (FILES "${ABS_PATH}"
225                    CONFIGURATIONS Debug
226                    DESTINATION "${INSTALL_DIR}/${OS_WITH_BIT}/${COMPILER}/libd"
227                    RENAME ${FREEIMLIB}.3)
228         endif()
229       endif()
230
231       if("${PRODUCT_NAME}" STREQUAL "GL2PS")
232         get_filename_component(GL2PSLIB ${3RDPARTY_${PRODUCT_NAME}_LIBRARY} NAME)
233
234         if (DEFINED INSTALL_LIB_DIR)
235           install (FILES "${ABS_PATH}" DESTINATION "${INSTALL_LIB_DIR}" RENAME ${GL2PSLIB}.1)
236         else()
237           install (FILES "${ABS_PATH}"
238                    CONFIGURATIONS Release
239                    DESTINATION "${INSTALL_DIR}/${OS_WITH_BIT}/${COMPILER}/lib"
240                    RENAME ${GL2PSLIB}.1)
241           install (FILES "${ABS_PATH}"
242                    CONFIGURATIONS RelWithDebInfo
243                    DESTINATION "${INSTALL_DIR}/${OS_WITH_BIT}/${COMPILER}/libi"
244                    RENAME ${GL2PSLIB}.1)
245           install (FILES "${ABS_PATH}"
246                    CONFIGURATIONS Debug
247                    DESTINATION "${INSTALL_DIR}/${OS_WITH_BIT}/${COMPILER}/libd"
248                    RENAME ${GL2PSLIB}.1)
249         endif()
250       endif()
251     endif()
252   else()
253     # the library directory for using by the executable
254     if (WIN32)
255       set (USED_3RDPARTY_${PRODUCT_NAME}_DIR "${3RDPARTY_${PRODUCT_NAME}_DLL_DIR}")
256     else()
257       set (USED_3RDPARTY_${PRODUCT_NAME}_DIR "${3RDPARTY_${PRODUCT_NAME}_LIBRARY_DIR}")
258     endif()
259   endif()
260
261   mark_as_advanced (3RDPARTY_${PRODUCT_NAME}_LIBRARY 3RDPARTY_${PRODUCT_NAME}_DLL)
262 endmacro()
263
264 macro (COMPLIANCE_PRODUCT_CONSISTENCY LIBNAME)
265   if (3RDPARTY_${LIBNAME}_DIR AND EXISTS "${3RDPARTY_${LIBNAME}_DIR}")
266     # include dir
267     set (DOES_PATH_CONTAIN FALSE)
268     if (3RDPARTY_${LIBNAME}_INCLUDE_DIR AND EXISTS "${3RDPARTY_${LIBNAME}_INCLUDE_DIR}")
269       string (REGEX MATCH "${3RDPARTY_${LIBNAME}_DIR}" DOES_PATH_CONTAIN "${3RDPARTY_${LIBNAME}_INCLUDE_DIR}")
270     endif()
271     if (NOT DOES_PATH_CONTAIN)
272       set (3RDPARTY_${LIBNAME}_INCLUDE_DIR "" CACHE FILEPATH "The directory containing headers of ${LIBNAME}" FORCE)
273     endif()
274
275     # library dir
276     set (DOES_PATH_CONTAIN FALSE)
277     if (3RDPARTY_${LIBNAME}_LIBRARY_DIR AND EXISTS "${3RDPARTY_${LIBNAME}_LIBRARY_DIR}")
278       string (REGEX MATCH "${3RDPARTY_${LIBNAME}_DIR}" DOES_PATH_CONTAIN "${3RDPARTY_${LIBNAME}_LIBRARY_DIR}")
279     endif()
280     if (NOT DOES_PATH_CONTAIN)
281       set (3RDPARTY_${LIBNAME}_LIBRARY_DIR "" CACHE FILEPATH "The directory containing ${LIBNAME} library" FORCE)
282     endif()
283
284     # shared library dir
285     if (WIN32)
286       set (DOES_PATH_CONTAIN FALSE)
287       if (3RDPARTY_${LIBNAME}_DLL_DIR AND EXISTS "${3RDPARTY_${LIBNAME}_DLL_DIR}")
288         string (REGEX MATCH "${3RDPARTY_${LIBNAME}_DIR}" DOES_PATH_CONTAIN "${3RDPARTY_${LIBNAME}_DLL_DIR}")
289       endif()
290       if (NOT DOES_PATH_CONTAIN)
291         set (3RDPARTY_${LIBNAME}_DLL_DIR "" CACHE FILEPATH "The directory containing ${LIBNAME} shared library" FORCE)
292       endif()
293     endif()
294   endif()
295
296   # check library
297   set (DOES_PATH_CONTAIN FALSE)
298   if (3RDPARTY_${LIBNAME}_LIBRARY_DIR AND EXISTS "${3RDPARTY_${LIBNAME}_LIBRARY_DIR}")
299     if (3RDPARTY_${LIBNAME}_LIBRARY AND EXISTS "${3RDPARTY_${LIBNAME}_LIBRARY}")
300       string (REGEX MATCH "${3RDPARTY_${LIBNAME}_LIBRARY_DIR}" DOES_PATH_CONTAIN "${3RDPARTY_${LIBNAME}_LIBRARY}")
301     endif()
302   endif()
303   if (NOT DOES_PATH_CONTAIN)
304     set (3RDPARTY_${LIBNAME}_LIBRARY "" CACHE FILEPATH "${LIBNAME} library" FORCE)
305   endif()
306
307   # check shared library
308   if (WIN32)
309     set (DOES_PATH_CONTAIN FALSE)
310     if (3RDPARTY_${LIBNAME}_DLL_DIR AND EXISTS "${3RDPARTY_${LIBNAME}_DLL_DIR}")
311       if (3RDPARTY_${LIBNAME}_DLL AND EXISTS "${3RDPARTY_${LIBNAME}_DLL}")
312         string (REGEX MATCH "${3RDPARTY_${LIBNAME}_DLL_DIR}" DOES_PATH_CONTAIN "${3RDPARTY_${LIBNAME}_DLL}")
313       endif()
314     endif()
315     if (NOT DOES_PATH_CONTAIN)
316       set (3RDPARTY_${LIBNAME}_DLL "" CACHE FILEPATH "${LIBNAME} shared library" FORCE)
317     endif()
318   endif()
319 endmacro()