tech-pkg archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

making gfortran work better



if anyone's tried to use their base compiler and pkgsrc gfortran, they
encounter errors like the following (building math/R):

checking how to get verbose linking output from gfortran... -v
checking for Fortran 77 libraries of gfortran...  -L/current/pkgsrc/math/R/work/.buildlink/lib -L/current/pkgsrc/math/R/work/.x11-buildlink/lib -L/usr/pkg/gcc7/lib/gcc/x86_64--netbsd/7.3.0 -L/usr/pkg/gcc7/lib/gcc/x86_64--netbsd/7.3.0/../../../../x86_64--netbsd/lib -L/usr/pkg/gcc7/lib/gcc/x86_64--netbsd/7.3.0/../../.. -Wl,-R/usr/pkg/gcc7//lib/. -Wl,-R/usr/pkg/gcc7/lib/. -lgfortran -lm -lquadmath -lpthread
checking how to get verbose linking output from gcc... -v
checking for C libraries of gcc...  -L/current/pkgsrc/math/R/work/.buildlink/lib -L/current/pkgsrc/math/R/work/.x11-buildlink/lib -lgcc_s -lpthread
checking for dummy main to link with Fortran 77 libraries... none
checking for Fortran 77 name-mangling scheme... lower case, underscore, no extra underscore
checking whether gfortran appends underscores to external names... yes
checking whether gfortran appends extra underscores to external names... no
checking whether mixed C/Fortran code can be run... configure: WARNING: cannot run mixed C/Fortran code
configure: error: Maybe check LDFLAGS for paths to Fortran libraries?


this is because of two problems:
1. configure finds fortran flags (FFLAGS) but only uses C flags to build
mixed code.
2. pkgsrc hides non-whitelisted paths, like the path to libgfortran.so.4

The following diff fixes both problems, although the first only by accident.


Index: gfortran.mk
===================================================================
RCS file: /cvsroot/pkgsrc/mk/compiler/gfortran.mk,v
retrieving revision 1.9
diff -u -r1.9 gfortran.mk
--- gfortran.mk	12 Sep 2016 12:18:13 -0000	1.9
+++ gfortran.mk	19 Jul 2018 03:19:25 -0000
@@ -90,9 +90,8 @@
 PREPEND_PATH+=	${_GFORTRAN_DIR}/bin
 .  endif
 
-# Add the dependency on gfortran.
-BUILDLINK_DEPMETHOD.gcc${GFORTRAN_VERSION}=	full
-.  include "../../lang/gcc${GFORTRAN_VERSION}/buildlink3.mk"
+# Resulting package will need the fortran libraries.
+.  include "../../lang/gcc${GFORTRAN_VERSION}-libs/buildlink3.mk"
 
 .  if defined(GFORTRAN_DIR) && !empty(GFORTRAN_DIR)
 PKGSRC_MAKE_ENV+=	GFORTRAN_DIR=${GFORTRAN_DIR:Q}


having gcc7-libs, means I whitelist the paths to the libraries, and also we
inject a specfile to them to all compilers, so it solves problem #1, so
even the C compiler knows where libgfortran.so.4 is.

ok to commit this?

p.s. I can probably do similar to split out gcc7-libgfortran without
libgcc_s and libstdc++.


Home | Main Index | Thread Index | Old Index