1# Distributed under the OSI-approved BSD 3-Clause License. See accompanying 2# file Copyright.txt or https://cmake.org/licensing for details. 3 4#[=======================================================================[.rst: 5FindTCL 6------- 7 8TK_INTERNAL_PATH was removed. 9 10This module finds if Tcl is installed and determines where the include 11files and libraries are. It also determines what the name of the 12library is. This code sets the following variables: 13 14:: 15 16 TCL_FOUND = Tcl was found 17 TK_FOUND = Tk was found 18 TCLTK_FOUND = Tcl and Tk were found 19 TCL_LIBRARY = path to Tcl library (tcl tcl80) 20 TCL_INCLUDE_PATH = path to where tcl.h can be found 21 TCL_TCLSH = path to tclsh binary (tcl tcl80) 22 TK_LIBRARY = path to Tk library (tk tk80 etc) 23 TK_INCLUDE_PATH = path to where tk.h can be found 24 TK_WISH = full path to the wish executable 25 26 27 28In an effort to remove some clutter and clear up some issues for 29people who are not necessarily Tcl/Tk gurus/developers, some 30variables were moved or removed. Changes compared to CMake 2.4 are: 31 32:: 33 34 => they were only useful for people writing Tcl/Tk extensions. 35 => these libs are not packaged by default with Tcl/Tk distributions. 36 Even when Tcl/Tk is built from source, several flavors of debug libs 37 are created and there is no real reason to pick a single one 38 specifically (say, amongst tcl84g, tcl84gs, or tcl84sgx). 39 Let's leave that choice to the user by allowing him to assign 40 TCL_LIBRARY to any Tcl library, debug or not. 41 => this ended up being only a Win32 variable, and there is a lot of 42 confusion regarding the location of this file in an installed Tcl/Tk 43 tree anyway (see 8.5 for example). If you need the internal path at 44 this point it is safer you ask directly where the *source* tree is 45 and dig from there. 46#]=======================================================================] 47 48include(${CMAKE_CURRENT_LIST_DIR}/CMakeFindFrameworks.cmake) 49include(${CMAKE_CURRENT_LIST_DIR}/FindTclsh.cmake) 50include(${CMAKE_CURRENT_LIST_DIR}/FindWish.cmake) 51 52if(TCLSH_VERSION_STRING) 53 set(TCL_TCLSH_VERSION "${TCLSH_VERSION_STRING}") 54else() 55 get_filename_component(TCL_TCLSH_PATH "${TCL_TCLSH}" PATH) 56 get_filename_component(TCL_TCLSH_PATH_PARENT "${TCL_TCLSH_PATH}" PATH) 57 string(REGEX REPLACE 58 "^.*tclsh([0-9]\\.*[0-9]).*$" "\\1" TCL_TCLSH_VERSION "${TCL_TCLSH}") 59endif() 60 61get_filename_component(TK_WISH_PATH "${TK_WISH}" PATH) 62get_filename_component(TK_WISH_PATH_PARENT "${TK_WISH_PATH}" PATH) 63string(REGEX REPLACE 64 "^.*wish([0-9]\\.*[0-9]).*$" "\\1" TK_WISH_VERSION "${TK_WISH}") 65 66get_filename_component(TCL_INCLUDE_PATH_PARENT "${TCL_INCLUDE_PATH}" PATH) 67get_filename_component(TK_INCLUDE_PATH_PARENT "${TK_INCLUDE_PATH}" PATH) 68 69get_filename_component(TCL_LIBRARY_PATH "${TCL_LIBRARY}" PATH) 70get_filename_component(TCL_LIBRARY_PATH_PARENT "${TCL_LIBRARY_PATH}" PATH) 71string(REGEX REPLACE 72 "^.*tcl([0-9]\\.*[0-9]).*$" "\\1" TCL_LIBRARY_VERSION "${TCL_LIBRARY}") 73 74get_filename_component(TK_LIBRARY_PATH "${TK_LIBRARY}" PATH) 75get_filename_component(TK_LIBRARY_PATH_PARENT "${TK_LIBRARY_PATH}" PATH) 76string(REGEX REPLACE 77 "^.*tk([0-9]\\.*[0-9]).*$" "\\1" TK_LIBRARY_VERSION "${TK_LIBRARY}") 78 79set(TCLTK_POSSIBLE_LIB_PATHS 80 "${TCL_INCLUDE_PATH_PARENT}/lib" 81 "${TK_INCLUDE_PATH_PARENT}/lib" 82 "${TCL_LIBRARY_PATH}" 83 "${TK_LIBRARY_PATH}" 84 "${TCL_TCLSH_PATH_PARENT}/lib" 85 "${TK_WISH_PATH_PARENT}/lib" 86) 87 88set(TCLTK_POSSIBLE_LIB_PATH_SUFFIXES 89 lib/tcl/tcl8.7 90 lib/tcl/tk8.7 91 lib/tcl/tcl8.6 92 lib/tcl/tk8.6 93 lib/tcl/tcl8.5 94 lib/tcl/tk8.5 95 lib/tcl/tcl8.4 96 lib/tcl/tk8.4 97) 98 99if(WIN32) 100 get_filename_component( 101 ActiveTcl_CurrentVersion 102 "[HKEY_LOCAL_MACHINE\\SOFTWARE\\ActiveState\\ActiveTcl;CurrentVersion]" 103 NAME) 104 set(TCLTK_POSSIBLE_LIB_PATHS ${TCLTK_POSSIBLE_LIB_PATHS} 105 "[HKEY_LOCAL_MACHINE\\SOFTWARE\\ActiveState\\ActiveTcl\\${ActiveTcl_CurrentVersion}]/lib" 106 "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Scriptics\\Tcl\\8.6;Root]/lib" 107 "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Scriptics\\Tcl\\8.5;Root]/lib" 108 "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Scriptics\\Tcl\\8.4;Root]/lib" 109 "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Scriptics\\Tcl\\8.3;Root]/lib" 110 "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Scriptics\\Tcl\\8.2;Root]/lib" 111 "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Scriptics\\Tcl\\8.0;Root]/lib" 112 "$ENV{ProgramFiles}/Tcl/Lib" 113 "C:/Program Files/Tcl/lib" 114 "C:/Tcl/lib" 115 ) 116endif() 117 118find_library(TCL_LIBRARY 119 NAMES 120 tcl 121 tcl${TCL_LIBRARY_VERSION} tcl${TCL_TCLSH_VERSION} tcl${TK_WISH_VERSION} 122 tcl87 tcl8.7 tcl87t tcl8.7t 123 tcl86 tcl8.6 tcl86t tcl8.6t 124 tcl85 tcl8.5 125 tcl84 tcl8.4 126 tcl83 tcl8.3 127 tcl82 tcl8.2 128 tcl80 tcl8.0 129 PATHS ${TCLTK_POSSIBLE_LIB_PATHS} 130 PATH_SUFFIXES ${TCLTK_POSSIBLE_LIB_PATH_SUFFIXES} 131 ) 132 133find_library(TK_LIBRARY 134 NAMES 135 tk 136 tk${TK_LIBRARY_VERSION} tk${TCL_TCLSH_VERSION} tk${TK_WISH_VERSION} 137 tk87 tk8.7 tk87t tk8.7t 138 tk86 tk8.6 tk86t tk8.6t 139 tk85 tk8.5 140 tk84 tk8.4 141 tk83 tk8.3 142 tk82 tk8.2 143 tk80 tk8.0 144 PATHS ${TCLTK_POSSIBLE_LIB_PATHS} 145 PATH_SUFFIXES ${TCLTK_POSSIBLE_LIB_PATH_SUFFIXES} 146 ) 147 148CMAKE_FIND_FRAMEWORKS(Tcl) 149CMAKE_FIND_FRAMEWORKS(Tk) 150 151set(TCL_FRAMEWORK_INCLUDES) 152if(Tcl_FRAMEWORKS) 153 if(NOT TCL_INCLUDE_PATH) 154 foreach(dir ${Tcl_FRAMEWORKS}) 155 set(TCL_FRAMEWORK_INCLUDES ${TCL_FRAMEWORK_INCLUDES} ${dir}/Headers) 156 endforeach() 157 endif() 158endif() 159 160set(TK_FRAMEWORK_INCLUDES) 161if(Tk_FRAMEWORKS) 162 if(NOT TK_INCLUDE_PATH) 163 foreach(dir ${Tk_FRAMEWORKS}) 164 set(TK_FRAMEWORK_INCLUDES ${TK_FRAMEWORK_INCLUDES} 165 ${dir}/Headers ${dir}/PrivateHeaders) 166 endforeach() 167 endif() 168endif() 169 170set(TCLTK_POSSIBLE_INCLUDE_PATHS 171 "${TCL_LIBRARY_PATH_PARENT}/include" 172 "${TK_LIBRARY_PATH_PARENT}/include" 173 "${TCL_INCLUDE_PATH}" 174 "${TK_INCLUDE_PATH}" 175 ${TCL_FRAMEWORK_INCLUDES} 176 ${TK_FRAMEWORK_INCLUDES} 177 "${TCL_TCLSH_PATH_PARENT}/include" 178 "${TK_WISH_PATH_PARENT}/include" 179 ) 180 181set(TCLTK_POSSIBLE_INCLUDE_PATH_SUFFIXES 182 include/tcl${TK_LIBRARY_VERSION} 183 include/tcl${TCL_LIBRARY_VERSION} 184 include/tcl8.7 185 include/tk8.7 186 include/tcl8.6 187 include/tk8.6 188 include/tcl8.5 189 include/tk8.5 190 include/tcl8.4 191 include/tk8.4 192 include/tcl8.3 193 include/tcl8.2 194 include/tcl8.0 195 ) 196 197if(WIN32) 198 set(TCLTK_POSSIBLE_INCLUDE_PATHS ${TCLTK_POSSIBLE_INCLUDE_PATHS} 199 "[HKEY_LOCAL_MACHINE\\SOFTWARE\\ActiveState\\ActiveTcl\\${ActiveTcl_CurrentVersion}]/include" 200 "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Scriptics\\Tcl\\8.6;Root]/include" 201 "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Scriptics\\Tcl\\8.5;Root]/include" 202 "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Scriptics\\Tcl\\8.4;Root]/include" 203 "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Scriptics\\Tcl\\8.3;Root]/include" 204 "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Scriptics\\Tcl\\8.2;Root]/include" 205 "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Scriptics\\Tcl\\8.0;Root]/include" 206 "$ENV{ProgramFiles}/Tcl/include" 207 "C:/Program Files/Tcl/include" 208 "C:/Tcl/include" 209 ) 210endif() 211 212find_path(TCL_INCLUDE_PATH 213 NAMES tcl.h 214 HINTS ${TCLTK_POSSIBLE_INCLUDE_PATHS} 215 PATH_SUFFIXES ${TCLTK_POSSIBLE_INCLUDE_PATH_SUFFIXES} 216 ) 217 218find_path(TK_INCLUDE_PATH 219 NAMES tk.h 220 HINTS ${TCLTK_POSSIBLE_INCLUDE_PATHS} 221 PATH_SUFFIXES ${TCLTK_POSSIBLE_INCLUDE_PATH_SUFFIXES} 222 ) 223 224include(${CMAKE_CURRENT_LIST_DIR}/FindPackageHandleStandardArgs.cmake) 225 226if (CMAKE_FIND_PACKAGE_NAME STREQUAL "TclStub") 227 # FindTclStub include()'s this module. It's an old pattern, but rather than 228 # trying to suppress this from outside the module (which is then sensitive to 229 # the contents, detect the case in this module and suppress it explicitly. 230 set(FPHSA_NAME_MISMATCHED 1) 231endif () 232FIND_PACKAGE_HANDLE_STANDARD_ARGS(TCL DEFAULT_MSG TCL_LIBRARY TCL_INCLUDE_PATH) 233set(FPHSA_NAME_MISMATCHED 1) 234set(TCLTK_FIND_REQUIRED ${TCL_FIND_REQUIRED}) 235set(TCLTK_FIND_QUIETLY ${TCL_FIND_QUIETLY}) 236FIND_PACKAGE_HANDLE_STANDARD_ARGS(TCLTK DEFAULT_MSG TCL_LIBRARY TCL_INCLUDE_PATH TK_LIBRARY TK_INCLUDE_PATH) 237set(TK_FIND_REQUIRED ${TCL_FIND_REQUIRED}) 238set(TK_FIND_QUIETLY ${TCL_FIND_QUIETLY}) 239FIND_PACKAGE_HANDLE_STANDARD_ARGS(TK DEFAULT_MSG TK_LIBRARY TK_INCLUDE_PATH) 240unset(FPHSA_NAME_MISMATCHED) 241 242mark_as_advanced( 243 TCL_INCLUDE_PATH 244 TK_INCLUDE_PATH 245 TCL_LIBRARY 246 TK_LIBRARY 247 ) 248