Umí SourceMage také reverzní závislosti?
Tedy např. jak řeší situaci, kdy při aktualizaci libsvga je třeba překompilovat i MPlayer, protože jinak by používal starou verzi knihovny.
Jak to SourceMage řeší? Odstraní staré knihovny a přestane to chodit, nechá tam staré knihovny, nebo oznámí balíky, které je třeba rekompilovat?
Gentoo to zatím nemá vyřešené a pokud je nová verze označená jako náhrada za starou (mají stejný SLOT), tak tu starou prostě zlikviduje a je na uživateli, aby to opravil.
Druhý dotaz se týká závislostí obecně: Jak moc je přesný strom DEPEND.
Má SourceMage nějaký nástroj, jak tento strom vyrobit a nebo se spoléhá na schopnost toho, kdo to napsal? V Gentoo jsem již několikrát narazil ne neúplné závislosti nebo na chybějící volitelné hodnoty. Výsledkem je pak zhavarování kompilace nebo balík, který má nebo nemá nějakou featuru podle toho, co jsem instaloval do systému předtím.
Jedná se o knihovnu statickou nebo sdílenou?
Automatický překlad závislých spellu je prováděn na základě souborů TRIGGERS.
MPlayer žádný TRIGGERS neobsahuje. Pokud je to chyba, je vhodné provést záznam na bugzille.
TRIGGERS soubor je obsažen například v spellu alsa-driver. Po přeložení linuxového jádra je automaticky zavolán překlad alsa-driver.
DEPENDS strom je zpravován vývojáři. Zcela jistě není 100%. Když něco nesedí, je vhodné informovat vývojáře (bugzilla).
Triggers je něco jiného - to si balík sám vyžádá rekompilaci sama sebe po aktualizaci někoho jiného.
Reverzní závislost balíku vynutí rekompilaci vybraných (nebo všech) balíků, které na něm staví.
Týká se to jak dynamických knihoven (kde to po odstranění staré verze s jiným soname může přestat chodit úplně), tak statických (kde je třeba rekompilovat všechny balíky dokonce i v případě pouhé opravy chyby při zachování kompatibility - viz případ chyby v zlib - co používalo dynamickou, bylo v pohodě a stačila tomu výměna balíku zlib, co statickou, muselo se rekompilovat celé.
V Source Mage je vždy nainstalovaná pouze jedna verze knihovny. Po aktualizaci systému (sorcery system-update) je automaticky spuštěn příkaz "cast --fix", který dá všechny nesrovnalosti do pořádku. "cast --fix" dělá kromě jiného "ldd check", tj. pokud se zjistí, že aplikace vyžaduje něco, co je v knihovně jinak, případně to tam vůbec není, je aplikace automaticky přeložena s již novou knihovnou.
Statické knihovny jsou řešeny pomocí TRIGGERS souborů.
Nejde to treba vyresit pomoci emerge --update --deep?
Chapu, ze myslite jeste trochu neco jineho, ale tohle snad staci. Navic udelat dokonale funkcni triggers je, myslim, nemozne. Vzdycky se na neco zapomene.
Gentoo je na muj vkus pruhlednejsi v nastavovani a je otazkou casu, kdy Portage bude mit tytez vlastnosti. Vyviji se velice rychle.
Samozřejmě, že nestačí. --deep --update nepočítá reverzní závislosti, ale pouze standardní závislosti. Na rozdíl od obyčejného --update ale jede rekurzívně.
Pokud tedy dáte emerge --deep --update -n mplayer, dokáže to zjistit, že některá ze závislých knihoven má novou verzi. Ale pokud kterákoliv z knihoven v závislostech zrovna nemá novou verzi, bude se to stále pokoušet linkovat se starou verzí.
Ale to stále ještě nemá nic společného s reverzními závislostmi. Např. po update GNOME-2.0 -> GNOME-2.2 přestala chodit všechna témata. Prostě proto, že se nepřekompilovaly. Aby to emerge zjistil, musel by umět vyhodnotit reverzní závislosti. Ve standardních závislostech GNOME totiž témata nejsou!
Závislosti = co potřebuji (nebo mohu pořebovat) ke kompilaci balíku
Reverzní závislosti = co kompilace balíku ovlivní (nebo může ovlivnit) v distribuci