| 1 | ## |
| 2 | |
| 3 | if(OCCT_MACROS_ALREADY_INCLUDED) |
| 4 | return() |
| 5 | endif() |
| 6 | set(OCCT_MACROS_ALREADY_INCLUDED 1) |
| 7 | |
| 8 | |
| 9 | macro (OCCT_CHECK_AND_UNSET VARNAME) |
| 10 | if (DEFINED ${VARNAME}) |
| 11 | unset (${VARNAME} CACHE) |
| 12 | endif() |
| 13 | endmacro() |
| 14 | |
| 15 | macro (OCCT_CHECK_AND_UNSET_GROUP GROUPNAME) |
| 16 | get_cmake_property(VARS VARIABLES) |
| 17 | string (REGEX MATCHALL "(^|;)${GROUPNAME}[A-Za-z0-9_]*" GROUPNAME_VARS "${VARS}") |
| 18 | foreach(GROUPNAME_VAR ${GROUPNAME_VARS}) |
| 19 | OCCT_CHECK_AND_UNSET(${GROUPNAME_VAR}) |
| 20 | endforeach() |
| 21 | endmacro() |
| 22 | |
| 23 | macro (OCCT_CHECK_AND_UNSET_INSTALL_DIR_SUBDIRS) |
| 24 | OCCT_CHECK_AND_UNSET (INSTALL_DIR_BIN) |
| 25 | OCCT_CHECK_AND_UNSET (INSTALL_DIR_SCRIPT) |
| 26 | OCCT_CHECK_AND_UNSET (INSTALL_DIR_LIB) |
| 27 | OCCT_CHECK_AND_UNSET (INSTALL_DIR_INCLUDE) |
| 28 | OCCT_CHECK_AND_UNSET (INSTALL_DIR_RESOURCE) |
| 29 | OCCT_CHECK_AND_UNSET (INSTALL_DIR_DATA) |
| 30 | OCCT_CHECK_AND_UNSET (INSTALL_DIR_SAMPLES) |
| 31 | OCCT_CHECK_AND_UNSET (INSTALL_DIR_TESTS) |
| 32 | OCCT_CHECK_AND_UNSET (INSTALL_DIR_DOC) |
| 33 | endmacro() |
| 34 | |
| 35 | # COMPILER_BITNESS variable |
| 36 | macro (OCCT_MAKE_COMPILER_BITNESS) |
| 37 | math (EXPR COMPILER_BITNESS "32 + 32*(${CMAKE_SIZEOF_VOID_P}/8)") |
| 38 | endmacro() |
| 39 | |
| 40 | # OS_WITH_BIT |
| 41 | macro (OCCT_MAKE_OS_WITH_BITNESS) |
| 42 | |
| 43 | OCCT_MAKE_COMPILER_BITNESS() |
| 44 | |
| 45 | if (WIN32) |
| 46 | set (OS_WITH_BIT "win${COMPILER_BITNESS}") |
| 47 | elseif(APPLE) |
| 48 | set (OS_WITH_BIT "mac${COMPILER_BITNESS}") |
| 49 | else() |
| 50 | set (OS_WITH_BIT "lin${COMPILER_BITNESS}") |
| 51 | endif() |
| 52 | endmacro() |
| 53 | |
| 54 | # COMPILER variable |
| 55 | macro (OCCT_MAKE_COMPILER_SHORT_NAME) |
| 56 | if (MSVC) |
| 57 | if ((MSVC_VERSION EQUAL 1300) OR (MSVC_VERSION EQUAL 1310)) |
| 58 | set (COMPILER vc7) |
| 59 | elseif (MSVC_VERSION EQUAL 1400) |
| 60 | set (COMPILER vc8) |
| 61 | elseif (MSVC_VERSION EQUAL 1500) |
| 62 | set (COMPILER vc9) |
| 63 | elseif (MSVC_VERSION EQUAL 1600) |
| 64 | set (COMPILER vc10) |
| 65 | elseif (MSVC_VERSION EQUAL 1700) |
| 66 | set (COMPILER vc11) |
| 67 | elseif (MSVC_VERSION EQUAL 1800) |
| 68 | set (COMPILER vc12) |
| 69 | elseif (MSVC_VERSION EQUAL 1900) |
| 70 | set (COMPILER vc14) |
| 71 | elseif ((MSVC_VERSION GREATER 1900) AND (MSVC_VERSION LESS 2000)) |
| 72 | # Since Visual Studio 15 (2017), its version diverged from version of |
| 73 | # compiler which is 14.1; as that compiler uses the same run-time as 14.0, |
| 74 | # we keep its id as "vc14" to be compatibille |
| 75 | set (COMPILER vc14) |
| 76 | else() |
| 77 | message (FATAL_ERROR "Unrecognized MSVC_VERSION") |
| 78 | endif() |
| 79 | elseif (DEFINED CMAKE_COMPILER_IS_GNUCC) |
| 80 | set (COMPILER gcc) |
| 81 | elseif (DEFINED CMAKE_COMPILER_IS_GNUCXX) |
| 82 | set (COMPILER gxx) |
| 83 | elseif (CMAKE_CXX_COMPILER_ID MATCHES "[Cc][Ll][Aa][Nn][Gg]") |
| 84 | set (COMPILER clang) |
| 85 | elseif (CMAKE_CXX_COMPILER_ID MATCHES "[Ii][Nn][Tt][Ee][Ll]") |
| 86 | set (COMPILER icc) |
| 87 | else() |
| 88 | set (COMPILER ${CMAKE_GENERATOR}) |
| 89 | string (REGEX REPLACE " " "" COMPILER ${COMPILER}) |
| 90 | endif() |
| 91 | endmacro() |
| 92 | |
| 93 | function (SUBDIRECTORY_NAMES MAIN_DIRECTORY RESULT) |
| 94 | file (GLOB SUB_ITEMS "${MAIN_DIRECTORY}/*") |
| 95 | |
| 96 | foreach (ITEM ${SUB_ITEMS}) |
| 97 | if (IS_DIRECTORY "${ITEM}") |
| 98 | get_filename_component (ITEM_NAME "${ITEM}" NAME) |
| 99 | list (APPEND LOCAL_RESULT "${ITEM_NAME}") |
| 100 | endif() |
| 101 | endforeach() |
| 102 | set (${RESULT} ${LOCAL_RESULT} PARENT_SCOPE) |
| 103 | endfunction() |
| 104 | |
| 105 | function (FIND_SUBDIRECTORY ROOT_DIRECTORY DIRECTORY_SUFFIX SUBDIRECTORY_NAME) |
| 106 | #message("Trying to find directory with suffix ${DIRECTORY_SUFFIX} in ${ROOT_DIRECTORY}") |
| 107 | SUBDIRECTORY_NAMES ("${ROOT_DIRECTORY}" SUBDIR_NAME_LIST) |
| 108 | #message("Subdirectories: ${SUBDIR_NAME_LIST}") |
| 109 | |
| 110 | #set(${SUBDIRECTORY_NAME} "${SUBDIR_NAME_LIST}" PARENT_SCOPE) |
| 111 | |
| 112 | foreach (SUBDIR_NAME ${SUBDIR_NAME_LIST}) |
| 113 | #message("Subdir: ${SUBDIR_NAME}, ${DIRECTORY_SUFFIX}") |
| 114 | # REGEX failed if the directory name contains '++' combination, so we replace it |
| 115 | string(REPLACE "+" "\\+" SUBDIR_NAME_ESCAPED ${SUBDIR_NAME}) |
| 116 | string (REGEX MATCH "${SUBDIR_NAME_ESCAPED}" DOES_PATH_CONTAIN "${DIRECTORY_SUFFIX}") |
| 117 | if (DOES_PATH_CONTAIN) |
| 118 | set(${SUBDIRECTORY_NAME} "${ROOT_DIRECTORY}/${SUBDIR_NAME}" PARENT_SCOPE) |
| 119 | #message("Subdirectory is found: ${SUBDIRECTORY_NAME}") |
| 120 | BREAK() |
| 121 | else() |
| 122 | #message("Check directory: ${ROOT_DIRECTORY}/${SUBDIR_NAME}") |
| 123 | FIND_SUBDIRECTORY ("${ROOT_DIRECTORY}/${SUBDIR_NAME}" "${DIRECTORY_SUFFIX}" SUBDIR_REC_NAME) |
| 124 | if (NOT "${SUBDIR_REC_NAME}" STREQUAL "") |
| 125 | set(${SUBDIRECTORY_NAME} "${SUBDIR_REC_NAME}" PARENT_SCOPE) |
| 126 | #message("Subdirectory is found: ${SUBDIRECTORY_NAME}") |
| 127 | BREAK() |
| 128 | endif() |
| 129 | endif() |
| 130 | endforeach() |
| 131 | endfunction() |
| 132 | |
| 133 | function (OCCT_ORIGIN_AND_PATCHED_FILES RELATIVE_PATH SEARCH_TEMPLATE RESULT) |
| 134 | |
| 135 | if (BUILD_PATCH AND EXISTS "${BUILD_PATCH}/${RELATIVE_PATH}") |
| 136 | file (GLOB FOUND_FILES "${BUILD_PATCH}/${RELATIVE_PATH}/${SEARCH_TEMPLATE}") |
| 137 | endif() |
| 138 | |
| 139 | file (GLOB ORIGIN_FILES "${CMAKE_SOURCE_DIR}/${RELATIVE_PATH}/${SEARCH_TEMPLATE}") |
| 140 | foreach (ORIGIN_FILE ${ORIGIN_FILES}) |
| 141 | # check for existence of patched version of current file |
| 142 | if (NOT BUILD_PATCH OR NOT EXISTS "${BUILD_PATCH}/${RELATIVE_PATH}") |
| 143 | list (APPEND FOUND_FILES ${ORIGIN_FILE}) |
| 144 | else() |
| 145 | get_filename_component (ORIGIN_FILE_NAME "${ORIGIN_FILE}" NAME) |
| 146 | if (NOT EXISTS "${BUILD_PATCH}/${RELATIVE_PATH}/${ORIGIN_FILE_NAME}") |
| 147 | list (APPEND FOUND_FILES ${ORIGIN_FILE}) |
| 148 | endif() |
| 149 | endif() |
| 150 | endforeach() |
| 151 | |
| 152 | set (${RESULT} ${FOUND_FILES} PARENT_SCOPE) |
| 153 | endfunction() |
| 154 | |
| 155 | function (FIND_PRODUCT_DIR ROOT_DIR PRODUCT_NAME RESULT) |
| 156 | OCCT_MAKE_COMPILER_SHORT_NAME() |
| 157 | OCCT_MAKE_COMPILER_BITNESS() |
| 158 | |
| 159 | string (TOLOWER "${PRODUCT_NAME}" lower_PRODUCT_NAME) |
| 160 | if ("${lower_PRODUCT_NAME}" STREQUAL "egl") |
| 161 | string (SUBSTRING "${lower_PRODUCT_NAME}" 1 -1 lower_PRODUCT_NAME) |
| 162 | list (APPEND SEARCH_TEMPLATES "[^gl]+${lower_PRODUCT_NAME}.*") |
| 163 | elseif ("${lower_PRODUCT_NAME}" STREQUAL "tbb") |
| 164 | list (APPEND SEARCH_TEMPLATES "^.*${lower_PRODUCT_NAME}.*") |
| 165 | else() |
| 166 | list (APPEND SEARCH_TEMPLATES "^[^a-zA-Z]*${lower_PRODUCT_NAME}[^a-zA-Z]*${COMPILER}.*${COMPILER_BITNESS}") |
| 167 | list (APPEND SEARCH_TEMPLATES "^[^a-zA-Z]*${lower_PRODUCT_NAME}[^a-zA-Z]*[0-9.]+.*${COMPILER}.*${COMPILER_BITNESS}") |
| 168 | list (APPEND SEARCH_TEMPLATES "^[a-zA-Z]*[0-9]*-${lower_PRODUCT_NAME}[^a-zA-Z]*[0-9.]+.*${COMPILER}.*${COMPILER_BITNESS}") |
| 169 | list (APPEND SEARCH_TEMPLATES "^[^a-zA-Z]*${lower_PRODUCT_NAME}[^a-zA-Z]*[0-9.]+.*${COMPILER_BITNESS}") |
| 170 | list (APPEND SEARCH_TEMPLATES "^[^a-zA-Z]*${lower_PRODUCT_NAME}[^a-zA-Z]*.*${COMPILER_BITNESS}") |
| 171 | list (APPEND SEARCH_TEMPLATES "^[^a-zA-Z]*${lower_PRODUCT_NAME}[^a-zA-Z]*[0-9.]+") |
| 172 | list (APPEND SEARCH_TEMPLATES "^[^a-zA-Z]*${lower_PRODUCT_NAME}[^a-zA-Z]*") |
| 173 | endif() |
| 174 | |
| 175 | SUBDIRECTORY_NAMES ("${ROOT_DIR}" SUBDIR_NAME_LIST) |
| 176 | |
| 177 | foreach (SEARCH_TEMPLATE ${SEARCH_TEMPLATES}) |
| 178 | if (LOCAL_RESULT) |
| 179 | BREAK() |
| 180 | endif() |
| 181 | |
| 182 | foreach (SUBDIR_NAME ${SUBDIR_NAME_LIST}) |
| 183 | string (TOLOWER "${SUBDIR_NAME}" lower_SUBDIR_NAME) |
| 184 | |
| 185 | string (REGEX MATCH "${SEARCH_TEMPLATE}" DUMMY_VAR "${lower_SUBDIR_NAME}") |
| 186 | if (DUMMY_VAR) |
| 187 | list (APPEND LOCAL_RESULT ${SUBDIR_NAME}) |
| 188 | endif() |
| 189 | endforeach() |
| 190 | endforeach() |
| 191 | |
| 192 | if (LOCAL_RESULT) |
| 193 | list (GET LOCAL_RESULT -1 DUMMY) |
| 194 | set (${RESULT} ${DUMMY} PARENT_SCOPE) |
| 195 | endif() |
| 196 | endfunction() |
| 197 | |
| 198 | macro (OCCT_INSTALL_FILE_OR_DIR BEING_INSTALLED_OBJECT DESTINATION_PATH) |
| 199 | if (BUILD_PATCH AND EXISTS "${BUILD_PATCH}/${BEING_INSTALLED_OBJECT}") |
| 200 | if (IS_DIRECTORY "${BUILD_PATCH}/${BEING_INSTALLED_OBJECT}") |
| 201 | # first of all, install original files |
| 202 | install (DIRECTORY "${CMAKE_SOURCE_DIR}/${BEING_INSTALLED_OBJECT}" DESTINATION "${DESTINATION_PATH}") |
| 203 | |
| 204 | # secondly, rewrite original files with patched ones |
| 205 | install (DIRECTORY "${BUILD_PATCH}/${BEING_INSTALLED_OBJECT}" DESTINATION "${DESTINATION_PATH}") |
| 206 | else() |
| 207 | install (FILES "${BUILD_PATCH}/${BEING_INSTALLED_OBJECT}" DESTINATION "${DESTINATION_PATH}") |
| 208 | endif() |
| 209 | else() |
| 210 | if (IS_DIRECTORY "${CMAKE_SOURCE_DIR}/${BEING_INSTALLED_OBJECT}") |
| 211 | install (DIRECTORY "${CMAKE_SOURCE_DIR}/${BEING_INSTALLED_OBJECT}" DESTINATION "${DESTINATION_PATH}") |
| 212 | else() |
| 213 | install (FILES "${CMAKE_SOURCE_DIR}/${BEING_INSTALLED_OBJECT}" DESTINATION "${DESTINATION_PATH}") |
| 214 | endif() |
| 215 | endif() |
| 216 | endmacro() |
| 217 | |
| 218 | macro (OCCT_CONFIGURE_AND_INSTALL BEING_CONGIRUGED_FILE BUILD_NAME INSTALL_NAME DESTINATION_PATH) |
| 219 | if (BUILD_PATCH AND EXISTS "${BUILD_PATCH}/${BEING_CONGIRUGED_FILE}") |
| 220 | configure_file("${BUILD_PATCH}/${BEING_CONGIRUGED_FILE}" "${BUILD_NAME}" @ONLY) |
| 221 | else() |
| 222 | configure_file("${CMAKE_SOURCE_DIR}/${BEING_CONGIRUGED_FILE}" "${BUILD_NAME}" @ONLY) |
| 223 | endif() |
| 224 | |
| 225 | install(FILES "${OCCT_BINARY_DIR}/${BUILD_NAME}" DESTINATION "${DESTINATION_PATH}" RENAME ${INSTALL_NAME}) |
| 226 | endmacro() |
| 227 | |
| 228 | macro (COLLECT_AND_INSTALL_OCCT_HEADER_FILES ROOT_TARGET_OCCT_DIR OCCT_BUILD_TOOLKITS OCCT_COLLECT_SOURCE_DIR OCCT_INSTALL_DIR_PREFIX) |
| 229 | set (OCCT_USED_PACKAGES) |
| 230 | |
| 231 | # consider patched header.in template |
| 232 | set (TEMPLATE_HEADER_PATH "${CMAKE_SOURCE_DIR}/adm/templates/header.in") |
| 233 | if (BUILD_PATCH AND EXISTS "${BUILD_PATCH}/adm/templates/header.in") |
| 234 | set (TEMPLATE_HEADER_PATH "${BUILD_PATCH}/adm/templates/header.in") |
| 235 | endif() |
| 236 | |
| 237 | set (ROOT_OCCT_DIR ${CMAKE_SOURCE_DIR}) |
| 238 | |
| 239 | foreach (OCCT_USED_TOOLKIT ${OCCT_BUILD_TOOLKITS}) |
| 240 | # append all required package folders |
| 241 | set (OCCT_TOOLKIT_PACKAGES) |
| 242 | if (BUILD_PATCH AND EXISTS "${BUILD_PATCH}/src/${OCCT_USED_TOOLKIT}/PACKAGES") |
| 243 | file (STRINGS "${BUILD_PATCH}/src/${OCCT_USED_TOOLKIT}/PACKAGES" OCCT_TOOLKIT_PACKAGES) |
| 244 | elseif (EXISTS "${OCCT_COLLECT_SOURCE_DIR}/${OCCT_USED_TOOLKIT}/PACKAGES") |
| 245 | file (STRINGS "${OCCT_COLLECT_SOURCE_DIR}/${OCCT_USED_TOOLKIT}/PACKAGES" OCCT_TOOLKIT_PACKAGES) |
| 246 | endif() |
| 247 | |
| 248 | list (APPEND OCCT_USED_PACKAGES ${OCCT_TOOLKIT_PACKAGES}) |
| 249 | endforeach() |
| 250 | |
| 251 | list (REMOVE_DUPLICATES OCCT_USED_PACKAGES) |
| 252 | |
| 253 | set (OCCT_HEADER_FILES_COMPLETE) |
| 254 | set (OCCT_HEADER_FILE_NAMES_NOT_IN_FILES) |
| 255 | set (OCCT_HEADER_FILE_WITH_PROPER_NAMES) |
| 256 | |
| 257 | string(TIMESTAMP CURRENT_TIME "%H:%M:%S") |
| 258 | message (STATUS "Info: \(${CURRENT_TIME}\) Compare FILES with files in package directories...") |
| 259 | |
| 260 | foreach (OCCT_PACKAGE ${OCCT_USED_PACKAGES}) |
| 261 | if (BUILD_PATCH AND EXISTS "${BUILD_PATCH}/src/${OCCT_PACKAGE}/FILES") |
| 262 | file (STRINGS "${BUILD_PATCH}/src/${OCCT_PACKAGE}/FILES" OCCT_ALL_FILE_NAMES) |
| 263 | elseif (EXISTS "${OCCT_COLLECT_SOURCE_DIR}/${OCCT_PACKAGE}/FILES") |
| 264 | file (STRINGS "${OCCT_COLLECT_SOURCE_DIR}/${OCCT_PACKAGE}/FILES" OCCT_ALL_FILE_NAMES) |
| 265 | else() |
| 266 | message (WARNING "FILES has not been found in ${OCCT_COLLECT_SOURCE_DIR}/${OCCT_PACKAGE}") |
| 267 | continue() |
| 268 | endif() |
| 269 | |
| 270 | list (LENGTH OCCT_ALL_FILE_NAMES ALL_FILES_NB) |
| 271 | math (EXPR ALL_FILES_NB "${ALL_FILES_NB} - 1" ) |
| 272 | |
| 273 | # emit warnings if there are unprocessed headers |
| 274 | file (GLOB OCCT_ALL_FILES_IN_DIR "${OCCT_COLLECT_SOURCE_DIR}/${OCCT_PACKAGE}/*.*") |
| 275 | file (GLOB OCCT_ALL_FILES_IN_PATCH_DIR "${BUILD_PATCH}/src/${OCCT_PACKAGE}/*.*") |
| 276 | |
| 277 | # use patched header files |
| 278 | foreach (OCCT_FILE_IN_PATCH_DIR ${OCCT_ALL_FILES_IN_PATCH_DIR}) |
| 279 | get_filename_component (OCCT_FILE_IN_PATCH_DIR_NAME ${OCCT_FILE_IN_PATCH_DIR} NAME) |
| 280 | list (REMOVE_ITEM OCCT_ALL_FILES_IN_DIR "${OCCT_COLLECT_SOURCE_DIR}/${OCCT_PACKAGE}/${OCCT_FILE_IN_PATCH_DIR_NAME}") |
| 281 | list (APPEND OCCT_ALL_FILES_IN_DIR "${OCCT_FILE_IN_PATCH_DIR}") |
| 282 | endforeach() |
| 283 | |
| 284 | foreach (OCCT_FILE_IN_DIR ${OCCT_ALL_FILES_IN_DIR}) |
| 285 | get_filename_component (OCCT_FILE_IN_DIR_NAME ${OCCT_FILE_IN_DIR} NAME) |
| 286 | |
| 287 | set (OCCT_FILE_IN_DIR_STATUS OFF) |
| 288 | |
| 289 | if (${ALL_FILES_NB} LESS 0) |
| 290 | break() |
| 291 | endif() |
| 292 | |
| 293 | foreach (FILE_INDEX RANGE ${ALL_FILES_NB}) |
| 294 | list (GET OCCT_ALL_FILE_NAMES ${FILE_INDEX} OCCT_FILE_NAME) |
| 295 | |
| 296 | string (REGEX REPLACE "[^:]+:+" "" OCCT_FILE_NAME "${OCCT_FILE_NAME}") |
| 297 | |
| 298 | if ("${OCCT_FILE_IN_DIR_NAME}" STREQUAL "${OCCT_FILE_NAME}") |
| 299 | set (OCCT_FILE_IN_DIR_STATUS ON) |
| 300 | |
| 301 | string (REGEX MATCH ".+\\.[hlg]xx|.+\\.h$" IS_HEADER_FOUND "${OCCT_FILE_NAME}") |
| 302 | if (IS_HEADER_FOUND) |
| 303 | list (APPEND OCCT_HEADER_FILES_COMPLETE ${OCCT_FILE_IN_DIR}) |
| 304 | |
| 305 | # collect header files with name that does not contain its package one |
| 306 | string (REGEX MATCH "^${OCCT_PACKAGE}[_.]" IS_HEADER_MATHCING_PACKAGE "${OCCT_FILE_NAME}") |
| 307 | if (NOT IS_HEADER_MATHCING_PACKAGE) |
| 308 | list (APPEND OCCT_HEADER_FILE_WITH_PROPER_NAMES "${OCCT_FILE_NAME}") |
| 309 | endif() |
| 310 | endif() |
| 311 | |
| 312 | # remove found element from list |
| 313 | list (REMOVE_AT OCCT_ALL_FILE_NAMES ${FILE_INDEX}) |
| 314 | math (EXPR ALL_FILES_NB "${ALL_FILES_NB} - 1" ) # decrement number |
| 315 | |
| 316 | break() |
| 317 | endif() |
| 318 | endforeach() |
| 319 | |
| 320 | if (NOT OCCT_FILE_IN_DIR_STATUS) |
| 321 | message (STATUS "Warning. File ${OCCT_FILE_IN_DIR} is not listed in ${OCCT_COLLECT_SOURCE_DIR}/${OCCT_PACKAGE}/FILES") |
| 322 | |
| 323 | string (REGEX MATCH ".+\\.[hlg]xx|.+\\.h$" IS_HEADER_FOUND "${OCCT_FILE_NAME}") |
| 324 | if (IS_HEADER_FOUND) |
| 325 | list (APPEND OCCT_HEADER_FILE_NAMES_NOT_IN_FILES ${OCCT_FILE_NAME}) |
| 326 | endif() |
| 327 | endif() |
| 328 | endforeach() |
| 329 | endforeach() |
| 330 | |
| 331 | # create new file including found header |
| 332 | string(TIMESTAMP CURRENT_TIME "%H:%M:%S") |
| 333 | message (STATUS "Info: \(${CURRENT_TIME}\) Create header-links in inc folder...") |
| 334 | |
| 335 | foreach (OCCT_HEADER_FILE ${OCCT_HEADER_FILES_COMPLETE}) |
| 336 | get_filename_component (HEADER_FILE_NAME ${OCCT_HEADER_FILE} NAME) |
| 337 | set (OCCT_HEADER_FILE_CONTENT "#include \"${OCCT_HEADER_FILE}\"") |
| 338 | configure_file ("${TEMPLATE_HEADER_PATH}" "${ROOT_TARGET_OCCT_DIR}/${OCCT_INSTALL_DIR_PREFIX}/${HEADER_FILE_NAME}" @ONLY) |
| 339 | endforeach() |
| 340 | |
| 341 | install (FILES ${OCCT_HEADER_FILES_COMPLETE} DESTINATION "${INSTALL_DIR}/${OCCT_INSTALL_DIR_PREFIX}") |
| 342 | |
| 343 | string(TIMESTAMP CURRENT_TIME "%H:%M:%S") |
| 344 | message (STATUS "Info: \(${CURRENT_TIME}\) Checking headers in inc folder...") |
| 345 | |
| 346 | file (GLOB OCCT_HEADER_FILES_OLD "${ROOT_TARGET_OCCT_DIR}/${OCCT_INSTALL_DIR_PREFIX}/*") |
| 347 | foreach (OCCT_HEADER_FILE_OLD ${OCCT_HEADER_FILES_OLD}) |
| 348 | get_filename_component (HEADER_FILE_NAME ${OCCT_HEADER_FILE_OLD} NAME) |
| 349 | string (REGEX MATCH "^[a-zA-Z0-9]+" PACKAGE_NAME "${HEADER_FILE_NAME}") |
| 350 | |
| 351 | list (FIND OCCT_USED_PACKAGES ${PACKAGE_NAME} IS_HEADER_FOUND) |
| 352 | if (NOT ${IS_HEADER_FOUND} EQUAL -1) |
| 353 | if (NOT EXISTS "${OCCT_COLLECT_SOURCE_DIR}/${PACKAGE_NAME}/${HEADER_FILE_NAME}") |
| 354 | message (STATUS "Warning. ${OCCT_HEADER_FILE_OLD} is not present in the sources and will be removed from ${ROOT_TARGET_OCCT_DIR}/inc") |
| 355 | file (REMOVE "${OCCT_HEADER_FILE_OLD}") |
| 356 | else() |
| 357 | list (FIND OCCT_HEADER_FILE_NAMES_NOT_IN_FILES ${PACKAGE_NAME} IS_HEADER_FOUND) |
| 358 | if (NOT ${IS_HEADER_FOUND} EQUAL -1) |
| 359 | message (STATUS "Warning. ${OCCT_HEADER_FILE_OLD} is present in the sources but not involved in FILES and will be removed from ${ROOT_TARGET_OCCT_DIR}/inc") |
| 360 | file (REMOVE "${OCCT_HEADER_FILE_OLD}") |
| 361 | endif() |
| 362 | endif() |
| 363 | else() |
| 364 | set (IS_HEADER_FOUND -1) |
| 365 | if (NOT "${OCCT_HEADER_FILE_WITH_PROPER_NAMES}" STREQUAL "") |
| 366 | list (FIND OCCT_HEADER_FILE_WITH_PROPER_NAMES ${HEADER_FILE_NAME} IS_HEADER_FOUND) |
| 367 | endif() |
| 368 | |
| 369 | if (${IS_HEADER_FOUND} EQUAL -1) |
| 370 | message (STATUS "Warning. \(${PACKAGE_NAME}\) ${OCCT_HEADER_FILE_OLD} is not used and will be removed from ${ROOT_TARGET_OCCT_DIR}/inc") |
| 371 | file (REMOVE "${OCCT_HEADER_FILE_OLD}") |
| 372 | endif() |
| 373 | endif() |
| 374 | endforeach() |
| 375 | endmacro() |
| 376 | |
| 377 | macro (OCCT_COPY_FILE_OR_DIR BEING_COPIED_OBJECT DESTINATION_PATH) |
| 378 | # first of all, copy original files |
| 379 | if (EXISTS "${CMAKE_SOURCE_DIR}/${BEING_COPIED_OBJECT}") |
| 380 | file (COPY "${CMAKE_SOURCE_DIR}/${BEING_COPIED_OBJECT}" DESTINATION "${DESTINATION_PATH}") |
| 381 | endif() |
| 382 | |
| 383 | if (BUILD_PATCH AND EXISTS "${BUILD_PATCH}/${BEING_COPIED_OBJECT}") |
| 384 | # secondly, rewrite original files with patched ones |
| 385 | file (COPY "${BUILD_PATCH}/${BEING_COPIED_OBJECT}" DESTINATION "${DESTINATION_PATH}") |
| 386 | endif() |
| 387 | endmacro() |
| 388 | |
| 389 | macro (OCCT_CONFIGURE BEING_CONGIRUGED_FILE FINAL_NAME) |
| 390 | if (BUILD_PATCH AND EXISTS "${BUILD_PATCH}/${BEING_CONGIRUGED_FILE}") |
| 391 | configure_file("${BUILD_PATCH}/${BEING_CONGIRUGED_FILE}" "${FINAL_NAME}" @ONLY) |
| 392 | else() |
| 393 | configure_file("${CMAKE_SOURCE_DIR}/${BEING_CONGIRUGED_FILE}" "${FINAL_NAME}" @ONLY) |
| 394 | endif() |
| 395 | endmacro() |
| 396 | |
| 397 | macro (OCCT_ADD_SUBDIRECTORY BEING_ADDED_DIRECTORY) |
| 398 | if (BUILD_PATCH AND EXISTS "${BUILD_PATCH}/${BEING_ADDED_DIRECTORY}/CMakeLists.txt") |
| 399 | add_subdirectory(${BUILD_PATCH}/${BEING_ADDED_DIRECTORY}) |
| 400 | elseif (EXISTS "${CMAKE_SOURCE_DIR}/${BEING_ADDED_DIRECTORY}/CMakeLists.txt") |
| 401 | add_subdirectory (${CMAKE_SOURCE_DIR}/${BEING_ADDED_DIRECTORY}) |
| 402 | else() |
| 403 | message (STATUS "${BEING_ADDED_DIRECTORY} directory is not included") |
| 404 | endif() |
| 405 | endmacro() |
| 406 | |
| 407 | function (OCCT_IS_PRODUCT_REQUIRED CSF_VAR_NAME USE_PRODUCT) |
| 408 | set (${USE_PRODUCT} OFF PARENT_SCOPE) |
| 409 | |
| 410 | if (NOT BUILD_TOOLKITS) |
| 411 | message(STATUS "Warning: the list of being used toolkits is empty") |
| 412 | else() |
| 413 | foreach (USED_TOOLKIT ${BUILD_TOOLKITS}) |
| 414 | if (BUILD_PATCH AND EXISTS "${BUILD_PATCH}/src/${USED_TOOLKIT}/EXTERNLIB") |
| 415 | file (READ "${BUILD_PATCH}/src/${USED_TOOLKIT}/EXTERNLIB" FILE_CONTENT) |
| 416 | elseif (EXISTS "${CMAKE_SOURCE_DIR}/src/${USED_TOOLKIT}/EXTERNLIB") |
| 417 | file (READ "${CMAKE_SOURCE_DIR}/src/${USED_TOOLKIT}/EXTERNLIB" FILE_CONTENT) |
| 418 | endif() |
| 419 | |
| 420 | string (REGEX MATCH "${CSF_VAR_NAME}" DOES_FILE_CONTAIN "${FILE_CONTENT}") |
| 421 | |
| 422 | if (DOES_FILE_CONTAIN) |
| 423 | set (${USE_PRODUCT} ON PARENT_SCOPE) |
| 424 | break() |
| 425 | endif() |
| 426 | endforeach() |
| 427 | endif() |
| 428 | endfunction() |
| 429 | |
| 430 | function (FILE_TO_LIST FILE_NAME FILE_CONTENT) |
| 431 | set (LOCAL_FILE_CONTENT) |
| 432 | if (BUILD_PATCH AND EXISTS "${BUILD_PATCH}/${FILE_NAME}") |
| 433 | file (STRINGS "${BUILD_PATCH}/${FILE_NAME}" LOCAL_FILE_CONTENT) |
| 434 | elseif (EXISTS "${CMAKE_SOURCE_DIR}/${FILE_NAME}") |
| 435 | file (STRINGS "${CMAKE_SOURCE_DIR}/${FILE_NAME}" LOCAL_FILE_CONTENT) |
| 436 | endif() |
| 437 | |
| 438 | set (${FILE_CONTENT} ${LOCAL_FILE_CONTENT} PARENT_SCOPE) |
| 439 | endfunction() |
| 440 | |
| 441 | # Function to determine if TOOLKIT is OCCT toolkit |
| 442 | function (IS_OCCT_TOOLKIT TOOLKIT_NAME MODULES IS_TOOLKIT_FOUND) |
| 443 | set (${IS_TOOLKIT_FOUND} OFF PARENT_SCOPE) |
| 444 | foreach (MODULE ${${MODULES}}) |
| 445 | set (TOOLKITS ${${MODULE}_TOOLKITS}) |
| 446 | list (FIND TOOLKITS ${TOOLKIT_NAME} FOUND) |
| 447 | |
| 448 | if (NOT ${FOUND} EQUAL -1) |
| 449 | set (${IS_TOOLKIT_FOUND} ON PARENT_SCOPE) |
| 450 | endif() |
| 451 | endforeach(MODULE) |
| 452 | endfunction() |
| 453 | |
| 454 | # TOOLKIT_DEPS is defined with dependencies from file src/TOOLKIT_NAME/EXTERNLIB. |
| 455 | # CSF_ variables are ignored |
| 456 | function (OCCT_TOOLKIT_DEP TOOLKIT_NAME TOOLKIT_DEPS) |
| 457 | FILE_TO_LIST ("src/${TOOLKIT_NAME}/EXTERNLIB" FILE_CONTENT) |
| 458 | |
| 459 | #list (APPEND LOCAL_TOOLKIT_DEPS ${TOOLKIT_NAME}) |
| 460 | set (LOCAL_TOOLKIT_DEPS) |
| 461 | foreach (FILE_CONTENT_LINE ${FILE_CONTENT}) |
| 462 | string (REGEX MATCH "^TK" TK_FOUND ${FILE_CONTENT_LINE}) |
| 463 | if ("x${FILE_CONTENT_LINE}" STREQUAL "xDRAWEXE" OR NOT "${TK_FOUND}" STREQUAL "") |
| 464 | list (APPEND LOCAL_TOOLKIT_DEPS ${FILE_CONTENT_LINE}) |
| 465 | endif() |
| 466 | endforeach() |
| 467 | |
| 468 | set (${TOOLKIT_DEPS} ${LOCAL_TOOLKIT_DEPS} PARENT_SCOPE) |
| 469 | endfunction() |
| 470 | |
| 471 | # TOOLKIT_FULL_DEPS is defined with complete dependencies (all levels) |
| 472 | function (OCCT_TOOLKIT_FULL_DEP TOOLKIT_NAME TOOLKIT_FULL_DEPS) |
| 473 | # first level dependencies are stored in LOCAL_TOOLKIT_FULL_DEPS |
| 474 | OCCT_TOOLKIT_DEP (${TOOLKIT_NAME} LOCAL_TOOLKIT_FULL_DEPS) |
| 475 | |
| 476 | list (LENGTH LOCAL_TOOLKIT_FULL_DEPS LIST_LENGTH) |
| 477 | set (LIST_INDEX 0) |
| 478 | while (LIST_INDEX LESS LIST_LENGTH) |
| 479 | list (GET LOCAL_TOOLKIT_FULL_DEPS ${LIST_INDEX} CURRENT_TOOLKIT) |
| 480 | OCCT_TOOLKIT_DEP (${CURRENT_TOOLKIT} CURRENT_TOOLKIT_DEPS) |
| 481 | |
| 482 | # append toolkits are not contained |
| 483 | foreach (CURRENT_TOOLKIT_DEP ${CURRENT_TOOLKIT_DEPS}) |
| 484 | set (CURRENT_TOOLKIT_DEP_FOUND OFF) |
| 485 | foreach (LOCAL_TOOLKIT_FULL_DEP ${LOCAL_TOOLKIT_FULL_DEPS}) |
| 486 | if ("${CURRENT_TOOLKIT_DEP}" STREQUAL "${LOCAL_TOOLKIT_FULL_DEP}") |
| 487 | set (CURRENT_TOOLKIT_DEP_FOUND ON) |
| 488 | break() |
| 489 | endif() |
| 490 | endforeach() |
| 491 | if ("${CURRENT_TOOLKIT_DEP_FOUND}" STREQUAL "OFF") |
| 492 | list (APPEND LOCAL_TOOLKIT_FULL_DEPS ${CURRENT_TOOLKIT_DEP}) |
| 493 | endif() |
| 494 | endforeach() |
| 495 | |
| 496 | # increment the list index |
| 497 | MATH(EXPR LIST_INDEX "${LIST_INDEX}+1") |
| 498 | |
| 499 | # calculate new length |
| 500 | list (LENGTH LOCAL_TOOLKIT_FULL_DEPS LIST_LENGTH) |
| 501 | endwhile() |
| 502 | |
| 503 | set (${TOOLKIT_FULL_DEPS} ${LOCAL_TOOLKIT_FULL_DEPS} PARENT_SCOPE) |
| 504 | endfunction() |
| 505 | |
| 506 | # Function to get list of modules/toolkits/samples from file adm/${FILE_NAME}. |
| 507 | # Creates list <$MODULE_LIST> to store list of MODULES and |
| 508 | # <NAME_OF_MODULE>_TOOLKITS foreach module to store its toolkits, where "TOOLKITS" is defined by TOOLKITS_NAME_SUFFIX. |
| 509 | function (OCCT_MODULES_AND_TOOLKITS FILE_NAME TOOLKITS_NAME_SUFFIX MODULE_LIST) |
| 510 | FILE_TO_LIST ("adm/${FILE_NAME}" FILE_CONTENT) |
| 511 | |
| 512 | foreach (CONTENT_LINE ${FILE_CONTENT}) |
| 513 | string (REPLACE " " ";" CONTENT_LINE ${CONTENT_LINE}) |
| 514 | list (GET CONTENT_LINE 0 MODULE_NAME) |
| 515 | list (REMOVE_AT CONTENT_LINE 0) |
| 516 | list (APPEND ${MODULE_LIST} ${MODULE_NAME}) |
| 517 | # (!) REMOVE THE LINE BELOW (implicit variables) |
| 518 | set (${MODULE_NAME}_${TOOLKITS_NAME_SUFFIX} ${CONTENT_LINE} PARENT_SCOPE) |
| 519 | endforeach() |
| 520 | |
| 521 | set (${MODULE_LIST} ${${MODULE_LIST}} PARENT_SCOPE) |
| 522 | endfunction() |
| 523 | |
| 524 | # Returns OCC version string from file Standard_Version.hxx (if available) |
| 525 | function (OCC_VERSION OCC_VERSION_MAJOR OCC_VERSION_MINOR OCC_VERSION_MAINTENANCE OCC_VERSION_DEVELOPMENT OCC_VERSION_STRING_EXT) |
| 526 | |
| 527 | set (OCC_VERSION_MAJOR 7) |
| 528 | set (OCC_VERSION_MINOR 0) |
| 529 | set (OCC_VERSION_MAINTENANCE 0) |
| 530 | set (OCC_VERSION_DEVELOPMENT dev) |
| 531 | set (OCC_VERSION_COMPLETE "7.0.0") |
| 532 | |
| 533 | set (STANDARD_VERSION_FILE "${CMAKE_SOURCE_DIR}/src/Standard/Standard_Version.hxx") |
| 534 | if (BUILD_PATCH AND EXISTS "${BUILD_PATCH}/src/Standard/Standard_Version.hxx") |
| 535 | set (STANDARD_VERSION_FILE "${BUILD_PATCH}/src/Standard/Standard_Version.hxx") |
| 536 | endif() |
| 537 | |
| 538 | if (EXISTS "${STANDARD_VERSION_FILE}") |
| 539 | foreach (SOUGHT_VERSION OCC_VERSION_MAJOR OCC_VERSION_MINOR OCC_VERSION_MAINTENANCE) |
| 540 | file (STRINGS "${STANDARD_VERSION_FILE}" ${SOUGHT_VERSION} REGEX "^#define ${SOUGHT_VERSION} .*") |
| 541 | string (REGEX REPLACE ".*${SOUGHT_VERSION} .*([^ ]+).*" "\\1" ${SOUGHT_VERSION} "${${SOUGHT_VERSION}}" ) |
| 542 | endforeach() |
| 543 | |
| 544 | foreach (SOUGHT_VERSION OCC_VERSION_DEVELOPMENT OCC_VERSION_COMPLETE) |
| 545 | file (STRINGS "${STANDARD_VERSION_FILE}" ${SOUGHT_VERSION} REGEX "^#define ${SOUGHT_VERSION} .*") |
| 546 | string (REGEX REPLACE ".*${SOUGHT_VERSION} .*\"([^ ]+)\".*" "\\1" ${SOUGHT_VERSION} "${${SOUGHT_VERSION}}" ) |
| 547 | endforeach() |
| 548 | endif() |
| 549 | |
| 550 | set (OCC_VERSION_MAJOR "${OCC_VERSION_MAJOR}" PARENT_SCOPE) |
| 551 | set (OCC_VERSION_MINOR "${OCC_VERSION_MINOR}" PARENT_SCOPE) |
| 552 | set (OCC_VERSION_MAINTENANCE "${OCC_VERSION_MAINTENANCE}" PARENT_SCOPE) |
| 553 | set (OCC_VERSION_DEVELOPMENT "${OCC_VERSION_DEVELOPMENT}" PARENT_SCOPE) |
| 554 | |
| 555 | if (OCC_VERSION_DEVELOPMENT AND OCC_VERSION_COMPLETE) |
| 556 | set (OCC_VERSION_STRING_EXT "${OCC_VERSION_COMPLETE}.${OCC_VERSION_DEVELOPMENT}" PARENT_SCOPE) |
| 557 | else() |
| 558 | set (OCC_VERSION_STRING_EXT "${OCC_VERSION_COMPLETE}" PARENT_SCOPE) |
| 559 | endif() |
| 560 | endfunction() |
| 561 | |
| 562 | macro (CHECK_PATH_FOR_CONSISTENCY THE_ROOT_PATH_NAME THE_BEING_CHECKED_PATH_NAME THE_VAR_TYPE THE_MESSAGE_OF_BEING_CHECKED_PATH) |
| 563 | |
| 564 | set (THE_ROOT_PATH "${${THE_ROOT_PATH_NAME}}") |
| 565 | set (THE_BEING_CHECKED_PATH "${${THE_BEING_CHECKED_PATH_NAME}}") |
| 566 | |
| 567 | if (THE_BEING_CHECKED_PATH OR EXISTS "${THE_BEING_CHECKED_PATH}") |
| 568 | get_filename_component (THE_ROOT_PATH_ABS "${THE_ROOT_PATH}" ABSOLUTE) |
| 569 | get_filename_component (THE_BEING_CHECKED_PATH_ABS "${THE_BEING_CHECKED_PATH}" ABSOLUTE) |
| 570 | |
| 571 | string (REGEX MATCH "${THE_ROOT_PATH_ABS}" DOES_PATH_CONTAIN "${THE_BEING_CHECKED_PATH_ABS}") |
| 572 | |
| 573 | if (NOT DOES_PATH_CONTAIN) # if cmake found the being checked path at different place from THE_ROOT_PATH_ABS |
| 574 | set (${THE_BEING_CHECKED_PATH_NAME} "" CACHE ${THE_VAR_TYPE} "${THE_MESSAGE_OF_BEING_CHECKED_PATH}" FORCE) |
| 575 | endif() |
| 576 | else() |
| 577 | set (${THE_BEING_CHECKED_PATH_NAME} "" CACHE ${THE_VAR_TYPE} "${THE_MESSAGE_OF_BEING_CHECKED_PATH}" FORCE) |
| 578 | endif() |
| 579 | |
| 580 | endmacro() |
| 581 | |
| 582 | # Adds OCCT_INSTALL_BIN_LETTER variable ("" for Release, "d" for Debug and |
| 583 | # "i" for RelWithDebInfo) in OpenCASCADETargets-*.cmake files during |
| 584 | # installation process. |
| 585 | # This and the following macros are used to overcome limitation of CMake |
| 586 | # prior to version 3.3 not supporting per-configuration install paths |
| 587 | # for install target files (see https://cmake.org/Bug/view.php?id=14317) |
| 588 | macro (OCCT_UPDATE_TARGET_FILE) |
| 589 | if (MSVC) |
| 590 | OCCT_INSERT_CODE_FOR_TARGET () |
| 591 | endif() |
| 592 | |
| 593 | install (CODE |
| 594 | "string (TOLOWER \"\${CMAKE_INSTALL_CONFIG_NAME}\" CMAKE_INSTALL_CONFIG_NAME_LOWERCASE) |
| 595 | file (GLOB ALL_OCCT_TARGET_FILES \"${INSTALL_DIR}/${INSTALL_DIR_CMAKE}/OpenCASCADE*Targets-\${CMAKE_INSTALL_CONFIG_NAME_LOWERCASE}.cmake\") |
| 596 | foreach(TARGET_FILENAME \${ALL_OCCT_TARGET_FILES}) |
| 597 | file (STRINGS \"\${TARGET_FILENAME}\" TARGET_FILE_CONTENT) |
| 598 | file (REMOVE \"\${TARGET_FILENAME}\") |
| 599 | foreach (line IN LISTS TARGET_FILE_CONTENT) |
| 600 | string (REGEX REPLACE \"[\\\\]?[\\\$]{OCCT_INSTALL_BIN_LETTER}\" \"\${OCCT_INSTALL_BIN_LETTER}\" line \"\${line}\") |
| 601 | file (APPEND \"\${TARGET_FILENAME}\" \"\${line}\\n\") |
| 602 | endforeach() |
| 603 | endforeach()") |
| 604 | endmacro() |
| 605 | |
| 606 | macro (OCCT_INSERT_CODE_FOR_TARGET) |
| 607 | install(CODE "if (\"\${CMAKE_INSTALL_CONFIG_NAME}\" MATCHES \"^([Rr][Ee][Ll][Ee][Aa][Ss][Ee])$\") |
| 608 | set (OCCT_INSTALL_BIN_LETTER \"\") |
| 609 | elseif (\"\${CMAKE_INSTALL_CONFIG_NAME}\" MATCHES \"^([Rr][Ee][Ll][Ww][Ii][Tt][Hh][Dd][Ee][Bb][Ii][Nn][Ff][Oo])$\") |
| 610 | set (OCCT_INSTALL_BIN_LETTER \"i\") |
| 611 | elseif (\"\${CMAKE_INSTALL_CONFIG_NAME}\" MATCHES \"^([Dd][Ee][Bb][Uu][Gg])$\") |
| 612 | set (OCCT_INSTALL_BIN_LETTER \"d\") |
| 613 | endif()") |
| 614 | endmacro() |
| 615 | |
| 616 | macro (OCCT_UPDATE_DRAW_DEFAULT_FILE) |
| 617 | install(CODE "set (DRAW_DEFAULT_FILE_NAME \"${INSTALL_DIR}/${INSTALL_DIR_RESOURCE}/DrawResources/DrawPlugin\") |
| 618 | file (STRINGS \"\${DRAW_DEFAULT_FILE_NAME}\" DRAW_DEFAULT_CONTENT) |
| 619 | file (REMOVE \"\${DRAW_DEFAULT_FILE_NAME}\") |
| 620 | foreach (line IN LISTS DRAW_DEFAULT_CONTENT) |
| 621 | string (REGEX MATCH \": TK\([a-zA-Z]+\)$\" IS_TK_LINE \"\${line}\") |
| 622 | string (REGEX REPLACE \": TK\([a-zA-Z]+\)$\" \": TK\${CMAKE_MATCH_1}${BUILD_SHARED_LIBRARY_NAME_POSTFIX}\" line \"\${line}\") |
| 623 | file (APPEND \"\${DRAW_DEFAULT_FILE_NAME}\" \"\${line}\\n\") |
| 624 | endforeach()") |
| 625 | endmacro() |
| 626 | |
| 627 | macro (OCCT_CREATE_SYMLINK_TO_FILE LIBRARY_NAME LINK_NAME) |
| 628 | if (NOT WIN32) |
| 629 | install (CODE "if (EXISTS \"${LIBRARY_NAME}\") |
| 630 | execute_process (COMMAND ln -s \"${LIBRARY_NAME}\" \"${LINK_NAME}\") |
| 631 | endif() |
| 632 | ") |
| 633 | endif() |
| 634 | endmacro() |