%************************************************************************ %* * \section[mkworld-suffix-rules]{Default stuff for suffix rules} %* * %************************************************************************ We are keen on suffix rules, rather than pattern rules, because not all makes do the latter. Sigh. Suffix rules come in three blobs: (1)~the unavoidable ones [few]; (2)~the ``always for this project'' ones [turn-off-able]; and (3)~the per-Jmakefile ones (you must ``ask for'' these in each Jmakefile where you need them. %************************************************************************ %* * \subsection[mkworld-suffix-macros]{Macros for making up suffix rules} %* * %************************************************************************ %************************************************************************ %* * \subsubsection[mkworld-suffix-macros-literate]{Suffix-rule macros for literate stuff} %* * %************************************************************************ The following rule generator assumes the @beforesuff->aftersuff@ is known to the literate programming system. \begin{code} #ifndef LitSuffixRule #define LitSuffixRule(beforesuff,aftersuff) @@\ CAT2(beforesuff,aftersuff): @@\ $(RM) $@ @@\ $(LIT2PGM) $(LIT2PGMFLAGS) -o $@ $< @@\ @chmod 444 $@ @@\ @@\ beforesuff.itxi: @@\ $(RM) $@ @@\ $(LIT2TEXI) -c $(LIT2TEXIFLAGS) -o $@ $< @@\ @chmod 444 $@ @@\ @@\ beforesuff.itex: @@\ $(RM) $@ @@\ $(LIT2LATEX) -c $(LIT2LATEXFLAGS) -o $@ $< @@\ @chmod 444 $@ #endif /* LitSuffixRule */ \end{code} %************************************************************************ %* * \subsubsection[mkworld-suffix-macros-C]{Suffix-rule macros for C} %* * %************************************************************************ For objects in libraries: these rules are invoked when you want to override some default suffix rules. \begin{code} #ifndef NormalLibraryObjectRule #define NormalLibraryObjectRule() @@\ .c.o: @@\ RemoveTarget ($@) @@\ $(CC) -c $(CFLAGS) $*.c #endif \end{code} %************************************************************************ %* * \subsubsection[mkworld-suffix-macros-Haskell]{Suffix-rule macros for Haskell} %* * %************************************************************************ There are several varying flavours of Haskell-related suffix rules; each such ``set'' of suffix rules should include...: \begin{verbatim} .o -> .hi # hacky pseudo-dependency to mk .hi file if non-existent .lhs -> .o .hs -> .o \end{verbatim} This is the {\em default}; a project or setup could override it. \begin{code} #ifndef HaskellSuffixRules #define HaskellSuffixRules() @@\ SuffixRule_o_hi() @@\ SuffixRule_lhs_o() @@\ SuffixRule_hs_o() #endif /* !HaskellSuffixRules */ \end{code} We use the internal mkworld CPP macro @_body_HaskellCompileWithSpecifiedFlags@, which is shared w/ other mkworld stuff. This keeps the magic to exactly one place. \begin{code} #ifndef SuffixRule_o_hi #define SuffixRule_o_hi() @@\ .o.hi: @@\ @if [ ! -f $@ ] ; then \ @@\ echo $(RM) $< ; \ @@\ $(RM) $< ; \ @@\ set +e ; \ @@\ echo $(MAKE) HC="$(HC)" HCFLAGS="$(HCFLAGS)" $(MFLAGS) $< ; \ @@\ $(MAKE) HC="$(HC)" HCFLAGS="$(HCFLAGS)" $(MFLAGS) $< ; \ @@\ if [ $$? -ne 0 ] ; then \ @@\ exit 1; \ @@\ fi ; \ @@\ fi #endif /* !SuffixRule_o_hi */ \end{code} \begin{code} #ifndef SuffixRule_hs_o #define SuffixRule_hs_o() @@\ .hs.o: \ _body_HaskellCompileWithSpecifiedFlags($<,$*,hs,-c $(HCFLAGS)) #endif /* !SuffixRule_hs_o */ #ifndef SuffixRule_lhs_o #define SuffixRule_lhs_o() @@\ .lhs.o: \ _body_HaskellCompileWithSpecifiedFlags($<,$*,lhs,-c $(HCFLAGS)) #endif /* !SuffixRule_lhs_o */ \end{code} %************************************************************************ %* * \subsubsection[mkworld-suffix-macros-doc]{Suffix-rule macros for document processing} %* * %************************************************************************ You have to ask for these. \begin{code} #ifndef DocProcessingSuffixRules #define DocProcessingSuffixRules() @@\ .tex.dvi: @@\ $(RM) $@ @@\ $(LTX) $< @@\ @@\ .verb.tex: @@\ $(RM) $*.tex @@\ expand $*.verb | $(VERBATIM) > $*.tex @@\ @@\ .tib.tex: @@\ $(RM) $*.tex $*.verb-t.tex @@\ $(TIB) $*.tib @@\ expand $*.tib-t.tex | $(VERBATIM) > $*.tex @@\ $(RM) $*.tib-t.tex @@\ @@\ .fig.ps: @@\ $(RM) $@ @@\ fig2dev -L ps $< $@ @@\ @@\ .fig.tex: @@\ $(RM) $@ @@\ fig2dev -L latex $< $@ #endif /* ! DocProcessingSuffixRules */ \end{code} %************************************************************************ %* * \subsection[mkworld-suffix-rule-text]{Generate actual suffix-rule text} %* * %************************************************************************ \begin{code} .SUFFIXES: .xdvi .ps .dvi .tex .fig .tib .verb .itex .itxi .lit \ _p.o .o .s .hi .hc .lhc .lhs .hs \ .prl .lprl \ .sh .lsh \ .c .lc .h .lh .lex .llex .y \ .ljm .jm \end{code} %************************************************************************ %* * \subsubsection[mkworld-suffixes-general]{Suffix rules---very general ones} %* * %************************************************************************ \begin{code} .s.o: $(RM) $@ $(AS) $(ASFLAGS) -o $@ $< || $(RM) $@ \end{code} %************************************************************************ %* * \subsubsection[mkworld-suffixes-literate]{Suffix rules for literate programming} %* * %************************************************************************ The \tr{.ljm->.jm} rule isn't optional, because the mkworld system uses it. \begin{code} LitSuffixRule(.ljm,.jm) /* mkworld */ #if SuffixRules_WantLiterate == YES LitSuffixRule(.lit,/*none*/) /* no language really */ LitSuffixRule(.lhs,.hs) /* Haskell */ LitSuffixRule(.lhc,.hc) /* Haskell assembler (C) */ LitSuffixRule(.lprl,.prl) /* Perl */ LitSuffixRule(.lsh,.sh) /* Bourne shell */ LitSuffixRule(.lc,.c) /* C */ LitSuffixRule(.lh,.h) LitSuffixRule(.llex,.lex) /* Lex */ /* extra rule... flex can't handle #line's yet */ /* also: save the .lex file in case of some debugging need */ .llex.c: $(RM) $@ $*.lex $*.lex.save $(LIT2PGM) $(LIT2PGMFLAGS) $< > $*.lex $(FLEX) $*.lex && mv $*.lex $*.lex.save && mv lex.yy.c $*.c #endif /* SuffixRules_WantLiterate */ \end{code} %************************************************************************ %* * \subsubsection[mkworld-suffixes-C]{Suffix rules for C/lex/yacc programming} %* * %************************************************************************ See also the ``literate lex'' (llex) rule in the literate section, above. We don't support the \tr{.y.c} suffix rule; an explicit @YaccRunWithExpectMsg@ is better. \begin{code} .y.c: @echo please use an explicit "YaccRunWithExpectMsg" macro .lex.c: /* ToDo: should make it do flex */ $(RM) $@ $(LEX) -t $(LFLAGS) $< > $@ || ( $(RM) $@ && exit 1 ) \end{code} NB: avoid \tr{-o } because of braindead C compilers. \begin{code} #if CCompilerGroksMinusCMinusO == YES .c.o: $(RM) $@ $(CC) $(CFLAGS) -c $< -o $@ .c.s: $(RM) $@ $(CC) $(CFLAGS) -S $< -o $@ #else /* ! CCompilerGroksMinusCMinusO */ .c.o: $(RM) $@ $(CC) $(CFLAGS) -c $< @if [ \( $(@D) != '.' \) -a \( $(@D) != './' \) ] ; then \ echo mv $(@F) $@ ; \ mv $(@F) $@ ; \ fi .c.s: $(RM) $@ $(CC) $(CFLAGS) -S $< @if [ \( $(@D) != '.' \) -a \( $(@D) != './' \) ] ; then \ echo mv $(@F) $@ ; \ mv $(@F) $@ ; \ fi #endif /* ! CCompilerGroksMinusCMinusO */ \end{code} %************************************************************************ %* * \subsubsection[mkworld-suffixes-haskell]{Suffix rules for Haskell programming} %* * %************************************************************************ Suffix rules for Haskell are {\em not} put in by default. A Jmakefile must ask for one specifically, using one of the macros defined in macros section, above (\sectionref{mkworld-suffix-macros-Haskell}). %************************************************************************ %* * \subsubsection[mkworld-suffixes-docs]{Suffix rules for document processing (LaTeX/tib/fig/etc)} %* * %************************************************************************ \begin{code} #if SuffixRules_WantDocProcessing == YES DocProcessingSuffixRules() #endif /* SuffixRules_WantDocProcessing */ \end{code}