Article View: be.comp.programming
Article #5106Re: Wat doet volgende Makefile? (reguliere expressies)
From: 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
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-mailReferences:
<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