# This Makefile.common is used only in an nhc98 build of the libraries.
# It is included from each package's individual Makefile.nhc98.
# Most of the necessary information is extracted from the .cabal file.
# However we assume the following definitions might be added in
# the importing Makefile.
#
# EXTRA_H_FLAGS = e.g. -prelude
# EXTRA_C_FLAGS = e.g. -I../Binary
include ../Makefile.inc
CABALFILE = $(shell ls *.cabal | head -n 1 )
READ = $(LOCAL)cabal-parse $(CABALFILE) -quiet
MAP = $(LOCAL)map
THISPKG = $(shell $(READ) name | cut -c2- )
VERSION = $(shell $(READ) version)
LOCATION = $(shell $(READ) hs-source-dir)
SEARCH = $(shell $(READ) build-depends | $(MAP) "echo -package" ) \
$(shell $(READ) include-dirs | $(MAP) "echo -i" | cut -c1,2,4-) \
$(shell $(READ) hs-source-dirs | $(MAP) "echo -I" | cut -c1,2,4-)
CINCLUDES = $(shell $(READ) include-dirs | $(MAP) "echo -I" | cut -c1,2,4-)
SRCS = $(shell $(READ) -slash exposed-modules)
EXTRA_SRCS = $(shell $(READ) -slash other-modules)
SRCS_C = $(shell $(READ) c-sources)
DIRS = $(shell $(READ) -slash exposed-modules other-modules \
| $(MAP) dirname | sort | uniq )
CDIRS = $(shell $(READ) c-sources | $(MAP) dirname | sort | uniq )
EXTRA_C_FLAGS = $(shell $(READ) cc-options)
EXTRA_H_FLAGS = $(shell $(READ) nhc98-options)
# ----
OBJDIR = ${BUILDDIR}/${OBJ}/libraries/${THISPKG}
OBJDIRS = $(patsubst %, ${OBJDIR}/%, ${DIRS} ${CDIRS})
FINALLIB = ${DST}/libHS${THISPKG}.$A
INCDIRS = ${INCDIR}/packages/${THISPKG} \
$(patsubst %, ${INCDIR}/packages/${THISPKG}/%, ${DIRS})
# ----
.SUFFIXES: # to remove builtin rules
.SUFFIXES: .hi .hs .lhs .o .gc .hc .hsc
#.SUFFIXES: .hi .hs .lhs .o .gc .c .hc .p.o .p.c .z.o .z.c .hsc
OBJS_HASK= $(patsubst %, $(OBJDIR)/%.$O, ${SRCS})
OBJS_C = $(patsubst %.c, ${OBJDIR}/%.$O, ${SRCS_C})
OBJS = $(OBJS_HASK) $(OBJS_C)
CFILES_GEN = $(patsubst %, %.$C, ${SRCS})
ifeq "p" "${PROFILING}"
HC += -p
endif
ifeq "z" "${TPROF}"
HC += -z
endif
#debug:
# @echo name: $(THISPKG)
# @echo version: $(VERSION)
# @echo search: $(SEARCH)
# @echo srcs: $(SRCS)
# @echo extra_srcs: $(EXTRA_SRCS)
# @echo srcs_c: $(SRCS_C)
# @echo dirs: $(DIRS)
all: ${OBJDIR} ${OBJDIRS} ${INCDIRS} extra ${OBJS} ${FINALLIB} cabalfile
extra:
cfiles: extracfiles generatedCfiles #${CFILES_GEN}
extracfiles:
fromC: ${OBJDIR} ${OBJDIRS} ${OBJS_C} cabalfile
[ -d "$(LOCATION)" ] && cd $(LOCATION); \
$(HC) -c -d $(OBJDIR) $(EXTRA_C_FLAGS) ${SEARCH} ${CFILES_GEN}
echo $(OBJS) | xargs ar cr ${FINALLIB}
objdir: ${OBJDIR} ${OBJDIRS} ${INCDIRS}
${OBJDIR} ${OBJDIRS} ${INCDIRS}:
mkdir -p $@
${FINALLIB}: ${OBJS}
echo $(OBJS) | xargs ar cr $@
cabalfile:
cp $(CABALFILE) $(INCDIR)/packages/$(THISPKG).cabal
cleanhi:
-rm -f $(patsubst %, %/*.hi, ${DIRS})
cleanC: cleanExtraC
-rm -f ${CFILES_GEN} ${CFILES_XS}
clean: cleanhi cleanC
-rm -f $(patsubst %, ${OBJDIR}/%/*.$O, ${DIRS})
cleanExtraC:
# general build rules for making objects from Haskell files
$(OBJS_HASK): # $(SRCS) $(EXTRA_SRCS) # $(OBJDIR) $(OBJDIRS)
[ -d "$(LOCATION)" ] && cd $(LOCATION); \
for src in $(SRCS); \
do $(LOCAL)hmake -hc=$(HC) -hidir $(INCDIR)/packages/$(THISPKG) \
$(filter -D%, $(EXTRA_C_FLAGS)) \
$(SEARCH) $(EXTRA_H_FLAGS) -d$(OBJDIR) $$src.hs; \
done
# general build rule for making objects from C files
${OBJS_C}: ${OBJDIR}/%.$O : %.c
$(CC) -c -I$(INCDIR) $(ENDIAN) $(ARCH) $(CINCLUDES) \
$(shell echo ${COPTS}) $(EXTRA_C_FLAGS) -o $@ $<
# general build rules for making bootstrap C files from Haskell files
#$(CFILES_GEN): # $(SRCS) $(EXTRA_SRCS)
generatedCfiles: # $(SRCS) $(EXTRA_SRCS)
[ -d "$(LOCATION)" ] && cd $(LOCATION); \
for src in $(SRCS); \
do $(LOCAL)hmake -hc=$(HC) -C -hidir $(INCDIR)/packages/$(THISPKG) \
$(filter -D%, $(EXTRA_C_FLAGS)) \
$(SEARCH) $(EXTRA_H_FLAGS) $$src.hs; \
done
touch generatedCfiles
# hack to get round mutual recursion between libraries
HIFILES = $(patsubst %.hs,../${THISLIB}/%.${HISUFFIX},$(filter %.hs, ${SRCS}))
${HIFILES}: ../${THISLIB}/%.${HISUFFIX} : %.hs
$(HC) -c $(PART_FLAGS) -o /dev/null $<
# The importing Makefile may now define extra individual dependencies
# e.g.
# ${OBJDIR}/Function.$O: Function.hs ${OBJDIR}/Other.$O
#
# and C-files dependencies likewise
# e.g.
# AlignBin.c: BinHandle.c
|