Thread View: be.comp.programming
7 messages
7 total messages
Started by Aquila
Fri, 30 May 2003 14:41
Wat doet volgende Makefile? (reguliere expressies)
Author: Aquila
Date: Fri, 30 May 2003 14:41
Date: Fri, 30 May 2003 14:41
16 lines
1677 bytes
1677 bytes
In de handleiding van gmake staat volgende schitterende manier om
automatisch uit c++ files de includes te halen voor dependencies, ik vroeg
me alleen af wat het eigenlijk juist doet:
%.d: %.cxx
set -e; $(CC) -MM $(CFLAGS) $< | sed 's/\($*\)\.o[ :]*/\1.o $@ : /g' > $@;
[ -s $@ ] || rm -f $@
Wat ik al weet is dat je dus elke cxx afgaat en er een d van maakt, en dat
$(CC) -MM $(CFLAGS) de compiler oproept om alle inclusions uit de file te
halen. Maar wat doet dan set -e (niet zo belangrijk), maar sed [reguliere
expressie]? Ik ben niet zo sterk in reguliere expressies namelijk...
--
Pleased to meet you
Hope you guess my name
But what's puzzling you
Is the nature of my game
Re: Wat doet volgende Makefile? (reguliere expressies)
Author: Nicolas Barbier
Date: Fri, 30 May 2003 15:34
Date: Fri, 30 May 2003 15:34
88 lines
4297 bytes
4297 bytes
Aquila wrote: > In de handleiding van gmake staat volgende schitterende manier om > automatisch uit c++ files de includes te halen voor dependencies, ik vroeg > me alleen af wat het eigenlijk juist doet: > %.d: %.cxx > set -e; $(CC) -MM $(CFLAGS) $< | sed 's/\($*\)\.o[ :]*/\1.o $@ : > /g' > $@; > [ -s $@ ] || rm -f $@ > > Wat ik al weet is dat je dus elke cxx afgaat en er een d van maakt, en dat > $(CC) -MM $(CFLAGS) de compiler oproept om alle inclusions uit de file te > halen. Maar wat doet dan set -e (niet zo belangrijk), maar sed [reguliere > expressie]? Ik ben niet zo sterk in reguliere expressies namelijk... Lijkt me de .d file bij de rule-targets te zetten, en dat weg te schrijven naar de .d file. Bv: blabla.o: blabla.cxx bla.h test.h wordt veranderd in: blabla.o blabla.d: blabla.cxx bla.h test.h en het resultaat wordt in de .d file gestopt. Zodoende zal, indien de .cxx file of een der zijn dependencies verandert, zowel de .o file als de .d file opnieuw gegenereerd worden (de .d file moet opnieuw gegenereerd worden omdat de dependencies hierdoor ook kunnen veranderen). De .d file moet als een gedeelte van de Makefile gebruikt worden om dit te laten werken natuurlijk (via een of ander soort include regel denk ik?). uit bash(1), gedeelte over set: -e Exit immediately if a simple command (see SHELL GRAMMAR above) exits with a non-zero status. The shell does not exit if the command that fails is part of an until or while loop, part of an if statement, part of a && or || list, or if the command's return value is being inverted via !. A trap on ERR, if set, is executed before the shell exits. De regular expression kan als volgt uitgelegd worden (fouten mijnentwege voorbehouden :-): sed 's/\($*\)\.o[ :]*/\1.o $@ : /g' > $@; s: verander hetgeen gematcht wordt door de volgende RE door de vervangingsexpressie. ER: "\($*\)\.o[ :]*" Uitleg: $: begin van de regel. \(: begin markering. *: match nul of meerdere keren het vorige, ik denk dat je dit verkeerd hebt overgetypt? Het lijkt me dat dit .* moet zijn (matcht alles). \): einde markering. \.o: letterlijke ".o", zonder aanhalingstekens. [ :]*: een willekeurig aantal keren een spatie of een ":". vervangingsexpressie: "\1.o $@ : " Uitleg: \1: zet hier het deel dat door de eerste markering gematcht is. .o : ".o" gevolgd door een spatie. $@: de rule-target (de .d file). : : " : " :-). De g duidt op meerdere keren vervangen als het meerdere keren voorkomt (ik snap niet echt waarvoor dit nodig is). Maw: zoek alles voor de eerste ".o", en vervang het, inclusief de ".o" met eventuele spaties en dubbelepunten erachter door de .o file en de .d file met een dubbele punt achter. Deze uitleg duurde langer dan 10 van dergelijke dingen opstellen :-). Hint: RE's zijn moeilijker te lezen dan op te stellen :-). Dankwoord: aangezien ik nog nooit de tijd heb gehad om het hele GNU build-systeem aan te leren, en de optie -M(M) van gcc niet kende, heb je er door je post voor gezorgd dat mijn Makefile-met-de-hand-genereren- nachtmerries waarschijnlijk zullen ophouden ;-). Leve -MM! Viva la -MM optioni! (ofzo ;-) -- Nicolas Barbier
Re: Wat doet volgende Makefile? (reguliere expressies)
Author: Nicolas Barbier
Date: Fri, 30 May 2003 15:36
Date: Fri, 30 May 2003 15:36
11 lines
1335 bytes
1335 bytes
Nicolas Barbier wrote: > ER: "\($*\)\.o[ :]*" s/ER/RE/ Hmm, de lessen databases hebben mijn acroniemen-database om zeep geholpen blijkbaar ;-). -- Nicolas Barbier
Re: Wat doet volgende Makefile? (reguliere expressies)
Author: Aquila
Date: Sat, 31 May 2003 11:21
Date: Sat, 31 May 2003 11:21
23 lines
1833 bytes
1833 bytes
Nicolas Barbier wrote: > Nicolas Barbier wrote: > >> ER: "\($*\)\.o[ :]*" > > s/ER/RE/ > > Hmm, de lessen databases hebben mijn acroniemen-database om zeep geholpen > blijkbaar ;-). > Bedankt voor het antwoord, ik ga eens kijken of ik er aan uit geraak :-) Moest je een voorbeeld makefile willen waar het geheel in gebruikt wordt dan mail je maar, anders moet je eens kijken op <http://www.gnu.org/manual/make-3.79.1/html_chapter/make_4.html#SEC43>, want daar heb ik de info vandaan. (NB: het geheel werkt alleen met gmake, make op solaris bv doet er moeilijk over) -- Pleased to meet you Hope you guess my name But what's puzzling you Is the nature of my game
Re: Wat doet volgende Makefile? (reguliere expressies)
Author: Gunter Schelfhout
Date: Sat, 31 May 2003 14:29
Date: Sat, 31 May 2003 14:29
71 lines
2866 bytes
2866 bytes
Nicolas Barbier wrote: >> ik >> vroeg me alleen af wat het eigenlijk juist doet: >> %.d: %.cxx >> set -e; $(CC) -MM $(CFLAGS) $< | sed 's/\($*\)\.o[ :]*/\1.o $@ : >> /g' > $@; >> [ -s $@ ] || rm -f $@ >> [knip] > > De regular expression kan als volgt uitgelegd worden (fouten mijnentwege > voorbehouden :-): > > sed 's/\($*\)\.o[ :]*/\1.o $@ : /g' > $@; > > s: verander hetgeen gematcht wordt door de volgende RE door de > vervangingsexpressie. > > ER: "\($*\)\.o[ :]*" > > Uitleg: > $: begin van de regel. $ matcht het 'einde' van de regel. ;-) > \(: begin markering. ack > *: match nul of meerdere keren het vorige, ik denk dat je dit verkeerd > hebt overgetypt? Het lijkt me dat dit .* moet zijn (matcht alles). Vermits het hier een shell-pipe betreft, is die $* de desbetreffende shell-variabele. (net zoals $@) > \): einde markering. ack > \.o: letterlijke ".o", zonder aanhalingstekens. ack > [ :]*: een willekeurig aantal keren een spatie of een ":". ack > vervangingsexpressie: "\1.o $@ : " > > Uitleg: > \1: zet hier het deel dat door de eerste markering gematcht is. > .o : ".o" gevolgd door een spatie. > $@: de rule-target (de .d file). > : : " : " :-). > > De g duidt op meerdere keren vervangen als het meerdere keren voorkomt (ik > snap niet echt waarvoor dit nodig is). Omdat $* meerdere argumenten kan bevatten. > Maw: zoek alles voor de eerste ".o", en vervang het, inclusief de ".o" met > eventuele spaties en dubbelepunten erachter door de .o file en de .d file > met een dubbele punt achter. [knip] -- Blood, sweat & tears
Re: Wat doet volgende Makefile? (reguliere expressies)
Author: Nicolas Barbier
Date: Sat, 31 May 2003 17:00
Date: Sat, 31 May 2003 17:00
12 lines
1386 bytes
1386 bytes
Gunter Schelfhout wrote: > $ matcht het 'einde' van de regel. ;-) Oeps *schaam mijzelf* :-). (snip andere correcties) Merci :-). -- Nicolas Barbier
Re: Wat doet volgende Makefile? (reguliere expressies)
Author: Robrecht Jacques
Date: Mon, 02 Jun 2003 16:21
Date: Mon, 02 Jun 2003 16:21
46 lines
2757 bytes
2757 bytes
Gunter Schelfhout wrote:
> Nicolas Barbier wrote:
>>> ik
>>> vroeg me alleen af wat het eigenlijk juist doet:
>>> %.d: %.cxx
>>> set -e; $(CC) -MM $(CFLAGS) $< | sed 's/\($*\)\.o[ :]*/\1.o
>>> $@ : /g' > $@;
>>> [ -s $@ ] || rm -f $@
[...]
>> *: match nul of meerdere keren het vorige, ik denk dat je dit
>> verkeerd hebt overgetypt? Het lijkt me dat dit .* moet zijn (matcht
>> alles).
>
> Vermits het hier een shell-pipe betreft, is die $* de desbetreffende
> shell-variabele. (net zoals $@)
Heeft niet echt iets met de shell te maken, maar met de speciale variabelen
van 'gmake', net als $@ en $<. Zie het deel over 'Automatic Variables' in
de info-file van 'gmake'.
$* : The stem with which an implicit rule matches... The stem is
useful for constructing names of related files.
$< : The name of the first dependency.
$@ : The file name of the target of the rule.
De betekenis van deze variabelen in een shell (bv 'bash') is volledig
anders:
$* : Expands to the positional parameters, starting from one.
$@ : Expands to the positional parameters, starting from one. (maar dan
anders als gebruikt als "$@" in vgl met "$*").
$< : bestaat niet in een shell
[...]
>> De g duidt op meerdere keren vervangen als het meerdere keren
>> voorkomt (ik snap niet echt waarvoor dit nodig is).
>
> Omdat $* meerdere argumenten kan bevatten.
Niet waar. De 'stem' zal altijd maar ��n argument zijn. Bv in bovenstaande
rule (%.d: %.cxx) zal voor het bestand 'foo/bar.cxx' de stem 'foo/bar'
zijn.
Ik denk trouwens niet dat de '/g' nodig is.
Robrecht
Thread Navigation
This is a paginated view of messages in the thread with full content displayed inline.
Messages are displayed in chronological order, with the original post highlighted in green.
Use pagination controls to navigate through all messages in large threads.
Back to All Threads