mirror of
https://github.com/Kitware/CMake.git
synced 2026-08-13 17:07:57 +00:00
Tcl/Tk 9.0.0 was released[1] in 2024, and is already up to version 9.0.4 (just released 2026-07-26). Tcl/Tk 9.1 is currently nearing beta,[2] and will likely release soon. Since it's still possible to have both of these libraries installed without Tclsh or Wish (making version detection via those tools unviable), add 9.0 and 9.1 variants to the explicit library/include path and file matches performed by FindTCL. Also add 9.0 and 9.1 patterns to the tool detections in FindTclsh, FindTclStub, and FindWish. [1]: https://sourceforge.net/projects/tcl/files/Tcl/9.0.0/ [2]: https://sourceforge.net/projects/tcl/files/Tcl/9.1b0/
157 lines
4.5 KiB
CMake
157 lines
4.5 KiB
CMake
# Distributed under the OSI-approved BSD 3-Clause License. See accompanying
|
|
# file LICENSE.rst or https://cmake.org/licensing for details.
|
|
|
|
#[=======================================================================[.rst:
|
|
FindTclsh
|
|
---------
|
|
|
|
Finds the Tcl shell command-line executable (``tclsh``), which includes the Tcl
|
|
(Tool Command Language) interpreter:
|
|
|
|
.. code-block:: cmake
|
|
|
|
find_package(Tclsh [<version>] [...])
|
|
|
|
Result Variables
|
|
^^^^^^^^^^^^^^^^
|
|
|
|
This module defines the following variables:
|
|
|
|
``Tclsh_FOUND``
|
|
.. versionadded:: 3.3
|
|
|
|
Boolean indicating whether the (requested version of) ``tclsh`` executable
|
|
was found.
|
|
|
|
``Tclsh_VERSION``
|
|
.. versionadded:: 4.2
|
|
|
|
The version of ``tclsh`` found.
|
|
|
|
Cache Variables
|
|
^^^^^^^^^^^^^^^
|
|
|
|
The following cache variables may also be set:
|
|
|
|
``TCL_TCLSH``
|
|
The path to the ``tclsh`` executable.
|
|
|
|
Deprecated Variables
|
|
^^^^^^^^^^^^^^^^^^^^
|
|
|
|
The following variables are provided for backward compatibility:
|
|
|
|
``TCLSH_FOUND``
|
|
.. deprecated:: 4.2
|
|
Use ``Tclsh_FOUND``, which has the same value.
|
|
|
|
Boolean indicating whether the (requested version of) ``tclsh`` executable
|
|
was found.
|
|
|
|
``TCLSH_VERSION_STRING``
|
|
.. deprecated:: 4.2
|
|
Use ``Tclsh_VERSION``, which has the same value.
|
|
|
|
The version of ``tclsh`` found.
|
|
|
|
Examples
|
|
^^^^^^^^
|
|
|
|
In the following example, this module is used to find the ``tclsh``
|
|
command-line executable, which is then executed in a process to evaluate
|
|
TCL code from the script file located in the project source directory:
|
|
|
|
.. code-block:: cmake
|
|
|
|
find_package(Tclsh)
|
|
if(Tclsh_FOUND)
|
|
execute_process(COMMAND ${TCL_TCLSH} example-script.tcl)
|
|
endif()
|
|
|
|
See Also
|
|
^^^^^^^^
|
|
|
|
* The :module:`FindTCL` module to find the Tcl installation.
|
|
* The :module:`FindTclStub` module to find the Tcl Stubs Library.
|
|
#]=======================================================================]
|
|
|
|
get_filename_component(TK_WISH_PATH "${TK_WISH}" PATH)
|
|
get_filename_component(TK_WISH_PATH_PARENT "${TK_WISH_PATH}" PATH)
|
|
string(REGEX REPLACE
|
|
"^.*wish([0-9]\\.*[0-9]).*$" "\\1" TK_WISH_VERSION "${TK_WISH}")
|
|
|
|
get_filename_component(TCL_INCLUDE_PATH_PARENT "${TCL_INCLUDE_PATH}" PATH)
|
|
get_filename_component(TK_INCLUDE_PATH_PARENT "${TK_INCLUDE_PATH}" PATH)
|
|
|
|
get_filename_component(TCL_LIBRARY_PATH "${TCL_LIBRARY}" PATH)
|
|
get_filename_component(TCL_LIBRARY_PATH_PARENT "${TCL_LIBRARY_PATH}" PATH)
|
|
string(REGEX REPLACE
|
|
"^.*tcl([0-9]\\.*[0-9]).*$" "\\1" TCL_LIBRARY_VERSION "${TCL_LIBRARY}")
|
|
|
|
get_filename_component(TK_LIBRARY_PATH "${TK_LIBRARY}" PATH)
|
|
get_filename_component(TK_LIBRARY_PATH_PARENT "${TK_LIBRARY_PATH}" PATH)
|
|
string(REGEX REPLACE
|
|
"^.*tk([0-9]\\.*[0-9]).*$" "\\1" TK_LIBRARY_VERSION "${TK_LIBRARY}")
|
|
|
|
set(TCLTK_POSSIBLE_BIN_PATHS
|
|
"${TCL_INCLUDE_PATH_PARENT}/bin"
|
|
"${TK_INCLUDE_PATH_PARENT}/bin"
|
|
"${TCL_LIBRARY_PATH_PARENT}/bin"
|
|
"${TK_LIBRARY_PATH_PARENT}/bin"
|
|
"${TK_WISH_PATH_PARENT}/bin"
|
|
)
|
|
|
|
if(WIN32)
|
|
get_filename_component(
|
|
ActiveTcl_CurrentVersion
|
|
"[HKEY_LOCAL_MACHINE\\SOFTWARE\\ActiveState\\ActiveTcl;CurrentVersion]"
|
|
NAME)
|
|
set(TCLTK_POSSIBLE_BIN_PATHS ${TCLTK_POSSIBLE_BIN_PATHS}
|
|
"[HKEY_LOCAL_MACHINE\\SOFTWARE\\ActiveState\\ActiveTcl\\${ActiveTcl_CurrentVersion}]/bin"
|
|
)
|
|
endif()
|
|
|
|
set(TCL_TCLSH_NAMES
|
|
tclsh
|
|
tclsh${TCL_LIBRARY_VERSION} tclsh${TK_LIBRARY_VERSION} tclsh${TK_WISH_VERSION}
|
|
tclsh91 tclsh9.1
|
|
tclsh90 tclsh9.0
|
|
tclsh86 tclsh8.6
|
|
tclsh85 tclsh8.5
|
|
tclsh84 tclsh8.4
|
|
tclsh83 tclsh8.3
|
|
tclsh82 tclsh8.2
|
|
tclsh80 tclsh8.0
|
|
)
|
|
|
|
find_program(TCL_TCLSH
|
|
NAMES ${TCL_TCLSH_NAMES}
|
|
HINTS ${TCLTK_POSSIBLE_BIN_PATHS}
|
|
)
|
|
|
|
if(TCL_TCLSH)
|
|
execute_process(COMMAND "${CMAKE_COMMAND}" -E echo puts "\$tcl_version"
|
|
COMMAND "${TCL_TCLSH}"
|
|
OUTPUT_VARIABLE Tclsh_VERSION
|
|
ERROR_QUIET
|
|
OUTPUT_STRIP_TRAILING_WHITESPACE
|
|
RESULT_VARIABLE _tclsh_version_result)
|
|
set(TCLSH_VERSION_STRING "${Tclsh_VERSION}")
|
|
endif()
|
|
|
|
include(FindPackageHandleStandardArgs)
|
|
if (CMAKE_FIND_PACKAGE_NAME STREQUAL "TCL" OR
|
|
CMAKE_FIND_PACKAGE_NAME STREQUAL "TclStub")
|
|
# FindTCL include()'s this module. It's an old pattern, but rather than
|
|
# trying to suppress this from outside the module (which is then sensitive to
|
|
# the contents, detect the case in this module and suppress it explicitly.
|
|
# Transitively, FindTclStub includes FindTCL.
|
|
set(FPHSA_NAME_MISMATCHED 1)
|
|
endif ()
|
|
find_package_handle_standard_args(Tclsh
|
|
REQUIRED_VARS TCL_TCLSH
|
|
VERSION_VAR Tclsh_VERSION)
|
|
unset(FPHSA_NAME_MISMATCHED)
|
|
|
|
mark_as_advanced(TCL_TCLSH)
|