FindTclsh.cmake 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  1. # Distributed under the OSI-approved BSD 3-Clause License. See accompanying
  2. # file LICENSE.rst or https://cmake.org/licensing for details.
  3. #[=======================================================================[.rst:
  4. FindTclsh
  5. ---------
  6. Finds the Tcl shell command-line executable (``tclsh``), which includes the Tcl
  7. (Tool Command Language) interpreter:
  8. .. code-block:: cmake
  9. find_package(Tclsh [<version>] [...])
  10. Result Variables
  11. ^^^^^^^^^^^^^^^^
  12. This module defines the following variables:
  13. ``Tclsh_FOUND``
  14. Boolean indicating whether the (requested version of) ``tclsh`` executable
  15. is found. For backward compatibility, the ``TCLSH_FOUND`` variable is
  16. also set to the same value.
  17. ``Tclsh_VERSION``
  18. .. versionadded:: 4.2
  19. The version of ``tclsh`` found.
  20. Cache Variables
  21. ^^^^^^^^^^^^^^^
  22. The following cache variables may also be set:
  23. ``TCL_TCLSH``
  24. The path to the ``tclsh`` executable.
  25. Deprecated Variables
  26. ^^^^^^^^^^^^^^^^^^^^
  27. The following variables are provided for backward compatibility:
  28. ``TCLSH_VERSION_STRING``
  29. .. deprecated:: 4.2
  30. Use ``Tclsh_VERSION``, which has the same value.
  31. The version of ``tclsh`` found.
  32. Examples
  33. ^^^^^^^^
  34. In the following example, this module is used to find the ``tclsh``
  35. command-line executable, which is then executed in a process to evaluate
  36. TCL code from the script file located in the project source directory:
  37. .. code-block:: cmake
  38. find_package(Tclsh)
  39. if(Tclsh_FOUND)
  40. execute_process(COMMAND ${TCL_TCLSH} example-script.tcl)
  41. endif()
  42. See Also
  43. ^^^^^^^^
  44. * The :module:`FindTCL` module to find the Tcl installation.
  45. * The :module:`FindTclStub` module to find the Tcl Stubs Library.
  46. #]=======================================================================]
  47. get_filename_component(TK_WISH_PATH "${TK_WISH}" PATH)
  48. get_filename_component(TK_WISH_PATH_PARENT "${TK_WISH_PATH}" PATH)
  49. string(REGEX REPLACE
  50. "^.*wish([0-9]\\.*[0-9]).*$" "\\1" TK_WISH_VERSION "${TK_WISH}")
  51. get_filename_component(TCL_INCLUDE_PATH_PARENT "${TCL_INCLUDE_PATH}" PATH)
  52. get_filename_component(TK_INCLUDE_PATH_PARENT "${TK_INCLUDE_PATH}" PATH)
  53. get_filename_component(TCL_LIBRARY_PATH "${TCL_LIBRARY}" PATH)
  54. get_filename_component(TCL_LIBRARY_PATH_PARENT "${TCL_LIBRARY_PATH}" PATH)
  55. string(REGEX REPLACE
  56. "^.*tcl([0-9]\\.*[0-9]).*$" "\\1" TCL_LIBRARY_VERSION "${TCL_LIBRARY}")
  57. get_filename_component(TK_LIBRARY_PATH "${TK_LIBRARY}" PATH)
  58. get_filename_component(TK_LIBRARY_PATH_PARENT "${TK_LIBRARY_PATH}" PATH)
  59. string(REGEX REPLACE
  60. "^.*tk([0-9]\\.*[0-9]).*$" "\\1" TK_LIBRARY_VERSION "${TK_LIBRARY}")
  61. set(TCLTK_POSSIBLE_BIN_PATHS
  62. "${TCL_INCLUDE_PATH_PARENT}/bin"
  63. "${TK_INCLUDE_PATH_PARENT}/bin"
  64. "${TCL_LIBRARY_PATH_PARENT}/bin"
  65. "${TK_LIBRARY_PATH_PARENT}/bin"
  66. "${TK_WISH_PATH_PARENT}/bin"
  67. )
  68. if(WIN32)
  69. get_filename_component(
  70. ActiveTcl_CurrentVersion
  71. "[HKEY_LOCAL_MACHINE\\SOFTWARE\\ActiveState\\ActiveTcl;CurrentVersion]"
  72. NAME)
  73. set(TCLTK_POSSIBLE_BIN_PATHS ${TCLTK_POSSIBLE_BIN_PATHS}
  74. "[HKEY_LOCAL_MACHINE\\SOFTWARE\\ActiveState\\ActiveTcl\\${ActiveTcl_CurrentVersion}]/bin"
  75. "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Scriptics\\Tcl\\8.6;Root]/bin"
  76. "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Scriptics\\Tcl\\8.5;Root]/bin"
  77. "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Scriptics\\Tcl\\8.4;Root]/bin"
  78. "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Scriptics\\Tcl\\8.3;Root]/bin"
  79. "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Scriptics\\Tcl\\8.2;Root]/bin"
  80. "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Scriptics\\Tcl\\8.0;Root]/bin"
  81. )
  82. endif()
  83. set(TCL_TCLSH_NAMES
  84. tclsh
  85. tclsh${TCL_LIBRARY_VERSION} tclsh${TK_LIBRARY_VERSION} tclsh${TK_WISH_VERSION}
  86. tclsh87 tclsh8.7
  87. tclsh86 tclsh8.6
  88. tclsh85 tclsh8.5
  89. tclsh84 tclsh8.4
  90. tclsh83 tclsh8.3
  91. tclsh82 tclsh8.2
  92. tclsh80 tclsh8.0
  93. )
  94. find_program(TCL_TCLSH
  95. NAMES ${TCL_TCLSH_NAMES}
  96. HINTS ${TCLTK_POSSIBLE_BIN_PATHS}
  97. )
  98. if(TCL_TCLSH)
  99. execute_process(COMMAND "${CMAKE_COMMAND}" -E echo puts "\$tcl_version"
  100. COMMAND "${TCL_TCLSH}"
  101. OUTPUT_VARIABLE Tclsh_VERSION
  102. ERROR_QUIET
  103. OUTPUT_STRIP_TRAILING_WHITESPACE)
  104. set(TCLSH_VERSION_STRING "${Tclsh_VERSION}")
  105. endif()
  106. include(FindPackageHandleStandardArgs)
  107. if (CMAKE_FIND_PACKAGE_NAME STREQUAL "TCL" OR
  108. CMAKE_FIND_PACKAGE_NAME STREQUAL "TclStub")
  109. # FindTCL include()'s this module. It's an old pattern, but rather than
  110. # trying to suppress this from outside the module (which is then sensitive to
  111. # the contents, detect the case in this module and suppress it explicitly.
  112. # Transitively, FindTclStub includes FindTCL.
  113. set(FPHSA_NAME_MISMATCHED 1)
  114. endif ()
  115. find_package_handle_standard_args(Tclsh
  116. REQUIRED_VARS TCL_TCLSH
  117. VERSION_VAR Tclsh_VERSION)
  118. unset(FPHSA_NAME_MISMATCHED)
  119. mark_as_advanced(TCL_TCLSH)