mirror of
https://gitlab.com/embeddable-common-lisp/ecl.git
synced 2026-01-26 14:32:11 -08:00
Fix copy of header files. This was accidentally working thanks to the `cp -rf $(srcdir)/h/*.h` that existed, but it means that editing any header file (except the internal.h one) would not recompile appropriately. Replace deprecated suffix rules with modern equivalents, list header files as dependencies for .d files.
304 lines
9.1 KiB
Makefile
304 lines
9.1 KiB
Makefile
# -*- Mode: Makefile; indent-tabs-mode: nil -*-
|
|
# vim: set filetype=makefile tabstop=8 shiftwidth=4 expandtab:
|
|
|
|
#
|
|
# Makefile for ECL
|
|
#
|
|
top_srcdir= @top_srcdir@
|
|
srcdir = @srcdir@
|
|
datarootdir = @datarootdir@
|
|
datadir = @datadir@
|
|
mandir=@mandir@
|
|
manext=1
|
|
|
|
# Programs used by "make":
|
|
#
|
|
|
|
@SET_MAKE@
|
|
# CC may be either C or CXX compiler (depending on --with-cxx
|
|
# option). This compiler is used for building all contribs, modules
|
|
# and anything what goes through CMP module.
|
|
CC = @ECL_CC@
|
|
# TRUE_CC is always C compiler. ECL core files (src/c/*) doesn't build
|
|
# with CXX compiler.
|
|
TRUE_CC = @CC@
|
|
CFLAGS = -I. -I@true_builddir@ -I$(srcdir)/c -Iecl/gc \
|
|
-DECL_BUILD -DECL_API -DECL_NO_LEGACY \
|
|
@CPPFLAGS@ @CFLAGS@ @ECL_CFLAGS@ -c
|
|
LIBS = @LIBS@
|
|
FASL_LIBS = @FASL_LIBS@
|
|
CORE_LIBS = @CORE_LIBS@
|
|
LDFLAGS = @LDFLAGS@
|
|
RM = @RM@
|
|
LN_S = @LN_S@
|
|
EXE = @EXEEXT@
|
|
CTAGS = @CTAGS@
|
|
ETAGS = @ETAGS@
|
|
RANLIB = @RANLIB@
|
|
AR = @AR@
|
|
DPP = dpp$(EXE)
|
|
ECL_MIN = ecl_min$(EXE)
|
|
ECL = ecl$(EXE)
|
|
|
|
# ==================== Where To Install Things ====================
|
|
|
|
# The default location for installation. Everything is placed in
|
|
# subdirectories of this directory. The default values for many of
|
|
# the variables below are expressed in terms of this one, so you may
|
|
# not need to change them. This defaults to /usr/local.
|
|
prefix=@prefix@
|
|
exec_prefix=@exec_prefix@
|
|
bindir=@bindir@
|
|
libdir=@libdir@
|
|
includedir=@includedir@
|
|
ecldir=@ecldir@
|
|
|
|
# Programs used by "make install":
|
|
#
|
|
SHELL = @SHELL@
|
|
INSTALL = @INSTALL@
|
|
INSTALL_DATA = @INSTALL_DATA@
|
|
INSTALL_PROGRAM = @INSTALL_PROGRAM@
|
|
INSTALL_SCRIPT = @INSTALL_SCRIPT@
|
|
INSTALL_LIBRARY = $(INSTALL_SCRIPT)
|
|
INSTALL_DATA = @INSTALL_DATA@
|
|
mkinstalldirs = $(top_srcdir)/bdwgc/install-sh -d
|
|
|
|
# Files
|
|
|
|
SUBDIRS = @SUBDIRS@
|
|
LIBRARIES = @LIBRARIES@
|
|
LSP_LIBRARIES = @LSP_LIBRARIES@
|
|
TARGETS = @TARGETS@
|
|
ECL_CMPDIR = @ECL_CMPDIR@
|
|
|
|
all: $(TARGETS) bin/ecl-config .git/tags TAGS doc
|
|
.PHONY: all
|
|
.SUFFIXES: .c .o .d .s
|
|
|
|
ifndef VERBOSE
|
|
.SILENT:
|
|
endif
|
|
|
|
%Makefile: $(srcdir)/%Makefile.in config.status
|
|
./config.status
|
|
|
|
bin/$(ECL): $(ECL_MIN) compile.lsp build-stamp $(top_srcdir)/h/*.h $(top_srcdir)/h/impl/*.h $(top_srcdir)/lsp/*.lsp $(top_srcdir)/clos/*.lsp $(top_srcdir)/*cmp/*.lsp
|
|
if [ -f CROSS-COMPILER ]; then \
|
|
./CROSS-COMPILER compile; \
|
|
else \
|
|
ECLDIR=`pwd`/ ./$(ECL_MIN) compile; \
|
|
fi
|
|
if [ "x@SONAME@" != "x" -a -f "@SONAME@" -a "@SONAME@" != "@SONAME3@" ]; then \
|
|
( mv @SONAME@ @SONAME3@ && \
|
|
$(RM) -f @SONAME2@ @SONAME1@ @SONAME@ && \
|
|
$(LN_S) @SONAME3@ @SONAME2@ && \
|
|
$(LN_S) @SONAME3@ @SONAME1@ && \
|
|
$(LN_S) @SONAME3@ @SONAME@ ) \
|
|
fi
|
|
|
|
# prerequisite libraries
|
|
libeclgc.a: libeclatomic.a
|
|
test -d ecl/gc || mkdir ecl/gc
|
|
test -d ecl/gc/private || mkdir ecl/gc/private
|
|
if (echo $(SUBDIRS) | grep gc); then \
|
|
cd gc && $(MAKE) install && cd .. && \
|
|
cp -rf $(srcdir)/@ECL_GC_DIR@/include/private/*.h ecl/gc/private/ && \
|
|
mv libgc.a libeclgc.a; \
|
|
fi
|
|
libeclffi.a:
|
|
if (echo $(SUBDIRS) | grep libffi); then \
|
|
cd libffi && $(MAKE) install && cd .. && \
|
|
sed -e 's,<ffitarget,<ecl/ffitarget,' ecl/ffi.h > ecl/foo.h && \
|
|
rm ecl/ffi.h && mv ecl/foo.h ecl/ffi.h && \
|
|
mv libffi.a libeclffi.a; \
|
|
fi
|
|
libeclatomic.a:
|
|
if (echo $(SUBDIRS) | grep atomic); then \
|
|
cd atomic && $(MAKE) && $(MAKE) install && cd .. && \
|
|
$(RM) -rf share ecl/atomic_ops_stack.h ecl/atomic_ops_malloc.h *atomic*gpl* && \
|
|
mv libatomic_ops.a libeclatomic.a; \
|
|
fi
|
|
libeclgmp.a:
|
|
if (echo $(SUBDIRS) | grep gmp); then \
|
|
cd gmp && $(MAKE) install && \
|
|
cd .. && mv include/gmp.h ecl/ && rmdir include && \
|
|
mv ./libgmp.a ./libeclgmp.a; \
|
|
fi
|
|
|
|
# final objects archive
|
|
libeclmin.a: libeclgmp.a libeclatomic.a libeclgc.a libeclffi.a lsp/config.lsp $(ECL_CMPDIR)/cmpdefs.lsp
|
|
@echo "Building $@..."
|
|
cd c; $(MAKE)
|
|
|
|
$(ECL_MIN): $(LIBRARIES) .gdbinit libeclmin.a
|
|
@echo "Building $@..."
|
|
if [ -f CROSS-COMPILER ]; then \
|
|
touch $@; \
|
|
else \
|
|
$(CC) $(LDFLAGS) -o $@ \
|
|
cinit.o c/all_symbols.o \
|
|
-L./ libeclmin.a \
|
|
$(CORE_LIBS) $(FASL_LIBS) $(LIBS);\
|
|
fi
|
|
mini_ecl: $(ECL_MIN) bare2.lsp
|
|
(echo '#!/bin/sh'; echo './$(ECL_MIN) bare2.lsp') > $@
|
|
chmod +x $@
|
|
|
|
clean-ecl_min:
|
|
$(RM) -rf $(DPP) $(ECL_MIN) libecl*.a c/
|
|
for i in $(srcdir)/c/*/; do mkdir -p c/`basename $$i`; done
|
|
|
|
bare2.lsp:
|
|
echo '(load "bare")(si::top-level)' > $@
|
|
|
|
.gdbinit: $(srcdir)/util/gdbinit
|
|
cp $(srcdir)/util/gdbinit $@
|
|
|
|
$(ECL_CMPDIR)/cmpdefs.lsp: $(ECL_CMPDIR)/cmpdefs.pre
|
|
sed -e 's,@ecldir\\@,$(ecldir),g' \
|
|
-e 's,@libdir\\@,$(libdir),g' \
|
|
-e 's,@includedir\\@,$(includedir),g' < $(ECL_CMPDIR)/cmpdefs.pre > $@
|
|
|
|
# @SONAME_LDFLAGS@ expansion may contain @libdir@ on OSX
|
|
compile.lsp: compile.pre
|
|
sed -e 's,@ecldir\\@,$(ecldir),g' \
|
|
-e 's,@libdir\\@,$(libdir),g' < compile.pre > compile.lsp
|
|
|
|
bin/ecl-config: bin/ecl-config.pre
|
|
sed -e 's,@libdir\\@,$(libdir),' \
|
|
-e 's,@includedir\\@,$(includedir),' \
|
|
-e 's,~A,$(libdir),' bin/ecl-config.pre > bin/ecl-config
|
|
|
|
build-stamp: config.status
|
|
echo "#" `uname -a` > $@
|
|
head -8 config.log | tail -6 >> $@
|
|
|
|
doc:
|
|
$(MAKE) -C doc
|
|
.PHONY: doc
|
|
|
|
install:
|
|
# Here we would use the option -s but the install program in sourceforge-solaris
|
|
# is broken.
|
|
$(mkinstalldirs) $(DESTDIR)$(bindir) $(DESTDIR)$(libdir) \
|
|
$(DESTDIR)$(ecldir) $(DESTDIR)$(includedir) $(DESTDIR)$(includedir)/ecl
|
|
for i in $(TARGETS); do \
|
|
$(INSTALL_PROGRAM) $$i $(DESTDIR)$(bindir); \
|
|
done
|
|
if [ -d encodings ]; then \
|
|
$(mkinstalldirs) $(DESTDIR)$(ecldir)/encodings; \
|
|
for i in ./encodings/*; do \
|
|
$(INSTALL_DATA) $$i $(DESTDIR)$(ecldir)/encodings; \
|
|
done \
|
|
fi
|
|
$(mkinstalldirs) $(DESTDIR)$(includedir)/ecl
|
|
for i in `(cd ecl && find . -type d)`; do \
|
|
k="$(DESTDIR)$(includedir)/ecl/$$i"; \
|
|
test -d "$$k" || $(mkinstalldirs) $$k; \
|
|
done
|
|
for i in `(cd ecl && find . -name '*.h')`; do echo $$i; \
|
|
$(INSTALL_DATA) ecl/$$i $(DESTDIR)$(includedir)/ecl/$$i; \
|
|
done
|
|
$(INSTALL_SCRIPT) bin/ecl-config $(DESTDIR)$(bindir)
|
|
for i in build-stamp help.doc TAGS ; do \
|
|
$(INSTALL_DATA) $$i $(DESTDIR)$(ecldir); \
|
|
done
|
|
for i in $(LSP_LIBRARIES) $(LIBRARIES); do \
|
|
if test -s $$i ; then \
|
|
if echo $$i | grep dll; then \
|
|
$(INSTALL_LIBRARY) $$i $(DESTDIR)$(bindir); \
|
|
fi; \
|
|
$(INSTALL_LIBRARY) $$i $(DESTDIR)$(libdir); \
|
|
fi \
|
|
done
|
|
if [ "x@SONAME3@" != "x" -a -f "@SONAME3@" -a "@SONAME@" != "@SONAME3@" ]; then \
|
|
( $(INSTALL_LIBRARY) @SONAME3@ $(DESTDIR)$(libdir) && \
|
|
cd $(DESTDIR)$(libdir) && $(RM) -f @SONAME2@ @SONAME1@ @SONAME@ && \
|
|
$(LN_S) @SONAME3@ @SONAME2@ && \
|
|
$(LN_S) @SONAME3@ @SONAME1@ && \
|
|
$(LN_S) @SONAME3@ @SONAME@ ) \
|
|
fi
|
|
$(INSTALL_PROGRAM) c/$(DPP) $(DESTDIR)$(ecldir)
|
|
$(INSTALL_PROGRAM) $(ECL_MIN) $(DESTDIR)$(ecldir)
|
|
for i in `cat modules`; do \
|
|
case $$i in \
|
|
*.fas) $(INSTALL_PROGRAM) $$i $(DESTDIR)$(ecldir);; \
|
|
*) $(INSTALL_DATA) $$i $(DESTDIR)$(ecldir);; \
|
|
esac \
|
|
done
|
|
for i in LICENSE COPYING; do \
|
|
$(INSTALL_DATA) $(top_srcdir)/../$$i $(DESTDIR)$(ecldir); \
|
|
done
|
|
$(MAKE) -C doc install
|
|
|
|
flatinstall: build-stamp
|
|
$(MAKE) DESTDIR=$(DESTDIR) bindir=$(prefix) libdir=$(prefix) \
|
|
includedir=$(prefix) ecldir=$(prefix) install
|
|
|
|
uninstall:
|
|
for i in $(ECL) ecl-config; do $(RM) $(DESTDIR)$(bindir)/$$i; done
|
|
for i in $(LSP_LIBRARIES) $(LIBRARIES) LICENSE LGPL \
|
|
@SONAME@ @SONAME1@ @SONAME2@ @SONAME3@; do \
|
|
$(RM) $(DESTDIR)$(libdir)/$$i || : ; \
|
|
done
|
|
$(MAKE) -C doc uninstall
|
|
$(RM) -r $(DESTDIR)$(includedir)/ecl $(DESTDIR)$(ecldir)
|
|
|
|
clean: mostlyclean
|
|
$(RM) -r *
|
|
mostlyclean: clean-ecl_min clean_lisp
|
|
(cd tests && $(MAKE) clean)
|
|
-for i in $(SUBDIRS); do (test -d $$i && cd $$i && $(MAKE) clean); done
|
|
$(RM) -r $(ECL_MIN) $(ECL) help.doc core a.out TAGS
|
|
$(RM) config.version config.log config.cache
|
|
$(RM) *.c *.o *.a *.eclh *.h *.data *.fas *.dat *.la *.so *.dylib
|
|
clean_lisp:
|
|
-$(RM) help.doc $(TARGETS)
|
|
-for i in lsp cmp clos tk ext; do $(RM) lib$$i.a $$i/?*.{o,eclh,data,c,sdat,h,fas}; done
|
|
distclean: clean
|
|
realclean: distclean
|
|
#
|
|
# Rebuild ECL using recent changes and compare
|
|
#
|
|
test_changes:
|
|
test -d old || mkdir old
|
|
cp -rf lsp clos cmp old/
|
|
$(MAKE) clean_lisp; $(MAKE) -C c clean; $(RM) -f $(ECL)
|
|
$(MAKE)
|
|
for i in lsp clos cmp; do diff --exclude=\*.o $$i old/$$i; done
|
|
#
|
|
# Run test suite
|
|
#
|
|
check:
|
|
cd tests && $(MAKE) clean && $(MAKE) check TESTS="$(TESTS)"
|
|
|
|
#
|
|
# Rebuild ECL using its own image and compare. Does not work
|
|
# right now.
|
|
#
|
|
selfbuild:
|
|
exit 2
|
|
test -d stage2 || mkdir stage2
|
|
cp -rf lsp clos cmp stage2
|
|
-for i in lsp cmp clos tk; do test -f lib$$i.a && mv lib$$i.a stage2; done
|
|
$(MAKE) clean_lisp
|
|
./ecl compile
|
|
-for i in lsp clos cmp tk; do test -d $$i && diff --exclude=\*.o $$i stage2/$$i; done | less
|
|
|
|
.git/tags:
|
|
( cd $(srcdir)/../.git && test "x$(CTAGS)" != "x" && $(CTAGS) -f tags -R --langmap=c:+.d ../src || false) || echo "tags generation failed, but this does not break the build."
|
|
|
|
# Make sure to also include *.d files; and match DPP's idiosyncracies
|
|
# like "@si::foo" and "@(defun si::foo". This rule is allowed to fail
|
|
# when etags does not exist.
|
|
TAGS:
|
|
-if test "x$(ETAGS)" != "x"; then \
|
|
srcfiles=`find $(srcdir)/c $(srcdir)/h -name '*.[chd]'` && \
|
|
$(ETAGS) --language=c -o $@ $$srcfiles && \
|
|
$(ETAGS) --language=none -o $@ --append \
|
|
--regex='/@\([-:*a-zA-z]+\)/\1/' \
|
|
--regex='/@(defun \([-:*a-zA-z]+\)/\1/' \
|
|
$$srcfiles; \
|
|
fi
|
|
touch $@
|