summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJulien Louis <ptitlouis@sysif.net>2008-10-18 13:54:59 +0200
committerJulien Louis <ptitlouis@sysif.net>2008-10-18 13:54:59 +0200
commit1f10ee141ae7376675758bc9d1792346f2728c3f (patch)
treedc323570cd2502a9456b73f388cabf6af58b6975
parenteab690aaafcd31dfe9400f51548896aafad29817 (diff)
downloadweechat-1f10ee141ae7376675758bc9d1792346f2728c3f.zip
- Add FindTCL.cmake to fix FreeBSD detection
- Only call Tcl_CreateNamespace when available in the public API, fix compatibility with older release
-rw-r--r--cmake/FindTCL.cmake158
-rw-r--r--config.h.cmake1
-rw-r--r--src/plugins/scripts/tcl/CMakeLists.txt5
-rw-r--r--src/plugins/scripts/tcl/weechat-tcl-api.c2
4 files changed, 166 insertions, 0 deletions
diff --git a/cmake/FindTCL.cmake b/cmake/FindTCL.cmake
new file mode 100644
index 000000000..3c6fefc3f
--- /dev/null
+++ b/cmake/FindTCL.cmake
@@ -0,0 +1,158 @@
+# - Find Tcl includes and libraries.
+# This module finds if Tcl is installed and determines where the
+# include files and libraries are. It also determines what the name of
+# the library is. This code sets the following variables:
+# TCL_FOUND = Tcl was found
+# TK_FOUND = Tk was found
+# TCLTK_FOUND = Tcl and Tk were found
+# TCL_LIBRARY = path to Tcl library (tcl tcl80)
+# TCL_INCLUDE_PATH = path to where tcl.h can be found
+# TCL_TCLSH = path to tclsh binary (tcl tcl80)
+# TK_LIBRARY = path to Tk library (tk tk80 etc)
+# TK_INCLUDE_PATH = path to where tk.h can be found
+# TK_WISH = full path to the wish executable
+#
+# In an effort to remove some clutter and clear up some issues for people
+# who are not necessarily Tcl/Tk gurus/developpers, some variables were
+# moved or removed. Changes compared to CMake 2.4 are:
+# - The stub libraries are now found in FindTclStub.cmake
+# => they were only useful for people writing Tcl/Tk extensions.
+# - TCL_LIBRARY_DEBUG and TK_LIBRARY_DEBUG were removed.
+# => these libs are not packaged by default with Tcl/Tk distributions.
+# Even when Tcl/Tk is built from source, several flavors of debug libs
+# are created and there is no real reason to pick a single one
+# specifically (say, amongst tcl84g, tcl84gs, or tcl84sgx).
+# Let's leave that choice to the user by allowing him to assign
+# TCL_LIBRARY to any Tcl library, debug or not.
+# - TK_INTERNAL_PATH was removed.
+# => this ended up being only a Win32 variable, and there is a lot of
+# confusion regarding the location of this file in an installed Tcl/Tk
+# tree anyway (see 8.5 for example). If you need the internal path at
+# this point it is safer you ask directly where the *source* tree is
+# and dig from there.
+
+INCLUDE(CMakeFindFrameworks)
+INCLUDE(FindTclsh)
+
+GET_FILENAME_COMPONENT(TCL_TCLSH_PATH "${TCL_TCLSH}" PATH)
+GET_FILENAME_COMPONENT(TCL_TCLSH_PATH_PARENT "${TCL_TCLSH_PATH}" PATH)
+STRING(REGEX REPLACE
+ "^.*tclsh([0-9]\\.*[0-9]).*$" "\\1" TCL_TCLSH_VERSION "${TCL_TCLSH}")
+
+GET_FILENAME_COMPONENT(TCL_INCLUDE_PATH_PARENT "${TCL_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_VERSION "${TCL_LIBRARY}")
+
+SET(TCL_POSSIBLE_LIB_PATHS
+ "${TCL_INCLUDE_PATH_PARENT}/lib"
+ "${TCL_LIBRARY_PATH}"
+ "${TCL_TCLSH_PATH_PARENT}/lib"
+ /usr/lib
+ /usr/local/lib
+ )
+
+IF(WIN32)
+ GET_FILENAME_COMPONENT(
+ ActiveTcl_CurrentVersion
+ "[HKEY_LOCAL_MACHINE\\SOFTWARE\\ActiveState\\ActiveTcl;CurrentVersion]"
+ NAME)
+ SET(TCLTK_POSSIBLE_LIB_PATHS ${TCLTK_POSSIBLE_LIB_PATHS}
+ "[HKEY_LOCAL_MACHINE\\SOFTWARE\\ActiveState\\ActiveTcl\\${ActiveTcl_CurrentVersion}]/lib"
+ "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Scriptics\\Tcl\\8.6;Root]/lib"
+ "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Scriptics\\Tcl\\8.5;Root]/lib"
+ "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Scriptics\\Tcl\\8.4;Root]/lib"
+ "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Scriptics\\Tcl\\8.3;Root]/lib"
+ "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Scriptics\\Tcl\\8.2;Root]/lib"
+ "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Scriptics\\Tcl\\8.0;Root]/lib"
+ "$ENV{ProgramFiles}/Tcl/Lib"
+ "C:/Program Files/Tcl/lib"
+ "C:/Tcl/lib"
+ )
+ENDIF(WIN32)
+
+FIND_LIBRARY(TCL_LIBRARY
+ NAMES
+ tcl
+ tcl${TCL_VERSION} tcl${TCL_TCLSH_VERSION}
+ tcl86 tcl8.6
+ tcl85 tcl8.5
+ tcl84 tcl8.4
+ tcl83 tcl8.3
+ tcl82 tcl8.2
+ tcl80 tcl8.0
+ PATHS ${TCL_POSSIBLE_LIB_PATHS}
+ )
+
+CMAKE_FIND_FRAMEWORKS(Tcl)
+
+SET(TCL_FRAMEWORK_INCLUDES)
+IF(Tcl_FRAMEWORKS)
+ IF(NOT TCL_INCLUDE_PATH)
+ FOREACH(dir ${Tcl_FRAMEWORKS})
+ SET(TCL_FRAMEWORK_INCLUDES ${TCL_FRAMEWORK_INCLUDES} ${dir}/Headers)
+ ENDFOREACH(dir)
+ ENDIF(NOT TCL_INCLUDE_PATH)
+ENDIF(Tcl_FRAMEWORKS)
+
+SET(TCL_POSSIBLE_INCLUDE_PATHS
+ "${TCL_LIBRARY_PATH_PARENT}/include"
+ "${TCL_INCLUDE_PATH}"
+ ${TCL_FRAMEWORK_INCLUDES}
+ "${TCL_TCLSH_PATH_PARENT}/include"
+ /usr/include
+ /usr/local/include
+ /usr/include/tcl${TCL_VERSION}
+ /usr/include/tcl8.6
+ /usr/include/tcl8.5
+ /usr/include/tcl8.4
+ /usr/include/tcl8.3
+ /usr/include/tcl8.2
+ /usr/include/tcl8.0
+ /usr/local/include/tcl${TCL_VERSION}
+ /usr/local/include/tcl8.6
+ /usr/local/include/tcl8.5
+ /usr/local/include/tcl8.4
+ /usr/local/include/tcl8.3
+ /usr/local/include/tcl8.2
+ /usr/local/include/tcl8.0
+ )
+
+
+IF(WIN32)
+ SET(TCLTK_POSSIBLE_INCLUDE_PATHS ${TCLTK_POSSIBLE_INCLUDE_PATHS}
+ "[HKEY_LOCAL_MACHINE\\SOFTWARE\\ActiveState\\ActiveTcl\\${ActiveTcl_CurrentVersion}]/include"
+ "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Scriptics\\Tcl\\8.6;Root]/include"
+ "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Scriptics\\Tcl\\8.5;Root]/include"
+ "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Scriptics\\Tcl\\8.4;Root]/include"
+ "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Scriptics\\Tcl\\8.3;Root]/include"
+ "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Scriptics\\Tcl\\8.2;Root]/include"
+ "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Scriptics\\Tcl\\8.0;Root]/include"
+ "$ENV{ProgramFiles}/Tcl/include"
+ "C:/Program Files/Tcl/include"
+ "C:/Tcl/include"
+ )
+ENDIF(WIN32)
+
+FIND_PATH(TCL_INCLUDE_PATH
+ NAMES tcl.h
+ PATHS ${TCL_POSSIBLE_INCLUDE_PATHS}
+ )
+
+# handle the QUIETLY and REQUIRED arguments and set TCL_FOUND to TRUE if
+# all listed variables are TRUE
+INCLUDE(FindPackageHandleStandardArgs)
+
+FIND_PACKAGE_HANDLE_STANDARD_ARGS(TCL DEFAULT_MSG TCL_LIBRARY TCL_INCLUDE_PATH)
+SET(TCL_FIND_REQUIRED ${TCL_FIND_REQUIRED})
+SET(TCL_FIND_QUIETLY ${TCL_FIND_QUIETLY})
+SET(TCL_VERSION ${TCL_VERSION})
+FIND_PACKAGE_HANDLE_STANDARD_ARGS(TCL DEFAULT_MSG TCL_LIBRARY TCL_INCLUDE_PATH)
+
+MARK_AS_ADVANCED(
+ TCL_INCLUDE_PATH
+ TCL_LIBRARY
+ TCL_VERSION
+ )
diff --git a/config.h.cmake b/config.h.cmake
index 37100ce04..6912c0bec 100644
--- a/config.h.cmake
+++ b/config.h.cmake
@@ -19,6 +19,7 @@
#cmakedefine HAVE_LANGINFO_CODESET
#cmakedefine HAVE_STRNDUP
#cmakedefine ICONV_2ARG_IS_CONST 1
+#cmakedefine HAVE_TCL_CREATE_NS
#define PACKAGE_VERSION "@VERSION@"
#define PACKAGE "@PROJECT_NAME@"
#define PACKAGE_NAME "@PROJECT_NAME@"
diff --git a/src/plugins/scripts/tcl/CMakeLists.txt b/src/plugins/scripts/tcl/CMakeLists.txt
index 977a36d4f..9b69794c6 100644
--- a/src/plugins/scripts/tcl/CMakeLists.txt
+++ b/src/plugins/scripts/tcl/CMakeLists.txt
@@ -20,9 +20,14 @@ weechat-tcl-api.c weechat-tcl-api.h)
SET_TARGET_PROPERTIES(tcl PROPERTIES PREFIX "")
IF(TCL_FOUND)
+ SET(CMAKE_REQUIRED_INCLUDES "${TCL_INCLUDE_PATH}")
+ SET(CMAKE_REQUIRED_LIBRARIES "${TCL_LIBRARY}")
+ CHECK_SYMBOL_EXISTS(Tcl_CreateNamespace tcl.h HAVE_TCL_CREATE_NS)
+
INCLUDE_DIRECTORIES(${TCL_INCLUDE_PATH})
SET(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} ${TCL_LFLAGS}")
TARGET_LINK_LIBRARIES(tcl ${TCL_LIBRARY} weechat_scripts)
+
ENDIF(TCL_FOUND)
INSTALL(TARGETS tcl LIBRARY DESTINATION lib/weechat/plugins)
diff --git a/src/plugins/scripts/tcl/weechat-tcl-api.c b/src/plugins/scripts/tcl/weechat-tcl-api.c
index 2de706169..dd391bd70 100644
--- a/src/plugins/scripts/tcl/weechat-tcl-api.c
+++ b/src/plugins/scripts/tcl/weechat-tcl-api.c
@@ -4896,8 +4896,10 @@ void weechat_tcl_api_init (Tcl_Interp *interp) {
/* standard initializer */
Tcl_Init (interp);
+#ifdef HAVE_TCL_CREATE_NS
/* create weechat namespace */
Tcl_CreateNamespace (interp, "weechat",(ClientData)0,NULL);
+#endif
/* interface constants */
/* set variables, TODO: make them unmodifiable (thru Tcl_TraceVar) ? */