packages feed

hdirect-0.21.0: lib/Makefile

#
# Makefile for basic HDirect support library.
#
TOP = ..
include $(TOP)/mk/boilerplate.mk

all ::

PACKAGE=hdirect
PACKAGE_DEPS=lang

#
# Should you want to build the library as a DLL, set it to NO.
# (not supported with ghc-5.xx)
#
BUILD_STATICALLY=YES

HC_OPTS += -package-name hdirect
# Since we are using FFI exts we have to compile through C.
HC_OPTS	+= -fglasgow-exts -fvia-C -Wall -fno-warn-deprecations 
HC_OPTS	+= -package lang
ifeq "$(BUILD_STATICALLY)" "YES"
HC_OPTS += -static
endif

cpp_opts = -cpp -DBEGIN_GHC_ONLY='-}' -DEND_GHC_ONLY='{-' -DBEGIN_NOT_FOR_GHC='{-' -DEND_NOT_FOR_GHC='-}' -DELSE_FOR_GHC='-}-}' 

HDirect_HC_OPTS      += $(cpp_opts)
WideString_HC_OPTS   += $(cpp_opts)
Pointer_HC_OPTS      += $(cpp_opts)
SRC_MKDEPENDHS_OPTS  += $(cpp_opts)


WideString_HC_OPTS  += -monly-3-regs
SRC_IHC_OPTS        += -fno-qualified-names 
HUGS_IHC_OPTS        = $(IHC_OPTS) --hugs -odir $(HUGSDIR)

WideString_IHC_OPTS  += -fno-imports -fno-export-lists -fkeep-hresult -fout-pointers-are-not-refs
PointerPrim_IHC_OPTS += -fkeep-hresult -fout-pointers-are-not-refs

SRC_CC_OPTS += -I.

IDL_SRCS = PointerPrim.idl WideString.idl
HUGS_IDL_SRCS += $(IDL_SRCS)
IDL_HS_SRCS = $(patsubst %.idl, %.hs, $(IDL_SRCS))

# Files that are part of both COM and non-COM builds.
C_SRCS  = PointerSrc.c WideStringSrc.c
H_SRCS  = HDirect.h PointerSrc.h WideStringSrc.h
HS_SRCS = Pointer.lhs HDirect.lhs $(IDL_HS_SRCS)

# for adding to SRC_DIST_FILES
HUGS_EXTRA_SRCS =

#
# The Hugs98 version of the library is deposited in a separate directory, so
# that it can coexist with the GHC version.
#
HUGSDIR=hugs

SRCS = $(HS_SRCS) $(C_SRCS)

SRC_DIST_FILES  = $(SRCS) $(H_SRCS) $(HUGS_IDL_SRCS) $(HUGS_EXTRA_SRCS) Makefile hdirect.pkg
CLEAN_FILES += $(patsubst %.idl,%.hs,$(wildcard *.idl))

#
# 'make install' setup:
#
INSTALL_DATAS	= hdirect.pkg $(HS_IFACES)
INSTALL_LIBS    = libHShdirect$(_way).a $(HUGS_FILES)

ifeq "$(BUILD_STATICALLY)" "NO"
INSTALL_PROGS   += HShdirect.dll
INSTALL_LIBS    += libHShdirect_imp.a
endif

ifeq "$(STANDALONE_DIST)" "YES"
all :: libHShdirect$(_way).a HShdirect.$(way_)o
endif

# We put the generated output for Hugs98 in a separate directory, $(HUGSDIR), so that
# GHC and Hugs builds can coexist.
all :: 
	@if [ -d $(HUGSDIR) ]; then : ; else mkdir $(HUGSDIR); fi;

clean :: 	
	if [ -d $(HUGSDIR) ]; then $(RM) -rf $(HUGSDIR)/ ; else : ; fi;

HUGS_FILES = Pointer.lhs HDirect.lhs $(patsubst %.idl, $(HUGSDIR)/%.hs, $(HUGS_IDL_SRCS)) $(patsubst %.idl, $(HUGSDIR)/%.$(dllext), $(HUGS_IDL_SRCS))

all :: $(HUGS_FILES)

all :: dlls

C_STUBS = $(patsubst %.idl, $(HUGSDIR)/%.c, $(IDL_SRCS))

$(HUGSDIR)/%.hs: %.idl
	$(IHC) $(HUGS_IHC_OPTS) -c $< -o $@

$(HUGSDIR)/%.c: $(HUGSDIR)/%.hs
	@:

$(HUGSDIR)/%.$(STUB_OBJ_SUFFIX) : %.c
	@$(RM) $@
	$(CC) $(CC_OPTS) -c $< -o $@

$(HUGSDIR)/%.$(STUB_OBJ_SUFFIX) : $(HUGSDIR)/%.c
	@$(RM) $@
	$(CC) $(CC_OPTS) -c $< -o $@

ifeq "$(USE_MSVC_TOOLS)" "YES"
$(HUGSDIR)/%.obj : %.c
	@$(RM) $@
	$(CCDLL) $(CCDLL_OPTS) -c $< -Fo$@
$(HUGSDIR)/%.obj : $(HUGSDIR)/%.c
	@$(RM) $@
	$(CCDLL) $(CCDLL_OPTS) -c $< -Fo$@
endif

.PRECIOUS: $(HUGSDIR)/%.$(STUB_OBJ_SUFFIX) $(HUGSDIR)/%.c $(HUGSDIR)/%.hs

HugsMod.def :
	@echo EXPORTS     > $@
	@echo initModule >> $@

$(HUGSDIR)/%.$(dllext) : $(HUGSDIR)/%.$(STUB_OBJ_SUFFIX)
	$(CCDLL) $(CCDLL_OPTS) -o $@ $^ $(CCDLL_LIBS)

dlls :: $(patsubst %.c, %.$(dllext), $(C_STUBS))

all :: $(HUGSDIR)/HDirect.lhs $(HUGSDIR)/Pointer.lhs

$(HUGSDIR)/HDirect.lhs : HDirect.lhs
	$(CP) $^ $@
$(HUGSDIR)/Pointer.lhs : Pointer.lhs
	$(CP) $^ $@

# Configuration of hugslibdir is for local testing only; remove before releasing.
ifeq "$(hugslibdir)" ""
hugslibdir=c:/src/hugs98/lib
endif

install-hugs ::
	mkdir -p $(hugslibdir)/hdirect
	cp $(HUGSDIR)/*.$(dllext) $(hugslibdir)/hdirect
	cp $(HUGSDIR)/*.hs $(hugslibdir)/hdirect
	cp *.lhs $(hugslibdir)/hdirect

# End of Hugs specific bit

ifeq "$(STANDALONE_DIST)" "YES"
libHShdirect$(_way).a : $(OBJS)
	$(AR) $(AR_OPTS) $@ $^

HShdirect.$(way_)o: $(OBJS)
	$(LD) -r $(LD_X) -o $@ $(OBJS)
endif

ifeq "$(BUILD_STATICALLY)" "NO"
dll ::
	$(HC) --mk-dll -o HShdirect.dll libHShdirect.a -fglasgow-exts -package lang -lwinmm -luser32
endif

boot :: $(IDL_HS_SRCS)

include $(TOP)/mk/target.mk

ifneq "$(BUILD_STATICALLY)" "YES"
all :: dll
endif

ifeq "$(FOR_WIN32)" "YES"
HDIRECT_LIBDIR=$(shell cygpath -p -w `pwd` | sed -e 's%\\%/%g')
else
HDIRECT_LIBDIR=$(shell pwd)
endif

ifeq "$(GHC_PKG)" ""
GHC_PKG=ghc-pkg
endif

install-pkg: hdirect.pkg
	@hd_libdir="$(HDIRECT_LIBDIR)" $(GHC_PKG) -u < hdirect.pkg || (echo "Unable to install 'hdirect' package for GHC - perhaps GHC isn't installed."; echo "Try running ghc-pkg utility \"ghc-pkg -u < $(datadir)/hdirect.pkg\""; echo "when GHC is installed.")

# extra dependencies for Hugs bits.
$(HUGSDIR)/PointerPrim.c : $(HUGSDIR)/PointerPrim.hs
$(HUGSDIR)/PointerPrim.$(STUB_OBJ_SUFFIX) : $(HUGSDIR)/PointerPrim.c

$(HUGSDIR)/WideString.c : $(HUGSDIR)/WideString.hs
$(HUGSDIR)/WideString.$(STUB_OBJ_SUFFIX) : $(HUGSDIR)/WideString.c

$(HUGSDIR)/WideString.$(dllext) : $(HUGSDIR)/WideString.$(STUB_OBJ_SUFFIX)
$(HUGSDIR)/WideString.$(dllext) : $(HUGSDIR)/WideStringSrc.$(STUB_OBJ_SUFFIX)

$(HUGSDIR)/PointerPrim.$(dllext) : $(HUGSDIR)/PointerPrim.$(STUB_OBJ_SUFFIX)
$(HUGSDIR)/PointerPrim.$(dllext) : $(HUGSDIR)/PointerSrc.$(STUB_OBJ_SUFFIX)

ifeq "$(FOR_WIN32)" "YES"
$(HUGSDIR)/WideString.$(dllext) : HugsMod.def
$(HUGSDIR)/PointerPrim.$(dllext) : HugsMod.def
endif