18/09/13 12:51, David Matthews wrote:
The complication is that exactly which libraries have to be included
depend on how libpolyml was built. The configure script detects the
libraries that are needed to build "poly" and builds a linker command
line from that. In particular, -lgmp is included only if GMP is
present. This all makes it difficult for a build script such as that
used by HOL4 to have a standard linker command line.
The idea of "polyc" is to capture the linker command line that was used
to build "poly" on the particular platform and make it available for
other applications. ...
One well-established aid for constructing suitable command-line options
is pkg-config. This may be more useful for use in Makefiles due to
greater flexibility than polyc. For pkg-config, a library installs a PC
file. (There are quite a few examples in /usr/lib64/pkgconfig/ on my
system.) This tells pkg-config which command line options are required
for building with that library.
A while ago, I experimented with this, creating the attached PC file for
polyml and adapting a Makefile to use pkg-config to construct the polyml
linker command-line options. This seems to work. For example, the
Makefile rule (for Poly/ML built with --enable-shared)
$(NAME)-polyml : $(NAME)-polyml.o
$(CC) -o $@ -L$(POLYMLLIB) -lpolymain -lpolyml $<
was changed to
$(CC) -o $@ `pkg-config --libs polyml` $<
given the attached polyml.pc in the pkg-config path. For static
linking, this would be
$(CC) -o $@ -static `pkg-config --libs --static polyml` $<
however this requires all dependencies to be static: given that
pkg-config generates command-line options for all dependencies, it is
not possible to switch back and forth between -static and -dynamic.
For Poly/ML built with --disable-shared (now default) the same commands
also work by using a slightly different polyml.pc where certain
dependencies are moved from
Libs.private
to
Libs
as they are always required for linking. This is shown in
polyml.pc-disable-shared, also attached.
With pkg-config, other variables can be extracted too. For example, the
Makefile lines
POLYML := $(shell which poly 2> /dev/null)
POLYMLBIN := $(patsubst %/,%,$(dir $(POLYML)))
POLYMLHOME := $(patsubst %/,%,$(dir $(POLYMLBIN)))
POLYMLLIB := $(POLYMLHOME)/lib
were replaced by
POLYMLBIN := `pkg-config --variable=bindir polyml`
POLYMLLIB := `pkg-config --variable=libdir polyml`
POLYML := $(POLYMLBIN)/poly
POLYMLROOT := `pkg-config --variable=prefix polyml`
Furthermore, should any future enhancements to the FFI want to allow
C-side code to reference symbols from Poly/ML H files, pkg-config can
produce command-line options for C include directories too. I seem to
recall that I once wanted to include a MLton H file in code on the
C-side of the MLton FFI.
There is a default pkg-config path which can be overridden with the
environment variable PKG_CONFIG_PATH. That seems as good a way as any
to indicate which version of Poly/ML should be used when building an
application.
Regards,
Phil
prefix=/opt/polyml/polyml-r1848d
exec_prefix=${prefix}
bindir=${exec_prefix}/bin
libdir=${exec_prefix}/lib
includedir=${prefix}/include
Name: Poly/ML
Description: Poly/ML Standard ML Compiler
URL: http://www.polyml.org/
Version: 5.5.1
Requires:
Libs: -L${libdir} -lpolymain -lpolyml
Libs.private: -lpthread -lgmp -lm -ldl -lstdc++ -lgcc_s -lgcc
Cflags: -I${includedir}
prefix=/opt/polyml/polyml-r1848
exec_prefix=${prefix}
bindir=${exec_prefix}/bin
libdir=${exec_prefix}/lib
includedir=${prefix}/include
Name: Poly/ML
Description: Poly/ML Standard ML Compiler
URL: http://www.polyml.org/
Version: 5.5.1
Requires:
Libs: -L${libdir} -lpolymain -lpolyml -lpthread -lgmp -lm -ldl -lstdc++ -lgcc_s
-lgcc
Libs.private:
Cflags: -I${includedir}
_______________________________________________
polyml mailing list
[email protected]
http://lists.inf.ed.ac.uk/mailman/listinfo/polyml