make on older systems (RHEL3)

Patrick Barnes nman64 at n-man.com
Fri Nov 18 07:42:05 UTC 2005


Tommy Reynolds wrote:
> Uttered Patrick Barnes <nman64 at n-man.com>, spake thus:
>
>   
>> I've made some revisions to docs-common/Makefile.common in an attempt to
>> resolve build failures on RHEL3.  I'd like this to undergo more testing
>> (particularly on older systems) before committing it.  In particular, I
>> would like Tommy to take a quick look at this to make sure it doesn't
>> break anything.  It is a syntax change that, to the best of my
>> knowledge, shouldn't change behavior, but I'm not overly experienced
>> with Makefiles.
>>
>> The altered file is attached.
>>     
>
> Sorry, but it's not even close ;-(
>
> Let me explain what's going on in a bit of detail, so everybody will
> be on the same page.  Someday I'll fold it into the docs... (yeah,
> right)
>
> The magic is all driven from a ${LANGUAGES} macro that holds a simple
> list of all the languages we must support in the make(1) setup.
>
> Here is the target and some rules for one language:
>
> $(DOCBASE)-en/index.html:: ${DOCBASE}-en.xml ${EXTRAXMLFILES-en}
> 	LANG=en.UTF-8 ${XMLTO} html -x $(XSLHTML) -o $(DOCBASE)-en \
> 		$(DOCBASE)-en.xml
> 	mkdir -p $(DOCBASE)-en/stylesheet-images/
> 	cp ${FDPDIR}/docs-common/stylesheet-images/*.png \
> 		$(DOCBASE)-en/stylesheet-images
> 	cp ${FDPDIR}/docs-common/css/fedora.css $(DOCBASE)-en/
> 	[ ! -d figs ] || (						\
> 		mkdir -p ${DOCBASE}-en/figs;				\
> 		find figs -type f -iname '*.*' -print		|	\
> 		egrep -vi '*.eps'				|	\
> 		egrep '(.*-$(1)..*)|([^-]*[.][^-]*)'		|	\
> 		while read x; do cp -f $$$${x} ${DOCBASE}-$(1)/figs; done \
> 	) && exit 0
>
> Now, here is another target and its rules for a translation:
>
> $(DOCBASE)-it/index.html:: ${DOCBASE}-it.xml ${EXTRAXMLFILES-it}
> 	LANG=en.UTF-8 ${XMLTO} html -x $(XSLHTML) -o $(DOCBASE)-it \
> 		$(DOCBASE)-it.xml
> 	mkdir -p $(DOCBASE)-it/stylesheet-images/
> 	cp ${FDPDIR}/docs-common/stylesheet-images/*.png \
> 		$(DOCBASE)-it/stylesheet-images
> 	cp ${FDPDIR}/docs-common/css/fedora.css $(DOCBASE)-it/
> 	[ ! -d figs ] || (						\
> 		mkdir -p ${DOCBASE}-it/figs;				\
> 		find figs -type f -iname '*.*' -print		|	\
> 		egrep -vi '*.eps'				|	\
> 		egrep '(.*-$(1)..*)|([^-]*[.][^-]*)'		|	\
> 		while read x; do cp -f $$$${x} ${DOCBASE}-$(1)/figs; done \
> 	) && exit 0
>
> So, using traditional make(1) constructs, we would have an "unrolled
> loop" that looks like this:
>
> ${DOCBASE-en/index.html:: ${DOCBASE}-en.xml ${EXTRAXMLFILES-en}
> 	LANG=en.UTF-8 ${XMLTO} html -x $(XSLHTML) -o $(DOCBASE)-it \
> 		$(DOCBASE)-it.xml
> 	...
> ${DOCBASE-de/index.html:: ${DOCBASE}-de.xml ${EXTRAXMLFILES-de}
> 	LANG=en.UTF-8 ${XMLTO} html -x $(XSLHTML) -o $(DOCBASE)-it \
> 		$(DOCBASE)-it.xml
> 	...
> ${DOCBASE-it/index.html:: ${DOCBASE}-it.xml ${EXTRAXMLFILES-it}
> 	LANG=en.UTF-8 ${XMLTO} html -x $(XSLHTML) -o $(DOCBASE)-it \
> 		$(DOCBASE)-it.xml
> 	...
>
> See the emerging pattern?  GNU make(1) implements a "template", which
> is a bit like a CPP macro preprocessor for the Makefile:
>
> define	HTML_template
> ${DOCBASE}-$(1)/index.html:: ${DOCBASE}-$(1).xml $$(XMLEXTRAFILES-$(1))
> 	LANG=$(1).UTF-8 ${XMLTO} html -x $(XSLHTML) -o $(DOCBASE)-$(1) $(DOCBASE)-$(1).xml
> 	mkdir -p $(DOCBASE)-$(1)/stylesheet-images/
> 	cp ${FDPDIR}/docs-common/stylesheet-images/*.png $(DOCBASE)-$(1)/stylesheet-images
> 	cp ${FDPDIR}/docs-common/css/fedora.css $$(DOCBASE)-$(1)/
> 	[ ! -d figs ] || (						\
> 		mkdir -p ${DOCBASE}-$(1)/figs;				\
> 		find figs -type f -iname '*.*' -print		|	\
> 		egrep -vi '*.eps'				|	\
> 		egrep '(.*-$(1)..*)|([^-]*[.][^-]*)'		|	\
> 		while read x; do cp -f $$$${x} ${DOCBASE}-$(1)/figs; done \
> 	) && exit 0
> endef
>
> Here, the "HTML_template" will take one parameter, the locale code
> that marks the language of interest.  We get these from the
> ${LANGUAGES} macro, so we somehow need to obtain a Makefile line
> like:
>
> html:: ${DOCBASE}-en/index.html ${DOCBASE}-de/index.html ... \
> 	${DOCBASE}-it/index.html
>
> without needing to do any editing when a new language gets added.
>
> One way to do this would have been to use various patsubst verbs for
> an in-line expansion, something like:
>
> html:: ${LANGUAGES:^%=${DOCBASE}-%:%$=%/index.html}
>
> (OK, that's not a valid line, but it gets the point across.  The real
> code was even uglier.)  Assume "LANGUAGES=en de it"; the construct you used:
>
> html:: ${DOCBASE}-${LANGUAGES}/index.html
>
> expands to
>
> html:: example_tutorial-en de it/index.html
>
> which is not what we want.
>
> Meanwhile, back at the patsubst example: well and good, as far as it
> goes.  Unfortunately, this works only for in-line expansion and is
> useless to "unroll the loop" to generate all the code and rules we
> need for every language we need to support.  When the Makefile.common
> does:
>
> $(foreach LANG,${LANGUAGES},$(eval $(call HTML_template,${LANG})))
>
> it is exactly the same as having cut & pasted the lines within the
> template body while replacing each instance of "$(1)" with one
> language locale from the ${LANGUAGES} list.
>
> You can watch all this happen by going into the "release-notes"
> document and typing this:
>
> $ make -n -p | less
>
> In particular, look for the stanzas introduced by lines with
> "LANG=<foo>.UTF-8".  All of these were generated as the template was
> expanded in the $(foreach ...) lines.
>
> Maybe this technique was just too cute to be maintainable.  I don't
> know when template support was introduced, but it's in FC4 and later.
>
> If this is a real problem, we have other technologies such as shell
> scripts, awk scripts, perl scripts, m4 macros, and on.
>
> HTH
>   
D'oh.  I should have caught my error on that one.

I don't think it is high-priority right now, and I hope it doesn't
become such.  Elliot was trying to use an RHEL3 system, but just used an
RHEL4 system when it didn't work.

-- 
Patrick "The N-Man" Barnes
nman64 at n-man.com

www.n-man.com
-- 



-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 189 bytes
Desc: OpenPGP digital signature
URL: <http://listman.redhat.com/archives/fedora-docs-list/attachments/20051118/ef58ed40/attachment.sig>


More information about the fedora-docs-list mailing list