Gimp soll xml Datei von einem anderen Ort einlesen

Lance

Well-Known Member
Ich möchte ja eine portable Anwendung machen, was bislang auch klappt aber ich erhalte folgednden Fehler (Beispiel Gimp)

Code:
There was an error parsing the menu definition from image-menu.xml: Failed to open file “/usr/local/share/gimp/menus/image-menu.xml”: No such file or directory

Wie bringe ich Gimp nun dazu, diese xml Datei von einem anderen Ort einzulesen? Ohne Gimp neu zu kompilieren und ohne in /usr/local/... zu schreiben?
 
Ohne Gimp neu zu kompilieren und ohne in /usr/local/... zu schreiben?
Das Problem hast Du häufig bei Programmen. Das die Dateien in bestimmten Pfaden erwarten, die i.d.R. auch fest einkompiliert sind. Und ja. Neu kompilieren ist da eigentlich "the way to go". Und zwar dann auch mit relativen Pfaden, weil Du sonst auch wieder in Probleme reinläufst.

Die Alternative ist, das Du chroot(8) verwendest. Sprich, Du hast dann sozusagen dein eigenen Verzeichnisbaum, in dem Du die Dateien und Verzeichnisse reintust, die das Programm braucht und wo dann auch die ganzen absoluten Pfade funktionieren.
Aber: Das Programm braucht i.d.R. auch Zugriff auf systemrelevante Sachen (libc und Co.). Die musst Du dann entweder mit rein tun oder via nullfs ins chroot reinblenden. Das gilt auch für Sachen, wie das /dev-Verzeichnis. Spätestens hier müsstest Du das mit dem enblenden machen (oder Devices Nodes erzeugen), weil sich das ja logischerweise nicht kopieren lässt.

Welche Dateien Du im chroot brauchst, kriegst Du ja eigentlich durch die Package-Infos (inkl. Abhängigkeiten) raus (siehe pkg-info).
Abhängigkeiten: pkg info --dependencies gimp-app
benötigte Bibliotheken: pkg info --required-shlibs gimp-app
Dateien die ein Paket selbst mitbringt: pkg info --list-files gimp-app

Damit bekommst Du aber möglicherweise nicht alle Dateien, die das Programm braucht (und die deshalb in die chroot müssen). Wenn man es ganz genau wissen will, könnte man das Programm mit truss tracen (truss -f gimp).

Und man muss sich natürlich überlegen, wie man mit Schreibzugriffen umgeht. Insbesondere wenn es denn irgendwie AppImage-mäßig betrieben werden soll.
 
Das wird mir wieder zu viel. ich hatte es bislang mit

Code:
export LD_LIBRARY_PATH=$(dirname "$0")/lib:$LD_LIBRARY_PATH
versucht (was aber nicht ausreicht)

und mit

Code:
export XDG_DATA_DIRS=$(dirname "$0"):$XDG_DATA_DIRS
.

Dann sieht Gimp aber so aus:

(Somit bekomme ich mit meienr Methode wohl nur kleine Progrämmchen als "AppImage" hin.)


Bildschirmfoto zu 2025-03-09 11-25-43.webp
 
Das wird mir wieder zu viel.
Naja. So ein chroot ist eigentlich jetzt nicht so dramatisch schwer. Ich würde einfach mal damit rumspielen.
Achja: Um die benötigten Dateien rauszukriegen, wird es vermutlich am einfachsten sein, das gewünschte Programm in einer Jail zu installieren (mit dem was unter /usr/local liegt sollte man so ziemlich alles haben abzüglich dessen was von pkg selbst kommt).
Denn manuell mit pkg-info da alles rauszusuchen ist, insbesondere bei umfangreichen Programmen wie gimp dann doch ne Menge Arbeit und man kann oft auch nicht stumpf automatisiert rüber iterieren, wegen zyklischer Abhängigkeiten.

Und selbst wenn Du es nicht mit chroot machst, musst Du Dich ja darum kümmern für ein portable wirklich alle Libraries mitzunehmen. Es reicht ja nicht einfach nur gimp zu haben und den LD_LIBRARY_PATH zu verbiegen.

Und ja. Das ist vielleicht ein bisschen umfangreicher. Aber wenn man sich erst mal das Know-How und Toolchain erarbeitet hat, dann ists natürlich auch relativ einfach dann das nächste Programm zu verpacken.
 
Naja. So ein chroot ist eigentlich jetzt nicht so dramatisch schwer. Ich würde einfach mal damit rumspielen.
Hm ich denke dann hätten es bestimmt schon andere gemacht oder Leute machen das längst für sich. Oder es besteht einfach kein interesse an AppImage Lösungen. Ich mache jetzt erstmal Pause oder auch Schluss für heute. Schade, es hätte so einfach sein können.

Und mit Systemrechten (entsprechende Simlinks erstellen) will ja keiner arbeiten. AppImages sollen als normaler User ausgeführt werden können.

Vielleicht versuche ich es nachher nochmal mit chroot aber momentan ist mein Kopf ausgeraucht.
 
Schade, es hätte so einfach sein können.
Generell sollte man sich Gedanken machen, was dann das Ziel ist.

Also wenn es nur darum geht, aus GIMP eine portable App für FreeBSD zu machen, kriegt man das wahrscheinlich sogar mit überschaubaren Aufwand auch über den Weg, den Du ja schon beschritten hast, hin.
Wenn es eher Ziel ist, sowas wie App-Image zu machen, dann sieht das schon wieder ein bisschen anders aus.

Und dann sollte man noch berücksichtigen: Machst Du das jetzt nur für GIMP oder soll in der Folge auch noch andere Programme "verpackt" werden.

Weil man will ja auch nicht irgendwie Zeit in Know-How-Aufbau stecken, wenn sich das dann irgendwie als Sackgasse heraus stellt oder dann beim der nächsten Programm dann nicht mehr funktioniert.

dann hätten es bestimmt schon andere gemacht
Das ist gut möglich. Weiß ich nicht. Mein Eindruck ist so ein bisschen, das man für solche Dinge dann gerne auf Jails zurückgreift. Aus meiner Perspektive kann man das durchaus machen, finde ich aber etwas unhandlich (zumindest so wie es dann gemacht wird z.B. bei AppJail) was dann zwar funktioniert, aber eigentlich zu viel und zu groß ist für das was man dafür bräuchte. Möglicherweise hat man da diesen "Wenn ich einen Hammer hab, sieht alles wie ein Nagel aus"-Effekt.

Aber ich weiß natürlich nicht alles. Möglicherweise gibts da auch gute Lösungen die ich einfach nur nicht kenne.

Oder es besteht einfach kein interesse an AppImage Lösungen
Kann gut sein. Man muss ja auch sagen, der Anteil der FreeBSD-Desktop-Nutzer ist vermutlich vergleichsweise klein. Und dann hat man automatisch weniger Lösung für bestimmte Dinge.

Und mit Systemrechten (entsprechende Simlinks erstellen) will ja keiner arbeiten.
Welche Symlinks nach wohin meinst Du denn?

An der Stelle (wg. Systemrechten) auch noch mal ein Hinweis zu chroot:
Das geht auch als normaler User. Allerdings musst das erst via security.bsd.unprivileged_chroot freigeschaltet werden (per default steht es auf 0). Und dann kann man ein chroot -n /my/new/root machen.
 
btw. Strings:
mit dem Kommando strings kann man sich alle Zeichenketten/Strings die in einer Datei enthalten sind ausgeben lassen. Das kann helfen, sich zumindest schon mal einen Überblick zu verschaffen.
 
Zurück
Oben