🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

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)
#5105
Author: Aquila
Date: Fri, 30 May 2003 14:41
16 lines
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)
#5106
Author: Nicolas Barbier
Date: Fri, 30 May 2003 15:34
88 lines
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)
#5107
Author: Nicolas Barbier
Date: Fri, 30 May 2003 15:36
11 lines
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)
#5108
Author: Aquila
Date: Sat, 31 May 2003 11:21
23 lines
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)
#5109
Author: Gunter Schelfhout
Date: Sat, 31 May 2003 14:29
71 lines
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)
#5110
Author: Nicolas Barbier
Date: Sat, 31 May 2003 17:00
12 lines
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)
#5111
Author: Robrecht Jacques
Date: Mon, 02 Jun 2003 16:21
46 lines
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