snafu1
Anmeldungsdatum: 5. September 2007
Beiträge: 2123
Wohnort: Gelsenkirchen
|
Hi, ich bräuchte eine Installations-Routine, die mein kompiliertes Programm in /usr/local/bin kopiert und das zugehörige Symbol in /usr/share/pixmaps . Muss ich dafür von Hand ins Makefile schreiben oder bietet mir CMake entsprechende Funktionalität? Also bisher habe ich das: 1
2
3
4
5
6
7
8
9
10
11
12
13
14 | cmake_minimum_required (VERSION 2.6)
project (TinyTerm)
set (CMAKE_C_FLAGS "-O3")
set (CMAKE_INSTALL_PREFIX "/usr/local/bin")
add_custom_target (install "${CMAKE_COMMAND}" -P
"${CMAKE_CURRENT_BINARY_DIR}/cmake_install.cmake")
find_package (PkgConfig REQUIRED)
pkg_search_module (VTE REQUIRED vte)
link_directories (${VTE_LIBRARY_DIRS})
include_directories (${VTE_INCLUDE_DIRS})
add_executable (tinyterm tinyterm.c)
target_link_libraries (tinyterm ${VTE_LIBRARIES})
|
Das Standard-Installskript wird damit auch ausgeführt. Ich müsste halt nur noch wissen - sofern das die richtige Vorgehensweise ist -, wie man Sachen mit CMake kopiert.
|
Lunar
Anmeldungsdatum: 17. März 2006
Beiträge: 5792
|
Das ist nicht die richtige Vorgehensweise. Es kann doch nicht so schwer sein, in der Dokumentation nach dem Wort "install" zu suchen 🙄 Im Übrigen setzt man auch Compiler-Flags wie -O3 nicht im Buildfile. Das ist Sache der Konfiguration (insbesondere des Buildtyps), die man auch nachträglich mit ccmake editieren kann.
|
snafu1
(Themenstarter)
Anmeldungsdatum: 5. September 2007
Beiträge: 2123
Wohnort: Gelsenkirchen
|
Für die Nachwelt: Lunars Link ist etwas falsch. Der entsprechende Abschnitt in der Doku befindet sich hier.
|
Lunar
Anmeldungsdatum: 17. März 2006
Beiträge: 5792
|
Entschuldige, da ist beim Kopieren was verloren gegangen 😳
|
snafu1
(Themenstarter)
Anmeldungsdatum: 5. September 2007
Beiträge: 2123
Wohnort: Gelsenkirchen
|
Okay, wie man für Binaries verfährt, habe ich jetzt glaub ich verstanden: | install (TARGETS tinyterm
RUNTIME DESTINATION bin)
|
...kopiert tinyterm ins Unterverzeichnis bin vom CMAKE_INSTALL_PREFIX , welches bei mir standardmäßig auf /usr/local zeigt. Also das, was ich wollte. Probleme macht mir allerdings noch das Programmicon. Obwohl es im selben Verzeichnis liegt wie tinyterm und das Makefile, bekomme ich eine Fehlermeldung. Das mache ich: | install (TARGETS tinyterm.png
DESTINATION /usr/share/pixmaps)
|
Und die Meldung: | CMake Error at CMakeLists.txt:15 (install):
install TARGETS given target "tinyterm.png" which does not exist in this
directory.
Configuring incomplete, errors occurred!
|
Ich bin ganz sicher, dass hier kein Schreibfehler vorliegt. Habe sogar irgendwann den Dateinamen aus der Ausgabe des ls -Kommandos kopiert. ^^
|
Lunar
Anmeldungsdatum: 17. März 2006
Beiträge: 5792
|
Wenn tinyterm.png kein Target ist, kannst du es auch nicht als "Target" installieren. Und absolute Pfade verwendet man beim Installieren auch nicht.
|
snafu1
(Themenstarter)
Anmeldungsdatum: 5. September 2007
Beiträge: 2123
Wohnort: Gelsenkirchen
|
Kannst du da bitte etwas genauer werden? Ich hab von Build-Prozessen, wie man ja wahrscheinlich merkt, kaum Ahnung. Wie ist der übliche Weg, den man für Icons geht? Dann meintest du anfangs, man soll das Flag -O3 nicht einfach so ins Buildfile setzen. Klar, das macht Sinn, weil es dann schwerer zu debuggen wird, oder? Wie müsste man CMake sagen, dass er für's Release mit -O3 -Flag kompilieren soll und für die Versionen zum Testen ohne? Oder sollte ich generell von -O3 Abstand nehmen?
|
Lunar
Anmeldungsdatum: 17. März 2006
Beiträge: 5792
|
Zur ersten Frage: Lies dir doch bitte einfach mal die komplette Doku zum install -Kommando durch. An der richtigen Signatur kann man doch eigentlich gar nicht vorbei ... (Spoiler: Das Icon ist ein "File") ☺ Zum Thema Flags: CMake hat sogenannte Build-Typen, die über die Variable CMAKE_BUILD_TYPE aktiviert werden. Wichtig sind da fürs Erste wohl Debug (aktiviert Debugginginformationen) und Release (setzt standardmäßig -O3 ). Die Flags, die bei einzelnen Buildtypen gesetzt werden, stehen in entsprechenden Variablen (z.B. CMAKE_C_FLAGS_RELEASE ). Führe doch einfach mal ccmake . im Buildverzeichnis aus und sieh dir die Konfigurationsvariablen an (auch im "advanced mode"). Die sind eigentlich selbsterklärend ...
|
snafu1
(Themenstarter)
Anmeldungsdatum: 5. September 2007
Beiträge: 2123
Wohnort: Gelsenkirchen
|
Aaaaaaaaaaaaaaah. 💡 Noch eine Frage zu dem Icon-Pfad: Wie würde man das eintragen, wenn man keine festen Angaben verwenden will? Ich vermute, dass ich außerdem ein C-Makro schreiben muss, damit mein Programm den richtigen Pfad findet...
|
Lunar
Anmeldungsdatum: 17. März 2006
Beiträge: 5792
|
snafu1 schrieb: Noch eine Frage zu dem Icon-Pfad: Wie würde man das eintragen, wenn man keine festen Angaben verwenden will?
Einen zum Installationspräfix relativen Pfad, in deinem Fall also share/pixmaps . Auch das ist aber dokumentiert.
Ich vermute, dass ich außerdem ein C-Makro schreiben muss, damit mein Programm den richtigen Pfad findet...
Normalerweise erstellt man dafür eine "config.h.in", den man durch "configure_file" schleust. Dadurch werden CMake-Variablen ersetzt, so dass man auf den Pfad zum Icon in etwa so verweisen würde: #define ICON_PATH "CMAKE_INSTALL_PREFIX/share/pixmaps/tinyterm.png"
|
snafu1
(Themenstarter)
Anmeldungsdatum: 5. September 2007
Beiträge: 2123
Wohnort: Gelsenkirchen
|
Funktioniert soweit. Meine config.h.in sieht so aus: | #define TINYTERM_ICON_PATH "${CMAKE_INSTALL_PREFIX}/share/pixmaps/tinyterm.png"
|
Und meine CMakeLists.txt so: 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 | cmake_minimum_required (VERSION 2.6)
project (TinyTerm)
find_package (PkgConfig REQUIRED)
pkg_search_module (VTE REQUIRED vte)
link_directories (${VTE_LIBRARY_DIRS})
include_directories (${VTE_INCLUDE_DIRS})
configure_file ("${CMAKE_SOURCE_DIR}/config.h.in" "${CMAKE_BINARY_DIR}/configure.h")
add_executable (tinyterm tinyterm.c)
target_link_libraries (tinyterm ${VTE_LIBRARIES})
install (TARGETS tinyterm
RUNTIME DESTINATION bin)
install (FILES tinyterm.png
DESTINATION share/pixmaps)
|
Jetzt besteht ja theoretisch die Möglichkeit, dass jemand nur kompiliert, aber noch nicht installiert. In diesem Fall zeigt TINYTERM_ICON_PATH auf eine nichtexistente Datei. Muss ich solche Fälle beachten? Wie geht man da vor? Meine Idee wäre, in der Prüfung, ob das Pixmap geladen werden konnte, nicht sofort den Fehler zu werfen, sondern nochmal im aktuellen Verzeichnis nachzugucken. Denn bisher mache ich das so: | icon_error = NULL;
icon = gdk_pixbuf_new_from_file (TINYTERM_ICON_PATH, &icon_error);
if (!icon) {
g_warning ("%s\n", icon_error->message);
g_error_free (icon_error);
}
gtk_window_set_icon (GTK_WINDOW (window), icon);
|
(icon_error ist vom Typ GError ) Zweite Frage: Ich hätte schon gerne ein configure -Skript, um dem Anwender mittels --prefix den Installationspfad wählen zu lassen. Schreibt man sich dafür ein sh -Skript, das ccmake entsprechend konfiguriert oder bietet cmake dafür eine eigene Methode an?
|
Lunar
Anmeldungsdatum: 17. März 2006
Beiträge: 5792
|
Im aktuellen Verzeichnis nachzusehen, ist reichlich sinnlos. Der Benutzer kann die Anwendung schließlich auch aus einem anderen Verzeichnis heraus aufrufen. Wenn überhaupt, dann musst du das Verzeichnis nutzen, in dem die ausführbare Datei liegt (über argv[0] zu erreichen). Das hilft aber auch nichts, wenn der Benutzer die ausführbare Datei verschiebt. Wenn du möchtest, dass deine Anwendung ohne Installation funktioniert, musst du Ressourcen einkompilieren. Ich persönlich aber würde ja einfach voraussetzen, dass die Anwendung installiert wird ... Man braucht auch kein ./configure -Skript. Der Benutzer kann Variablen wie CMAKE_BUILD_TYPE und eben auch CMAKE_INSTALL_PREFIX nach Belieben anpassen. Das funktioniert entweder nachträglich über ccmake oder cmake-gui , oder direkt bei der Ausführung von cmake . So kann man auch prima ins Home-Verzeichnis installieren, so dass die Anwendung uninstalliert gar nicht funktionieren muss:
$ cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX="${HOME}" Übrigens, wenn du den Header "config.h.in" nennst, dann ist es irgendwie komisch, daraus ein "configure.h" zu machen. Ich würde da eher "config.h" erwarten, das entspräche auch der üblichen Konvention.
|
snafu1
(Themenstarter)
Anmeldungsdatum: 5. September 2007
Beiträge: 2123
Wohnort: Gelsenkirchen
|
Okay, ich denke es hat sich dann soweit alles für mich geklärt. Nochmal danke für deine Unterstützung. ☺
|