OT trapenie sa s make
Milan B.
milan@bastl.sk
Pátek Březen 13 14:06:12 CET 2009
Takze som sa do toho zahlbil, vyskusal a dospel som k nasledovnemu:
Mate pravdu. Nevytvori, ked nemusi.
Ale cele je to trochu vytrhnute z kontextu. Nie nahodou su tieto
direktivy vymenovane v kapitole o retazeni implicitnych pravidiel.
Zoberme nasledujuci priklad. V tomto pripade testfile.nonexistent je
"intermediate" subor a subor testfile.proto obsahuje "prahmotu"
###########################################################
#.SECONDARY: testfile.nonexistent
#.INTERMEDIATE: testfile.nonexistent
testfile.dependent: testfile.nonexistent
%.nonexistent: %.proto
cp $< $@
%.dependent: %.nonexistent
@echo making $@
cp $< $@
###########################################################
Ked nie je pouzita ziadna z direktiv .INTERMEDIATE a .SECONDARY, tak ak
testfile.nonexistent neexistuje, tak make ho vytvori (na zaklade
existujuceho implicitneho pravidla) a z neho vytvori testfile dependent
- a testfile.nonexistent necha tam. Ako pravi dokumentacia, akonahle je
subor vymenovany ako dependency, nie je povazovany za "intermediate" subor.
Toto sa da zmenit pomocou .INTERMEDIATE - vtedy sa opat povazuje za
intermediate subor. Takze v nasom pripade, ak testfile.dependent je
novsi ako testfile.proto (a testfile.nonexistent neexistuje), nedeje sa
nic (tu je ta zmena oproti predoslemu chovaniu). Ale ak
testfile.dependent chyba alebo je starsie ako testfile.proto tak ho make
vytvori cestou testfile.proto -> testfile.nonexistent ->
testfile.dependent a na zaver testfile.nonexistent vymaze.
Pokial .INTERMEDIATE nahradime .SECONDARY, chovanie je rovnake s tym
rozdielom, ze testfile.nonexistent sa na zaver nevymaze.
Uvedeny priklad sa lisi od vasho len tym, ze spracovanie nonexistent ->
dependent bolo presunute do implicitneho pravidla a bolo pridane
pravidlo na vytvorenie nonexistent.
Takze podla mna sa direktiva .SECONDARY chova tak, ako je
zdokumentovana. A ako som uviedol, zakladny problem vo vasom priklade
je, ze make nevie vytvorit testfile.nonexistent ked ho potrebuje
Kazdopadne dajte vediet, co vam odpovedali.
-m-
Jan Waclawek wrote:
> Dokumentacia (http://www.gnu.org/software/make/manual/make.html#Chained-Rules) hovori:
> "When a file is secondary, make will not create the file merely because it does not already exist"
>
> Mne to znie, ze ak subor je oznaceny "secondary", make sa nebude snazit ho vytvorit len preto, ze neexistuje (ale sa ho bude snazit vytvorit, ak pre neho existuje explicitne pravidlo a na zaklade takehoto pravidla sa usudi, ze ten subor nie je aktualny).
>
> Mimochodom, ak testfile.dependent *existuje*, tak sa skutocne netrva na existencii testfile.nonexistent.
>
> Skusim sa teda strapnit priamo u udrziavatelov projektu (je zaujimave, ze velky RMS medzi nimi nie je...), ako pan kolega Ladman doporucil, a uvidime, co povedia...
>
> wek
>
> ----- Original Message ---------------
>
>> Tato direktiva mi nie je prilis doverne znama, ale chapem to si takto:
>>
>> "make na tom subore netrva" by malo znamenat asi tolko, ze nemusi
>> existovat, pretoze si ho make vytvori sam, ale musi vedie ako - podla
>> nejakeho implicitneho pravidla.
>>
>> Zda sa, ze .SECONDARY mu iba povie, ze ten "pomocny" subor nema mazat.
>> ked ho uz raz vytvoril a sucasne make povie, ze ten neexistujuci subor
>> moze byt pouzity v zozname zavislosti
>>
>> Takze make *musi* vediet, ako testfile.nonexistent vytvorit.
>>
>> Nezda sa mi, ze tato direktiva by mala sluzit na to, aby sa ignorovali
>> neexistujuce subory.
>>
>> -m-
>>
>>
>>
>> Jan Waclawek wrote:
>>
>>> Mam nasledovny makefile:
>>> -------
>>> .SECONDARY=testfile.nonexistent
>>>
>>> testfile.dependent: testfile.nonexistent
>>> @echo making testfile.dependent
>>> -------
>>>
>>> testfile.dependent ani testfile.nonexistent neexistuju. Toto sa stane pri pokuse o make:
>>>
>>> c:\>make.exe -f test.makefile
>>> make.exe: *** No rule to make target `testfile.nonexistent', needed by `testfile.dependent'. Stop.
>>>
>>> Podla mna je to bug, ucel .SECONDARY je predsa oznacit subory, na existencii ktorych make nebude trvat.
>>> Make je GNU make 3.81, ktory bol pribaleny k WinAVR20071221.
>>>
>>> Co s tym (teda okrem opravovania make vlastnymi silami v tom pravom duchu opensource)?
>>>
>>> wek
>>>
>>>
>
> _______________________________________________
> HW-list mailing list - sponsored by www.HW.cz
> Hw-list@list.hw.cz
> http://list.hw.cz/mailman/listinfo/hw-list
>
Další informace o konferenci Hw-list