From f7d579641bf5af2a8b6a19c80cb0cb4e968afda8 Mon Sep 17 00:00:00 2001 From: Don Stewart Date: Thu, 28 Apr 2005 11:27:38 +0000 Subject: [PATCH] New build system for objects. Support profiling and -jN. --- Makefile | 12 +++---- config.mk.in | 2 +- src/Makefile | 6 ++-- src/altdata/Makefile | 4 +++ src/build.mk | 77 ++++++++++++++++++++++++++++++++------------ src/eval/Makefile | 6 ++++ src/hi/Makefile | 4 +++ src/plugins/Makefile | 4 +++ src/printf/Makefile | 4 +++ 9 files changed, 87 insertions(+), 32 deletions(-) diff --git a/Makefile b/Makefile index 77a0bef..3e9ced5 100644 --- a/Makefile +++ b/Makefile @@ -3,18 +3,15 @@ # cut down reimplementation of $fptools/mk directory -MAKEFLAGS += --no-builtin-rules -.SUFFIXES: - .PHONY: build all -all: build headers +all: build EvalHaskell.h -build: +build:: cd src && $(MAKE) -headers: build - cp src/eval/Eval/Haskell_stub.h EvalHaskell.h +EvalHaskell.h: build + cp src/eval/Eval/Haskell_stub.h $@ # # installing @@ -25,6 +22,7 @@ install: $(INSTALL_DATA_DIR) $(LIBDIR)/include $(INSTALL_DATA) EvalHaskell.h $(LIBDIR)/include @(cd src && $(MAKE) install) + $(INSTALL_DATA_DIR) $(PREFIX)/bin # # and register the library with ghc package system diff --git a/config.mk.in b/config.mk.in index a15eaad..7c9ae64 100644 --- a/config.mk.in +++ b/config.mk.in @@ -36,7 +36,7 @@ GHC_LD_OPTS = GHC_PKG = @GHCPKG@-@GHC_VERSION@ LD = @LD@ -LD_X = -x +LD_X = @LD@ -x HAPPY = @HAPPY@ HAPPY_OPTS = -a -g -c diff --git a/src/Makefile b/src/Makefile index 56df945..eba7346 100644 --- a/src/Makefile +++ b/src/Makefile @@ -11,11 +11,11 @@ altdata: @cd altdata && $(MAKE) hi: @cd hi && $(MAKE) -plugins: +plugins: altdata hi @cd plugins && $(MAKE) -eval: +eval: plugins @cd eval && $(MAKE) -printf: +printf: plugins @cd printf && $(MAKE) install: i_altdata i_hi i_plugins i_eval i_printf diff --git a/src/altdata/Makefile b/src/altdata/Makefile index e2a79dd..9cdecd2 100644 --- a/src/altdata/Makefile +++ b/src/altdata/Makefile @@ -1,7 +1,11 @@ PKG = altdata UPKG = AltData +ALL_SRCS=$(wildcard $(patsubst ./%, %, $(patsubst %, %/*.hs, . $(UPKG)))) + TOP=../.. include ../build.mk install: install-me + +-include depend diff --git a/src/build.mk b/src/build.mk index b17fc9c..a0854a5 100644 --- a/src/build.mk +++ b/src/build.mk @@ -3,32 +3,69 @@ # LGPL version 2.1 or later (see http://www.gnu.org/copyleft/lesser.html) # +MAKEFLAGS += --no-builtin-rules +.SUFFIXES: + include $(TOP)/config.mk +# If $(way) is set then we define $(way_) and $(_way) from it in the +# obvious fashion. +ifeq "$(way)" "p" + way_ := $(way)_ + _way := _$(way) +endif + +# +# building the profiled way +# +ifeq "$(way)" "p" +PROF_OPTS = -prof -auto-all -Icbits +LD_OPTS += $(PROF_OPTS) +HC_OPTS += $(PROF_OPTS) +HC_OPTS += -hisuf $(way_)hi -hcsuf $(way_)hc -osuf $(way_)o +endif + MAIN = $(UPKG).hs -LIBRARY = libHS$(PKG).a -GHCI_LIBRARY = HS$(PKG).o +LIBRARY = libHS$(PKG)$(_way).a +GHCI_LIBRARY = $(patsubst lib%.a,%.o,$(LIBRARY)) OBJS = $(UPKG).o $(UPKG)/*.o -HC_OPTS = -package-name $(PKG) +HC_OPTS += -package-name $(PKG) HC_OPTS += -O -Wall -Werror -fno-warn-missing-signatures $(GHC_EXTRA_OPTS) -HC_OPTS += -threaded +HC_OPTS += -threaded CLEANS += $(LIBRARY) $(GHCI_LIBRARY) CLEAN_FILES += *.conf.inplace* *.conf.*.old *.conf.in *.h *.in -.PHONY: clean all alt_objs inplace-pkg-conf happy banner +OBJS= $(addsuffix .$(way_)o,$(basename $(ALL_SRCS))) -all : $(LIBRARY) inplace-pkg-conf $(PKG).conf.in +.PHONY: clean all alt_objs plugins.conf.inplace happy banner + +all : $(LIBRARY) $(TOP)/plugins.conf.inplace $(PKG).conf.in # libraries -$(LIBRARY): banner $(COBJ) $(XOBJ) $(YOBJ) objs +$(LIBRARY): depend $(COBJ) $(XOBJ) $(YOBJ) $(OBJS) @$(RM) -f $@ - @$(AR) cq $@ $(OBJS) + @$(AR) cq $@ $(OBJS) $(COBJ) $(STUBOBJS) @$(RANLIB) $@ -banner: - @echo "=========== building $(PKG) =============" +$(GHCI_LIBRARY) : $(OBJS) + $(LD_X) -r -o $@ $(OBJS) $(COBJ) $(STUBOBJS) + +# +# Dependency generation +# +depend: $(ALL_SRCS) + @echo -n "Rebuilding dependencies ... " + @$(GHC) -cpp $(HC_OPTS) $(PKG_OPTS) $(HTOOLKIT) -M -optdep-f \ + -optdepdepend $(ALL_SRCS) || rm depend + @echo "done." + +%.$(way_)hi : %.$(way_)o + @: + +%.$(way_)o: %.hs + $(GHC) $(HC_OPTS) -c $< -o $@ -ohi $(basename $@).$(way_)hi # happy files $(YOBJ): $(YSRC) @@ -38,21 +75,16 @@ $(YOBJ): $(YSRC) $(XOBJ): $(XSRC) $(ALEX) $(ALEX_OPTS) -o $@ $(XSRC) -# objects -objs:: - $(GHC) $(HC_OPTS) --make -no-hs-main -no-link $(MAIN) - $(COBJ): $(CSRC) $(GHC) -c $(CSRC) -o $@ # package.confs and friends # ghc-6.2.2 needs TOP as env var. -inplace-pkg-conf: $(LIBRARY) - @rm -f $(GHCI_LIBRARY) +$(TOP)/plugins.conf.inplace: $(PKG).conf.in.cpp $(LIBRARY) $(GHCI_LIBRARY) @cpp -DTOP=$(TOP) -DGLASGOW_HASKELL=$(GLASGOW_HASKELL) -DCABAL=$(CABAL) -undef < $(PKG).conf.in.cpp | sed -e 's/""//g' -e 's/\[ *,/[ /g' -e '/^#/d' > $(PKG).conf.inplace.in @(cd $(TOP) ;\ - if [ ! -f plugins.conf.inplace ]; then echo [] > plugins.conf.inplace; fi;\ - env TOP=$(TOP) $(GHC_PKG) -g -f plugins.conf.inplace -u < src/$(PKG)/$(PKG).conf.inplace.in) + if [ ! -f $(TOP)/plugins.conf.inplace ]; then echo [] > $(TOP)/plugins.conf.inplace; fi;\ + env TOP=$(TOP) $(GHC_PKG) --force -f $@ -u < src/$(PKG)/$(PKG).conf.inplace.in) # installation pkg.confs $(PKG).conf.in : $(PKG).conf.in.cpp @@ -64,15 +96,15 @@ $(PKG).conf.in : $(PKG).conf.in.cpp .PHONY: install install-me install-me: $(INSTALL_DATA_DIR) $(LIBDIR)/imports/$(UPKG) - @for i in $(TOP)/src/$(PKG)/*.hi ; do \ + @for i in $(TOP)/src/$(PKG)/*.$(way_)hi ; do \ echo $(INSTALL_DATA) $$i $(LIBDIR)/imports/ ; \ $(INSTALL_DATA) $$i $(LIBDIR)/imports/ ; \ done - @for i in $(TOP)/src/$(PKG)/$(UPKG)/*.hi ; do \ + @for i in $(TOP)/src/$(PKG)/$(UPKG)/*.$(way_)hi ; do \ echo $(INSTALL_DATA) $$i $(LIBDIR)/imports/$(UPKG)/ ; \ $(INSTALL_DATA) $$i $(LIBDIR)/imports/$(UPKG)/ ; \ done - $(INSTALL_DATA) $(TOP)/src/$(PKG)/libHS$(PKG).a $(LIBDIR) + $(INSTALL_DATA) $(TOP)/src/$(PKG)/libHS$(PKG)$(_way).a $(LIBDIR) $(RANLIB) $(LIBDIR)/libHS$(PKG).a $(INSTALL_DATA) $(TOP)/src/$(PKG)/HS$(PKG).o $(LIBDIR) $(INSTALL_DATA) $(TOP)/src/$(PKG)/$(PKG).conf.in $(LIBDIR) @@ -80,11 +112,14 @@ install-me: clean: rm -f $(CLEAN_FILES) find . -name '*.a' -exec rm {} \; + find . -name depend -exec rm {} \; find . -name '*.in' -exec rm {} \; find . -name '*~' -exec rm {} \; find . -name 'a.out' -exec rm {} \; find . -name '*.hi' -exec rm {} \; + find . -name '*.p_hi' -exec rm {} \; find . -name '*.o' -exec rm {} \; + find . -name '*.p_o' -exec rm {} \; find . -name '*.old' -exec rm {} \; find . -name '*.core' -exec rm {} \; find . -name '*_stub.c' -exec rm {} \; diff --git a/src/eval/Makefile b/src/eval/Makefile index 875aa09..3957a23 100644 --- a/src/eval/Makefile +++ b/src/eval/Makefile @@ -1,6 +1,10 @@ PKG = eval UPKG = Eval +ALL_SRCS=$(wildcard $(patsubst ./%, %, $(patsubst %, %/*.hs, . $(UPKG)))) + +STUBOBJS =Eval/Haskell_stub.o + TOP=../.. include ../build.mk @@ -10,3 +14,5 @@ HC_OPTS += -package plugins GHC6_3_HC_OPTS += -package template-haskell install: install-me + +-include depend diff --git a/src/hi/Makefile b/src/hi/Makefile index 5d3b87d..f952dc0 100644 --- a/src/hi/Makefile +++ b/src/hi/Makefile @@ -4,9 +4,13 @@ UPKG = Hi CSRC = $(UPKG)/hschooks.c COBJ = $(UPKG)/hschooks.o +ALL_SRCS=$(wildcard $(patsubst ./%, %, $(patsubst %, %/*.hs, . $(UPKG)))) + TOP=../.. include ../build.mk HC_OPTS += -I$(UPKG) install: install-me + +-include depend diff --git a/src/plugins/Makefile b/src/plugins/Makefile index d709da0..ec4157e 100644 --- a/src/plugins/Makefile +++ b/src/plugins/Makefile @@ -12,6 +12,8 @@ YOBJ = $(UPKG)/ParsePkgConfLite.hs YSRC = $(UPKG)/ParsePkgConfLite.y endif +ALL_SRCS=$(wildcard $(patsubst ./%, %, $(patsubst %, %/*.hs, . $(UPKG)))) + include ../build.mk HC_OPTS += -package-conf $(TOP)/plugins.conf.inplace @@ -24,3 +26,5 @@ HC_OPTS += -package posix endif install: install-me + +-include depend diff --git a/src/printf/Makefile b/src/printf/Makefile index e908c81..3eda98b 100644 --- a/src/printf/Makefile +++ b/src/printf/Makefile @@ -7,6 +7,8 @@ YSRC = $(UPKG)/Parser.y XOBJ = $(UPKG)/Lexer.hs XSRC = $(UPKG)/Lexer.x +ALL_SRCS=$(wildcard $(patsubst ./%, %, $(patsubst %, %/*.hs, . $(UPKG)))) + TOP=../.. include ../build.mk @@ -14,3 +16,5 @@ HC_OPTS += -package-conf $(TOP)/plugins.conf.inplace HC_OPTS += -package eval install: install-me + +-include depend