summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lang/tclX/Makefile21
-rw-r--r--lang/tclX/files/patch-profile103
2 files changed, 121 insertions, 3 deletions
diff --git a/lang/tclX/Makefile b/lang/tclX/Makefile
index d0a98186c5cb..bc34d774d5c2 100644
--- a/lang/tclX/Makefile
+++ b/lang/tclX/Makefile
@@ -16,8 +16,8 @@ MAINTAINER= mi@aldan.algebra.com
COMMENT= Extended TCL
USE_BZIP2= yes
-USE_TCL_BUILD= 84
-USE_TCL= 84
+USE_TCL_BUILD= yes
+USE_TCL= yes
USE_LDCONFIG= yes
GNU_CONFIGURE= yes
@@ -28,9 +28,20 @@ CONFIGURE_ARGS= --enable-shared \
--with-tcl="${TCL_LIBDIR}"
PLIST_SUB= TCLX_VER=${PORTVERSION}
MAKE_JOBS_SAFE= yes
-ALL_TARGET= binaries libraries # test
+ALL_TARGET= binaries libraries
INSTALL_TARGET= install-binaries install-libraries
+check test regression-check:
+ #
+ # Define TCLX_NO_SELF_TESTS to disable automatic
+ # running of TclX' checks after building
+ #
+ ${SETENV} ${MAKE_ENV} ${MAKE} -C ${WRKSRC} test
+
+.ifndef TCLX_NO_SELF_TESTS
+post-build: test
+.endif
+
MAN3= CmdWrite.3 Handles.3 Keylist.3 ObjCmdWrite.3 TclXInit.3
MANN= TclX.n
@@ -48,6 +59,10 @@ MLINKS+= TclXInit.3 $l.3
.include <bsd.port.pre.mk>
+.if ${TCL_VER} > 8.4
+EXTRA_PATCHES+= ${FILESDIR}/tcl85-test-patch
+.endif
+
pre-configure:
.if exists(${TCL_LIBDIR}/tclConfig-threads.sh)
${REINPLACE_CMD} -e 's|tclConfig.sh|tclConfig-threads.sh|' \
diff --git a/lang/tclX/files/patch-profile b/lang/tclX/files/patch-profile
new file mode 100644
index 000000000000..a7a4f0131c9b
--- /dev/null
+++ b/lang/tclX/files/patch-profile
@@ -0,0 +1,103 @@
+This first patch fixes a seg-fault at `make test' time -- profile.test crashes
+without this change.
+
+Submitted to maintainers:
+
+https://sourceforge.net/tracker/index.php?func=detail&aid=1925400&group_id=13247&atid=113247
+
+and committed upstream.
+
+The second changes TclXOSElapsedTime to better handles clock_t being too
+narrow (32-bit on FreeBSD).
+
+Getting it committed upstream...
+
+ -mi
+
+--- generic/tclXprofile.c 2004-11-22 19:12:54.000000000 -0500
++++ generic/tclXprofile.c 2009-07-31 02:44:11.000000000 -0400
+@@ -674,5 +674,5 @@
+ CallFrame *framePtr;
+ {
+- if (framePtr == NULL)
++ if (framePtr == NULL || framePtr->objv == NULL)
+ return;
+ InitializeProcStack (infoPtr, framePtr->callerPtr);
+--- unix/tclXunixOS.c 2005-07-12 15:03:15.000000000 -0400
++++ unix/tclXunixOS.c 2009-11-27 02:00:57.000000000 -0500
+@@ -550,4 +550,10 @@
+ * o realTime - Elapsed real time, in milliseconds is returned here.
+ * o cpuTime - Elapsed CPU time, in milliseconds is returned here.
++ *
++ * XXX In some cases, clock_t may not be wide enough, such as when it is
++ * XXX a signed 32-bit value, its maximum is 2^31 or 2147483648. There
++ * XXX are more milliseconds in 25 days: 25*1000*60*60*24 = 2160000000.
++ * XXX If a profile-session is to last longer than that, the API needs
++ * XXX to use 64-bit values. -mi Nov 27, 2009
+ *-----------------------------------------------------------------------------
+ */
+@@ -557,4 +563,5 @@
+ clock_t *cpuTime;
+ {
++ struct tms cpuTimes;
+ /*
+ * If times returns elapsed real time, this is easy. If it returns a status,
+@@ -562,25 +569,34 @@
+ */
+ #ifndef TIMES_RETS_STATUS
+- struct tms cpuTimes;
++ static clock_t startTime;
++ clock_t currentTime;
+
+- *realTime = TclXOSTicksToMS (times (&cpuTimes));
+- *cpuTime = TclXOSTicksToMS (cpuTimes.tms_utime + cpuTimes.tms_stime);
++ /*
++ * If this is the first call, get base time.
++ */
++ currentTime = times (&cpuTimes);
++ if (startTime == 0) {
++ startTime = currentTime;
++ *realTime = 0;
++ } else
++ *realTime = TclXOSTicksToMS (currentTime - startTime);
+ #else
+ static struct timeval startTime = {0, 0};
+ struct timeval currentTime;
+- struct tms cpuTimes;
+
+ /*
+ * If this is the first call, get base time.
+ */
+- if ((startTime.tv_sec == 0) && (startTime.tv_usec == 0))
++ if ((startTime.tv_sec == 0) && (startTime.tv_usec == 0)) {
+ gettimeofday (&startTime, NULL);
+-
+- gettimeofday (&currentTime, NULL);
+- currentTime.tv_sec = currentTime.tv_sec - startTime.tv_sec;
+- currentTime.tv_usec = currentTime.tv_usec - startTime.tv_usec;
+- *realTime = (currentTime.tv_sec * 1000) + (currentTime.tv_usec / 1000);
++ *realTime = 0;
++ } else {
++ gettimeofday (&currentTime, NULL);
++ currentTime.tv_sec = currentTime.tv_sec - startTime.tv_sec;
++ currentTime.tv_usec = currentTime.tv_usec - startTime.tv_usec;
++ *realTime = (currentTime.tv_sec * 1000) + (currentTime.tv_usec / 1000);
++ }
+ times (&cpuTimes);
+- *cpuTime = TclXOSTicksToMS (cpuTimes.tms_utime + cpuTimes.tms_stime);
+ #endif
++ *cpuTime = TclXOSTicksToMS (cpuTimes.tms_utime + cpuTimes.tms_stime);
+ }
+--- unix/tclXunixPort.h 2005-10-07 19:30:28.000000000 -0400
++++ unix/tclXunixPort.h 2009-11-27 02:31:15.000000000 -0500
+@@ -66,4 +66,10 @@
+ * Make sure CLK_TCK is defined.
+ */
++#ifdef __FreeBSD__
++# if defined(CLK_TCK) && CLK_TCK == 128
++# undef CLK_TCK
++# define CLK_TCK sysconf(_SC_CLK_TCK)
++# endif
++#endif
+ #ifndef CLK_TCK
+ # ifdef HZ