# # Makefile for HDirect Com library. # TOP = .. FOR_WIN32=YES include $(TOP)/mk/boilerplate.mk # # Should you want to build the library as a DLL, set it to NO. # (not supported with ghc-5.xx) # BUILD_STATICALLY=YES # # The Hugs98 version of the library is deposited in a separate directory, so # that it can coexist with the GHC version. # HUGSDIR=hugs # # The com library is a superset of the HDirect base library, but compiled differently # (i.e., it consistently uses the COM task allocator). # HDLIBDIR =../lib HC_OPTS += -package-name com HC_OPTS += -package lang -I$(HDLIBDIR) -DCOM # Since we are using FFI exts we have to compile through C. HC_OPTS += -fglasgow-exts -fvia-C ifeq "$(BUILD_STATICALLY)" "YES" HC_OPTS += -static endif SRC_CC_OPTS += -I. -I$(HDLIBDIR) -DCOM all :: 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) Pointer_HC_OPTS += $(cpp_opts) Com_HC_OPTS += $(cpp_opts) ComException_HC_OPTS += $(cpp_opts) ComPrim_HC_OPTS += $(cpp_opts) Automation_HC_OPTS += $(cpp_opts) -H12m -fno-warn-missing-methods -fno-warn-deprecations AutoPrim_HC_OPTS += $(cpp_opts) -monly-3-regs WideString_HC_OPTS += $(cpp_opts) ComServ_HC_OPTS += $(cpp_opts) ComDll_HC_OPTS += $(cpp_opts) SRC_MKDEPENDHS_OPTS += $(cpp_opts) # # 5.04.2 is barfing when these are compiled with -O # EnumInterface_HC_OPTS += -Onot ClassFactory_HC_OPTS += -Onot SRC_IHC_OPTS += -fno-qualified-names HUGS_IHC_OPTS = $(IHC_OPTS) --hugs -odir $(HUGSDIR) AutoPrim_IHC_OPTS += -fno-imports -fno-export-lists -fhs-to-c -fno-overload-variant -fout-pointers-are-not-refs -fsubtyped-interface-pointers ComPrim_IHC_OPTS += -fno-imports -fno-export-lists -fout-pointers-are-not-refs 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 StdTypes_IHC_OPTS += -fno-export-list -fno-gen-variant-instances -fout-pointers-are-not-refs --gen-headers SafeArray_IHC_OPTS += -fhs-to-c -fno-export-lists --gen-headers -fout-pointers-are-not-refs --gen-headers TypeLib_IHC_OPTS += -fno-export-list -fappend-interface-short-name -fno-overload-variant --gen-headers Connection_IHC_OPTS += -fappend-interface-short-name SafeArray_HC_OPTS += -fvia-C '-\#include "SafeArray.h"' TypeLib_HC_OPTS += -fvia-C Connection_HC_OPTS += -fvia-C ComServ_HC_OPTS += -fvia-C # Files that are part of both COM and non-COM builds. C_SRCS = PointerSrc.c WideStringSrc.c H_SRCS = $(HDLIBDIR)/HDirect.h $(HDLIBDIR)/PointerSrc.h $(HDLIBDIR)/WideStringSrc.h HS_SRCS = Pointer.lhs HDirect.lhs PointerPrim.hs WideString.hs COMLIB_C_SRCS = ComPrimSrc.c AutoPrimSrc.c Registry.c SafeArrayPrim.c COMLIB_HS_SRCS = Com.lhs Automation.lhs AutoPrim.hs ComPrim.hs StdTypes.hs COMLIB_HS_SRCS += SafeArray.hs ComException.lhs COMLIB_HS_SRCS += TypeLib.hs Connection.hs H_SRCS += comPrim.h autoPrim.h Registry.h safeArrayPrim.h SafeArray.h StdTypes.h C_SRCS += $(COMLIB_C_SRCS) HS_SRCS += $(COMLIB_HS_SRCS) C_OBJS := $(subst PointerSrc.$(way_)o,PointerSrcCom.$(way_)o,$(C_OBJS)) # for adding to SRC_DIST_FILES HUGS_EXTRA_SRCS = IDL_SRCS = $(wildcard *.idl) HUGS_IDL_SRCS = $(IDL_SRCS) # # The COM server specific modules are compilable under both # mingw32 and cygwin32, but there's a couple of niggling interop # issues with using cygwin32 DLLs from MSVC compiled code, so # it is recommended that you use mingw32 when you want to create # COM in-proc servers. # # COMLIB_EXTRA_HS_SRCS += ComDll.lhs ComServ.lhs ClassFactory.lhs COMLIB_EXTRA_HS_SRCS += StdDispatch.lhs ConnectionPoint.lhs COMLIB_EXTRA_HS_SRCS += EnumInterface.lhs ExeServer.lhs HS_SRCS += $(COMLIB_EXTRA_HS_SRCS) ifneq "$(USE_MSVC_TOOLS)" "YES" SRC_CC_OPTS += -mno-cygwin -I. endif SRCS = $(HS_SRCS) $(C_SRCS) SRC_DIST_FILES = $(SRCS) $(H_SRCS) $(IDL_SRCS) $(HUGS_EXTRA_SRCS) Makefile com.pkg CLEAN_FILES += $(patsubst %.idl,%.hs,$(wildcard *.idl)) $(COPIED_OVER) # # 'make install' setup: # INSTALL_DATAS = com.pkg $(HS_IFACES) $(SRCS) INSTALL_LIBS += libHScom$(_way).a ifneq "$(BUILD_STATICALLY)" "YES" INSTALL_PROGS += HScom.dll INSTALL_LIBS += libHScom_imp.a endif #OBJS += $(patsubst %.idl, %.$(way_)o, $(IDL_SRCS)) LIBCOM_OBJS += ComServ_stub.$(way_)o ClassFactory_stub.$(way_)o ComDll_stub.$(way_)o EnumInterface_stub.$(way_)o ConnectionPoint_stub.$(way_)o LIBCOM_OBJS += $(filter-out PointerSrc.$(way_)o, $(OBJS)) all :: libHScom$(_way).a HScom.$(way_)o # 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; all :: $(patsubst %.idl, $(HUGSDIR)/%.hs, $(IDL_SRCS)) all :: dlls $(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)/WideString.$(dllext) : HugsMod.def $(HUGSDIR)/PointerPrim.$(dllext) : $(HUGSDIR)/PointerPrim.$(STUB_OBJ_SUFFIX) $(HUGSDIR)/PointerPrim.$(dllext) : $(HUGSDIR)/PointerSrcCom.$(STUB_OBJ_SUFFIX) $(HUGSDIR)/PointerPrim.$(dllext) : HugsMod.def $(HUGSDIR)/AutoPrim.$(dllext) : $(HUGSDIR)/AutoPrimSrc.$(STUB_OBJ_SUFFIX) $(HUGSDIR)/AutoPrim.$(dllext) : $(HUGSDIR)/AutoPrim.$(STUB_OBJ_SUFFIX) $(HUGSDIR)/AutoPrim.$(dllext) : $(HUGSDIR)/PointerSrcCom.$(STUB_OBJ_SUFFIX) $(HUGSDIR)/AutoPrim.$(dllext) : $(HUGSDIR)/ComPrimSrc.$(STUB_OBJ_SUFFIX) $(HUGSDIR)/AutoPrim.$(dllext) : HugsMod.def $(HUGSDIR)/ComPrim.$(dllext) : HugsMod.def $(HUGSDIR)/ComPrim.$(dllext) : $(HUGSDIR)/ComPrim.$(STUB_OBJ_SUFFIX) $(HUGSDIR)/ComPrim.$(dllext) : $(HUGSDIR)/ComPrimSrc.$(STUB_OBJ_SUFFIX) $(HUGSDIR)/ComPrim.$(dllext) : $(HUGSDIR)/PointerSrcCom.$(STUB_OBJ_SUFFIX) $(HUGSDIR)/SafeArray.$(dllext) : $(HUGSDIR)/SafeArray.$(STUB_OBJ_SUFFIX) $(HUGSDIR)/SafeArray.$(dllext) : $(HUGSDIR)/SafeArrayPrim.$(STUB_OBJ_SUFFIX) $(HUGSDIR)/SafeArray.$(dllext) : HugsMod.def # StdTypes.idl doesn't generate a .c file, so filter it out. C_STUBS = $(patsubst %.idl, $(HUGSDIR)/%.c, $(filter-out StdTypes.idl, $(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)/PointerSrcCom.$(STUB_OBJ_SUFFIX) : PointerSrc.c @$(RM) $@ $(CCDLL) $(CCDLL_OPTS) -c -DCOM $< -Fo$@ $(HUGSDIR)/%.obj : %.c @$(RM) $@ $(CCDLL) $(CCDLL_OPTS) -c -DCOM $< -Fo$@ $(HUGSDIR)/%.obj : $(HUGSDIR)/%.c @$(RM) $@ $(CCDLL) $(CCDLL_OPTS) -c -DCOM $< -Fo$@ else $(HUGSDIR)/PointerSrcCom.$(STUB_OBJ_SUFFIX) : PointerSrc.c @$(RM) $@ $(CC) $(CC_OPTS) -c -DCOM $< -o $@ endif .PRECIOUS: $(HUGSDIR)/%.$(STUB_OBJ_SUFFIX) $(HUGSDIR)/%.c $(HUGSDIR)/%.hs HugsMod.def : @echo EXPORTS > $@ @echo initModule >> $@ COPIED_OVER=HDirect.lhs Pointer.lhs WideString.idl PointerPrim.idl PointerSrc.c WideStringSrc.c HDirect.lhs : $(HDLIBDIR)/HDirect.lhs $(CP) $< $@ Pointer.lhs : $(HDLIBDIR)/Pointer.lhs $(CP) $< $@ WideString.idl : $(HDLIBDIR)/WideString.idl $(CP) $< $@ PointerPrim.idl : $(HDLIBDIR)/PointerPrim.idl $(CP) $< $@ PointerSrc.c : $(HDLIBDIR)/PointerSrc.c $(CP) $< $@ WideStringSrc.c : $(HDLIBDIR)/WideStringSrc.c $(CP) $< $@ $(HUGSDIR)/%.$(dllext) : $(HUGSDIR)/%.$(STUB_OBJ_SUFFIX) $(CCDLL) $(CCDLL_OPTS) -o $@ $^ $(CCDLL_LIBS) dlls :: $(patsubst %.c, %.$(dllext), $(C_STUBS)) HUGS_COMLIB_LHSS = HDirect.lhs Pointer.lhs Automation.lhs Com.lhs ComException.lhs all :: $(patsubst %.lhs,$(HUGSDIR)/%.lhs,$(HUGS_COMLIB_LHSS)) $(HUGSDIR)/HDirect.lhs : HDirect.lhs $(CP) $^ $(HUGSDIR)/ $(HUGSDIR)/Pointer.lhs : Pointer.lhs $(CP) $^ $(HUGSDIR)/ $(HUGSDIR)/Automation.lhs : Automation.lhs $(CP) $^ $(HUGSDIR)/ $(HUGSDIR)/Com.lhs : Com.lhs $(CP) $^ $(HUGSDIR)/ $(HUGSDIR)/ComException.lhs : ComException.lhs $(CP) $^ $(HUGSDIR)/ # 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 PointerSrcCom.$(way_)o : PointerSrc.c @$(RM) $@ $(CC) $(CC_OPTS) -c -DCOM $< -o $@ WideStringSrc.$(way_)o : WideStringSrc.c @$(RM) $@ $(CC) $(CC_OPTS) -c -DCOM $< -o $@ ComServ_stub.$(way_)o : ComServ.$(way_)o @- ClassFactory_stub.$(way_)o : ClassFactory.$(way_)o @- ComDll_stub.$(way_)o : ComDll.$(way_)o @- EnumInterface_stub.$(way_)o : EnumInterface.$(way_)o @- ConnectionPoint_stub.$(way_)o : ConnectionPoint.$(way_)o @- libHScom$(_way).a : $(LIBCOM_OBJS) $(RM) $@ $(AR) $(AR_OPTS) $@ $^ HScom.$(way_)o: $(LIBCOM_OBJS) $(LD) -r $(LD_X) -o $@ $(LIBCOM_OBJS) dll :: $(HC) --mk-dll -o HScom.dll libHScom.a -fglasgow-exts -syslib lang -lwinmm -lole32 -loleaut32 -luser32 BOOT_SRCS=$(patsubst %.idl, %.hs, $(IDL_SRCS)) boot :: $(COPIED_OVER) $(BOOT_SRCS) depend :: $(COPIED_OVER) include $(TOP)/mk/target.mk ifneq "$(BUILD_STATICALLY)" "YES" all :: dll endif .PHONY: install-pkg # ToDo: configure this approp. if you've installed the HDirect # libraries first. 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: com.pkg @hd_libdir="$(HDIRECT_LIBDIR)" $(GHC_PKG) -u < com.pkg || echo "Unable to install 'com' package; try running ghc-pkg utility manually, i.e., \"ghc-pkg -u < com.pkg\""