[GiNaC-list] [patch] MinGW compile fixes [Was: Re: Results of GiNaC
(& CLN) builds]
Sheplyakov Alexei
varg at theor.jinr.ru
Fri Jul 14 19:50:47 CEST 2006
On Thu, Jul 13, 2006 at 06:21:20PM +0200, Chris Dams wrote:
>
> Dear Richard and others,
>
> I won't be addressing most of your observations. I could have a small look
> if time permits, but am not going to promise anything.
Actually, I've already submitted patches which solve most of portability
issues, these patches are already in CVS (1.4 branch).
I've attached two patches. First patch is for GiNaC 1.4. It solves solves
"no readline" issue.
Second one is for GiNaC 1.3 ("backport" from 1.4 branch) -- it contains
*all* changes which make GiNaC compile on MinGW.
--
All science is either physics or stamp collecting.
-------------- next part --------------
Index: acinclude.m4
===================================================================
RCS file: /home/cvs/GiNaC/acinclude.m4,v
retrieving revision 1.22
diff -u -r1.22 acinclude.m4
--- acinclude.m4 3 Nov 2005 22:19:32 -0000 1.22
+++ acinclude.m4 14 Jul 2006 17:27:13 -0000
@@ -43,6 +43,10 @@
dnl libtermcap is being phased out.
AC_DEFUN([GINAC_TERMCAP],
[LIBTERMCAP=
+case $host_os in
+*mingw32*)
+ ;; dnl no termcap libraries are necessary (need hacked libreadline)
+*)
AC_CHECK_FUNCS(tgetent)
if test "x$ac_cv_func_tgetent" = "xyes"; then
:
@@ -52,6 +56,8 @@
AC_CHECK_LIB(termcap, tgetent, LIBTERMCAP="-ltermcap")
fi
fi
+;;
+esac
AC_SUBST(LIBTERMCAP)
])
Index: check/Makefile.am
===================================================================
RCS file: /home/cvs/GiNaC/check/Makefile.am,v
retrieving revision 1.31
diff -u -r1.31 Makefile.am
--- check/Makefile.am 20 Aug 2003 18:01:35 -0000 1.31
+++ check/Makefile.am 14 Jul 2006 17:27:13 -0000
@@ -2,6 +2,7 @@
TESTS = run_exams run_checks run_times
check_PROGRAMS = exams checks times
+TESTS_ENVIRONMENT = EXEEXT=$(EXEEXT) srcdir=$(srcdir)
checks_SOURCES = check_numeric.cpp check_inifcns.cpp check_matrices.cpp \
check_lsolve.cpp genex.cpp checks.cpp checks.h
Index: check/run_checks
===================================================================
RCS file: /home/cvs/GiNaC/check/run_checks,v
retrieving revision 1.4
diff -u -r1.4 run_checks
--- check/run_checks 13 Mar 2000 14:14:21 -0000 1.4
+++ check/run_checks 14 Jul 2006 17:27:13 -0000
@@ -1,4 +1,4 @@
#! /bin/sh
echo "GiNaC will now run through some rather costly random consistency checks:"
-./checks 2>checks.out
+./checks${EXEEXT} 2>checks.out
cmp ${srcdir}/checks.ref checks.out
Index: check/run_exams
===================================================================
RCS file: /home/cvs/GiNaC/check/run_exams,v
retrieving revision 1.1
diff -u -r1.1 run_exams
--- check/run_exams 29 Feb 2000 14:28:23 -0000 1.1
+++ check/run_exams 14 Jul 2006 17:27:13 -0000
@@ -1,4 +1,4 @@
#! /bin/sh
echo "GiNaC will now take an exam with specific input (like a pupils' exam):"
-./exams 2>exams.out
+./exams${EXEEXT} 2>exams.out
cmp ${srcdir}/exams.ref exams.out
Index: check/run_times
===================================================================
RCS file: /home/cvs/GiNaC/check/run_times,v
retrieving revision 1.1
diff -u -r1.1 run_times
--- check/run_times 29 Feb 2000 14:28:23 -0000 1.1
+++ check/run_times 14 Jul 2006 17:27:13 -0000
@@ -1,4 +1,4 @@
#! /bin/sh
echo "GiNaC will now run through some basic timings:"
-./times 2>times.out
+./times${EXEEXT} 2>times.out
cmp ${srcdir}/times.ref times.out
-------------- next part --------------
Index: configure.ac
===================================================================
RCS file: /home/cvs/GiNaC/configure.ac,v
retrieving revision 1.21.2.6
diff -u -r1.21.2.6 configure.ac
--- configure.ac 12 Apr 2006 16:23:01 -0000 1.21.2.6
+++ configure.ac 14 Jul 2006 17:31:16 -0000
@@ -82,6 +82,7 @@
dnl Check for stuff needed for building the GiNaC interactive shell (ginsh).
AC_CHECK_HEADERS(unistd.h)
+GINAC_HAVE_RUSAGE
AC_CHECK_HEADERS(readline/readline.h readline/history.h)
if test "x${ac_cv_header_readline_readline_h}" != "xyes" -o "x${ac_cv_header_readline_history_h}" != "xyes"; then
GINAC_WARNING([I could not find the headers for libreadline (needed for building ginsh).])
@@ -111,6 +112,9 @@
AC_CHECK_HEADER(stdexcept, , GINAC_ERROR([The standard <stdexcept> header file could not be found.]))
AC_CHECK_HEADER(algorithm, , GINAC_ERROR([The standard <algorithm> header file could not be found.]))
AC_CHECK_HEADER(limits, , GINAC_ERROR([The standard <limits> header file could not be found.]))
+if test "x$CONFIG_RUSAGE" = "xno"; then
+ AC_CHECK_HEADER(ctime, , GINAC_ERROR([The standard <ctime> header file could not be found.]))
+fi
dnl We need to have Bruno Haible's CLN installed.
dnl (CLN versions >= 1.1.0 must have installed cln.m4 at a visible place,
Index: acinclude.m4
===================================================================
RCS file: /home/cvs/GiNaC/acinclude.m4,v
retrieving revision 1.21
diff -u -r1.21 acinclude.m4
--- acinclude.m4 5 Jul 2004 15:56:28 -0000 1.21
+++ acinclude.m4 14 Jul 2006 17:31:16 -0000
@@ -43,6 +43,10 @@
dnl libtermcap is being phased out.
AC_DEFUN([GINAC_TERMCAP],
[LIBTERMCAP=
+case $host_os in
+*mingw32*) dnl termcap library is not necessary on this platform
+;;
+*)
AC_CHECK_FUNCS(tgetent)
if test "x$ac_cv_func_tgetent" = "xyes"; then
:
@@ -52,6 +56,8 @@
AC_CHECK_LIB(termcap, tgetent, LIBTERMCAP="-ltermcap")
fi
fi
+;;
+esac
AC_SUBST(LIBTERMCAP)
])
@@ -100,3 +106,22 @@
fi
echo "Configuration of GiNaC $VERSION done. Now type \"make\"."
fi])
+
+AC_DEFUN([GINAC_HAVE_RUSAGE],
+[AC_CACHE_CHECK([whether struct rusage is declared in <sys/resource.h>],
+ac_cv_have_rusage,
+ [AC_TRY_COMPILE([#include <sys/times.h>
+ #include <sys/resource.h>],
+ [struct rusage resUsage;
+ getrusage(RUSAGE_SELF, &resUsage);
+ return 0;],
+ [ac_cv_have_rusage=yes],
+ [ac_cv_have_rusage=no])
+])
+CONFIG_RUSAGE="no"
+if test "$ac_cv_have_rusage" = yes; then
+ CONFIG_RUSAGE="yes"
+ AC_DEFINE(HAVE_RUSAGE,,[define if struct rusage declared in <sys/resource.h>])
+fi
+AC_SUBST(CONFIG_RUSAGE)
+])
Index: check/Makefile.am
===================================================================
RCS file: /home/cvs/GiNaC/check/Makefile.am,v
retrieving revision 1.31
diff -u -r1.31 Makefile.am
--- check/Makefile.am 20 Aug 2003 18:01:35 -0000 1.31
+++ check/Makefile.am 14 Jul 2006 17:31:16 -0000
@@ -2,6 +2,7 @@
TESTS = run_exams run_checks run_times
check_PROGRAMS = exams checks times
+TESTS_ENVIRONMENT = EXEEXT=$(EXEEXT) srcdir=$(srcdir)
checks_SOURCES = check_numeric.cpp check_inifcns.cpp check_matrices.cpp \
check_lsolve.cpp genex.cpp checks.cpp checks.h
Index: check/exam_archive.cpp
===================================================================
RCS file: /home/cvs/GiNaC/check/exam_archive.cpp,v
retrieving revision 1.13.4.2
diff -u -r1.13.4.2 exam_archive.cpp
--- check/exam_archive.cpp 1 May 2005 18:12:42 -0000 1.13.4.2
+++ check/exam_archive.cpp 14 Jul 2006 17:31:16 -0000
@@ -54,12 +54,12 @@
archive ar;
ar.archive_ex(e, "expr 1");
{
- std::ofstream fout("exam.gar");
+ std::ofstream fout("exam.gar", std::ios_base::binary);
fout << ar;
}
ar.clear();
{
- std::ifstream fin("exam.gar");
+ std::ifstream fin("exam.gar", std::ios_base::binary);
fin >> ar;
}
f = ar.unarchive_ex(lst(x, y, mu, dim), "expr 1");
Index: check/run_checks
===================================================================
RCS file: /home/cvs/GiNaC/check/run_checks,v
retrieving revision 1.4
diff -u -r1.4 run_checks
--- check/run_checks 13 Mar 2000 14:14:21 -0000 1.4
+++ check/run_checks 14 Jul 2006 17:31:16 -0000
@@ -1,4 +1,4 @@
#! /bin/sh
echo "GiNaC will now run through some rather costly random consistency checks:"
-./checks 2>checks.out
+./checks${EXEEXT} 2>checks.out
cmp ${srcdir}/checks.ref checks.out
Index: check/run_exams
===================================================================
RCS file: /home/cvs/GiNaC/check/run_exams,v
retrieving revision 1.1
diff -u -r1.1 run_exams
--- check/run_exams 29 Feb 2000 14:28:23 -0000 1.1
+++ check/run_exams 14 Jul 2006 17:31:16 -0000
@@ -1,4 +1,4 @@
#! /bin/sh
echo "GiNaC will now take an exam with specific input (like a pupils' exam):"
-./exams 2>exams.out
+./exams${EXEEXT} 2>exams.out
cmp ${srcdir}/exams.ref exams.out
Index: check/run_times
===================================================================
RCS file: /home/cvs/GiNaC/check/run_times,v
retrieving revision 1.1
diff -u -r1.1 run_times
--- check/run_times 29 Feb 2000 14:28:23 -0000 1.1
+++ check/run_times 14 Jul 2006 17:31:16 -0000
@@ -1,4 +1,4 @@
#! /bin/sh
echo "GiNaC will now run through some basic timings:"
-./times 2>times.out
+./times${EXEEXT} 2>times.out
cmp ${srcdir}/times.ref times.out
Index: check/timer.cpp
===================================================================
RCS file: /home/cvs/GiNaC/check/timer.cpp,v
retrieving revision 1.7.4.3
diff -u -r1.7.4.3 timer.cpp
--- check/timer.cpp 1 Nov 2005 21:05:15 -0000 1.7.4.3
+++ check/timer.cpp 14 Jul 2006 17:31:16 -0000
@@ -20,51 +20,80 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
-#include <sys/time.h>
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+#ifdef HAVE_RUSAGE
#include <sys/resource.h>
#include <unistd.h>
+#include <sys/time.h>
+#else
+#include <ctime>
+#endif
#include "timer.h"
timer::timer() : on(false)
{
+#ifdef HAVE_RUSAGE
getrusage(RUSAGE_SELF, &used1);
used2.ru_utime = used1.ru_utime;
used2.ru_stime = used1.ru_stime;
+#else
+ used1 = clock();
+ used2 = used1;
+#endif
}
void timer::start()
{
on = true;
+#ifdef HAVE_RUSAGE
getrusage(RUSAGE_SELF, &used1);
used2.ru_utime = used1.ru_utime;
used2.ru_stime = used1.ru_stime;
+#else
+ used1 = clock();
+ used2 = used1;
+#endif
}
void timer::stop()
{
on = false;
+#ifdef HAVE_RUSAGE
getrusage(RUSAGE_SELF, &used2);
+#else
+ used2 = clock();
+#endif
}
void timer::reset()
{
+#ifdef HAVE_RUSAGE
getrusage(RUSAGE_SELF, &used1);
used2.ru_utime = used1.ru_utime;
used2.ru_stime = used1.ru_stime;
+#else
+ used1 = clock();
+ used2 = used1;
+#endif
}
double timer::read()
{
- double elapsed;
+#ifdef HAVE_RUSAGE
if (running())
getrusage(RUSAGE_SELF, &used2);
- elapsed = ((used2.ru_utime.tv_sec - used1.ru_utime.tv_sec) +
- (used2.ru_stime.tv_sec - used1.ru_stime.tv_sec) +
- (used2.ru_utime.tv_usec - used1.ru_utime.tv_usec) * 1e-6 +
- (used2.ru_stime.tv_usec - used1.ru_stime.tv_usec) * 1e-6);
- // Results more accurate than 10ms are pointless:
- return 0.01*int(elapsed*100+0.5);
+ return ((used2.ru_utime.tv_sec - used1.ru_utime.tv_sec) +
+ (used2.ru_stime.tv_sec - used1.ru_stime.tv_sec) +
+ (used2.ru_utime.tv_usec - used1.ru_utime.tv_usec) * 1e-6 +
+ (used2.ru_stime.tv_usec - used1.ru_stime.tv_usec) * 1e-6);
+#else
+ if (running())
+ used2 = clock();
+ return double(used2 - used1)/CLOCKS_PER_SEC;
+#endif
}
bool timer::running()
Index: check/timer.h
===================================================================
RCS file: /home/cvs/GiNaC/check/timer.h,v
retrieving revision 1.3.4.2
diff -u -r1.3.4.2 timer.h
--- check/timer.h 1 May 2005 18:12:42 -0000 1.3.4.2
+++ check/timer.h 14 Jul 2006 17:31:16 -0000
@@ -23,7 +23,14 @@
#ifndef TIMER_H
#define TIMER_H
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+#ifdef HAVE_RUSAGE
#include <sys/resource.h>
+#else
+#include <ctime>
+#endif
class timer {
public:
@@ -35,7 +42,11 @@
bool running();
private:
bool on;
+#ifdef HAVE_RUSAGE
struct rusage used1, used2;
+#else
+ std::clock_t used1, used2;
+#endif
};
#endif // ndef TIMER_H
Index: ginsh/ginsh_parser.yy
===================================================================
RCS file: /home/cvs/GiNaC/ginsh/ginsh_parser.yy,v
retrieving revision 1.77.2.5
diff -u -r1.77.2.5 ginsh_parser.yy
--- ginsh/ginsh_parser.yy 22 Apr 2006 15:42:25 -0000 1.77.2.5
+++ ginsh/ginsh_parser.yy 14 Jul 2006 17:31:17 -0000
@@ -28,8 +28,11 @@
%{
#include "config.h"
-
+#ifdef HAVE_RUSAGE
#include <sys/resource.h>
+#else
+#include <ctime>
+#endif
#if HAVE_UNISTD_H
#include <sys/types.h>
@@ -61,7 +64,23 @@
static ex exstack[3];
// Start and end time for the time() function
+#ifdef HAVE_RUSAGE
static struct rusage start_time, end_time;
+#define START_TIMER getrusage(RUSAGE_SELF, &start_time);
+#define STOP_TIMER getrusage(RUSAGE_SELF, &end_time);
+#define PRINT_TIME_USED cout << \
+ (end_time.ru_utime.tv_sec - start_time.ru_utime.tv_sec) + \
+ (end_time.ru_stime.tv_sec - start_time.ru_stime.tv_sec) + \
+ double(end_time.ru_utime.tv_usec - start_time.ru_utime.tv_usec) / 1e6 + \
+ double(end_time.ru_stime.tv_usec - start_time.ru_stime.tv_usec) / 1e6 \
+ << 's' << endl;
+#else
+static std::clock_t start_time, end_time;
+#define START_TIMER start_time = std::clock();
+#define STOP_TIMER end_time = std::clock();
+#define PRINT_TIME_USED \
+ cout << double(end_time - start_time)/CLOCKS_PER_SEC << 's' << endl;
+#endif
// Table of functions (a multimap, because one function may appear with different
// numbers of parameters)
@@ -210,13 +229,7 @@
}
| T_REAL_SYMBOLS { symboltype = domain::real; }
| T_COMPLEX_SYMBOLS { symboltype = domain::complex; }
- | T_TIME {getrusage(RUSAGE_SELF, &start_time);} '(' exp ')' {
- getrusage(RUSAGE_SELF, &end_time);
- cout << (end_time.ru_utime.tv_sec - start_time.ru_utime.tv_sec) +
- (end_time.ru_stime.tv_sec - start_time.ru_stime.tv_sec) +
- double(end_time.ru_utime.tv_usec - start_time.ru_utime.tv_usec) / 1e6 +
- double(end_time.ru_stime.tv_usec - start_time.ru_stime.tv_usec) / 1e6 << 's' << endl;
- }
+ | T_TIME { START_TIMER } '(' exp ')' { STOP_TIMER PRINT_TIME_USED }
| error ';' {yyclearin; yyerrok;}
| error ':' {yyclearin; yyerrok;}
;
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 827 bytes
Desc: Digital signature
Url : http://www.cebix.net/pipermail/ginac-list/attachments/20060714/ae12871c/attachment.pgp
More information about the GiNaC-list
mailing list