🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: be.comp.programming
Article #5106

Re: Wat doet volgende Makefile? (reguliere expressies)

#5106
From: 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
Technical Details
Message-ID: <3ed77a1c$0$6531$afc38c87@sisyphus.news.be.easynet.net>
Path: arc1-ca.pugleaf.net!archiver1.google.com!news1.google.com!sn-xit-02!sn-xit-04!sn-xit-01!sn-xit-09!supernews.com!news-out.visi.com!petbe.visi.com!easynet-monga!easynet.net!feed1.news.be.easynet.net!sisyphus.news.be.easynet.net!not-for-mail
References: <bb7qnc$38c$1@reader08.wxs.nl>

Show Full Headers
Complete Article Headers
X-Google-Language: DUTCH,ASCII-7-bit
X-Google-Thread: fcea4,e99e0c65c5ba9bfb
X-Google-Attributes: gidfcea4,public
X-Google-ArrivalTime: 2003-05-30 08:35:02 PST
Path: arc1-ca.pugleaf.net!archiver1.google.com!news1.google.com!sn-xit-02!sn-xit-04!sn-xit-01!sn-xit-09!supernews.com!news-out.visi.com!petbe.visi.com!easynet-monga!easynet.net!feed1.news.be.easynet.net!sisyphus.news.be.easynet.net!not-for-mail
Message-ID: <3ed77a1c$0$6531$afc38c87@sisyphus.news.be.easynet.net>
From: Nicolas Barbier <anti@spam.invalid>
Subject: Re: Wat doet volgende Makefile? (reguliere expressies)
Newsgroups: be.comp.programming
Date: Fri, 30 May 2003 17:34:05 +0200
References: <bb7qnc$38c$1@reader08.wxs.nl>
User-Agent: KNode/0.6.1
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Transfer-Encoding: 7Bit
Lines: 88
Organization: [ posted via Easynet Belgium ]
NNTP-Posting-Date: 30 May 2003 15:34:52 GMT
NNTP-Posting-Host: 213.193.183.32
X-Trace: 1054308892  6531 [::ffff:213.193.183.32]:34119
X-Complaints-To: abuse@be.easynet.net