# Ist die USE-Flag Liste wirklich vollständig?

## Flasher

Hallo!

Ich wühle mich zur Zeit durch die globale USE-Flag Liste unter /usr/portage/profiles/...

Dabei stelle ich immer wieder fest, dass manche Boardies (wenn sie ihre USE Variable hier im Forum posten) Einträge gesetzt haben, die nicht in dieser Liste auftauchen.

Bestes Beispiel ist 3dnowext. Das habe ich bisher nur in den lokalen USE-Flags beim mplayer gesehen, aber nicht in den globalen USE-Flags. Trotzdem tragen es viele  Benutzer in die make.conf ein!

Ist die Liste mit globalen USE-Flags unter /usr/portage/profiles/use.desc (glaube ich) nicht vollständig?

Vielleicht könnte mich da mal jemand aufklären!

Danke euch!

Grüße,

Flasher

----------

## think4urs11

Ein Grund ist sicherlich das vielen das Konzept bzw. der Unterschied zwischen lokalen und globalen USE-Flags nicht klar und/oder egal ist.

Nach dem Motto 'das Flag wird ja benutzt, so what'.

Genaugenommen ist es ja auch (aus Anwendersicht) egal ob man in make.conf auch lokale/paket-spezifische Flags einträgt oder oder diese in package.use packt.

Letzteres ist die sauberere Methode bzw. diejenige die die maximale Flexibilität/Individualität erhält. (z.B. wenn zwei Pakete das Flag 'schlonz' enthalten aber nur eines davon mit schlonz-Funktionalität gebaut werden soll)

----------

## misterjack

 *Think4UrS11 wrote:*   

> Letzteres ist die sauberere Methode bzw. diejenige die die maximale Flexibilität/Individualität erhält. (z.B. wenn zwei Pakete das Flag 'schlonz' enthalten aber nur eines davon mit schlonz-Funktionalität gebaut werden soll)

 

Das gilt aber auch für globale Useflags  :Smile: 

----------

## Vortex375

Ich wusste noch nicht mal, dass es da einen Unterschied gibt. Als Benutzer merkt man ja nichts davon.

----------

## Inte

 *Vortex375 wrote:*   

> Ich wusste noch nicht mal, dass es da einen Unterschied gibt. Als Benutzer merkt man ja nichts davon.

 Und wie man das merkt!

Der liebe Inte benutzt bei allen seinen Programmen (falls vorhanden sqlite). Also: USE="sqlite" -> /etc/make.conf

Nun wollen x11-libs/qt und dev-libs/apr-tools mir sqlite in der Version 2 installieren. Warum? Sie haben ein USE-Flag namens "sqlite3". Also "x11-libs/qt -sqlite sqlite3" -> /etc/portage/package.use und das gleiche für dev-libs/apr-tools.

Siehe da! Ich kann mir das slotten von sqlite ersparen.  :Very Happy: 

Ist das nicht praktisch?  :Wink: 

----------

## mv

 *Inte wrote:*   

>  *Vortex375 wrote:*   Ich wusste noch nicht mal, dass es da einen Unterschied gibt. Als Benutzer merkt man ja nichts davon. Und wie man das merkt!

 

Nein, man merkt absolut nichts davon.

 *Quote:*   

> [...]Siehe da! Ich kann mir das slotten von sqlite ersparen. 
> 
> Ist das nicht praktisch? 

 

Nein. Wenn Du Dir nämlich eines Tages das Paket super-duper/bazonk installierst, das ebenfalls sqlite3 in seinen lokalen Useflags hat, musst Du das Ganze wiederholen oder ziehst Dir aus Versehen doch den falschen Slot. Einfacher ist es da, gleich sqlite3 in /etc/make.conf zu setzen - da brauchst Du Dich dann nicht darum zu kümmern, welche Pakete das "lokal" benutzen.

Umgekehrt kannst Du natürlich auch globale Flags in /etc/portage/package.use für einzelne Pakete umändern.

----------

## Inte

 *mv wrote:*   

> Umgekehrt kannst Du natürlich auch globale Flags in /etc/portage/package.use für einzelne Pakete umändern.

  Ahh ja ... was mache ich denn? Global ist sqlite3 nicht gesetzt, sqlite hingegen schon. Global bedeuted ja nicht gleich gesetzt! Du kannst ein Flag ja auch global nicht setzen. Da bei mir es die Beiden benötigen, bekommen sie es lokal. Ob das Flag dabei lokal hinzugefügt (USE="sqlite3") oder entfernt (USE="-sqlite") wird, ist dabei irrelevent. Wann jemand ein Flag global setzt, sollte man demjenigen doch selbst überlassen.

Wenn ein Flag erstmal global gesetzt ist, sagt Dir ein equery d ${PAKET} später nicht mehr, wer die Abhängigkeiten gezogen hat. Es wird jedes Paket aufgelistet, das dieses Flag hat. Benutzt man dagegen die lokalen Flags, sieht man sofort weswegen man vor 'nem Jahr mal Bibliothek X (mit)installiert hat. Falls jemand natürlich (wie in dem oben genannten, unglücklich gewählten Beispiel) alle Pakete die dieses Flag haben lokal versorgt, macht das in der Tat keinen Unterschied. Dennoch setze ich bei <3 Paketen sowas immer manuell.

----------

## mv

 *Inte wrote:*   

> Da bei mir es die Beiden benötigen, bekommen sie es lokal.

 

Da liegt offensichtlich ein Missverständnis vor. Gentoo versteht unter "lokalen" und "globalen" useflags etwas anderes: "Global" sind die Useflags, die in use.desc stehen, "local" diejenigen, die in use.local.desc stehen - wo Du die setzt oder nicht setzt, ist vollkommen egal. Deshalb schrieb ich ja: Der Benutzer merkt die Unterscheidung (glücklicherweise) überhaupt nicht. Die Regel ist IIRC, dass useflags, die in mindestens 5 Paketen vorkommen, global sind.

BTW: Anders als ich angenommen habe, sind sqlite und sqlite3 beide globale Useflags. Wenn ich das auswendig gewusst hätte, hätte ich das Missverständnis gleich bemerkt...

 *Quote:*   

> Wenn ein Flag erstmal global gesetzt ist, sagt Dir ein equery d ${PAKET} später nicht mehr, wer die Abhängigkeiten gezogen hat.

 

equery ist ohnehin nur ein Hack, der nicht zuverlässig funktioniert, weil er vieles nicht berücksichtigt.

 *Quote:*   

> Benutzt man dagegen die lokalen Flags, sieht man sofort weswegen man vor 'nem Jahr mal Bibliothek X (mit)installiert hat.

 

Nicht alles, was eine Bibliothek benötigt, hat dazu ein Useflag. Es kann sein, dass ein Eintrag in /etc/portage/package.use Dir einen Hinweis darauf liefert, es muss aber nicht sein.

 *Quote:*   

> Falls jemand natürlich (wie in dem oben genannten, unglücklich gewählten Beispiel) alle Pakete die dieses Flag haben lokal versorgt, macht das in der Tat keinen Unterschied. Dennoch setze ich bei <3 Paketen sowas immer manuell.

 

Es ist wohl i.W. Geschmacksache, ob man bei neu zu installierenden Paketen lieber manuell die useflags überprüft, oder lieber einen "default" explizit in /etc/make.conf setzt.

----------

## STiGMaTa_ch

Um mal das Durcheinander zwischen den loakeln und globalen USE Flags zu entwirren sollten wir vielleicht zuerst mal die Begriffe definieren.

Globale USE Flag:

 Die Beschreibung zu diesem USE Flag befindet sich in /usr/portage/profiles/use.desc

 Das USE Flag ist global, weil es in sehr vielen ebuilds Verwendung findet. Bestes Beispiel dafür ist das X USE Flag. Es gibt viele Programme welche mit oder ohne X Unterstützung laufen können.

Lokale USE Flag:

 Die Beschreibung zu diesem USE Flag befindet sich in /usr/portage/profiles/use.local.desc

 Das USE Flag ist lokal, weil es vielleicht nur in einem einzigen ebuild vorkommt.

Ob eine USE Flag nun global oder lokal ist spielt somit für die Funktionalität eines Programms erstmal keine Rolle. Setzen oder entfernen einer globalen/lokalen USE Flag sorgt nur dafür dass ein Programm X die Funktionalität Y unterstützt oder eben nicht.

Nun kann man aber eine globale/lokale USE Flag auch noch lokal oder global setzen. Die Unterschiede sind folgende:

Global gesetzte USE Flag:

 Die USE Flag wird in /etc/make.conf eingetragen.

 Die USE Flag wird von allen Paketen, welche die Flag unterstützen angewandt. z.B. sorgt ein USE="X" dafür, dass alle Programme welche das X USE Flag anbieten, auch mit X Unterstützung kompiliert werden.

Lokal gesetzte USE Flag:

 Die USE Flag wird in /etc/portage/package.use/<datei> oder /etc/portage/package.use gesetzt.

 Die USE Flag wir nur für das in der Datei gesetzte Paket verwendet.  Alle anderen Pakete werden (je nach dem ob man die Flag explizit setzt oder löscht) ohne/mit dieser Flag kompiliert.

Auch hier ist es wieder völlig egal ob man eine globale oder lokale USE Flag global oder lokal für das System setzt/entfernt. Nur macht es nicht wirklich viel Sinn eine nur in einem ebuild verwendete Use Flag wie USE="superduper" in /etc/make.conf zu setzen. Ausser natürlich man geht davon aus, dass "superduper" in Zukunft von mehr ebuilds unterstützt wird und man für alle Fälle "superduper" dann auch einkompiliert haben will.

Lieber Gruss

STiGMaTa

----------

## TheSmallOne

 *STiGMaTa_ch wrote:*   

> Lokal gesetzte USE Flag:
> 
>  Die USE Flag wir nur für das in der Datei gesetzte Paket verwendet.  Alle anderen Pakete werden (je nach dem ob man die Flag explizit setzt oder löscht) ohne/mit dieser Flag kompiliert.
> 
> 

 

Echt?

Irgendwie habe ich das anders in Erinnerung. Ich war der Meinung das USE-Flag beeinflußt nur, ob ein Paket die Funktionalität als Abhängigkeit zieht. Wenn es installiert ist, dann würde trotzdem alles mit der Funktionalität kompiliert. Zumindest habe ich das irgendwann mal so in der Gentoo-Doku gelesen.

Also als Beispiel, damit klar ist was ich meine:

Die Pakete A, B und C können alle mit X-Funktionalität gebaut werden. Nun setze ich das X-Useflag lokal für Paket A und installiere es. Dadurch zieht es X als Abhängigkeit ins System. Wenn nun B und C kompiliert werdne, dann werden die auch mit X kompiliert, obwohl für die Pakete weder lokal, noch global das Useflag gesetzt ist.

----------

## Gibheer

Nein, das ist nicht so.

Ich habe hier gftp mit gtk kompiliert (in /etc/portage/package.use/gftp eingetragen), da ich sonst kein grafisches frontend habe. Nun gibt es bei freeciv auch gtk support und gtk ist nicht in der make.conf eingetragen. Erst durch ein weiteres lokales setzen (per USE="gtk" emerge freeciv) hab ich dann wirklich gtk-support gehabt.

Hoffentlich hilft das zur Klaerung.

----------

## dertobi123

 *TheSmallOne wrote:*   

> Also als Beispiel, damit klar ist was ich meine:
> 
> Die Pakete A, B und C können alle mit X-Funktionalität gebaut werden. Nun setze ich das X-Useflag lokal für Paket A und installiere es. Dadurch zieht es X als Abhängigkeit ins System. Wenn nun B und C kompiliert werdne, dann werden die auch mit X kompiliert, obwohl für die Pakete weder lokal, noch global das Useflag gesetzt ist.

 

 *Gibheer wrote:*   

> Nein, das ist nicht so.

 

Ich sag mal so, ein bisschen habt ihr beide recht  :Wink:  Die Reihenfolge in der USE-Flags ausgewertet werden stammt aus der Variable USE_ORDER (man make.conf). Damals in einer Zeit vor Portage 2.1.irgendwas war über diese Variable per default konfiguriert, so dass bei einem installierten Paket gtk+ ein neu zu installierendes Paket xyz mit aktiviertem USE-Flag gtk installiert werden konnte. Korrigiert mich wenn ich daneben liege - ist schon "ein Weilchen was" her  :Wink: 

----------

## STiGMaTa_ch

 *TheSmallOne wrote:*   

> Also als Beispiel, damit klar ist was ich meine:
> 
> Die Pakete A, B und C können alle mit X-Funktionalität gebaut werden. Nun setze ich das X-Useflag lokal für Paket A und installiere es. Dadurch zieht es X als Abhängigkeit ins System. Wenn nun B und C kompiliert werdne, dann werden die auch mit X kompiliert, obwohl für die Pakete weder lokal, noch global das Useflag gesetzt ist.

 

Wie sollte das gehen? Die USE Flag ist nichts anderes als Flag das gesetzt wird und anhand dessen etwas spezielles in einem ebuild erledigt wird. Wenn du z.B. die USE Flag "gtk" setzt, dann wird halt im ebuild statt eines ./configure; make nun ein ./configure --with-gtk; make ausgeführt. Oder aber jemand macht halt einige if then Schleifen Aufgrund einer gesetzten USE Flag, in der dann halt ein wenig da kopiert, ein wenig dort gelöscht und vielleicht noch ein Patch da eingepflanzt wird.

Ich verweise hier mal auf zwei - ja, ja... von mir geschriebenen - Foreneinträge bezüglich USE Flags:

Foreneintrag 1

Foreneintrag 2

Lieber Gruss

STiGMaTa

----------

## think4urs11

 *dertobi123 wrote:*   

> Ich sag mal so, ein bisschen habt ihr beide recht  Die Reihenfolge in der USE-Flags ausgewertet werden stammt aus der Variable USE_ORDER (man make.conf). Damals in einer Zeit vor Portage 2.1.irgendwas war über diese Variable per default konfiguriert, so dass bei einem installierten Paket gtk+ ein neu zu installierendes Paket xyz mit aktiviertem USE-Flag gtk installiert werden konnte. Korrigiert mich wenn ich daneben liege - ist schon "ein Weilchen was" her 

 

Beruhigt mich das du die genaue Version auch nicht auf Anhieb gefunden hast  :Wink: 

Gemeint war sicher folgendes: New USE defaults in the making

----------

## dertobi123

 *Think4UrS11 wrote:*   

> Gemeint war sicher folgendes: New USE defaults in the making

  Exakt - und den hab ich nicht auf die Schnelle gefunden  :Wink: 

----------

## franzf

Wie das gehandhabt wird hängt vom Programmierer ab. Du kannst simpel abfragen, ob ein Paket gefunden werden kann. Oder du reagierst auf Optionen, die der Benutzer dem configure / cmake / ... übergibt, und baust entsprechende Funktionalität ein.

Von diesen beiden Varianten ist die zweite die schönere, da du gezielt Funktionen an und abschalten kannst.

Wird andereseits z.B. bei einem Programm automatisch bei Existenz der gtk+-Bibliothek das entsprechende Frontend gebaut, welches sich mit deiner Version von gtk+ nicht bauen lässt, und du eben KEINEN Einfluss über entsprechende Optionen darauf hast, stehst du ziemlich in der Sch***.

@Thesmallone

Ich hoffe das war eine klare Antwort auf deine hoffentlich richtig interpretierte Frage  :Smile: 

----------

## mv

 *franzf wrote:*   

> Wie das gehandhabt wird hängt vom Programmierer ab. Du kannst simpel abfragen, ob ein Paket gefunden werden kann. Oder du reagierst auf Optionen, die der Benutzer dem configure / cmake / ... übergibt, und baust entsprechende Funktionalität ein.

 

Wobei der erste Fall in Gentoo ein Bug ist, falls das ebuild nicht so gebaut ist, dass es die Abhängigkeit zwingend braucht oder blockt:

Es darf in Gentoo nicht passieren, dass bei gleichen Useflags "verschiedene" Pakete (in Abhängigkeit der bereits installierten) gebaut werden, weil sonst die Abhängigkeiten nicht mehr mit den im ebuild verzeichneten Abhängigkeiten übereinstimmen würden.

----------

