Skip to content

Commit

Permalink
build: overhaul how GMP is built; build gc and libatomic
Browse files Browse the repository at this point in the history
  • Loading branch information
fingolfin committed Mar 12, 2017
1 parent db914d7 commit 8a5aca8
Show file tree
Hide file tree
Showing 4 changed files with 187 additions and 64 deletions.
8 changes: 6 additions & 2 deletions GNUmakefile.in
Original file line number Diff line number Diff line change
Expand Up @@ -44,16 +44,20 @@ DEFS = @DEFS@
LDFLAGS = @LDFLAGS@
LIBS = @LIBS@

GMP_USE_BUILTIN = @GMP_USE_BUILTIN@
BUILD_GMP = @BUILD_GMP@
GMP_CPPFLAGS = @GMP_CPPFLAGS@
GMP_LDFLAGS = @GMP_LDFLAGS@

READLINE_LDFLAGS = @READLINE_LDFLAGS@

BOEHM_CPPFLAGS = @BOEHM_CPPFLAGS@
BUILD_BOEHM_GC = @BUILD_BOEHM_GC@
BOEHM_GC_CPPFLAGS = @BOEHM_GC_CPPFLAGS@
BOEHM_LDFLAGS = @BOEHM_LDFLAGS@

BUILD_LIBATOMIC_OPS = @BUILD_LIBATOMIC_OPS@
LIBATOMIC_OPS_CPPFLAGS = @LIBATOMIC_OPS_CPPFLAGS@
LIBATOMIC_OPS_LDFLAGS = @LIBATOMIC_OPS_LDFLAGS@

PTHREAD_CFLAGS = @PTHREAD_CFLAGS@
PTHREAD_LIBS = @PTHREAD_LIBS@

Expand Down
140 changes: 113 additions & 27 deletions Makefile.rules
Original file line number Diff line number Diff line change
Expand Up @@ -12,9 +12,11 @@
# Default rule: build gap
########################################################################
all: gap$(EXEEXT) gac
.PHONY: all

# Backwards compatibility: add "default" target as alias for "all"
default: all
.PHONY: default


########################################################################
Expand Down Expand Up @@ -142,7 +144,7 @@ GAP_CPPFLAGS += $(GMP_CPPFLAGS)

# Add HPC-GAP specific flacks if necessary
ifeq ($(HPCGAP),yes)
GAP_CPPFLAGS += $(BOEHM_CPPFLAGS) $(LIBATOMIC_OPS_CPPFLAGS)
GAP_CPPFLAGS += $(BOEHM_GC_CPPFLAGS) $(LIBATOMIC_OPS_CPPFLAGS)
endif

# HACK: teach GAP how to "find itself". For a proper solution,
Expand Down Expand Up @@ -378,6 +380,7 @@ docomp: #gap$(EXEEXT)
"$(abs_top_srcdir)"/cnf/GAP-C-GEN $(DOCOMP_PREFIX) $$file ./gap$(EXEEXT) ; \
done

.PHONY: docomp

########################################################################
# Rules for 'make clean'
Expand All @@ -391,32 +394,126 @@ clean:
rm -rf obj
rm -f gap$(EXEEXT) gac

.PHONY: clean distclean


########################################################################
# Building subprojects
########################################################################

ifeq ($(GMP_USE_BUILTIN),yes)
gap$(EXEEXT): gmp

# master target for external dependencies / subprojects
EXTERN_FILES =


#
# GMP
#
ifeq ($(BUILD_GMP),yes)

GMP_BUILDDIR := extern/build/gmp
GMP_PREFIX := extern/install/gmp
# GMP_PREREQ := $(GMP_BUILDDIR)/config.status
GMP_FILES := $(GMP_PREFIX)/lib/libgmp.la

EXTERN_FILES += $(GMP_FILES)

gmp: $(GMP_FILES)
$(GMP_FILES):
MAKE=$(MAKE) $(srcdir)/cnf/build-extern.sh gmp "$(abs_top_srcdir)/extern/gmp" ABI=$(ABI)

.PHONY: gmp

# TODO: add clean, distclean, check targets?
# TODO: pass on cachfile?
# TODO: pass on certain *FLAGS ?


else

gmp:
$(MAKE) -C extern/gmp -s
echo "Using external GMP, nothing to do be done"

endif # BUILD_GMP


#
# libatomic_ops
#
ifeq ($(BUILD_LIBATOMIC_OPS),yes)

$(OBJS): extern/gmp/gmp.h
extern/gmp/gmp.h:
$(MAKE) -C extern/gmp -s gmp.h
LIBATOMIC_OPS_BUILDDIR := extern/build/libatomic_ops
LIBATOMIC_OPS_PREFIX := extern/install/libatomic_ops
#LIBATOMIC_OPS_PREREQ := $(LIBATOMIC_OPS_BUILDDIR)/config.status
LIBATOMIC_OPS_FILES := $(LIBATOMIC_OPS_PREFIX)/lib/libatomic_ops.la

clean: clean-gmp
clean-gmp:
$(MAKE) -C extern/gmp -s clean
EXTERN_FILES += $(LIBATOMIC_OPS_FILES)

check: check-gmp
check-gmp:
$(MAKE) -C extern/gmp -s check
libatomic_ops: $(LIBATOMIC_OPS_FILES)
$(LIBATOMIC_OPS_FILES):
MAKE=$(MAKE) $(srcdir)/cnf/build-extern.sh libatomic_ops "$(abs_top_srcdir)/hpcgap/extern/libatomic_ops" ABI=$(ABI)

.PHONY: gmp clean-gmp check-gmp
# TODO: MAKEFLAGS=-j1

.PHONY: libatomic_ops

endif # BUILD_LIBATOMIC_OPS


#
# Boehm GC
#
ifeq ($(BUILD_BOEHM_GC),yes)

# TODO: ensure Boehm GC is built *after* libatomic_ops, at least if
# we are building or own libatomic_ops.
# Also, ensure that it uses the right version of libatomic_ops,
# by passing --with-libatomic-ops=...

# TODO: also pass

# TODO: refactor code which handles dependencies like GMP, Boehm, libatomic,
# to reduce code duplication.

# TODO: pass on more things to configure, e.g. the build / host system type...
#

BOEHM_GC_BUILDDIR := extern/build/gc
BOEHM_GC_PREFIX := extern/install/gc
#BOEHM_GC_PREREQ := $(BOEHM_GC_BUILDDIR)/config.status
BOEHM_GC_FILES := $(BOEHM_GC_PREFIX)/lib/libgc.la

EXTERN_FILES += $(BOEHM_GC_FILES)

boehm: gc # alias
gc: $(BOEHM_GC_FILES)
$(BOEHM_GC_FILES):
MAKE=$(MAKE) $(srcdir)/cnf/build-extern.sh gc "$(abs_top_srcdir)/hpcgap/extern/gc" ABI=$(ABI)

ifeq ($(BUILD_LIBATOMIC_OPS),yes)
$(BOEHM_GC_FILES): $(LIBATOMIC_OPS_FILES)
endif

.PHONY: boehm gc

endif # BUILD_BOEHM_GC


foobar:
echo FOOBAR: $(EXTERN_FILES) QUUX

# ensure subprojects are built and "installed" before compiling and linking GAP
gap$(EXEEXT): $(EXTERN_FILES)
$(OBJS): $(EXTERN_FILES)
ifeq ($(HPCGAP),yes)
$(SOURCES): $(EXTERN_FILES)
endif

distclean: distclean-extern
distclean-extern:
rm -rf extern/build
rm -rf extern/install


########################################################################
# Compatibility mode
Expand Down Expand Up @@ -547,6 +644,8 @@ gen/gap_version.c: $(top_srcdir)/src/gap_version.c.in $(GVF)
@$(MKDIR_P) $(@D)
$(QUIET_SED)sed -e "s/@GAP_VERSION@/$(GAP_VERSION)/" < $< > $@

.PHONY: FORCE


########################################################################
# Regenerate parts of the build system as needed.
Expand Down Expand Up @@ -586,16 +685,3 @@ GNUmakefile: $(srcdir)/GNUmakefile.in config.status

gac: $(srcdir)/cnf/gac.in config.status
$(SHELL) ./config.status $@


########################################################################
# All .PHONY targets
########################################################################

.PHONY: all clean distclean check docomp

# The following is needed for the rules handling the GAP version
.PHONY: FORCE

# Backwards compatibility rules
.PHONY: default
29 changes: 29 additions & 0 deletions cnf/build-extern.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
#!/usr/bin/env bash
#
# This script is used by the build system to build external dependencies
# such as GMP and Boehm GC in a controlled and uniform way

set -e

echo "=== START building $pkg ==="

# read arguments (TODO: error handling)
pkg=$1; shift
src=$1; shift # directory with package sources -- must be an absolute path

builddir=extern/build/$pkg
prefix=$PWD/extern/install/$pkg

mkdir -p "$builddir"

if [[ ! "$builddir/config.status" -nt "$src/configure" ]] ; then
pushd "$builddir"
"$src/configure" --prefix=$prefix "$@"
popd
fi

$MAKE -C "$builddir"
$MAKE -C "$builddir" install

# TODO: insert command to check whether make needs to be called at all?
echo "=== DONE building $pkg ==="
74 changes: 39 additions & 35 deletions configure.ac
Original file line number Diff line number Diff line change
Expand Up @@ -252,7 +252,7 @@ dnl External dependencies
dnl

dnl Find GMP
GMP_USE_BUILTIN=no
BUILD_GMP=no
AC_ARG_WITH([gmp],
[AS_HELP_STRING([--with-gmp[=DIR]],
[prefix of GMP installation. e.g. /usr/local or /usr])],
Expand All @@ -268,7 +268,7 @@ AC_ARG_WITH([gmp],

AS_IF([test x$with_gmp = xbuiltin],
# user explicitly requested to use builtin GMP?
[GMP_USE_BUILTIN=yes
[BUILD_GMP=yes
AC_MSG_NOTICE([Using bundled GMP])
],
# otherwise try to link against GMP
Expand All @@ -280,7 +280,7 @@ AS_IF([test x$with_gmp = xbuiltin],
AC_CHECK_LIB([gmp], [__gmpz_init],
[], # all is good
[AS_IF([test x$with_gmp = xcheck],
[GMP_USE_BUILTIN=yes
[BUILD_GMP=yes
AC_MSG_NOTICE([No usable GMP found, switching to included GMP])
],
[AC_MSG_ERROR([GMP not found at prefix $with_gmp])]
Expand All @@ -290,14 +290,13 @@ AS_IF([test x$with_gmp = xbuiltin],
LDFLAGS="$tmp_LDFLAGS"
])

AS_IF([test x$GMP_USE_BUILTIN = xyes],[
AC_CONFIG_SUBDIRS([extern/gmp])
GMP_USE_BUILTIN=yes
GMP_CPPFLAGS=' -I${builddir}/extern/gmp'
GMP_LDFLAGS=' ${builddir}/extern/gmp/libgmp.la'
AS_IF([test x$BUILD_GMP = xyes],[
BUILD_GMP=yes
GMP_CPPFLAGS='-I${builddir}/extern/install/gmp/include'
GMP_LDFLAGS='${builddir}/extern/install/gmp/lib/libgmp.la'
])

AC_SUBST([GMP_USE_BUILTIN])
AC_SUBST([BUILD_GMP])
AC_SUBST([GMP_CPPFLAGS])
AC_SUBST([GMP_LDFLAGS])

Expand Down Expand Up @@ -363,36 +362,41 @@ AS_IF([test "x$enable_hpcgap" = xyes],
AS_IF([test "x$ADDGUARDS2" = x], AC_MSG_ERROR([could not locate addguards2]))
# TODO: there are further hpcgap specific external dependencies:
# gc - the Boehm garbage collector, see http://www.hboehm.info/gc/
# libatomic_ops - part of gc, but see also https://github.com/ivmai/libatomic_ops
# ...
# HACK
AC_DEFINE([BOEHM_GC], [1], [Use Boehm garbage collector])
# TODO: detect BOEHM GC and set flags suitably
# -> may want to build the one shipped with HPC-GAP,
# as that has special improvements for HPC-GAP
AS_IF([test "x$enable_hpcgap" = xyes],[BOEHM_LDFLAGS="-lgc"])
AC_SUBST([BOEHM_CPPFLAGS])
AC_SUBST([BOEHM_LDFLAGS])
# TODO: detected libatomic and set flags suitably
# -> may want to build the one shipped with HPC-GAP,
# as that has special improvements for HPC-GAP
AC_SUBST([LIBATOMIC_OPS_CPPFLAGS])
AC_SUBST([LIBATOMIC_OPS_LDFLAGS])
# FIXME: what about these defines which HPC-GAP seems to "know"?
# - DISABLE_GC
# - NUM_CPUS
# - VERBOSE_GUARDS
# We bundle two libraries we need for HPC-GAP:
# Boehm garbage collector, see http://www.hboehm.info/gc/
# libatomic_ops - part of Boehm GC, but see also https://github.com/ivmai/libatomic_ops
#
# We bundle them because we need a few patches to Boehm GC which are
# not upstream (and it is unclear whether they ever will be).
# And we bundle libatomic_ops because its version must match that
# of Boehm GC; the easiest way to ensure that is to include that, too.
#
# As a side benefit, users do not have to worry about installing dependencies.
BUILD_LIBATOMIC_OPS=yes
LIBATOMIC_OPS_CPPFLAGS='-I${builddir}/extern/install/libatomic_ops/include'
LIBATOMIC_OPS_LDFLAGS='${builddir}/extern/install/libatomic_ops/lib/libatomic_ops.la'
AC_SUBST([BUILD_LIBATOMIC_OPS])
AC_SUBST([LIBATOMIC_OPS_CPPFLAGS])
AC_SUBST([LIBATOMIC_OPS_LDFLAGS])
ATOMIC_OPS_CFLAGS=$LIBATOMIC_OPS_CPPFLAGS
ATOMIC_OPS_LIBS=$LIBATOMIC_OPS_LDFLAGS
AC_DEFINE([BOEHM_GC], [1], [Use Boehm garbage collector])
BUILD_BOEHM_GC=yes
BOEHM_GC_CPPFLAGS='-I${builddir}/extern/install/gc/include'
BOEHM_LDFLAGS='${builddir}/extern/install/gc/lib/libgc.la'
AC_SUBST([BUILD_BOEHM_GC])
AC_SUBST([BOEHM_GC_CPPFLAGS])
AC_SUBST([BOEHM_LDFLAGS])
]
)


# HACK to see if a cache file is set, and what it is
AS_BOX([cache_file = $cache_file.])


dnl
dnl Detect host specific setting
Expand Down

0 comments on commit 8a5aca8

Please sign in to comment.