diff --git a/AUTHORS b/AUTHORS index bfd9b4fb..f8fb429f 100644 --- a/AUTHORS +++ b/AUTHORS @@ -7,6 +7,7 @@ written by Chris Hanson and John Lamping. Thanks to the following people for patches and bug reports: + * Alan Watson * Alexander Shendi * Andreas Rottman * Bakul Shah @@ -26,6 +27,7 @@ Thanks to the following people for patches and bug reports: * Michal Kowalski (sladegen) * Rajesh Krishnan * Taylor Venable + * Travis Cross * Zhang Meng If you would prefer not to be listed, or are one of the users listed diff --git a/Makefile b/Makefile index 54f5f327..cb8a42bd 100644 --- a/Makefile +++ b/Makefile @@ -1,116 +1,25 @@ # -*- makefile-gmake -*- -.PHONY: all libs dist clean cleaner dist-clean install uninstall test checkdefs -.PRECIOUS: %.c +.PHONY: dist mips-dist cleaner test checkdefs -# install configuration +CHIBI_FFI ?= $(CHIBI) tools/chibi-ffi +CHIBI_FFI_DEPENDENCIES ?= $(CHIBI_DEPENDENCIES) tools/chibi-ffi -CC ?= cc -CD ?= cd -RM ?= rm -f -LS ?= ls -INSTALL ?= install -MKDIR ?= $(INSTALL) -d -RMDIR ?= rmdir -TAR ?= tar -DIFF ?= diff -GREP ?= grep -FIND ?= find -SYMLINK ?= ln -s +CHIBI_DOC ?= $(CHIBI) tools/chibi-doc +CHIBI_DOC_DEPENDENCIES ?= $(CHIBI_DEPENDENCIES) tools/chibi-doc -PREFIX ?= /usr/local -BINDIR ?= $(PREFIX)/bin -LIBDIR ?= $(PREFIX)/lib -SOLIBDIR ?= $(PREFIX)/lib -INCDIR ?= $(PREFIX)/include/chibi -MODDIR ?= $(PREFIX)/share/chibi -BINMODDIR ?= $(PREFIX)/lib/chibi -MANDIR ?= $(PREFIX)/share/man/man1 - -DESTDIR ?= - -GENSTUBS ?= ./tools/chibi-ffi GENSTATIC ?= ./tools/chibi-genstatic +CHIBI ?= LD_LIBRARY_PATH=".:$(LD_LIBRARY_PATH)" ./chibi-scheme$(EXE) +CHIBI_DEPENDENCIES = ./chibi-scheme$(EXE) + ######################################################################## -# system configuration - if not using GNU make, set PLATFORM and the -# following flags as necessary. - -# -LIBDL = -ldl - -ifndef PLATFORM -ifeq ($(shell uname),Darwin) -PLATFORM=macosx -else -ifeq ($(shell uname),FreeBSD) -PLATFORM=FreeBSD -else -ifeq ($(shell uname -o),Msys) -PLATFORM=mingw -SOLIBDIR = $(BINDIR) -DIFFOPTS = -b -else -ifeq ($(shell uname -o),Cygwin) -PLATFORM=cygwin -SOLIBDIR = $(BINDIR) -DIFFOPTS = -b -else -ifeq ($(shell uname -o),GNU/Linux) -PLATFORM=linux -else -PLATFORM=unix -endif -endif -endif -endif -endif -endif - -ifeq ($(PLATFORM),macosx) -SO = .dylib -EXE = -CLIBFLAGS = -dynamiclib -STATICFLAGS = -static-libgcc -DSEXP_USE_DL=0 -else -ifeq ($(PLATFORM),mingw) -SO = .dll -EXE = .exe -CC = gcc -CLIBFLAGS = -shared -CPPFLAGS += -DSEXP_USE_STRING_STREAMS=0 -DBUILDING_DLL -LDFLAGS += -Wl,--out-implib,libchibi-scheme$(SO).a -STATICFLAGS = -DSEXP_USE_DL=0 -LIBDL = -else -ifeq ($(PLATFORM),cygwin) -SO = .dll -EXE = .exe -CC = gcc -CLIBFLAGS = -shared -CPPFLAGS += -DSEXP_USE_STRING_STREAMS=0 -LDFLAGS += -Wl,--out-implib,libchibi-scheme$(SO).a -else -SO = .so -EXE = -CLIBFLAGS = -fPIC -shared -STATICFLAGS = -static -DSEXP_USE_DL=0 -ifeq ($(PLATFORM),FreeBSD) -LIBDL= -RLDFLAGS=-Wl,-R$(DESTDIR)$(LIBDIR) -endif -endif -endif -endif - -ifeq ($(PLATFORM),unix) -#RLDFLAGS=-rpath $(LIBDIR) -RLDFLAGS=-Wl,-R$(LIBDIR) -endif - -ifeq ($(USE_BOEHM),1) -SEXP_USE_BOEHM = 1 -endif +# Library config. +# +# This is to allow "make SEXP_USE_BOEHM=1" and "make SEXP_USE_DL=0" to +# automatically include the necessary compiler and linker flags in +# addition to setting those features. If not using GNU make just +# comment out the ifs and use the else branches for the defaults. ifeq ($(SEXP_USE_BOEHM),1) GCLDFLAGS := -lgc @@ -130,28 +39,30 @@ endif ######################################################################## -all: chibi-scheme$(EXE) libs lib/chibi/ast$(SO) - -CHIBI ?= LD_LIBRARY_PATH=".:$(LD_LIBRARY_PATH)" ./chibi-scheme$(EXE) - -CHIBI_COMPILED_LIBS := lib/chibi/filesystem$(SO) lib/chibi/process$(SO) \ +CHIBI_COMPILED_LIBS = lib/chibi/filesystem$(SO) lib/chibi/process$(SO) \ lib/chibi/time$(SO) lib/chibi/system$(SO) lib/chibi/stty$(SO) \ lib/chibi/weak$(SO) lib/chibi/heap-stats$(SO) lib/chibi/disasm$(SO) \ lib/chibi/net$(SO) -CHIBI_IO_COMPILED_LIBS := lib/chibi/io/io$(SO) -CHIBI_OPT_COMPILED_LIBS := lib/chibi/optimize/rest$(SO) \ +CHIBI_IO_COMPILED_LIBS = lib/chibi/io/io$(SO) +CHIBI_OPT_COMPILED_LIBS = lib/chibi/optimize/rest$(SO) \ lib/chibi/optimize/profile$(SO) -COMPILED_LIBS := $(CHIBI_COMPILED_LIBS) $(CHIBI_IO_COMPILED_LIBS) \ +COMPILED_LIBS = $(CHIBI_COMPILED_LIBS) $(CHIBI_IO_COMPILED_LIBS) \ $(CHIBI_OPT_COMPILED_LIBS) lib/srfi/18/threads$(SO) \ lib/srfi/27/rand$(SO) lib/srfi/33/bit$(SO) lib/srfi/39/param$(SO) \ lib/srfi/69/hash$(SO) lib/srfi/95/qsort$(SO) lib/srfi/98/env$(SO) \ lib/scheme/time$(SO) -libs: $(COMPILED_LIBS) - BASE_INCLUDES = include/chibi/sexp.h include/chibi/features.h include/chibi/install.h include/chibi/bignum.h INCLUDES = $(BASE_INCLUDES) include/chibi/eval.h +######################################################################## + +include Makefile.libs + +######################################################################## + +all: chibi-scheme$(EXE) all-libs lib/chibi/ast$(SO) + include/chibi/install.h: Makefile echo '#define sexp_so_extension "'$(SO)'"' > $@ echo '#define sexp_default_module_path "'$(MODDIR):$(BINMODDIR)'"' >> $@ @@ -189,40 +100,34 @@ chibi-scheme-ulimit$(EXE): main.o eval.o sexp-ulimit.o clibs.c: $(GENSTATIC) chibi-scheme$(EXE) $(FIND) lib -name \*.sld | $(CHIBI) $(GENSTATIC) > $@ -%.c: %.stub $(GENSTUBS) chibi-scheme$(EXE) - -$(CHIBI) $(GENSTUBS) $< - # A special case, this needs to be linked with the LDFLAGS in case # we're using Boehm. lib/chibi/ast$(SO): lib/chibi/ast.c $(INCLUDES) -$(CC) $(CLIBFLAGS) $(XCPPFLAGS) $(XCFLAGS) -o $@ $< $(XLDFLAGS) -L. -lchibi-scheme -lib/%$(SO): lib/%.c $(INCLUDES) - -$(CC) $(CLIBFLAGS) $(XCPPFLAGS) $(XCFLAGS) -o $@ $< -L. -lchibi-scheme - -%.html: %.scrbl tools/chibi-doc chibi-scheme$(EXE) - $(CHIBI) tools/chibi-doc $< > $@ - -doc/lib/chibi/%.html: lib/chibi/%.sld tools/chibi-doc chibi-scheme$(EXE) - $(CHIBI) tools/chibi-doc chibi.$* > $@ +doc/lib/chibi/%.html: lib/chibi/%.sld $(CHIBI_DOC_DEPENDENCIES) + $(CHIBI_DOC) chibi.$* > $@ MODULE_DOCS := ast disasm equiv filesystem generic heap-stats io loop \ match mime modules net pathname process repl scribble stty \ system test time trace type-inference uri weak -doc: doc/chibi.html $(MODULE_DOCS:%=doc/lib/chibi/%.html) +doc: doc/chibi.html doc-libs -clean: - $(RM) *.o *.i *.s *.8 - $(RM) tests/basic/*.out tests/basic/*.err +HTML_LIBS = $(MODULE_DOCS:%=doc/lib/chibi/%.html) + +%.html: %.scrbl $(CHIBI_DOC_DEPENDENCIES) + $(CHIBI_DOC) $< > $@ + +clean: clean-libs + -$(RM) *.o *.i *.s *.8 tests/basic/*.out tests/basic/*.err cleaner: clean - $(RM) chibi-scheme$(EXE) chibi-scheme-static$(EXE) chibi-scheme-ulimit$(EXE) libchibi-scheme$(SO) *.a include/chibi/install.h - $(FIND) lib -name \*$(SO) -exec $(RM) -r '{}' \; - $(FIND) lib -name \*.o -exec $(RM) -r '{}' \; + -$(RM) chibi-scheme$(EXE) chibi-scheme-static$(EXE) chibi-scheme-ulimit$(EXE) \ + libchibi-scheme$(SO) *.a include/chibi/install.h \ + $(shell $(FIND) lib -name \*.o) -dist-clean: cleaner - for f in `find lib -name \*.stub`; do $(RM) $${f%.stub}.c; done +dist-clean: dist-clean-libs cleaner checkdefs: @for d in $(D); do \ diff --git a/Makefile.detect b/Makefile.detect new file mode 100644 index 00000000..a65bfc8c --- /dev/null +++ b/Makefile.detect @@ -0,0 +1,78 @@ +# -*- makefile-gmake -*- + +######################################################################## +# Detect the PLATFORM with uname. + +ifndef PLATFORM +ifeq ($(shell uname),Darwin) +PLATFORM=macosx +else +ifeq ($(shell uname),FreeBSD) +PLATFORM=FreeBSD +else +ifeq ($(shell uname -o),Msys) +PLATFORM=mingw +SOLIBDIR = $(BINDIR) +DIFFOPTS = -b +else +ifeq ($(shell uname -o),Cygwin) +PLATFORM=cygwin +SOLIBDIR = $(BINDIR) +DIFFOPTS = -b +else +ifeq ($(shell uname -o),GNU/Linux) +PLATFORM=linux +else +PLATFORM=unix +endif +endif +endif +endif +endif +endif + +######################################################################## +# Set default variables for the platform. + +LIBDL = -ldl + +ifeq ($(PLATFORM),macosx) +SO = .dylib +EXE = +CLIBFLAGS = -dynamiclib +STATICFLAGS = -static-libgcc -DSEXP_USE_DL=0 +else +ifeq ($(PLATFORM),mingw) +SO = .dll +EXE = .exe +CC = gcc +CLIBFLAGS = -shared +CPPFLAGS += -DSEXP_USE_STRING_STREAMS=0 -DBUILDING_DLL +LDFLAGS += -Wl,--out-implib,libchibi-scheme$(SO).a +STATICFLAGS = -DSEXP_USE_DL=0 +LIBDL = +else +ifeq ($(PLATFORM),cygwin) +SO = .dll +EXE = .exe +CC = gcc +CLIBFLAGS = -shared +CPPFLAGS += -DSEXP_USE_STRING_STREAMS=0 +LDFLAGS += -Wl,--out-implib,libchibi-scheme$(SO).a +else +SO = .so +EXE = +CLIBFLAGS = -fPIC -shared +STATICFLAGS = -static -DSEXP_USE_DL=0 +ifeq ($(PLATFORM),FreeBSD) +LIBDL= +RLDFLAGS=-Wl,-R$(DESTDIR)$(LIBDIR) +endif +endif +endif +endif + +ifeq ($(PLATFORM),unix) +#RLDFLAGS=-rpath $(LIBDIR) +RLDFLAGS=-Wl,-R$(LIBDIR) +endif diff --git a/Makefile.libs b/Makefile.libs new file mode 100644 index 00000000..c91f5654 --- /dev/null +++ b/Makefile.libs @@ -0,0 +1,91 @@ +# -*- makefile-gmake -*- + +# Include-able makefile for building Chibi libraries - see README.libs +# for usage. + +.PHONY: all all-libs clean clean-libs dist-clean dist-clean-libs install install-libs uninstall uninstall-libs doc doc-libs +.PRECIOUS: %.c + +PREFIX ?= /usr/local + +# install configuration + +CC ?= cc +CD ?= cd +RM ?= rm -f +LS ?= ls +INSTALL ?= install +MKDIR ?= $(INSTALL) -d +RMDIR ?= rmdir +TAR ?= tar +DIFF ?= diff +GREP ?= grep +FIND ?= find +SYMLINK ?= ln -s + +PREFIX ?= /usr/local +BINDIR ?= $(PREFIX)/bin +LIBDIR ?= $(PREFIX)/lib +SOLIBDIR ?= $(PREFIX)/lib +INCDIR ?= $(PREFIX)/include/chibi +MODDIR ?= $(PREFIX)/share/chibi +BINMODDIR ?= $(PREFIX)/lib/chibi +MANDIR ?= $(PREFIX)/share/man/man1 + +DESTDIR ?= + +CHIBI ?= chibi-scheme$(EXE) +CHIBI_FFI ?= chibi-ffi +CHIBI_DOC ?= chibi-doc + +######################################################################## +# System configuration - if not using GNU make, set PLATFORM and the +# flags from Makefile.detect (at least SO, EXE, CLIBFLAGS) as necessary. + +include Makefile.detect + +######################################################################## + +all-libs: $(COMPILED_LIBS) + +lib/%.c: lib/%.stub $(CHIBI_FFI_DEPENDENCIES) + $(CHIBI_FFI) $< + +lib/%$(SO): lib/%.c $(INCLUDES) + $(CC) $(CLIBFLAGS) $(XCPPFLAGS) $(XCFLAGS) -o $@ $< -L. -lchibi-scheme + +doc-libs: $(HTML_LIBS) + +doc/lib/%.html: lib/%.sld + $(MKDIR) $(dir $@) + $(CHIBI_DOC) $(subst /,.,$*) > $@ + +clean-libs: + $(RM) $(COMPILED_LIBS) + $(RM) -r $(patsubst %,%.dSYM,$(COMPILED_LIBS)) + $(RM) $(HTML_LIBS) + +dist-clean-libs: clean-libs + $(RM) $(patsubst %.stub, %.c, $(shell $(FIND) lib -name \*.stub)) + +install-libs: all-libs + for dir in $(dir $(patsubst lib/%,%,$(COMPILED_LIBS))) ; do \ + $(MKDIR) $(DESTDIR)$(BINMODDIR)/$$dir; \ + done + for file in $(patsubst lib/%,%,$(COMPILED_LIBS)) ; do \ + $(INSTALL) lib/$$file $(DESTDIR)$(BINMODDIR)/$$file ; \ + done + for dir in $(dir $(patsubst lib/%,%,$(SCM_LIBS))) ; do \ + $(MKDIR) $(DESTDIR)$(MODDIR)/$$dir; \ + done + for file in $(patsubst lib/%,%,$(SCM_LIBS)) ; do \ + $(INSTALL) lib/$$file $(DESTDIR)$(MODDIR)/$$file ; \ + done + +uninstall-libs: + for file in $(patsubst lib/%,%,$(COMPILED_LIBS)) ; do \ + $(RM) $(DESTDIR)$(BINMODDIR)/$$file ; \ + done + for file in $(patsubst lib/%,%,$(SCM_LIBS)) ; do \ + $(RM) $(DESTDIR)$(MODDIR)/$$file ; \ + done diff --git a/README.libs b/README.libs new file mode 100644 index 00000000..d47d5b47 --- /dev/null +++ b/README.libs @@ -0,0 +1,108 @@ +Using the Makefile.libs File To Build and Install Libraries +----------------------------------------------------------- + +The Makefile.libs file distributed with the Chibi Scheme sources +can facilitate building and installing Chibi Scheme libraries written +in C or Scheme. To use it, follow these instructions: + +1. Copy the Makefile.libs file from the Chibi Scheme source + directory to the library source top-level directory. + +2. Place the library source in the subdirectory "lib" of the library + source top-level directory. For example, + + lib/foo/bar.c + lib/foo/bar.h + lib/foo/bar.sld + lib/foo/bar.scm + +3. In the Makefile in the library source top-level directory, define + the following targets: + + all + doc + install + uninstall + clean + dist-clean + + These should depend on the corresponding "-libs" target, but + can include additional commands. For example: + + all: all-libs + install: install-libs + cp -r doc $(PREFIX)/share/chibi/ + uninstall: uninstall-libs + doc: doc-libs + clean: clean-libs + dist-clean: dist-clean-libs + + The all target should be the first target in the Makefile. + + The all-libs target makes the shared libraries in the library. + The doc-libs target generates HTML files for the library. The + install-libs and uninstall-libs targets install and uninstall + the library under the prefix. The clean-libs target removes the + shared libraries and generated HTML files. The dist-clean-libs + removes any .c files generated from .stub files and also performs + a clean-libs. + +4. In the Makefile in the library source top-level directory, define + the following variables: + + COMPILED_LIBS: Any shared libraries that should be built and + installed. The shared library is build from the corresponding + .c or .stub file. The $(SO) variable should be used for the + shared-library suffix; in order for this to work COMPILED_LIBS + should be defined as a recursively-expanded variable (with + =) rather than a simply-expanded variable (with :=). + + INCLUDES: Any other files on which the shared libraries depend. + + SCM_LIBS: Any Scheme source files that should be installed. + + HTML_LIBS: Any HTML files that should be generated. The HTML + files are generated from the corresponding .sld files using + chibi-doc. + + For example, + + COMPILED_LIBS = lib/foo/bar$(SO) + INCLUDES = lib/foo/bar.h + SCM_LIBS = lib/foo/bar.sld lib/foo/bar.scm + HTML_LIBS = doc/lib/foo/bar.html + +5. Add additional flags as necessary to XCPPFLAGS and XCFLAGS. + These flags are passed to the compiler and linker when they + generate the shared library. These should probably include at + least: + + XCPPFLAGS += -I$(PREFIX)/include + XCFLAGS += -L$(PREFIX)/lib + + These additions will ensure that the compiler and linker can + find the Chibi Scheme include and library files, even if they + are installed under a non-standard prefix. + +6. Include the common Makefile using: + + include Makefile.libs + +A complete example is: + + all: all-libs + install: install-libs + uninstall: uninstall-libs + doc: doc-libs + clean: clean-libs + dist-clean: dist-clean-libs + + COMPILED_LIBS = lib/foo/bar$(SO) + INCLUDES = lib/foo/bar.h + SCM_LIBS = lib/foo/bar.sld lib/foo/bar.scm + HTML_LIBS = doc/lib/foo/bar.html + + XCPPFLAGS += -I$(PREFIX)/include + XCFLAGS += -L$(PREFIX)/lib + + include Makefile.libs