0029571: Samples: build qt samples together with OCCT
[occt.git] / adm / cmake / occt_toolkit.cmake
index 14acf42..689ed40 100644 (file)
@@ -1,28 +1,69 @@
 # script for each OCCT toolkit
 
+# filling some variables by default values(src) or using custom(tools, samples)
+set (RELATIVE_SOURCES_DIR "${RELATIVE_DIR}")
+if ("${RELATIVE_SOURCES_DIR}" STREQUAL "")
+  #if it is not defined, use default directory
+  set (RELATIVE_SOURCES_DIR "src")
+endif()
+
+set (OCC_MODULES_LIST "${MODULES_LIST}")
+if ("${OCC_MODULES_LIST}" STREQUAL "")
+  set (OCC_MODULES_LIST ${OCCT_MODULES})
+endif()
+
+set (OCC_TARGET_FOLDER "${TARGET_FOLDER}")
+if ("${OCC_TARGET_FOLDER}" STREQUAL "")
+  set (OCC_TARGET_FOLDER "Modules")
+endif()
+
+set (OCCT_TOOLKITS_NAME_SUFFIX "${TOOLKITS_NAME_SUFFIX}")
+if ("${OCCT_TOOLKITS_NAME_SUFFIX}" STREQUAL "")
+  set (OCCT_TOOLKITS_NAME_SUFFIX "TOOLKITS")
+endif()
+
 # parce PACKAGES file
-if ("${PROJECT_NAME}" STREQUAL DRAWEXE)
-  set (USED_PACKAGES DRAWEXE)
-else()
-  FILE_TO_LIST ("src/${PROJECT_NAME}/PACKAGES" USED_PACKAGES)
+FILE_TO_LIST ("${RELATIVE_SOURCES_DIR}/${PROJECT_NAME}/PACKAGES" USED_PACKAGES)
+if ("${USED_PACKAGES}" STREQUAL "")
+  set (USED_PACKAGES ${PROJECT_NAME})
 endif()
 
+if (USE_QT)
+  # Qt dependencies
+  OCCT_INCLUDE_CMAKE_FILE (adm/cmake/qt_macro)
+  FIND_QT_PACKAGE(PROJECT_LIBRARIES_DEBUG PROJECT_LIBRARIES_RELEASE PROJECT_INCLUDES)
+  include_directories("${PROJECT_INCLUDES}")
+endif(USE_QT)
+
 set (PRECOMPILED_DEFS)
 
 if (NOT BUILD_SHARED_LIBS)
   list (APPEND PRECOMPILED_DEFS "-DOCCT_NO_PLUGINS")
+  if (WIN32)
+    list (APPEND PRECOMPILED_DEFS "-DOCCT_STATIC_BUILD")
+  endif()
 endif()
 
 # Get all used packages from toolkit
+UNSET(RESOURCE_FILES)
 foreach (OCCT_PACKAGE ${USED_PACKAGES})
-  
+
+  #remove part after "/" in the OCCT_PACKAGE variable if exists
+  string (FIND "${OCCT_PACKAGE}" "/" _index)
+  if (_index GREATER -1)
+    math (EXPR _index "${_index}")
+    string (SUBSTRING "${OCCT_PACKAGE}" 0 ${_index} OCCT_PACKAGE_NAME)
+  else()
+    set (OCCT_PACKAGE_NAME "${OCCT_PACKAGE}")
+  endif()
+
   # TKService contains platform-dependent packages: Xw and WNT
   if ((WIN32 AND "${OCCT_PACKAGE}" STREQUAL "Xw") OR (NOT WIN32 AND "${OCCT_PACKAGE}" STREQUAL "WNT"))
     # do nothing
   else()
 
     if (WIN32)
-      list (APPEND PRECOMPILED_DEFS "-D__${OCCT_PACKAGE}_DLL")
+      list (APPEND PRECOMPILED_DEFS "-D__${OCCT_PACKAGE_NAME}_DLL")
     endif()
 
     set (SOURCE_FILES)
@@ -32,11 +73,11 @@ foreach (OCCT_PACKAGE ${USED_PACKAGES})
     if (${BUILD_YACCLEX})
 
       # flex files
-      OCCT_ORIGIN_AND_PATCHED_FILES ("src/${OCCT_PACKAGE}" "*[.]lex" SOURCE_FILES_FLEX)
+      OCCT_ORIGIN_AND_PATCHED_FILES ("${RELATIVE_SOURCES_DIR}/${OCCT_PACKAGE}" "*[.]lex" SOURCE_FILES_FLEX)
       list (LENGTH SOURCE_FILES_FLEX SOURCE_FILES_FLEX_LEN)
 
       # bison files
-      OCCT_ORIGIN_AND_PATCHED_FILES ("src/${OCCT_PACKAGE}" "*[.]yacc" SOURCE_FILES_BISON)
+      OCCT_ORIGIN_AND_PATCHED_FILES ("${RELATIVE_SOURCES_DIR}/${OCCT_PACKAGE}" "*[.]yacc" SOURCE_FILES_BISON)
       list (LENGTH SOURCE_FILES_BISON SOURCE_FILES_BISON_LEN)
 
       if (${SOURCE_FILES_FLEX_LEN} EQUAL ${SOURCE_FILES_BISON_LEN} AND NOT ${SOURCE_FILES_FLEX_LEN} EQUAL 0)
@@ -58,8 +99,8 @@ foreach (OCCT_PACKAGE ${USED_PACKAGES})
           if (EXISTS "${CURRENT_FLEX_FILE}" AND EXISTS "${CURRENT_BISON_FILE}" AND ${ARE_FILES_EQUAL})
             set (BISON_OUTPUT_FILE ${CURRENT_BISON_FILE_NAME}.tab.c)
             set (FLEX_OUTPUT_FILE lex.${CURRENT_FLEX_FILE_NAME}.c)
-            BISON_TARGET (Parser_${CURRENT_BISON_FILE_NAME} ${CURRENT_BISON_FILE} ${CMAKE_SOURCE_DIR}/src/${OCCT_PACKAGE}/${BISON_OUTPUT_FILE} COMPILE_FLAGS "-p ${CURRENT_BISON_FILE_NAME}")
-            FLEX_TARGET  (Scanner_${CURRENT_FLEX_FILE_NAME} ${CURRENT_FLEX_FILE} ${CMAKE_SOURCE_DIR}/src/${OCCT_PACKAGE}/${FLEX_OUTPUT_FILE} COMPILE_FLAGS "-P${CURRENT_FLEX_FILE_NAME}")
+            BISON_TARGET (Parser_${CURRENT_BISON_FILE_NAME} ${CURRENT_BISON_FILE} ${CMAKE_SOURCE_DIR}/${RELATIVE_SOURCES_DIR}/${OCCT_PACKAGE}/${BISON_OUTPUT_FILE} COMPILE_FLAGS "-p ${CURRENT_BISON_FILE_NAME}")
+            FLEX_TARGET  (Scanner_${CURRENT_FLEX_FILE_NAME} ${CURRENT_FLEX_FILE} ${CMAKE_SOURCE_DIR}/${RELATIVE_SOURCES_DIR}/${OCCT_PACKAGE}/${FLEX_OUTPUT_FILE} COMPILE_FLAGS "-P${CURRENT_FLEX_FILE_NAME}")
             ADD_FLEX_BISON_DEPENDENCY (Scanner_${CURRENT_FLEX_FILE_NAME} Parser_${CURRENT_BISON_FILE_NAME})
            
             list (APPEND SOURCE_FILES ${BISON_OUTPUT_FILE} ${FLEX_OUTPUT_FILE})
@@ -69,23 +110,23 @@ foreach (OCCT_PACKAGE ${USED_PACKAGES})
     endif()
 
     # header files
-    if (BUILD_PATCH AND EXISTS "${BUILD_PATCH}/src/${OCCT_PACKAGE}/FILES")
-      file (STRINGS "${BUILD_PATCH}/src/${OCCT_PACKAGE}/FILES" HEADER_FILES_M   REGEX ".+[.]h")
-      file (STRINGS "${BUILD_PATCH}/src/${OCCT_PACKAGE}/FILES" HEADER_FILES_LXX REGEX ".+[.]lxx")
-      file (STRINGS "${BUILD_PATCH}/src/${OCCT_PACKAGE}/FILES" HEADER_FILES_GXX REGEX ".+[.]gxx")
+    if (BUILD_PATCH AND EXISTS "${BUILD_PATCH}/${RELATIVE_SOURCES_DIR}/${OCCT_PACKAGE}/FILES")
+      file (STRINGS "${BUILD_PATCH}/${RELATIVE_SOURCES_DIR}/${OCCT_PACKAGE}/FILES" HEADER_FILES_M   REGEX ".+[.]h")
+      file (STRINGS "${BUILD_PATCH}/${RELATIVE_SOURCES_DIR}/${OCCT_PACKAGE}/FILES" HEADER_FILES_LXX REGEX ".+[.]lxx")
+      file (STRINGS "${BUILD_PATCH}/${RELATIVE_SOURCES_DIR}/${OCCT_PACKAGE}/FILES" HEADER_FILES_GXX REGEX ".+[.]gxx")
 
-      file (STRINGS "${BUILD_PATCH}/src/${OCCT_PACKAGE}/FILES" SOURCE_FILES_C REGEX ".+[.]c")
+      file (STRINGS "${BUILD_PATCH}/${RELATIVE_SOURCES_DIR}/${OCCT_PACKAGE}/FILES" SOURCE_FILES_C REGEX ".+[.]c")
       if(APPLE)
-        file (STRINGS "${BUILD_PATCH}/src/${OCCT_PACKAGE}/FILES" SOURCE_FILES_M REGEX ".+[.]mm")
+        file (STRINGS "${BUILD_PATCH}/${RELATIVE_SOURCES_DIR}/${OCCT_PACKAGE}/FILES" SOURCE_FILES_M REGEX ".+[.]mm")
       endif()
     else()
-      file (STRINGS "${CMAKE_SOURCE_DIR}/src/${OCCT_PACKAGE}/FILES"     HEADER_FILES_M   REGEX ".+[.]h")
-      file (STRINGS "${CMAKE_SOURCE_DIR}/src/${OCCT_PACKAGE}/FILES"     HEADER_FILES_LXX REGEX ".+[.]lxx")
-      file (STRINGS "${CMAKE_SOURCE_DIR}/src/${OCCT_PACKAGE}/FILES"     HEADER_FILES_GXX REGEX ".+[.]gxx")
+      file (STRINGS "${CMAKE_SOURCE_DIR}/${RELATIVE_SOURCES_DIR}/${OCCT_PACKAGE}/FILES"     HEADER_FILES_M   REGEX ".+[.]h")
+      file (STRINGS "${CMAKE_SOURCE_DIR}/${RELATIVE_SOURCES_DIR}/${OCCT_PACKAGE}/FILES"     HEADER_FILES_LXX REGEX ".+[.]lxx")
+      file (STRINGS "${CMAKE_SOURCE_DIR}/${RELATIVE_SOURCES_DIR}/${OCCT_PACKAGE}/FILES"     HEADER_FILES_GXX REGEX ".+[.]gxx")
 
-      file (STRINGS "${CMAKE_SOURCE_DIR}/src/${OCCT_PACKAGE}/FILES"     SOURCE_FILES_C REGEX ".+[.]c")
+      file (STRINGS "${CMAKE_SOURCE_DIR}/${RELATIVE_SOURCES_DIR}/${OCCT_PACKAGE}/FILES"     SOURCE_FILES_C REGEX ".+[.]c")
       if(APPLE)
-        file (STRINGS "${CMAKE_SOURCE_DIR}/src/${OCCT_PACKAGE}/FILES"   SOURCE_FILES_M REGEX ".+[.]mm")
+        file (STRINGS "${CMAKE_SOURCE_DIR}/${RELATIVE_SOURCES_DIR}/${OCCT_PACKAGE}/FILES"   SOURCE_FILES_M REGEX ".+[.]mm")
       endif()
     endif()
     
@@ -96,26 +137,36 @@ foreach (OCCT_PACKAGE ${USED_PACKAGES})
     endif()
 
     foreach(HEADER_FILE ${HEADER_FILES})
-      if (BUILD_PATCH AND EXISTS "${BUILD_PATCH}/src/${OCCT_PACKAGE}/${HEADER_FILE}")
-        message (STATUS "Info: consider patched file: ${BUILD_PATCH}/src/${OCCT_PACKAGE}/${HEADER_FILE}")
-        list (APPEND USED_INCFILES "${BUILD_PATCH}/src/${OCCT_PACKAGE}/${HEADER_FILE}")
-        SOURCE_GROUP ("Header Files\\${OCCT_PACKAGE}" FILES "${BUILD_PATCH}/src/${OCCT_PACKAGE}/${HEADER_FILE}")
+      if (BUILD_PATCH AND EXISTS "${BUILD_PATCH}/${RELATIVE_SOURCES_DIR}/${OCCT_PACKAGE}/${HEADER_FILE}")
+        message (STATUS "Info: consider patched file: ${BUILD_PATCH}/${RELATIVE_SOURCES_DIR}/${OCCT_PACKAGE}/${HEADER_FILE}")
+        list (APPEND USED_INCFILES "${BUILD_PATCH}/${RELATIVE_SOURCES_DIR}/${OCCT_PACKAGE}/${HEADER_FILE}")
+        SOURCE_GROUP ("Header Files\\${OCCT_PACKAGE_NAME}" FILES "${BUILD_PATCH}/${RELATIVE_SOURCES_DIR}/${OCCT_PACKAGE}/${HEADER_FILE}")
       else()
-        list (APPEND USED_INCFILES "${CMAKE_SOURCE_DIR}/src/${OCCT_PACKAGE}/${HEADER_FILE}")
-        SOURCE_GROUP ("Header Files\\${OCCT_PACKAGE}" FILES "${CMAKE_SOURCE_DIR}/src/${OCCT_PACKAGE}/${HEADER_FILE}")
+        list (APPEND USED_INCFILES "${CMAKE_SOURCE_DIR}/${RELATIVE_SOURCES_DIR}/${OCCT_PACKAGE}/${HEADER_FILE}")
+        SOURCE_GROUP ("Header Files\\${OCCT_PACKAGE_NAME}" FILES "${CMAKE_SOURCE_DIR}/${RELATIVE_SOURCES_DIR}/${OCCT_PACKAGE}/${HEADER_FILE}")
       endif()
     endforeach()
 
     foreach(SOURCE_FILE ${SOURCE_FILES})
-      if (BUILD_PATCH AND EXISTS "${BUILD_PATCH}/src/${OCCT_PACKAGE}/${SOURCE_FILE}")
-        message (STATUS "Info: consider patched file: ${BUILD_PATCH}/src/${OCCT_PACKAGE}/${SOURCE_FILE}")
-        list (APPEND USED_SRCFILES "${BUILD_PATCH}/src/${OCCT_PACKAGE}/${SOURCE_FILE}")
-        SOURCE_GROUP ("Source Files\\${OCCT_PACKAGE}" FILES "${BUILD_PATCH}/src/${OCCT_PACKAGE}/${SOURCE_FILE}")
+      if (BUILD_PATCH AND EXISTS "${BUILD_PATCH}/${RELATIVE_SOURCES_DIR}/${OCCT_PACKAGE}/${SOURCE_FILE}")
+        message (STATUS "Info: consider patched file: ${BUILD_PATCH}/${RELATIVE_SOURCES_DIR}/${OCCT_PACKAGE}/${SOURCE_FILE}")
+        list (APPEND USED_SRCFILES "${BUILD_PATCH}/${RELATIVE_SOURCES_DIR}/${OCCT_PACKAGE}/${SOURCE_FILE}")
+        SOURCE_GROUP ("Source Files\\${OCCT_PACKAGE_NAME}" FILES "${BUILD_PATCH}/${RELATIVE_SOURCES_DIR}/${OCCT_PACKAGE}/${SOURCE_FILE}")
       else()
-        list (APPEND USED_SRCFILES "${CMAKE_SOURCE_DIR}/src/${OCCT_PACKAGE}/${SOURCE_FILE}")
-        SOURCE_GROUP ("Source Files\\${OCCT_PACKAGE}" FILES "${CMAKE_SOURCE_DIR}/src/${OCCT_PACKAGE}/${SOURCE_FILE}")
+        list (APPEND USED_SRCFILES "${CMAKE_SOURCE_DIR}/${RELATIVE_SOURCES_DIR}/${OCCT_PACKAGE}/${SOURCE_FILE}")
+        SOURCE_GROUP ("Source Files\\${OCCT_PACKAGE_NAME}" FILES "${CMAKE_SOURCE_DIR}/${RELATIVE_SOURCES_DIR}/${OCCT_PACKAGE}/${SOURCE_FILE}")
       endif()
     endforeach()
+
+    if (USE_QT)
+      FIND_AND_INSTALL_QT_RESOURCES (${OCCT_PACKAGE} RESOURCE_FILES)
+      #message("Qt Resource files are: ${QT_RESOURCE_FILES} in ${OCCT_PACKAGE}")
+    endif(USE_QT)
+
+    #message("Resource files are: ${RESOURCE_FILES} in ${OCCT_PACKAGE}")
+    foreach(RESOURCE_FILE ${RESOURCE_FILES})
+      SOURCE_GROUP ("Resource Files\\${OCCT_PACKAGE_NAME}" FILES "${RESOURCE_FILE}")
+    endforeach()
   endif()
 endforeach()
 string (REGEX REPLACE ";" " " PRECOMPILED_DEFS "${PRECOMPILED_DEFS}")
@@ -132,28 +183,34 @@ if (MSVC)
 endif()
 
 set (CURRENT_MODULE)
-foreach (OCCT_MODULE ${OCCT_MODULES})
-  list (FIND ${OCCT_MODULE}_TOOLKITS ${PROJECT_NAME} CURRENT_PROJECT_IS_BUILT)
+foreach (OCCT_MODULE ${OCC_MODULES_LIST})
+  list (FIND ${OCCT_MODULE}_${OCCT_TOOLKITS_NAME_SUFFIX} ${PROJECT_NAME} CURRENT_PROJECT_IS_BUILT)
+
   if (NOT ${CURRENT_PROJECT_IS_BUILT} EQUAL -1)
     set (CURRENT_MODULE ${OCCT_MODULE})
   endif()
 endforeach()
 
-if (NOT SINGLE_GENERATOR)
+if (WIN32)
   OCCT_INSERT_CODE_FOR_TARGET ()
 endif()
 
-if ("${PROJECT_NAME}" STREQUAL "DRAWEXE")
-  add_executable (${PROJECT_NAME} ${USED_SRCFILES} ${USED_INCFILES} ${USED_RCFILE})
+if (USE_QT)
+  FIND_AND_WRAP_MOC_FILES("${USED_INCFILES}" "${PROJECT_NAME}_MOC_FILES")
+  #message("MOC files: ${${PROJECT_NAME}_MOC_FILES}")
+endif (USE_QT)
+
+if (EXECUTABLE_PROJECT)
+  add_executable (${PROJECT_NAME} ${USED_SRCFILES} ${USED_INCFILES} ${USED_RCFILE} ${RESOURCE_FILES} ${${PROJECT_NAME}_MOC_FILES})
 
   install (TARGETS ${PROJECT_NAME}
            DESTINATION "${INSTALL_DIR_BIN}\${OCCT_INSTALL_BIN_LETTER}")
 else()
-  add_library (${PROJECT_NAME} ${USED_SRCFILES} ${USED_INCFILES} ${USED_RCFILE})
+  add_library (${PROJECT_NAME} ${USED_SRCFILES} ${USED_INCFILES} ${USED_RCFILE} ${RESOURCE_FILES} ${${PROJECT_NAME}_MOC_FILES})
 
   if (MSVC)
-    install (FILES  ${CMAKE_BINARY_DIR}/${OS_WITH_BIT}/${COMPILER}/bind/${PROJECT_NAME}.pdb
-             CONFIGURATIONS Debug
+    install (FILES  ${CMAKE_BINARY_DIR}/${OS_WITH_BIT}/${COMPILER}/bin\${OCCT_INSTALL_BIN_LETTER}/${PROJECT_NAME}.pdb
+             CONFIGURATIONS Debug RelWithDebInfo
              DESTINATION "${INSTALL_DIR_BIN}\${OCCT_INSTALL_BIN_LETTER}")
   endif()
 
@@ -178,7 +235,7 @@ else()
 endif()
 
 if (CURRENT_MODULE)
-  set_target_properties (${PROJECT_NAME} PROPERTIES FOLDER "Modules/${CURRENT_MODULE}")
+  set_target_properties (${PROJECT_NAME} PROPERTIES FOLDER "${OCC_TARGET_FOLDER}/${CURRENT_MODULE}")
   set_target_properties (${PROJECT_NAME} PROPERTIES MODULE "${CURRENT_MODULE}")
   if (APPLE)
     if (NOT "${INSTALL_NAME_DIR}" STREQUAL "")
@@ -204,7 +261,7 @@ set (USED_TOOLKITS_BY_CURRENT_PROJECT)
 set (USED_EXTERNAL_LIBS_BY_CURRENT_PROJECT)
 
 # parce EXTERNLIB file
-FILE_TO_LIST ("src/${PROJECT_NAME}/EXTERNLIB" USED_EXTERNLIB_AND_TOOLKITS)
+FILE_TO_LIST ("${RELATIVE_SOURCES_DIR}/${PROJECT_NAME}/EXTERNLIB" USED_EXTERNLIB_AND_TOOLKITS)
 foreach (USED_ITEM ${USED_EXTERNLIB_AND_TOOLKITS})
   string (REGEX MATCH "^ *#" COMMENT_FOUND ${USED_ITEM})
   if (NOT COMMENT_FOUND)
@@ -213,16 +270,48 @@ foreach (USED_ITEM ${USED_EXTERNLIB_AND_TOOLKITS})
     
     if (NOT "${TK_FOUND}" STREQUAL "" OR NOT "${VTK_FOUND}" STREQUAL "")
       list (APPEND USED_TOOLKITS_BY_CURRENT_PROJECT ${USED_ITEM})
+      if (NOT "${VTK_FOUND}" STREQUAL "" AND BUILD_SHARED_LIBS AND INSTALL_VTK AND COMMAND OCCT_INSTALL_VTK)
+        OCCT_INSTALL_VTK(${USED_ITEM})
+      endif()
     else()
       string (REGEX MATCH "^CSF_" CSF_FOUND ${USED_ITEM})
       if ("${CSF_FOUND}" STREQUAL "")
         message (STATUS "Info: ${USED_ITEM} from ${PROJECT_NAME} skipped due to it is empty")
       else() # get CSF_ value
         set (CURRENT_CSF ${${USED_ITEM}})
-        if (NOT "${CURRENT_CSF}" STREQUAL "")
-          # prepare a list from a string with whitespaces
+        if (NOT "x${CURRENT_CSF}" STREQUAL "x")
+          set (LIBRARY_FROM_CACHE 0)
           separate_arguments (CURRENT_CSF)
-          list (APPEND USED_EXTERNAL_LIBS_BY_CURRENT_PROJECT ${CURRENT_CSF})
+          foreach (CSF_LIBRARY ${CURRENT_CSF})
+            string (TOLOWER "${CSF_LIBRARY}" CSF_LIBRARY)
+            string (REPLACE "+" "[+]" CSF_LIBRARY "${CSF_LIBRARY}")
+            string (REPLACE "." "" CSF_LIBRARY "${CSF_LIBRARY}")
+            get_cmake_property(ALL_CACHE_VARIABLES CACHE_VARIABLES)
+            string (REGEX MATCHALL "(^|;)3RDPARTY_[^;]+_LIBRARY[^;]*" ALL_CACHE_VARIABLES "${ALL_CACHE_VARIABLES}")
+            foreach (CACHE_VARIABLE ${ALL_CACHE_VARIABLES})
+              set (CURRENT_CACHE_LIBRARY ${${CACHE_VARIABLE}})
+              string (TOLOWER "${CACHE_VARIABLE}" CACHE_VARIABLE)
+
+              if (EXISTS "${CURRENT_CACHE_LIBRARY}" AND NOT IS_DIRECTORY "${CURRENT_CACHE_LIBRARY}")
+                string (REGEX MATCH "_${CSF_LIBRARY}$" IS_ENDING "${CACHE_VARIABLE}")
+                string (REGEX MATCH "^([a-z]+)" CSF_WO_VERSION "${CSF_LIBRARY}")
+                string (REGEX MATCH "_${CSF_WO_VERSION}$" IS_ENDING_WO_VERSION "${CACHE_VARIABLE}")
+                if ("3rdparty_${CSF_LIBRARY}_library" STREQUAL "${CACHE_VARIABLE}" OR
+                    "3rdparty_${CSF_WO_VERSION}_library" STREQUAL "${CACHE_VARIABLE}" OR
+                    NOT "x${IS_ENDING}" STREQUAL "x" OR
+                    NOT "x${IS_ENDING_WO_VERSION}" STREQUAL "x")
+                  list (APPEND USED_EXTERNAL_LIBS_BY_CURRENT_PROJECT "${CURRENT_CACHE_LIBRARY}")
+                  set (LIBRARY_FROM_CACHE 1)
+                endif()
+              endif()
+            endforeach()
+          endforeach()
+
+          if (NOT ${LIBRARY_FROM_CACHE})
+            # prepare a list from a string with whitespaces
+            separate_arguments (CURRENT_CSF)
+            list (APPEND USED_EXTERNAL_LIBS_BY_CURRENT_PROJECT ${CURRENT_CSF})
+          endif()
         endif()
       endif()
     endif()
@@ -249,11 +338,70 @@ if("${VTK_RENDERING_BACKEND}" STREQUAL "OpenGL2")
       list (REMOVE_ITEM USED_TOOLKITS_BY_CURRENT_PROJECT ${VTK_EXCLUDE_LIBRARY})
       if (${VTK_EXCLUDE_LIBRARY} STREQUAL vtkRenderingOpenGL)
         list (APPEND USED_TOOLKITS_BY_CURRENT_PROJECT vtkRenderingOpenGL2)
+        if(VTK_MAJOR_VERSION GREATER 6)
+          list (APPEND USED_TOOLKITS_BY_CURRENT_PROJECT vtkRenderingGL2PSOpenGL2)
+        endif()
       endif()
     endif()
   endforeach()
+else()
+  if(VTK_MAJOR_VERSION EQUAL 6 AND VTK_MINOR_VERSION GREATER 2 OR VTK_MAJOR_VERSION GREATER 6)
+    list (FIND USED_TOOLKITS_BY_CURRENT_PROJECT "vtkRenderingFreeTypeOpenGL" IS_VTK_RENDER_FREETYPE_FOUND)
+    if (NOT ${IS_VTK_RENDER_FREETYPE_FOUND} EQUAL -1)
+      list (REMOVE_ITEM USED_TOOLKITS_BY_CURRENT_PROJECT "vtkRenderingFreeTypeOpenGL")
+    endif()
+  endif()
 endif()
 
 if (BUILD_SHARED_LIBS)
   target_link_libraries (${PROJECT_NAME} ${USED_TOOLKITS_BY_CURRENT_PROJECT} ${USED_EXTERNAL_LIBS_BY_CURRENT_PROJECT})
 endif()
+
+if (USE_QT)
+  foreach (PROJECT_LIBRARY_DEBUG ${PROJECT_LIBRARIES_DEBUG})
+    target_link_libraries (${PROJECT_NAME} debug ${PROJECT_LIBRARY_DEBUG})
+  endforeach()
+  foreach (PROJECT_LIBRARY_RELEASE ${PROJECT_LIBRARIES_RELEASE})
+    target_link_libraries (${PROJECT_NAME} optimized ${PROJECT_LIBRARY_RELEASE})
+  endforeach()
+endif()
+
+# suppress deprecation warnings inside OCCT itself for old gcc versions with unavailable Standard_DISABLE_DEPRECATION_WARNINGS
+if (CMAKE_COMPILER_IS_GNUCC OR CMAKE_COMPILER_IS_GNUCXX)
+  if (CMAKE_CXX_COMPILER_VERSION VERSION_LESS 4.6.0)
+    add_definitions("-DOCCT_NO_DEPRECATED")
+    message (STATUS "Warning: internal deprecation warnings by Standard_DEPRECATED have been disabled due to old gcc version being used")
+  endif()
+endif()
+
+# use Cotire to accelerate build via usage of precompiled headers
+if (BUILD_USE_PCH)
+  if (WIN32)
+    # prevent definition of min and max macros through inclusion of Windows.h
+    # (for cotire builds)
+    add_definitions("-DNOMINMAX")
+    # avoid warnings on deprecated names from standard C library (see strsafe.h)
+    add_definitions("-DSTRSAFE_NO_DEPRECATE")
+    # avoid "std::Equal1" warning in QANCollection_Stl.cxx in debug mode
+    # suggesting using msvc "Checked Iterators"
+    add_definitions("-D_SCL_SECURE_NO_WARNINGS")
+  endif()
+
+  # Exclude system-provided glext.h.
+  # These macros are already defined within OpenGl_GlFunctions.hxx,
+  # however we have to duplicate them here for building TKOpenGl with PCH.
+  add_definitions("-DGL_GLEXT_LEGACY")
+  add_definitions("-DGLX_GLXEXT_LEGACY")
+
+  # workaround for old gcc
+  if (CMAKE_COMPILER_IS_GNUCC OR CMAKE_COMPILER_IS_GNUCXX)
+    add_definitions("-D__STDC_CONSTANT_MACROS")
+    add_definitions("-D__STDC_FORMAT_MACROS")
+  endif()
+
+  # unity builds are not used since they do not add speed but cause conflicts
+  # in TKV3d
+  set_target_properties(${PROJECT_NAME} PROPERTIES COTIRE_ADD_UNITY_BUILD FALSE)
+
+  cotire(${PROJECT_NAME})
+endif()