• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

Makefile selbst schreiben

Emanuele

Member
Hallo ich bastel gerade an einem Makefile.
Ich installieren damit ein Programm.
So weit funktioniert auch alles.
Doch damit die Krönung kommt soll ein Desktoplink erstellt werden.
Dafür habe ich händisch eins erstellt und es im installationsverzeichnis mit abgelegt.
Ich möchte das jetzt aus dem Installationsverzeichnis auf jeden Desktop jedes Nutzers kopieren mittels besagtem Makefile.

Nach langer suche bin ich über
Code:
for f in `ls /home`; do ln -s /home/zeugs/knusper /home/$f; done
gestolpert, das funktioniert aber so nicht.

Kennt sich jemand mit makefiles aus und kann mir bitte weiterhelfen?
 

spoensche

Moderator
Teammitglied
Mit "ln" erzeugst du einen symbolischen Link (Verknüpfung). Eine Datei wird also nicht kopiert.

Mit
Code:
cp /pfad/zur/copy/datei /home/username/Desktop
kopierst du die Datei auf den Desktop der User. Der Befehl muss im Makefile in der "install" Rule aufgerufen werden.
 
OP
E

Emanuele

Member
Ja ok mein fehler ich hab im Code den urpsrungscode verwendet den ich gefunden hatte. Den habe ich natürlich mit einem cp Befehl ersetzt.
Dein Vorschlag ist ja richtig aber für den Fall passt es nicht. Denn ich möchte ja auf verschiedenen Rechnern die Installation durchführen. Und da sind mir die User ja nicht vorher bekannt. Ich muss also mit variablen Usernamen arbeiten. Für jeden User auf dem System installiere auf dem Desktop den Link...
Das was oben in meinem Beispiel steht ist ja grundsätzlich die richtige lösung nur funktioniert sie bei einem Aufruf aus dem Makefile nicht richtig. Vielleicht muss man den Befehl etwas anpassen oder man muss in einem makefile die Befehle anders hintereinander weg schreiben. Leider schreibe ich zum ersten mal ein Makefile und kenne mich daher sehr wenig aus damit.
Aber ein
Code:
for each $user 
cp File.desktop /home/$User/Desktop
könnte doch klappen? Wobei halt das $User gefüttert werden muss.
 

spoensche

Moderator
Teammitglied
Du musst halt auf dem jeweiligen Rechner die vorhandenen User ermitteln und die Datei dann kopieren. Beachte aber, dass die .desktopm Dateien nur bei KDE existieren. Der Befehl selbst wird in einem Makefile korrekt ausgeführt.

Poste doch mal das Makefile, bevor wir hier unnötig im Trüben fischen.
 

Tooltime

Advanced Hacker
Kleine Zwischenfrage, nehmen wir an dein Makefile funktioniert wie du willst, auf dem System wird eine neuer User angelegt, soll dieser auch den Link erhalten? Bis jetzt behandelst du nur den Zeitpunkt bis zur Installation deines Programms. Was kommt dann ein Cron-Job der ständig nach neuen Usern sucht?

Was soll das Ganze eigentlich werden, ich schätze dein Problem könnte man einfacher lösen wenn man wüsste was das werden soll. Soll ein Icon für den Programmstart eingepflanzt werden? Oder der Zugriff/Öffnen einer Datei per Klick. Welche Aktion soll auf welchen Daten-/Dateityp per Icon ausgelöst werden und ist dein Programm an einen speziellen Desktop gebunden?
 
A

Anonymous

Gast
Keine Ahnung was das für ein Programm und was das für Rechner und User sind. Aber prinzipell ist es nicht nicht die Aufgabe von Installscripten die Desktops der User zu verändern. In die Menü- und Programmstartleisten und dem automatischen Programmstart der Grafischen Oberfläche ist ok. Aber nicht auf das Desktop selbst. Ich als User würde mich da maßlos drüber aufregen, das ist meine ganz persönliche Spielwiese und was da drauf ist oder nicht ist mein Bier und nicht die eines Admins der ein Programm installiert das ich eventuell gar nicht haben will. Immer diese Windowsmethoden.

Zwar währe es möglich alle User zu ermitteln die eigene Home und Desktopumgebungen haben, nur ist damit auch nicht sichergestellt, das diese wirklich alle mit diesem Programm arbeiten. Auch können ständig neue User auch später noch angelegt werden, und man müsste auch noch /etc/skel/ bemühen um diese zu erreichen. Aber Richtiger währe es durch ein kleines Script dafür zu sorgen, das beim aller ersten ausführen des Programmes als User die entsprechenden Dateien, Verknüpfungen und Konfigurationen in den Homeverzeichnissen der User gemacht werden. So und so ähnlich machen es seit ewiger Zeit die meisten Programme. Sind beim Start zB die .config Dateien und Strukturen nicht da, dann werden sie eben angelegt, ansonsten angewendet und ausgeführt.

robi
 
OP
E

Emanuele

Member
ok das mit dem User und Desktop hat sich fast erledigt.
Es reicht wenn ich im Makefile den User angebe der den link erhalten soll.
Ich hab das folgendermassen gelöst vlt findet ihr einen fehler.

Was aber wichtiger ist ich möchte die hosts datei überprüfen ob dort die ip bereits drin steht und wenn nein die ip eintragen
Hier mein Makefile damit ihr mir besser helfen könnt.

Code:
#
# Makefile for Prg-Installation
#
################################################################

SHELL = /bin/sh
USRBINPATH = /usr/bin

#usersettings
USER="localuser"

install:
		@echo; \
		echo; \
		user=`$(USRBINPATH)/whoami`; \
		if [ "$$user" != "root" ]; \
		then \
			echo "Sorry, only root can install this Software !!"; \
			echo; \
			exit 0; \
		fi; \

#Benötigte Dateien und Ordner kopieren
		install -o root -g root -m555 Prg-0.2.7 /usr/local/bin; \
		cp -r images /usr/local/bin; \
		chmod -R 555 /usr/local/bin/images; \
		cp -r postscript /usr/local/bin; \
		chmod -R 555; \
		if [$$USER -n] \
		then \
		install -m555 Prg.desktop /home/$$USER/Desktop; \
		fi; \
#libs installieren
		install -m755 libQtSql.so.4.1.4 /usr/local/lib ; \
		install -m755 libQtGui.so.4 /usr/local/lib; \
		install -m755 libQtCore.so.4 /usr/local/lib; \
		install -m755 libpng.so.3 /usr/lib; \
		cd /usr/local/lib; \
		ln -s libQtSql.so.4.1.4 libQtSql.so.4;\
		chmod 755 libQtSql.so.4; \
#Server für Prg in hosts bekannt machen
		echo "169.255.214.134 inclass2.de inclass2" >> /etc/hosts; \
#die libs im System bekannt machen
		ldconfig; \

Also ich brauche den Code um die /etc/hosts nach der ip zu prüfen und dann wenn sie noch nicht drin steht diese selbst einzutragen

ich dachte an folgenden code
Code:
string = cat /etc/hosts | grep 169.255.214.134 ; \
if [string -n];\
then \
echo "169.255.214.134 inclass2.de inclass2" >> /etc/hosts; \
fi; \

Was meint ihr dazu?
 
OP
E

Emanuele

Member
so ich bin jetzt etwas weiter gekommen.
Das Makefile läuft fehlerfrei durch, jedoch wird der Link auf dem Desktop nicht erzeugt!

Code:
#
# Makefile for Prg-Installation
#
################################################################

SHELL = /bin/sh
USRBINPATH = /usr/bin

#usersettings
USERSET="localuser"

install:
		@echo; \
		echo; \
		user=`$(USRBINPATH)/whoami`; \
		if [ "$$user" != "root" ]; \
		then \
			echo "Sorry, only root can install this Software !!"; \
			echo; \
			exit 0; \
		fi; \

#Benötigte Dateien und Ordner kopieren
		install -o root -g root -m555 Prg-0.5.3 /usr/local/bin; \
		cp -r images /usr/local/bin; \
		chmod -R 555 /usr/local/bin/images; \
		cp -r postscript /usr/local/bin; \
		chmod -R 555 /usr/local/bin/postscript; \
		if [ -n "$$USERSET" ]; \
		then \
		install -m555 Prg.desktop /home/"$$USERSET"/Desktop; \ <--- wird nicht ausgeführt obwohl die var nicht leer ist
		fi; \
#libs installieren
		install -m755 libQtSql.so.4.1.4 /usr/local/lib ; \
		install -m755 libQtGui.so.4 /usr/local/lib; \
		install -m755 libQtCore.so.4 /usr/local/lib; \
		install -m755 libpng.so.3 /usr/lib; \
		cd /usr/local/lib; \
		ln -s libQtSql.so.4.1.4 libQtSql.so.4;\
		chmod 755 libQtSql.so.4; \
#Server für Prg in hosts bekannt machen
		#string = cat /etc/hosts | grep 169.255.214.134 ; \
		#if [ -n "$$string" ]; \
		#then \		
		echo "169.255.214.134 inclass2.de inclass2" >> /etc/hosts; \
		#fi; \
#die libs im System bekannt machen
		ldconfig; \

Woran kann das liegen? :???:

Unten der Code für das hinzufügen der ip-Adresse (auskommentiert) in die hosts ist auch noch falsch. Falls da jemand weiss was ich falsch gemacht habe bitte auch dazu einen Kommentar ablassen :D
 

Tooltime

Advanced Hacker
Emanuele schrieb:
Das Makefile läuft fehlerfrei durch, jedoch wird der Link auf dem Desktop nicht erzeugt!
Meinst du das hier?
Emanuele schrieb:
install -m555 Prg.desktop /home/"$$USERSET"/Desktop; \ <--- wird nicht ausgeführt obwohl die var nicht leer ist
Installiere die Datei einfach in die globalen Vorlagen, bei KDE4 ist das z.B. /usr/share/kde4/config/SuSE/default, dann kriegt das auch jeder Benutzen.

Und mal nebenbei, warum installierst du jede Menge Qt-Bibliotheken die eigentlich ein normales System schon mitbringt.
 
OP
E

Emanuele

Member
Installiere die Datei einfach in die globalen Vorlagen, bei KDE4 ist das z.B. /usr/share/kde4/config/SuSE/default, dann kriegt das auch jeder Benutzen.
Es gibt kein Verzeichnis SuSE unter kde4/config nur colors und ui

Die Librarys installiere ich weil beim ausführen des Programms diese Libraries als fehlend moniert wurden.


Der User existiert auf dem Client!
 

Tooltime

Advanced Hacker
Emanuele schrieb:
Es gibt kein Verzeichnis SuSE unter kde4/config nur colors und ui
Tja, dann hast du kein SuSE oder kein KDE4. Da du keine Angaben zur Linuxversion und Desktop gemacht hast, habe ich einfach mal einen Pfad in den Raum gestellt. Du glaubst doch nicht ernsthaft das ich so mal aus Spass für Fedora/Ubuntu/SuSE/... und den verschiedenen Desktop die Info zusammensuche.
Emanuele schrieb:
Die Librarys installiere ich weil beim ausführen des Programms diese Libraries als fehlend moniert wurden.
Na dann installiert man halt die nötigen Pakete, oder ich linke gleich statisch. Die erste Variante ist grundsätzlich besser, da man automatisch mit Updates versorgt wird.
 
OP
E

Emanuele

Member
Also das ist ja mal eine gute idee. Wenn ich das in den Defaultordner bekomme dann kommt der link automatisch beim ersten anmelden und für jeden Benutzer der eingerichtet wird.

Jetzt muss ich nur wissen wo die Verzeichnisse sind.
Also ich hab zb ein Suse 10.1 mit KDE3.5.1?
und zum weiteren ein Suse 9.3 mit KDE 3.4.0!
 

Tooltime

Advanced Hacker
Emanuele schrieb:
Jetzt muss ich nur wissen wo die Verzeichnisse sind.
Dann suche sie mal. Am einfachsten du schaust in das Verzeichnis Desktop eines Benutzers, suchst dir eine möglichst markante Datei aus und durchsuchst das Filesystem.
Beispiel auf einer 10.1:

  • tooltime@server:~> locate Network.desktop
    /opt/kde3/share/config/SuSE/default/Network.desktop
Bei nur einer Antwort ist ja alles klar. Bei der 9.3 dürfte es das gleiche Verzeichnis sein.
 
OP
E

Emanuele

Member
Ja das Verzeichnis hatte ich auch gefunden aber da sind viel mehr dateien drin als dann auf dem Desktop landen. Daher dacht ich das ist bestimmt nicht das richtige Verzeichnis. Aber ok dann werd ich das mal ausprobieren. Danke.

Mein ziel ist es den Programmstart auf einem fertig eingerichteten PC für jeden User einzurichten.
Danach werde ich nur noch einzelne Nutzer hinzufügen müssen und dann natürlich auch den Link auf den Desktop verschieben. Dafür ist dann die Lösung mit dem Defaultverzeichnis super. Sobald der sich einloggt kommt der Link auf dem Desktop. Da ich das aber in das Makefile schreibe um auch bei der installation alle eingerichteten Nutzer zu bedienen, müsste ich noch die Suse-Version abfragen damit es immer korrekt funktioniert. Da ich ja hier Version 9.3 bis 11.0 Clients habe.

Kann ich in einem Makefile auch eine Versionsabfrage einbauen mit der ich dann versionsspezifisch das Verzeichnis verwende?
 

Tooltime

Advanced Hacker
Das Verzeichnis müsste eigentlich immer das gleiche sein, es dürfte sich nur mit der KDE-Version (KDE2, KDE3 KDE4) ändern.

Und so etwas regelt man nicht in einen Makefile, sondern im Specfile für das RPM-Paket. Dort kann man eigentlich alle Shell-Befehle ausführen. Das Specfile dient speziell zu Anpassungen an Versionen und Distributionen. Es sei denn du willst kein RPM-Paket ausliefern, sondern zwingend über Scourcecode installieren.
 

oc2pus

Ultimate Guru
schau dir diesen Thread mal an:
http://lists.opensuse.org/opensuse-de/2006-08/msg01792.html

und /etc/skel ist für so was eigentlich die richtige Lösung
 
OP
E

Emanuele

Member
ja also hier gilt nicht was ich will sondern was mir vorgegeben wird.
Ich persönlich würde ein rpm-Paket wesentlich eleganter finden habe aber selbst noch nie eins erstellt. Was nicht heisst das ich das nicht kann. Da für bin ich ja hier um das zu lernen.

Vorgegeben ist ein konstrukt aus etwa 7 makefiles die für system, environment und Programme die entsprechenden installationen durchführen. Es gibt ein übergeordnetes makefile das die anderen anstösst. Mittlerweile habe ich auch herausgefunden dass man mittels config die User eintragen kann die den Desktoplink auf den Desktop bekommen sollen.
Das funktioniert soweit auch ganz gut.


Ein rpm anlegen behalte ich mal im hinterkopf und werde das gerne mal versuchen. ist sicherlich die elegantere art.
 
Oben