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