mirror of
https://git.dev.opencascade.org/repos/occt.git
synced 2025-04-03 17:56:21 +03:00
CMake scripts are corrected to do perform search of libs and dlls of third-party libraries even for static builds of OCCT. Treatment of errors in this case is relaxed: not found DLLs are reported as warnings, and not found libs as warning for static build, and continuable error for shared build. Code of samples is corrected to allow building with OCCT linked statically. Implementation of main application class is corrected to ensure that initialization is done after all global objects are created. Note however that samples still fails to start for unclear reason (creation of MFC frame window fails).
295 lines
11 KiB
CMake
295 lines
11 KiB
CMake
# tcl
|
|
|
|
if (NOT DEFINED INSTALL_TCL AND BUILD_SHARED_LIBS)
|
|
set (INSTALL_TCL OFF CACHE BOOL "${INSTALL_TCL_DESCR}")
|
|
endif()
|
|
|
|
# tcl directory
|
|
if (NOT DEFINED 3RDPARTY_TCL_DIR)
|
|
set (3RDPARTY_TCL_DIR "" CACHE PATH "The directory containing tcl")
|
|
endif()
|
|
|
|
# tcl include directory
|
|
if (NOT DEFINED 3RDPARTY_TCL_INCLUDE_DIR)
|
|
set (3RDPARTY_TCL_INCLUDE_DIR "" CACHE FILEPATH "The directory containing headers of tcl")
|
|
endif()
|
|
|
|
if (BUILD_SHARED_LIBS)
|
|
# tcl library file (with absolute path)
|
|
if (NOT DEFINED 3RDPARTY_TCL_LIBRARY OR NOT 3RDPARTY_TCL_LIBRARY_DIR)
|
|
set (3RDPARTY_TCL_LIBRARY "" CACHE FILEPATH "tcl library" FORCE)
|
|
endif()
|
|
|
|
# tcl library directory
|
|
if (NOT DEFINED 3RDPARTY_TCL_LIBRARY_DIR)
|
|
set (3RDPARTY_TCL_LIBRARY_DIR "" CACHE FILEPATH "The directory containing tcl library")
|
|
endif()
|
|
|
|
# tcl shared library (with absolute path)
|
|
if (WIN32)
|
|
if (NOT DEFINED 3RDPARTY_TCL_DLL OR NOT 3RDPARTY_TCL_DLL_DIR)
|
|
set (3RDPARTY_TCL_DLL "" CACHE FILEPATH "tcl shared library" FORCE)
|
|
endif()
|
|
endif()
|
|
|
|
# tcl shared library directory
|
|
if (WIN32 AND NOT DEFINED 3RDPARTY_TCL_DLL_DIR)
|
|
set (3RDPARTY_TCL_DLL_DIR "" CACHE FILEPATH "The directory containing tcl shared library")
|
|
endif()
|
|
endif()
|
|
|
|
# search for tcl in user defined directory
|
|
if (NOT 3RDPARTY_TCL_DIR AND 3RDPARTY_DIR)
|
|
FIND_PRODUCT_DIR("${3RDPARTY_DIR}" tcl TCL_DIR_NAME)
|
|
if (TCL_DIR_NAME)
|
|
set (3RDPARTY_TCL_DIR "${3RDPARTY_DIR}/${TCL_DIR_NAME}" CACHE PATH "The directory containing tcl" FORCE)
|
|
endif()
|
|
endif()
|
|
|
|
# define paths for default engine
|
|
if (3RDPARTY_TCL_DIR AND EXISTS "${3RDPARTY_TCL_DIR}")
|
|
set (TCL_INCLUDE_PATH "${3RDPARTY_TCL_DIR}/include")
|
|
endif()
|
|
|
|
# check tcl include dir, library dir and shared library dir
|
|
COMPLIANCE_PRODUCT_CONSISTENCY(TCL)
|
|
|
|
# use default (CMake) TCL search
|
|
find_package(TCL QUIET)
|
|
|
|
# tcl include dir
|
|
if (NOT 3RDPARTY_TCL_INCLUDE_DIR)
|
|
if (TCL_INCLUDE_PATH AND EXISTS "${TCL_INCLUDE_PATH}")
|
|
set (3RDPARTY_TCL_INCLUDE_DIR "${TCL_INCLUDE_PATH}" CACHE FILEPATH "The directory containing headers of TCL" FORCE)
|
|
endif()
|
|
endif()
|
|
|
|
if (BUILD_SHARED_LIBS)
|
|
# tcl dir and library
|
|
if (NOT 3RDPARTY_TCL_LIBRARY)
|
|
if (TCL_LIBRARY AND EXISTS "${TCL_LIBRARY}")
|
|
set (3RDPARTY_TCL_LIBRARY "${TCL_LIBRARY}" CACHE FILEPATH "TCL library" FORCE)
|
|
|
|
if (NOT 3RDPARTY_TCL_LIBRARY_DIR)
|
|
get_filename_component (3RDPARTY_TCL_LIBRARY_DIR "${3RDPARTY_TCL_LIBRARY}" PATH)
|
|
set (3RDPARTY_TCL_LIBRARY_DIR "${3RDPARTY_TCL_LIBRARY_DIR}" CACHE FILEPATH "The directory containing TCL library" FORCE)
|
|
endif()
|
|
endif()
|
|
endif()
|
|
|
|
|
|
if (WIN32)
|
|
if (NOT 3RDPARTY_TCL_DLL)
|
|
set (CMAKE_FIND_LIBRARY_SUFFIXES .lib .dll .a)
|
|
|
|
set (DLL_FOLDER_FOR_SEARCH "")
|
|
if (3RDPARTY_TCL_DLL_DIR)
|
|
set (DLL_FOLDER_FOR_SEARCH "${3RDPARTY_TCL_DLL_DIR}")
|
|
elseif (3RDPARTY_TCL_DIR)
|
|
set (DLL_FOLDER_FOR_SEARCH "${3RDPARTY_TCL_DIR}/bin")
|
|
elseif (3RDPARTY_TCL_LIBRARY_DIR)
|
|
get_filename_component (3RDPARTY_TCL_LIBRARY_DIR_PARENT "${3RDPARTY_TCL_LIBRARY_DIR}" PATH)
|
|
set (DLL_FOLDER_FOR_SEARCH "${3RDPARTY_TCL_LIBRARY_DIR_PARENT}/bin")
|
|
endif()
|
|
|
|
set (3RDPARTY_TCL_DLL "3RDPARTY_TCL_DLL-NOTFOUND" CACHE FILEPATH "TCL shared library" FORCE)
|
|
find_library (3RDPARTY_TCL_DLL NAMES ${CSF_TclLibs}
|
|
PATHS "${DLL_FOLDER_FOR_SEARCH}"
|
|
NO_DEFAULT_PATH)
|
|
endif()
|
|
endif()
|
|
endif()
|
|
|
|
COMPLIANCE_PRODUCT_CONSISTENCY(TCL)
|
|
|
|
if (BUILD_SHARED_LIBS)
|
|
# tcl dir and library
|
|
if (NOT 3RDPARTY_TCL_LIBRARY)
|
|
set (3RDPARTY_TCL_LIBRARY "3RDPARTY_TCL_LIBRARY-NOTFOUND" CACHE FILEPATH "TCL library" FORCE)
|
|
find_library (3RDPARTY_TCL_LIBRARY NAMES ${CSF_TclLibs}
|
|
PATHS "${3RDPARTY_TCL_LIBRARY_DIR}"
|
|
NO_DEFAULT_PATH)
|
|
|
|
# search in another place if previous search doesn't find anything
|
|
find_library (3RDPARTY_TCL_LIBRARY NAMES ${CSF_TclLibs}
|
|
PATHS "${3RDPARTY_TCL_DIR}/lib"
|
|
NO_DEFAULT_PATH)
|
|
|
|
|
|
if (NOT 3RDPARTY_TCL_LIBRARY OR NOT EXISTS "${3RDPARTY_TCL_LIBRARY}")
|
|
set (3RDPARTY_TCL_LIBRARY "" CACHE FILEPATH "TCL library" FORCE)
|
|
endif()
|
|
|
|
if (NOT 3RDPARTY_TCL_LIBRARY_DIR AND 3RDPARTY_TCL_LIBRARY)
|
|
get_filename_component (3RDPARTY_TCL_LIBRARY_DIR "${3RDPARTY_TCL_LIBRARY}" PATH)
|
|
set (3RDPARTY_TCL_LIBRARY_DIR "${3RDPARTY_TCL_LIBRARY_DIR}" CACHE FILEPATH "The directory containing TCL library" FORCE)
|
|
endif()
|
|
endif()
|
|
|
|
set (3RDPARTY_TCL_LIBRARY_VERSION "")
|
|
if (3RDPARTY_TCL_LIBRARY AND EXISTS "${3RDPARTY_TCL_LIBRARY}")
|
|
get_filename_component (TCL_LIBRARY_NAME "${3RDPARTY_TCL_LIBRARY}" NAME)
|
|
string(REGEX REPLACE "^.*tcl([0-9]\\.*[0-9]).*$" "\\1" TCL_LIBRARY_VERSION "${TCL_LIBRARY_NAME}")
|
|
|
|
if (NOT "${TCL_LIBRARY_VERSION}" STREQUAL "${TCL_LIBRARY_NAME}")
|
|
set (3RDPARTY_TCL_LIBRARY_VERSION "${TCL_LIBRARY_VERSION}")
|
|
else() # if the version isn't found - seek other library with 8.6 or 8.5 version in the same dir
|
|
message (STATUS "Info: TCL version isn't found")
|
|
endif()
|
|
endif()
|
|
|
|
set (3RDPARTY_TCL_LIBRARY_VERSION_WITH_DOT "")
|
|
if (3RDPARTY_TCL_LIBRARY_VERSION)
|
|
string (REGEX REPLACE "^.*([0-9])[^0-9]*[0-9].*$" "\\1" 3RDPARTY_TCL_MAJOR_VERSION "${3RDPARTY_TCL_LIBRARY_VERSION}")
|
|
string (REGEX REPLACE "^.*[0-9][^0-9]*([0-9]).*$" "\\1" 3RDPARTY_TCL_MINOR_VERSION "${3RDPARTY_TCL_LIBRARY_VERSION}")
|
|
set (3RDPARTY_TCL_LIBRARY_VERSION_WITH_DOT "${3RDPARTY_TCL_MAJOR_VERSION}.${3RDPARTY_TCL_MINOR_VERSION}")
|
|
endif()
|
|
|
|
if (WIN32)
|
|
if (NOT 3RDPARTY_TCL_DLL)
|
|
set (CMAKE_FIND_LIBRARY_SUFFIXES .lib .dll .a)
|
|
|
|
set (DLL_FOLDER_FOR_SEARCH "")
|
|
if (3RDPARTY_TCL_DLL_DIR)
|
|
set (DLL_FOLDER_FOR_SEARCH "${3RDPARTY_TCL_DLL_DIR}")
|
|
elseif (3RDPARTY_TCL_DIR)
|
|
set (DLL_FOLDER_FOR_SEARCH "${3RDPARTY_TCL_DIR}/bin")
|
|
else()
|
|
get_filename_component (3RDPARTY_TCL_LIBRARY_DIR_PARENT "${3RDPARTY_TCL_LIBRARY_DIR}" PATH)
|
|
set (DLL_FOLDER_FOR_SEARCH "${3RDPARTY_TCL_LIBRARY_DIR_PARENT}/bin")
|
|
endif()
|
|
|
|
set (3RDPARTY_TCL_DLL "3RDPARTY_TCL_DLL-NOTFOUND" CACHE FILEPATH "TCL shared library" FORCE)
|
|
find_library (3RDPARTY_TCL_DLL NAMES tcl${3RDPARTY_TCL_LIBRARY_VERSION}
|
|
PATHS "${DLL_FOLDER_FOR_SEARCH}"
|
|
NO_DEFAULT_PATH)
|
|
|
|
if (NOT 3RDPARTY_TCL_DLL OR NOT EXISTS "${3RDPARTY_TCL_DLL}")
|
|
set (3RDPARTY_TCL_DLL "" CACHE FILEPATH "TCL shared library" FORCE)
|
|
endif()
|
|
endif()
|
|
if (NOT 3RDPARTY_TCL_DLL_DIR AND 3RDPARTY_TCL_DLL)
|
|
get_filename_component (3RDPARTY_TCL_DLL_DIR "${3RDPARTY_TCL_DLL}" PATH)
|
|
set (3RDPARTY_TCL_DLL_DIR "${3RDPARTY_TCL_DLL_DIR}" CACHE FILEPATH "The directory containing TCL shared library" FORCE)
|
|
endif()
|
|
endif()
|
|
|
|
# include found paths to common variables
|
|
if (3RDPARTY_TCL_INCLUDE_DIR AND EXISTS "${3RDPARTY_TCL_INCLUDE_DIR}")
|
|
list (APPEND 3RDPARTY_INCLUDE_DIRS "${3RDPARTY_TCL_INCLUDE_DIR}")
|
|
else()
|
|
list (APPEND 3RDPARTY_NOT_INCLUDED 3RDPARTY_TCL_INCLUDE_DIR)
|
|
endif()
|
|
|
|
if (3RDPARTY_TCL_LIBRARY AND EXISTS "${3RDPARTY_TCL_LIBRARY}")
|
|
list (APPEND 3RDPARTY_LIBRARY_DIRS "${3RDPARTY_TCL_LIBRARY_DIR}")
|
|
else()
|
|
list (APPEND 3RDPARTY_NO_LIBS 3RDPARTY_TCL_LIBRARY_DIR)
|
|
endif()
|
|
|
|
if (WIN32)
|
|
if (3RDPARTY_TCL_DLL OR EXISTS "${3RDPARTY_TCL_DLL}")
|
|
list (APPEND 3RDPARTY_DLL_DIRS "${3RDPARTY_TCL_DLL_DIR}")
|
|
else()
|
|
list (APPEND 3RDPARTY_NO_DLLS 3RDPARTY_TCL_DLL_DIR)
|
|
endif()
|
|
endif()
|
|
|
|
# install tcl
|
|
if (INSTALL_TCL)
|
|
# include occt macros. compiler_bitness, os_wiht_bit, compiler
|
|
OCCT_INCLUDE_CMAKE_FILE ("adm/cmake/occt_macros")
|
|
|
|
OCCT_MAKE_OS_WITH_BITNESS()
|
|
OCCT_MAKE_COMPILER_SHORT_NAME()
|
|
|
|
if (WIN32)
|
|
# tcl 8.6 requires zlib. install all dlls from tcl bin folder that may contain zlib also
|
|
|
|
# collect and install all dlls from tcl dll dirs
|
|
file (GLOB TCL_DLLS "${3RDPARTY_TCL_DLL_DIR}/*.dll")
|
|
|
|
if (SINGLE_GENERATOR)
|
|
install (FILES ${TCL_DLLS} DESTINATION "${INSTALL_DIR_BIN}")
|
|
else()
|
|
install (FILES ${TCL_DLLS}
|
|
CONFIGURATIONS Release
|
|
DESTINATION "${INSTALL_DIR_BIN}")
|
|
install (FILES ${TCL_DLLS}
|
|
CONFIGURATIONS RelWithDebInfo
|
|
DESTINATION "${INSTALL_DIR_BIN}i")
|
|
install (FILES ${TCL_DLLS}
|
|
CONFIGURATIONS Debug
|
|
DESTINATION "${INSTALL_DIR_BIN}d")
|
|
endif()
|
|
else()
|
|
get_filename_component(3RDPARTY_TCL_LIBRARY_REALPATH ${3RDPARTY_TCL_LIBRARY} REALPATH)
|
|
|
|
if (SINGLE_GENERATOR)
|
|
install (FILES ${3RDPARTY_TCL_LIBRARY_REALPATH} DESTINATION "${INSTALL_DIR_LIB}")
|
|
else()
|
|
install (FILES ${3RDPARTY_TCL_LIBRARY_REALPATH}
|
|
CONFIGURATIONS Release
|
|
DESTINATION "${INSTALL_DIR_LIB}")
|
|
install (FILES ${3RDPARTY_TCL_LIBRARY_REALPATH}
|
|
CONFIGURATIONS RelWithDebInfo
|
|
DESTINATION "${INSTALL_DIR_LIB}i")
|
|
install (FILES ${3RDPARTY_TCL_LIBRARY_REALPATH}
|
|
CONFIGURATIONS Debug
|
|
DESTINATION "${INSTALL_DIR_LIB}d")
|
|
endif()
|
|
endif()
|
|
|
|
if (TCL_TCLSH_VERSION)
|
|
# tcl is required to install in lib folder (without)
|
|
install (DIRECTORY "${3RDPARTY_TCL_LIBRARY_DIR}/tcl8" DESTINATION "${INSTALL_DIR_LIB}")
|
|
install (DIRECTORY "${3RDPARTY_TCL_LIBRARY_DIR}/tcl${TCL_TCLSH_VERSION}" DESTINATION "${INSTALL_DIR_LIB}")
|
|
else()
|
|
message (STATUS "\nWarning: tclX.X subdir won't be copyied during the installation process.")
|
|
message (STATUS "Try seeking tcl within another folder by changing 3RDPARTY_TCL_DIR variable.")
|
|
endif()
|
|
|
|
set (USED_3RDPARTY_TCL_DIR "")
|
|
else()
|
|
# the library directory for using by the executable
|
|
if (WIN32)
|
|
set (USED_3RDPARTY_TCL_DIR ${3RDPARTY_TCL_DLL_DIR})
|
|
else()
|
|
set (USED_3RDPARTY_TCL_DIR ${3RDPARTY_TCL_LIBRARY_DIR})
|
|
endif()
|
|
endif()
|
|
|
|
mark_as_advanced (3RDPARTY_TCL_LIBRARY 3RDPARTY_TCL_DLL)
|
|
endif()
|
|
|
|
if (TK_FOUND AND 3RDPARTY_TCL_DIR)
|
|
|
|
get_filename_component (TK_WISH_ABSOLUTE "${TK_WISH}" ABSOLUTE)
|
|
get_filename_component (3RDPARTY_TCL_DIR_ABSOLUTE "${3RDPARTY_TCL_DIR}" ABSOLUTE)
|
|
|
|
string (FIND "${TK_WISH_ABSOLUTE}" "${3RDPARTY_TCL_DIR_ABSOLUTE}" THE_SAME_FOLDER)
|
|
|
|
if (${THE_SAME_FOLDER} EQUAL 0)
|
|
set (3RDPARTY_TCLTK_DIR "${3RDPARTY_TCL_DIR}")
|
|
message (STATUS "Info: TK is used from TCL folder: ${3RDPARTY_TCLTK_DIR}")
|
|
endif()
|
|
endif()
|
|
|
|
# unset all redundant variables
|
|
#TCL
|
|
OCCT_CHECK_AND_UNSET (TCL_LIBRARY)
|
|
OCCT_CHECK_AND_UNSET (TCL_INCLUDE_PATH)
|
|
OCCT_CHECK_AND_UNSET (TCL_TCLSH)
|
|
#TK
|
|
OCCT_CHECK_AND_UNSET (TK_LIBRARY)
|
|
OCCT_CHECK_AND_UNSET (TK_INCLUDE_PATH)
|
|
OCCT_CHECK_AND_UNSET (TK_WISH)
|
|
|
|
if (NOT BUILD_SHARED_LIBS)
|
|
OCCT_CHECK_AND_UNSET (3RDPARTY_TCL_LIBRARY)
|
|
OCCT_CHECK_AND_UNSET (3RDPARTY_TCL_LIBRARY_DIR)
|
|
OCCT_CHECK_AND_UNSET (3RDPARTY_TCL_DLL)
|
|
OCCT_CHECK_AND_UNSET (3RDPARTY_TCL_DLL_DIR)
|
|
OCCT_CHECK_AND_UNSET (INSTALL_TCL)
|
|
endif()
|