#! /bin/sh /usr/share/dpatch/dpatch-run
## 321-support-gfortran.dpatch by <kmccarty@debian.org>
##
## All lines beginning with `## DP:' are a description of the patch.
## DP: Support compilation with gfortran. Patch thanks to Harald Vogt, plus:
## DP: - Extra hack to IOSTAT EOF return value to support gfortran-4.3.
## DP: - Fix to patchy.car to change default fortran compiler in nyshell
## DP: in gfortran case.
@DPATCH@
diff -urNad cernlib-2006.dfsg.2~/src/mathlib/gen/c/rteq464.F cernlib-2006.dfsg.2/src/mathlib/gen/c/rteq464.F
--- cernlib-2006.dfsg.2~/src/mathlib/gen/c/rteq464.F 1996-04-01 07:01:53.000000000 -0800
+++ cernlib-2006.dfsg.2/src/mathlib/gen/c/rteq464.F 2008-03-13 09:40:04.000000000 -0700
@@ -45,7 +45,16 @@
MT=3
Z(1)=SQRT(SQRT(-D))
Z(2)=-Z(1)
+#if !defined(CERNLIB_GFORTRAN)
Z(3)=SQRT(-Z(1)**2)
+#else
+* Using gfortran the following sqrt yields an inconsistent result
+* if the imaginary part is a "negative zero"
+* gfortran is conform with the Fortran ISO 2003 standard (1.6.1)
+* Therefore if the imaginary part is a "negative zero"
+* it must be replaced by a "positive zero" to be consistent
+ if (imag(-z(1)**2) .eq. 0) z(3)=SQRT(real(-z(1)**2)+i*0)
+#endif
Z(4)=-Z(3)
ENDIF
DC=(-R12*D)**3
@@ -94,9 +103,21 @@
W1=SQRT(U(K1)+I*0)
W2=SQRT(U(K2)+I*0)
ELSE
+#if !defined(CERNLIB_GFORTRAN)
MT=3
W1=SQRT(U(2)+I*U(3))
W2=SQRT(U(2)-I*U(3))
+#else
+* For gfortran see above
+ MT=3
+ IF (U(3) .NE. 0.) THEN
+ W1=SQRT(U(2)+I*U(3))
+ W2=SQRT(U(2)-I*U(3))
+ ELSE
+ W1=SQRT(U(2)+I*0)
+ W2=W1
+ ENDIF
+#endif
ENDIF
W3=0
IF(W1*W2 .NE. 0) W3=-Q/(8*W1*W2)
diff -urNad cernlib-2006.dfsg.2~/src/mathlib/gen/v/nranf.F cernlib-2006.dfsg.2/src/mathlib/gen/v/nranf.F
--- cernlib-2006.dfsg.2~/src/mathlib/gen/v/nranf.F 1996-04-01 07:02:54.000000000 -0800
+++ cernlib-2006.dfsg.2/src/mathlib/gen/v/nranf.F 2008-03-13 09:40:04.000000000 -0700
@@ -14,10 +14,12 @@
VECTOR(I) = RNDM(I)
100 CONTINUE
RETURN
- ENTRY NRANIN (V)
+ END
+ SUBROUTINE NRANIN (V)
CALL RDMIN(V)
RETURN
- ENTRY NRANUT (V)
+ END
+ SUBROUTINE NRANUT (V)
CALL RDMOUT(V)
RETURN
END
diff -urNad cernlib-2006.dfsg.2~/src/packlib/hbook/chbook/Imakefile cernlib-2006.dfsg.2/src/packlib/hbook/chbook/Imakefile
--- cernlib-2006.dfsg.2~/src/packlib/hbook/chbook/Imakefile 1999-11-15 05:25:58.000000000 -0800
+++ cernlib-2006.dfsg.2/src/packlib/hbook/chbook/Imakefile 2008-03-13 09:40:04.000000000 -0700
@@ -13,7 +13,19 @@
#endif
#if defined(CERNLIB_LINUX)
+EXTRA_DEFINES := $(EXTRA_DEFINES) -D_SVID_SOURCE
+#endif
+
+#if defined(CERNLIB_LINUX) && !defined(CERNLIB_QMLXIA64)
+EXTRA_DEFINES := $(EXTRA_DEFINES) -Df2cFortran
+#endif
+
+#if defined(CERNLIB_QMLXIA64)
+#if defined(CERNLIB_GFORTRAN)
+EXTRA_DEFINES := $(EXTRA_DEFINES) -DgFortran
+#else
EXTRA_DEFINES := $(EXTRA_DEFINES) -Df2cFortran
#endif
+#endif
SubdirLibraryTarget(NullParameter,NullParameter)
diff -urNad cernlib-2006.dfsg.2~/src/packlib/kernlib/kerngen/unix/gfortgs/Imakefile cernlib-2006.dfsg.2/src/packlib/kernlib/kerngen/unix/gfortgs/Imakefile
--- cernlib-2006.dfsg.2~/src/packlib/kernlib/kerngen/unix/gfortgs/Imakefile 2006-09-04 05:32:59.000000000 -0700
+++ cernlib-2006.dfsg.2/src/packlib/kernlib/kerngen/unix/gfortgs/Imakefile 2008-03-13 09:40:04.000000000 -0700
@@ -1,6 +1,6 @@
-SRCS_F= irndm.F qnext.F rdmin.F
+SRCS_F= irndm.F qnext.F rdmin.F kernlibgetarg.F
-SRCS_C= lshift.c ishftr.c getarg.c
+SRCS_C= lshift.c ishftr.c /* getarg.c */
SubdirLibraryTarget(NullParameter,NullParameter)
diff -urNad cernlib-2006.dfsg.2~/src/packlib/kernlib/kerngen/unix/gfortgs/kernlibgetarg.F cernlib-2006.dfsg.2/src/packlib/kernlib/kerngen/unix/gfortgs/kernlibgetarg.F
--- cernlib-2006.dfsg.2~/src/packlib/kernlib/kerngen/unix/gfortgs/kernlibgetarg.F 1969-12-31 16:00:00.000000000 -0800
+++ cernlib-2006.dfsg.2/src/packlib/kernlib/kerngen/unix/gfortgs/kernlibgetarg.F 2008-03-13 09:40:04.000000000 -0700
@@ -0,0 +1,19 @@
+* Wrapper GETARG routine for gfortran,
+* originally written by Harald Vogt <hvogt@ifh.de>
+*
+* SUBROUTINE GETARG (JARG, CHARG)
+* The following stuff is required to use gfortrans inline routine GETARG
+* It is required to avoid the calling GETARG here which conflicts
+* to the Fortran rules
+* CHARACTER CHARG*(*)
+* CALL MYGETARG (JARG, CHARG)
+* END
+
+ SUBROUTINE KERNLIBGETARG (JARG, CHARG)
+ CHARACTER CHARG*(*)
+* gfortran translates the following line to a call
+* to its library routine _gfortran_getarg_i4
+* therefore it will not clash in the linking step
+ CALL GETARG (JARG, CHARG)
+ END
+
diff -urNad cernlib-2006.dfsg.2~/src/packlib/kuip/kuip/kfor.h cernlib-2006.dfsg.2/src/packlib/kuip/kuip/kfor.h
--- cernlib-2006.dfsg.2~/src/packlib/kuip/kuip/kfor.h 2006-09-15 02:35:30.000000000 -0700
+++ cernlib-2006.dfsg.2/src/packlib/kuip/kuip/kfor.h 2008-03-13 09:40:05.000000000 -0700
@@ -1031,7 +1031,7 @@
#if !defined(CERNLIB_GFORTRAN)
#define Getarg F77_NAME(getarg,GETARG)
#else
-#define Getarg _gfortran_getarg_i4
+#define Getarg F77_NAME(kernlibgetarg,KERNLIBGETARG)
#endif
extern SUBROUTINE Getarg;
#define Goparm F77_NAME(goparm,GOPARM)
diff -urNad cernlib-2006.dfsg.2~/src/packlib/zebra/fq/fzdaeof.inc cernlib-2006.dfsg.2/src/packlib/zebra/fq/fzdaeof.inc
--- cernlib-2006.dfsg.2~/src/packlib/zebra/fq/fzdaeof.inc 2006-09-15 02:35:31.000000000 -0700
+++ cernlib-2006.dfsg.2/src/packlib/zebra/fq/fzdaeof.inc 2008-03-13 09:40:05.000000000 -0700
@@ -46,8 +46,12 @@
#elif defined(CERNLIB_WINDOWS)
* only valid for dec fortran (e.g. not f2c + microsoft c)
PARAMETER (IOSEOF = 36)
-#elif defined(CERNLIB_GFORTRAN)
+#elif defined(CERNLIB_GFORTRAN) && defined(__GNUC__) && defined(__GNUC_MINOR__)
+# if (__GNUC__ > 4 || __GNUC_MINOR__ >= 3)
+ PARAMETER (IOSEOF = 5002)
+# else
PARAMETER (IOSEOF = 3)
+# endif
#elif 1
PARAMETER (IOSEOF = -1)
#endif
diff -urNad cernlib-2006.dfsg.2~/src/patchy/fcasplit.F cernlib-2006.dfsg.2/src/patchy/fcasplit.F
--- cernlib-2006.dfsg.2~/src/patchy/fcasplit.F 2008-03-13 09:39:39.000000000 -0700
+++ cernlib-2006.dfsg.2/src/patchy/fcasplit.F 2008-03-13 09:40:05.000000000 -0700
@@ -352,7 +352,11 @@
PARAMETER (CHEXAS = '.s')
PARAMETER (CHEXOBJ = '.o')
+#if defined(CERNLIB_GFORTRAN)
+ PARAMETER (CHWHF = 'gfortran ')
+#else
PARAMETER (CHWHF = 'g77 ')
+#endif
PARAMETER (CHWHC = 'gcc ')
PARAMETER (CHWHA = 'as ')
#endif
diff -urNad cernlib-2006.dfsg.2~/src/patchy/patchy.car cernlib-2006.dfsg.2/src/patchy/patchy.car
--- cernlib-2006.dfsg.2~/src/patchy/patchy.car 2006-09-04 05:33:00.000000000 -0700
+++ cernlib-2006.dfsg.2/src/patchy/patchy.car 2008-03-13 09:41:01.000000000 -0700
@@ -25968,10 +25968,14 @@
+SELF, IF=QMLNX.
CALL SMCIL (-1, 'fo:1' , '-O2')
CALL SMCIL (-1, 'fo:2' , '-O0')
- CALL SMCIL (-1, 'fopt' , '-c -Nx800 -Nc200')
+ CALL SMCIL (-1, 'fopt' , '-c -g')
CALL SMCIL (-1, 'co:1' , '-O2')
CALL SMCIL (-1, 'co:2' , '-O0')
- CALL SMCIL (-1, 'copt' , '-c -posix')
+ CALL SMCIL (-1, 'copt' , '-c -g')
+
++SELF, IF=GFORTRAN.
+ CALL SMCIL (-1, 'fc' , 'gfortran')
+
+SELF, IF=QMNXT.
+SELF, IF=QMSGI.
+SELF, IF=QMSUN.