X-Git-Url: http://git.megacz.com/?p=ghc-hetmet.git;a=blobdiff_plain;f=utils%2Fhsc2hs%2FMakefile;h=c30269dd20d8c33677c3ed83b6bfa65594d499e8;hp=88f3edbe856bf3a65ba70108ffdf81246c1b2d11;hb=526c3af1dc98987b6949f4df73c0debccf9875bd;hpb=1ee08bbe86b03ba74a9be309a84602b34e41cbb4 diff --git a/utils/hsc2hs/Makefile b/utils/hsc2hs/Makefile index 88f3edb..c30269d 100644 --- a/utils/hsc2hs/Makefile +++ b/utils/hsc2hs/Makefile @@ -5,7 +5,14 @@ TOP=../.. include $(TOP)/mk/boilerplate.mk -INSTALLING=1 +# Beyond stage 1, honour any Mac OS X depolyment target options. If we use +# these options in stage 1 we get a linker error if the bootstrap compiler is +# for a more recent OS version +ifeq "$(stage)" "2" +SRC_CC_OPTS += $(MACOSX_DEPLOYMENT_CC_OPTS) +SRC_HC_OPTS += $(addprefix -optc, $(MACOSX_DEPLOYMENT_CC_OPTS)) +SRC_LD_OPTS += $(addprefix -optl, $(MACOSX_DEPLOYMENT_LD_OPTS)) +endif # This causes libghccompat.a to be used: include $(GHC_COMPAT_DIR)/compat.mk @@ -15,7 +22,14 @@ include $(GHC_COMPAT_DIR)/compat.mk # we must also build with $(GhcHcOpts) here: SRC_HC_OPTS += $(GhcHcOpts) $(GhcStage1HcOpts) -HS_PROG = hsc2hs-bin +# We have two version: the inplace version compiled by the bootstrap compiler +# and the install version compiled by the stage 1 compiler +ifeq "$(stage)" "2" +HS_PROG = hsc2hs.bin +else +HS_PROG = hsc2hs-inplace.bin +endif + ifeq "$(HOSTPLATFORM)" "i386-unknown-mingw32" HS_PROG = hsc2hs$(exeext) endif @@ -23,76 +37,84 @@ ifeq "$(HOSTPLATFORM)" "i386-unknown-cygwinw32" HS_PROG = hsc2hs$(exeext) endif -ifeq "$(ghc_ge_504)" "NO" -SRC_HC_OPTS += -package util -endif - # Note: Somehow we should pass $(exeext) here, but the history of changes used # for calling the C preprocessor via GHC has changed a few times, making a # clean solution impossible. So we revert to a hack in Main.hs... SRC_HC_OPTS += -Wall -ifneq "$(HOSTPLATFORM)" "i386-unknown-mingw32" -INSTALLED_SCRIPT_PROG = hsc2hs-ghc -endif -INPLACE_SCRIPT_PROG = hsc2hs-inplace - -ifeq "$(INSTALLING)" "1" -TOP_PWD := $(prefix) -SCRIPT_PROG = $(INSTALLED_SCRIPT_PROG) -else -TOP_PWD := $(FPTOOLS_TOP_ABS) -SCRIPT_PROG = $(INPLACE_SCRIPT_PROG) -endif +# ----------------------------------------------------------------------------- +# hsc2hs script -ifeq "$(INSTALLING)" "1" -ifeq "$(BIN_DIST)" "1" -HSC2HS_BINDIR=$$\"\"libexecdir -HSC2HS_DIR=$$\"\"libdir -HSC2HS_EXTRA= -else -HSC2HS_BINDIR=$(libexecdir) -HSC2HS_DIR=$(libdir) -HSC2HS_EXTRA=--cc=$(bindir)/ghc-$(ProjectVersion) -endif # BIN_DIST -else -HSC2HS_BINDIR=$(FPTOOLS_TOP_ABS)/$(GHC_HSC2HS_DIR_REL) -HSC2HS_DIR=$(FPTOOLS_TOP_ABS_PLATFORM)/$(GHC_HSC2HS_DIR_REL) +INPLACE_HS=hsc2hs-inplace.hs +INPLACE_PROG=hsc2hs-inplace +EXCLUDED_SRCS+=$(INPLACE_HS) ifeq "$(HOSTPLATFORM)" "i386-unknown-mingw32" extra_flags=$(addprefix --cflag=,$(filter-out -O,$(SRC_CC_OPTS))) +else +extra_flags= endif -HSC2HS_EXTRA="--cc=$(CC) --ld=$(CC) $(extra_flags) --cflag=-D__GLASGOW_HASKELL__=$(ProjectVersionInt) -I$(FPTOOLS_TOP_ABS_PLATFORM)/$(GHC_INCLUDE_DIR_REL)" -endif +nothing= +space=$(nothing) $(nothing) +# Given +# foo bar +# make +# :\"-Ifoo\":\"-Ibar\" +GMP_INCLUDE_DIRS_STRINGS = $(subst $(space),,$(foreach d,$(GMP_INCLUDE_DIRS),:\"-I$(d)\")) -$(SCRIPT_PROG) : Makefile -$(INSTALLED_SCRIPT_PROG) : $(TOP)/mk/config.mk +$(INPLACE_HS): Makefile $(FPTOOLS_TOP)/mk/config.mk + echo "import System.Cmd; import System.Environment; import System.Exit" > $@ + echo "main = do args <- getArgs; rawSystem \"$(FPTOOLS_TOP_ABS)/$(GHC_HSC2HS_DIR_REL)/$(HS_PROG)\" (\"--template=$(FPTOOLS_TOP_ABS)/$(GHC_HSC2HS_DIR_REL)/template-hsc.h\":\"--cc=$(CC)\":\"--ld=$(CC)\"$(patsubst %,:\"%\",$(extra_flags)):\"--cflag=-D__GLASGOW_HASKELL__=$(ProjectVersionInt)\":\"-I$(FPTOOLS_TOP_ABS)/$(GHC_INCLUDE_DIR_REL)\":\"-I$(FPTOOLS_TOP_ABS)/gmp/gmpbuild\"$(GMP_INCLUDE_DIRS_STRINGS):args) >>= exitWith" >> $@ -SCRIPT_SUBST_VARS = HSC2HS_BINDIR HSC2HS_DIR HS_PROG HSC2HS_EXTRA +$(INPLACE_PROG): $(INPLACE_HS) + $(HC) --make $< -o $@ -SCRIPT_OBJS=hsc2hs.sh -INTERP=$(SHELL) +all :: $(INPLACE_PROG) -ifneq "$(TARGETPLATFORM)" "i386-unknown-mingw32" -INSTALL_SCRIPTS += $(SCRIPT_PROG) -INSTALL_LIBEXECS += $(HS_PROG) -else +CLEAN_FILES += $(INPLACE_HS) $(INPLACE_PROG) + +ifeq "$(HOSTPLATFORM)" "i386-unknown-mingw32" INSTALL_PROGS += $(HS_PROG) +else +INSTALL_LIBEXECS += $(HS_PROG) +LINK = hsc2hs-ghc +LINK_TARGET = $(LINK)-$(ProjectVersion) +INSTALLED_SCRIPT=$(DESTDIR)$(bindir)/$(LINK_TARGET) +install:: + $(RM) -f $(INSTALLED_SCRIPT) + echo "#!$(SHELL)" >> $(INSTALLED_SCRIPT) + echo "HSC2HS_BINDIR=$(libexecdir)" >> $(INSTALLED_SCRIPT) + echo "HSC2HS_DIR=$(libdir)" >> $(INSTALLED_SCRIPT) + echo "HS_PROG=$(HS_PROG)" >> $(INSTALLED_SCRIPT) + echo "HSC2HS_EXTRA=" >> $(INSTALLED_SCRIPT) + cat hsc2hs.sh >> $(INSTALLED_SCRIPT) + $(EXECUTABLE_FILE) $(INSTALLED_SCRIPT) + +ifneq "$(NO_INSTALL_HSC2HS)" "YES" +install:: + $(CP) $(INSTALLED_SCRIPT) $(DESTDIR)/$(bindir)/hsc2hs +endif +endif + +# hsc2hs-inplace is needed to 'make boot' in compiler. +# Do a recursive 'make all' after generating dependencies, because this +# will work with 'make -j'. +ifneq "$(BootingFromHc)" "YES" +boot :: depend + $(MAKE) all endif +# ----------------------------------------------------------------------------- + override datadir=$(libdir) INSTALL_DATAS += template-hsc.h -# ----------------------------------------------------------------------------- -# don't recurse on 'make install' -# -ifeq "$(INSTALLING)" "1" -all :: $(HS_PROG) - $(MAKE) INSTALLING=0 BIN_DIST=0 $(MFLAGS) $@ - -clean distclean maintainer-clean :: - $(MAKE) INSTALLING=0 BIN_DIST=0 $(MFLAGS) $@ -endif +binary-dist: + $(INSTALL_DIR) $(BIN_DIST_DIR)/utils/hsc2hs + $(INSTALL_DATA) Makefile $(BIN_DIST_DIR)/utils/hsc2hs/ + $(INSTALL_DATA) hsc2hs.sh $(BIN_DIST_DIR)/utils/hsc2hs/ + $(INSTALL_DATA) $(INSTALL_DATAS) $(BIN_DIST_DIR)/utils/hsc2hs/ + $(INSTALL_PROGRAM) $(HS_PROG) $(BIN_DIST_DIR)/utils/hsc2hs/ include $(TOP)/mk/target.mk