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