diff --git a/GNUmakefile.in b/GNUmakefile.in index a1ef990a1e..a050d13ff1 100644 --- a/GNUmakefile.in +++ b/GNUmakefile.in @@ -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@ diff --git a/Makefile.rules b/Makefile.rules index 80432d7434..7c2e48262b 100644 --- a/Makefile.rules +++ b/Makefile.rules @@ -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 ######################################################################## @@ -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, @@ -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' @@ -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 @@ -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. @@ -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 diff --git a/cnf/build-extern.sh b/cnf/build-extern.sh new file mode 100755 index 0000000000..83219fe19c --- /dev/null +++ b/cnf/build-extern.sh @@ -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 ===" diff --git a/configure.ac b/configure.ac index a51db841c6..5a44991c24 100644 --- a/configure.ac +++ b/configure.ac @@ -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])], @@ -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 @@ -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])] @@ -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]) @@ -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