[ Skip to the content ]

Institute of Formal and Applied Linguistics Wiki


[ Back to the navigation ]

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
user:zeman:rizeni-pokusu-pomoci-makefilu [2009/03/28 14:52]
zeman Full/gold eval vs. blind.
user:zeman:rizeni-pokusu-pomoci-makefilu [2023/04/21 15:57] (current)
zeman [mdmake]
Line 46: Line 46:
  
 Pokud oddělíme kopírování dat ze vzdálených složek do samostatného Makefilu a pokud v rámci jednoho Makefilu omezíme případné přesuny mezi složkami na takové, které se dají vyjádřit relativní cestou (tj. typicky podstrom složky, ve které leží Makefile), pak si vystačíme s relativními cestami. Poznámka: I kopírování ze vzdálených složek lze pak vyřešit tím, že si na vzdálené složky vyrobíme ze složky s Makefilem symbolický odkaz. Pokud oddělíme kopírování dat ze vzdálených složek do samostatného Makefilu a pokud v rámci jednoho Makefilu omezíme případné přesuny mezi složkami na takové, které se dají vyjádřit relativní cestou (tj. typicky podstrom složky, ve které leží Makefile), pak si vystačíme s relativními cestami. Poznámka: I kopírování ze vzdálených složek lze pak vyřešit tím, že si na vzdálené složky vyrobíme ze složky s Makefilem symbolický odkaz.
- 
  
 ===== Rozměry ===== ===== Rozměry =====
Line 58: Line 57:
   * Různá nastavení parseru a dalších nástrojů, různá předzpracování dat (např. převedení morfologických značek do sady PDT)   * Různá nastavení parseru a dalších nástrojů, různá předzpracování dat (např. převedení morfologických značek do sady PDT)
  
 +
 +===== mdmake =====
 +
 +Tohle jsou Danovy poznámky k budoucímu nástroji, který by měl řadu problémů odstranit tím, že z šablony ''makefile.mdm'' vygeneruje Makefile pro normální gnu make. MD-make znamená „multidimenzionální make“.
 +
 +  * MD-makefile může obsahovat všechny syntaktické konstrukce, které obsahuje normální makefile. Konstrukce se opíší do vygenerovaného makefilu a za jejich zpracování bude zodpovědný až normální make. Je akorát nutné mít na paměti, že k jejich zpracování dojde po vygenerování makefilu. Pokud tedy např. vkládáme vnořené makefily pomocí include, musí to už být normální makefily, ne MD-makefily.
 +  * Vyjmenovat proměnné, které obsahují hodnoty v jednotlivých rozměrech. Současně dát najevo, jak se z nich poskládá jméno souboru. (Mezery se umažou, jsou tam proto, aby se poznalo, který oddělovač se má vynechat, když nějaký rozměr zcela chybí. Povolené oddělovače jsou lomítko, pomlčka a tečka.)
 +<code>.MDIMS: LANGUAGES/ DE TRAINTEST -PREPROCESSINGS .STATES</code>
 +  * Oddělovače nejsou povinné, ale MD-make zkontroluje, zda kvůli chybějícím oddělovačům nemůžou vzniknout nejednoznačnosti (např. LANGUAGES = hi him, DOMAINS = mix ix, .MDIMS: LANGUAGES DOMAINS by způsobovalo problémy).
 +  * Poslední rozměr v&nbsp;seznamu rozměrů má výlučné postavení. Nemusí se jmenovat STATES a nemusí být oddělen právě tečkou (i když se to doporučuje - v&nbsp;některých operačních systémech je vhodné, když má jméno souboru příponu, která definuje typ obsahu), ale nicméně hodnota v&nbsp;tomto rozměru se považuje za typ souboru, ze kterého mj. vyplývá, v&nbsp;jakých ostatních rozměrech se soubory tohoto typu pohybují. MD-make si to přečte u pravidla, které soubory tohoto typu generuje jako svůj cíl. Takové pravidlo musí být alespoň jedno pro každý typ. Teoreticky jich může být i více, pokud chceme dělat něco jiného třeba pro jednotlivé jazyky. V&nbsp;tom případě všechna taková pravidla musí uvádět shodný seznam rozměrů cíle. Nemusí ale dohromady pokrývat všechny hodnoty všech těchto rozměrů.
 +  * Příslušné proměnné s&nbsp;hodnotami jednotlivých rozměrů musí být obyčejné proměnné, obsahující seznam slov oddělených mezerami. MD-make v&nbsp;nich nehledá odkazy na jiné proměnné nebo dokonce makra. Pokud v&nbsp;nich narazí na dolar, hodí výjimku a odmítne pokračovat. Tyto proměnné zůstanou viditelné i ve vygenerovaném makefilu.
 +  * Žádná hodnota v&nbsp;žádném rozměru nesmí být totožná s&nbsp;nějakou hodnotou v&nbsp;jiném rozměru. Jinými slovy, máme-li hodnotu, můžeme z&nbsp;ní poznat i rozměr. (Tím se mimo jiné předchází nejednoznačnostem ve jménech souborů, která neobsahují všechny rozměry.)
 +  * Multidimenzionální šablonovité pravidlo lze označit jako takové a říct pro něj:
 +    * Ve kterých rozměrech se pohybuje cílový soubor: direktiva ''.md.for''. (Ostatní rozměry se ve jménu souboru vůbec neobjeví.)
 +    * Jaké jsou podmínky na hodnoty v&nbsp;jednotlivých rozměrech. (Standardně pomocí direktivy ''.md.if'', ale nějak zařídit, aby se podmínka pro rozměr ''.STATES'' (resp. poslední rozměr v&nbsp;seznamu) mohla defaultně vyjádřit přímo v&nbsp;pravidle.
 +    * MD-make rozgeneruje multidimenzionální pravidlo na řadu obyčejných pravidel, ve kterých se vystřídají všechny kombinace hodnot ve všech zúčastněných rozměrech. Tato pravidla už nejsou šablonovitá, takže nehrozí, že gnu make potom narazí na cyklické závislosti nebo jiné problémy.
 +    * Uvnitř příkazů lze použít nové proměnné ''$(*1)'', resp. místo jedničky jiné číslo, pro n-tou závislost. MD-make si najde pravidlo, kterým tato závislost vzniká, zjistí si z&nbsp;něj, v&nbsp;jakých rozměrech se pohybuje, a podle toho zkonstruuje jméno příslušného souboru, které na dané místo vloží. Beze změny ponechá ''$<'' a ''$^'', které budou fungovat samy od sebe, avšak pozor na ''$*'', které v&nbsp;MD pravidlech (na rozdíl od obyčejných šablonovitých pravidel) nemá smysl.
 +    * MD pravidlo končí povinně prázdným řádkem (dokonce i na konci souboru).
 +    * Není-li uveden parametr ''.md.for'', pravidlo se rozgeneruje pro všechny známé rozměry kromě posledního (u nás ''STATES'', ale může se jmenovat i jinak).
 +    * Parametr ''.md.fix'' obsahuje hodnoty, které jsou v&nbsp;tomto pravidle pevné, tj. pravidlo se nerozgenerovává pro ostatní hodnoty téhož rozměru. Není zatím dovoleno uvést více hodnot ve stejném rozměru (i když by to teoreticky mohlo sloužit k&nbsp;vymezení částečného rozgenerování).
 +      * Jestliže ''.md.fix'' obsahuje rozměr, který je současně uveden v&nbsp;''.md.for'', znamená to, že cílový typ souboru se pohybuje v&nbsp;tomto rozměru, má jeho hodnotu uvedenou v&nbsp;cestě, akorát toto konkrétní pravidlo generuje tento soubor pouze pro jednu hodnotu v&nbsp;dotyčném rozměru.
 +      * Jestliže ''.md.fix'' obsahuje rozměr, který není současně uveden v&nbsp;''.md.for'', znamená to, že cílový typ souboru tento rozměr nezná a nemá ho uveden v&nbsp;cestě, avšak některý ze zdrojových souborů tento rozměr má a potřebuje vědět, kterou hodnotu máme na mysli. Které ze zdrojových souborů hodnotu ''.md.fix'' využijí, poznáme z&nbsp;pravidel, která tyto soubory generují jako cílové a vymezují jejich rozměry.
 +      * Jestliže některý zdrojový soubor vyžaduje rozměr, který cílový soubor neobsahuje, a tento rozměr není zafixován, pravidlo se rozgeneruje i pro všechny hodnoty tohoto rozměru. Bude pak existovat několik konkurenčních pravidel, která vytvářejí tentýž cílový soubor.
 +    * ''.md.del'' odstraní rozměry z&nbsp;''.md.for'' (nejvíce se hodí, když ''.md.for'' není uvedeno a defaultně tedy obsahuje všechny rozměry)
 +    * ''.md.fxd'' je jako ''.md.fix'' a ''.md.del'' dohromady. Uvádějí se hodnoty, nikoli názvy rozměrů (tedy jako u ''.md.fix'' a na rozdíl od ''.md.del'')
 +    * Odkaz na hodnotu rozměru z&nbsp;příkazu (např. ''$(*LANGUAGES)'') se převede na aktuální hodnotu daného rozměru. Pokud mohou mít různé zdrojové soubory různé hodnoty téhož rozměru v&nbsp;rámci jednoho vygenerovaného pravidla, odkaz se převede na hodnotu, které v&nbsp;tomto rozměru nabývá cílový soubor, resp. která je proměnná. Odkazy tohoto druhu byly stejně zavedeny kvůli proměnným rozměrům. Odlišné hodnoty u konkrétních zdrojových souborů jsou fixní výjimky, tyto hodnoty známe předem a v&nbsp;případě potřeby je můžeme do příkazu zapsat přímo.
 +
 +<code>.MDRULE
 +.md.rul mst.conll < blind.conll mst
 +.md.dep $(TOOLDIR)/runmst.pl
 +.md.for: LANGUAGES DE PREPROCESSINGS
 +.md.fix: test
 +        @echo Running MST for language $(*LANGUAGES):
 +        $(TOOLDIR)/runmst.pl -m $(*2) < $< > $@</code>
 +
 +  * Je možné definovat vstupní soubory. Ty typicky leží úplně v&nbsp;jiné cestě, nebo se alespoň jmenují tak, aby se nepletly se soubory pojmenovanými pomocí hodnot rozměrů, a nehrozilo tudíž jejich smazání makem. Můžeme popsat jejich vlastnosti v&nbsp;jednotlivých rozměrech prostě tak, že vytvoříme obyčejné pravidlo, kde dotyčný vstupní soubor bude jako závislost, zatímco cíl bude soubor pojmenovaný příslušnými hodnotami rozměrů. Před pravidlo připíšeme ''.md.in:''. MD-make pak doplní příkaz pro zkopírování závislosti do cíle (''cp $< $@'') a navíc zkontroluje, že cílový soubor má hodnoty všech rozměrů, které soubor v&nbsp;daném stavu (hodnota posledního rozměru) má mít.
 +  * Vygenerovaný makefile by navíc mohl obsahovat pro každou hodnotu každého rozměru seznam souborů, v&nbsp;nichž je tato hodnota zafixovaná. Např. všechny cílové soubory v&nbsp;jazyce "hi". Kromě proměnné obsahující jména těchto souborů (HIFILES) by vygenerovaný makefile obsahoval cíl, který všechny tyto soubory vyrobí (hi), a cíl, který je smaže (clean_hi).
 +  * V&nbsp;průběhu generování vícerozměrných pravidel si pamatovat seznam všech vygenerovaných cílových souborů. Ke každému cílovému souboru vytvořit hash, jehož klíčem je hodnota libovolného rozměru a hodnota u daného klíče je nenulová, jestliže příslušná hodnota rozměru je v&nbsp;názvu souboru obsažena. Na konci makefilu lze použít pravidlo ''.MDALL'', které vytvoří ''.PHONY'' cíl závisející na všech souborech obsahujících určité hodnoty. Např.
 +
 +<code>.MDALL: d hi conll</code>
 +
 +se přepíše jako
 +
 +<code>.PHONY: all_d_hi_conll
 +all_d_hi_conll: <seznam všech souborů obsahujících hodnoty "d", "hi" a "conll"></code>
 +
 +Pozor! Podporu pro odesílání cílů na cluster, plánovanou níže, psát nemusím! Existuje totiž ''qmake'', který si poradí s&nbsp;normálním makefilem pro GNU make a sám rozesílá úlohy na cluster. Jediný podstatný rozdíl, na který je třeba dát pozor, je, že pravidlo nesmí obsahovat několik příkazů na samostatných řádcích. Pokud má obsahovat více než jeden příkaz, musejí být všechny na jednom řádku oddělené středníky a před případnými zalomeními řádku musí být backslash.
 +
 +  * Podpora pro odesílání cílů na cluster:
 +    * Umět říct, který cíl chceme na clusteru, pokud to jde.
 +    * Detekce, že jsme na hlavě clusteru (HOSTNAME musí odpovídat nějaké proměnné).
 +    * Normální make bude puštěn paralelně (tuším -p 20 nebo tak nějak), aby dokázal řešit nezávislé další cíle, zatímco jeden cíl čeká na cluster.
 +    * K&nbsp;tomu je třeba novější verze mého ''qsub.csh'', která umí počkat, až odeslaný job skončí, a pokud skončí neúspěchem, umí ho navíc odeslat znova. (Musíme jí ale umět říct, jak se pozná neúspěch.)

[ Back to the navigation ] [ Back to the content ]