# Simple makefile to build UUAG. # Nothing fancy, just as simple as possible to get things done quickly. # --Alexey .PHONY : help test help: @echo Build system for the AG compiler @echo Targets: @echo @echo build - Build the AG compiler @echo clean - Clean the generated HS sources @echo install - Install the AG compiler @echo dist - Create source distributions @echo @echo derived - Only the derived files # Directories SRC_DIR = src SRC_DERIVED_DIR = src-derived SRC_AG_DIR = src-ag TEST_DIR = test # The following variables are set in configure AG = "@UUAGC@" BUILD_DIR = @BUILD_DIR@ MV = @MV@ RM = @RM@ RM_F = $(RM) -f CP = @CP@ FIND = @FIND@ MKDIR = @MKDIR@ GREP = @GREP@ CHMOD = @CHMOD@ VERSION = @VERSION@ prefix = @prefix@ MKINSTDIR = ./mkinstalldirs INSTALL = @INSTALL@ HC = "@HC@" # whether to use user package database USER_PCKG = @USER_PCKG@ # Some hardcoded settings AG_BINARY = ./$(BUILD_DIR)/uuagc/uuagc CABAL_BUILD = $(CABAL_SCRIPT) build CABAL_CONFIGURE = $(CABAL_SCRIPT) configure $(USER_PCKG) # Generated after running ./Setup . May change! CABAL_CONFIG = .setup-config CABAL_SOURCE = Setup.hs CABAL_SCRIPT = ./Setup # We generate datatype definitions for these AG files. SRC_AG_SYN_NAMES = AbstractSyntax.ag ConcreteSyntax.ag ErrorMessages.ag\ HsToken.ag Code.ag Expression.ag Patterns.ag Interfaces.ag\ CodeSyntax.ag DeclBlocks.ag VisageSyntax.ag VisagePatterns.ag SRC_LAG_SYN_NAMES = # And semantic functions from these AG files. SRC_AG_SEM_NAMES = Desugar.ag DefaultRules.ag GenerateCode.ag PrintOcamlCode.ag PrintCode.ag PrintVisitCode.ag \ PrintErrorMessages.ag SemHsTokens.ag \ Transform.ag Order.ag \ AbstractSyntaxDump.ag CodeSyntaxDump.ag \ Visage.ag TfmToVisage.ag \ AG2AspectAG.ag SRC_LAG_SEM_NAMES = InterfacesRules.lag # Default flags for AG FLAGS_AG_SEM = -mcsfp --newtypes --wrappers FLAGS_AG_SYN = -mdp # $(FLAGS_AG_$@) specifies per-file options for $(AG). The $@ # part has a literal value which specifies the file that it is for. FLAGS_AG_InterfacesRules.ag = --self SRC_AG_SYN = $(addprefix $(SRC_AG_DIR)/,$(SRC_AG_SYN_NAMES)) SRC_LAG_SYN = $(addprefix $(SRC_AG_DIR)/,$(SRC_LAG_SYN_NAMES)) SRC_AG_SEM = $(addprefix $(SRC_AG_DIR)/,$(SRC_AG_SEM_NAMES)) SRC_LAG_SEM = $(addprefix $(SRC_AG_DIR)/,$(SRC_LAG_SEM_NAMES)) SRC_AG = $(SRC_AG_SYN) $(SRC_LAG_SYN) $(SRC_AG_SEM) $(SRC_LAG_SEM) # The corresponding haskell sources SRC_HS_SYN = $(addprefix $(SRC_DERIVED_DIR)/,$(patsubst %.ag,%.hs,$(SRC_AG_SYN_NAMES))) SRC_HS_SYN_L = $(addprefix $(SRC_DERIVED_DIR)/,$(patsubst %.lag,%.hs,$(SRC_LAG_SYN_NAMES))) SRC_HS_SEM = $(addprefix $(SRC_DERIVED_DIR)/,$(patsubst %.ag,%.hs,$(SRC_AG_SEM_NAMES))) SRC_HS_SEM_L = $(addprefix $(SRC_DERIVED_DIR)/,$(patsubst %.lag,%.hs,$(SRC_LAG_SEM_NAMES))) # Generate dependencies for ag files DEPEND_AG = ag.depend depend_ag: $(DEPEND_AG) DEP_PROG = scripts/mkAGdepend.sh $(DEPEND_AG): Makefile $(SRC_AG) @echo "* Generating dependencies..." echo "# Dependencies generated by Makefile, do not edit." > $(DEPEND_AG) for agf in $(SRC_AG); do \ sh $(DEP_PROG) $(SRC_DERIVED_DIR) . $$agf >> $(DEPEND_AG); \ done # Dependencies between ag files -include $(DEPEND_AG) # Dependencies on ag files by hs files # ugly: change directory per file # and the "cd .." precludes using a depth of more than one # and too directory specific ifeq ($(AG),) $(SRC_HS_SYN) $(SRC_HS_SEM): $(SRC_DERIVED_DIR)/%.hs: $(SRC_AG_DIR)/%.ag @echo "* No AG compiler configured" && exit 1 $(SRC_HS_SYN_L) $(SRC_HS_SEM_L): $(SRC_DERIVED_DIR)/%.hs: $(SRC_AG_DIR)/%.lag @echo "* No AG compiler configured" && exit 1 else $(SRC_HS_SYN): $(SRC_DERIVED_DIR)/%.hs: $(SRC_AG_DIR)/%.ag cd $(SRC_AG_DIR) && \ $(AG) $(FLAGS_AG_SYN) $(FLAGS_AG_$@) --genlinepragmas $*.ag -o ../$(SRC_DERIVED_DIR)/$*.hs && \ cd .. $(SRC_HS_SYN_L): $(SRC_DERIVED_DIR)/%.hs: $(SRC_AG_DIR)/%.lag cd $(SRC_AG_DIR) && \ $(AG) $(FLAGS_AG_SYN) $(FLAGS_AG_$@) --genlinepragmas $*.lag -o ../$(SRC_DERIVED_DIR)/$*.hs && \ cd .. $(SRC_HS_SEM): $(SRC_DERIVED_DIR)/%.hs: $(SRC_AG_DIR)/%.ag cd $(SRC_AG_DIR) && \ $(AG) $(FLAGS_AG_SEM) $(FLAGS_AG_$@) --genlinepragmas $*.ag -o ../$(SRC_DERIVED_DIR)/$*.hs && \ cd .. $(SRC_HS_SEM_L): $(SRC_DERIVED_DIR)/%.hs: $(SRC_AG_DIR)/%.lag cd $(SRC_AG_DIR) && \ $(AG) $(FLAGS_AG_SEM) $(FLAGS_AG_$@) $*.lag --genlinepragmas -o ../$(SRC_DERIVED_DIR)/$*.hs && \ cd .. endif # HS source files for uuag SRC_HS_NAMES = Ag.hs CommonTypes.hs DepTypes.hs HsTokenScanner.hs Options.hs Parser.hs SequentialComputation.lhs SequentialTypes.hs Scanner.hs Streaming.hs TokenDef.hs Version.hs GrammarInfo.hs PPUtil.hs Pretty.hs SRC_HS = $(addprefix $(SRC_DIR)/,$(SRC_HS_NAMES)) build: $(AG_BINARY) # Building the uuagc system invokes cabal build derived: $(SRC_HS) $(SRC_HS_SEM) $(SRC_HS_SEM_L) $(SRC_HS_SYN) $(SRC_HS_SYN_L) $(AG_BINARY): derived $(CABAL_CONFIG) @echo "* Compiling hs sources..." $(CABAL_BUILD) $(CABAL_CONFIG): $(CABAL_SCRIPT) @echo "* Configuring Cabal" $(CABAL_CONFIGURE) --user # AM: ignore the prefix; instead install as user command # --prefix=$(prefix) $(CABAL_SCRIPT): $(CABAL_SOURCE) @echo "* Building Cabal script" $(HC) $< -o $@ -package Cabal # # distribution (for the time being source only and unix) # DISTTYPE=src ifeq ($(DISTTYPE),win32) TARCZVF := zip -r TAREXT := .zip else TARCZVF := tar cvzf TAREXT := .tar.gz endif # the name is hard-coded REVISION := $(shell if [ -f svn-revision ]; then cat svn-revision; else echo "unknown"; fi) TODAY := $(shell date '+%Y-%m-%d') DLABEL := uuagc-$(TODAY) VLABEL := uuagc-$(VERSION) DTLABEL:= uuagc-$(TODAY)-$(DISTTYPE) VTLABEL:= uuagc-$(VERSION)-$(DISTTYPE) XLABEL := uuagc-$(VERSION)-rev$(REVISION) XTLABEL:= uuagc-$(VERSION)-rev$(REVISION)-$(DISTTYPE) dist_makedirs: $(RM_F) -r $(DLABEL) $(RM_F) -r $(VLABEL) $(MKDIR) -p $(DLABEL) $(MKDIR) -p $(DLABEL)/test $(MKDIR) -p $(DLABEL)/regress for dir in `$(FIND) $(SRC_DIR) -type d -not -path '*/.svn*'`; do $(MKDIR) -p $(DLABEL)/$${dir}; done for dir in `$(FIND) $(SRC_DERIVED_DIR) -type d -not -path '*/.svn*'`; do $(MKDIR) -p $(DLABEL)/$${dir}; done for dir in `$(FIND) $(SRC_AG_DIR) -type d -not -path '*/.svn*'`; do $(MKDIR) -p $(DLABEL)/$${dir}; done for dir in `$(FIND) scripts -type d -not -path '*/.svn*'`; do $(MKDIR) -p $(DLABEL)/$${dir}; done dist_copy: dist_makedirs $(SRC_HS_SEM) $(SRC_HS_SEM_L) $(SRC_HS_SYN) $(SRC_HS_SYN_L) $(CP) -p LICENSE \ VERSION \ README \ Makefile.in \ configure \ configure.in \ uuagc.cabal \ uuagc.cabal.in \ uuagc.cabal-for-ghc-6.6 \ uuagc.cabal-for-ghc-6.6.in \ Setup.hs \ install-sh \ mkinstalldirs \ $(DLABEL) # populate source and scripts $(CP) -p $(SRC_DIR)/*.hs $(DLABEL)/$(SRC_DIR) $(CP) -p $(SRC_DIR)/*.hs.in $(DLABEL)/$(SRC_DIR) $(CP) -p $(SRC_DIR)/*.lhs $(DLABEL)/$(SRC_DIR) $(CP) -p $(SRC_DERIVED_DIR)/*.hs $(DLABEL)/$(SRC_DERIVED_DIR) $(CP) -p $(SRC_AG_DIR)/*.ag $(DLABEL)/$(SRC_AG_DIR) $(CP) -p $(SRC_AG_DIR)/*.lag $(DLABEL)/$(SRC_AG_DIR) $(CP) -p test/*.ag $(DLABEL)/test $(CP) -p regress/Makefile $(DLABEL)/regress $(CP) -p regress/*.ag $(DLABEL)/regress $(CP) -p regress/*.exp $(DLABEL)/regress $(CP) -p scripts/*.sh.in $(DLABEL)/scripts dist_pack: dist_copy $(TARCZVF) $(DTLABEL)$(TAREXT) $(DLABEL) $(MV) $(DLABEL) $(VLABEL) $(TARCZVF) $(VTLABEL)$(TAREXT) $(VLABEL) dist: dist_info dist_pack dist_info: @echo "* Generating distributions..." source_tarball: source_tarball_info source_tarball_pack source_tarball_info: @echo "* Generating source tarball..." source_tarball_pack: dist_copy touch svn-revision $(MV) $(DLABEL) $(XLABEL) $(TARCZVF) $(XTLABEL)$(TAREXT) $(XLABEL) # # Clean (only stuff built using uuagc) # clean: $(RM_F) $(SRC_HS_SEM) $(SRC_HS_SEM_L) $(SRC_HS_SYN) $(SRC_HS_SYN_L) $(GEN_HS) $(GEN_AG) # # # Install install: $(AG_BINARY) @echo "* Installing UUAG..." $(MKINSTDIR) $(prefix)/bin $(INSTALL) -m 755 $(AG_BINARY) $(prefix)/bin # # Testing AG files in $(TEST_DIR) # TEST_SRC = $(wildcard $(TEST_DIR)/*.ag) TEST_HS = $(patsubst %.ag,%.hs,$(TEST_SRC)) TEST_O = $(patsubst %.ag,%.o,$(TEST_SRC)) TEST_HI = $(patsubst %.ag,%.hi,$(TEST_SRC)) TEST_EXE = $(patsubst %.ag,%.exe,$(TEST_SRC)) $(TEST_HS) : %.hs : %.ag $(AG_BINARY) -a -O --unbox $< -o $@ --module=Main $(TEST_EXE) : %.exe : %.hs $(HC) $< -o $@ test : $(TEST_EXE) cleantest : $(RM_F) $(TEST_HS) $(TEST_O) $(TEST_EXE) check: cd regress; make test GHC=$(HC) AG=../dist/build/uuagc/uuagc check-expect: cd regress; make expect GHC=$(HC) AG=../dist/build/uuagc/uuagc