Install Targets mit cmake definieren

Alles zur Entwicklung von KDE - Anwendungen
Antworten
slash-ex
Beiträge: 239
Registriert: 30. März 2005 21:40

Install Targets mit cmake definieren

Beitrag von slash-ex »

Ich hatte mal ein kde4 applet geschrieben. Ursprünglich dachte ich, dass dieses cmakelist-file einfach funktionieren sollte. im Prinzip sucht es sich ein paar Dateien zusammen und baut daraus libs und soll diese dann installieren. Allerdings funktioniert bei mir der Abschnitt:

install(TARGETS
plasma_applet_NVDimmer
plasma_applet_NVInfo
#plasma_applet_NVMaster
DESTINATION ${KDE4_LIB_INSTALL_DIR}
)

NICHT. Das heißt die Apllets werden bei mir nicht installiert, wohl aber der darunter liegende Abschnitt, welcher für die desktop-files zuständig ist. Ich verstehe nicht wo das Problem liegt und irgendwie habe ich auch schon fast die Hoffnung aufgegeben auch nur so etwas ähnlches wie ne anständige Dokumentation für cmake zu finden.

Code: Alles auswählen

# PROJECT
project(NV_Clock)

include_directories(
  ${CMAKE_SOURCE_DIR}/nvclock/backend
  ${CMAKE_SOURCE_DIR}/nvclock/nvcontrol
  ${CMAKE_SOURCE_DIR}/NVCL_Plasmoid
)

# SEARCH LIBS
find_package(KDE4 REQUIRED)
include(KDE4Defaults)
 
add_definitions (${QT_DEFINITIONS} ${KDE4_DEFINITIONS})
include_directories(
   ${CMAKE_SOURCE_DIR}
   ${CMAKE_BINARY_DIR}
   ${KDE4_INCLUDES}
   )
 
# SOURCES
set(APPLET_SRCS
  nv_dimmerLayout.cpp
  nv_infoManager.cpp
  nv_coolbitsDialog.cpp
  nv_infoLayout.cpp
  nv_configDialog.cpp
  monitorbutton.cpp
)

set(DIMMER_APPLET_SRCS
  nv_dimmerApplet.cpp
)
set(MASTER_APPLET_SRCS
  nv_MasterApplet.cpp
)
set(INFO_APPLET_SRCS
  nv_InfoApplet.cpp
)


# LINKEN
kde4_add_plugin(plasma_applet_NVDimmer ${APPLET_SRCS} ${DIMMER_APPLET_SRCS})
target_link_libraries(plasma_applet_NVDimmer
                      ${KDE4_PLASMA_LIBS} backend solidcontrol)
 
kde4_add_plugin(plasma_applet_NVInfo ${APPLET_SRCS} ${INFO_APPLET_SRCS})
target_link_libraries(plasma_applet_NVInfo
                      ${KDE4_PLASMA_LIBS} backend solidcontrol)

#kde4_add_plugin(plasma_applet_NVMaster ${APPLET_SRCS} ${MASTER_APPLET_SRCS})
#target_link_libraries(plasma_applet_NVMaster
#                      ${KDE4_PLASMA_LIBS} backend solidcontrol)

install(TARGETS
    plasma_applet_NVDimmer
    plasma_applet_NVInfo
    #plasma_applet_NVMaster
        DESTINATION ${KDE4_LIB_INSTALL_DIR}
)

INSTALL(FILES
    plasma-applet-NVInfo.desktop
    plasma-applet-NVDimmer.desktop
    #plasma-applet-NVMaster.desktop
       DESTINATION ${SERVICES_INSTALL_DIR}
) 

Code: Alles auswählen

Install the project...
-- Install configuration: ""
-- Installing: /usr/local/share/kde4/services/plasma-applet-NVInfo.desktop
-- Installing: /usr/local/share/kde4/services/plasma-applet-NVDimmer.desktop
Xerces@linux-0u1s:~/devel/NV_APPLET/build> sudo make uninstall
Scanning dependencies of target uninstall
-- Uninstalling "/usr/local/share/kde4/services/plasma-applet-NVInfo.desktop"
-- Uninstalling "/usr/local/share/kde4/services/plasma-applet-NVDimmer.desktop"
Built target uninstall 
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Abgesehen davon dass es wohl PLUGIN_INSTALL_DIR sein sollte sieht es korrekt aus.
Erstelle mal ein dummy executable mit ADD_EXECUTABLE() und versuche das per INSTALL(TARGETS ...) zu installieren.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
slash-ex
Beiträge: 239
Registriert: 30. März 2005 21:40

Beitrag von slash-ex »

ich habe mal den unten geposteten code an meine cmakelist angehangen. der einfachheit halber, habe ich versucht ins home-verzeichnis zu installieren. es hat nicht funktioniert. ${PLUGIN_INSTALL_DIR} funktioniert ebenfalls nicht.
mich wundert es ziemlich, dass das bei mir nicht funktioniert. Allerdings scheinen findige leute mein Applet irgendwie installieren zu können, da schon rpms für opensuse existieren, aber dass ich als urheber überhaupt nicht auf cmake klarkomme ist bedauerlich. ich verstehe echt nicht was da nicht hinhaut.
es ist auch so demotivierend wenn, solche kleinigkeiten vom wesentlichen abhalten.
ich habe auch mal probiert, statt install(TARGETS ) install(FILES) zu benutzen. jedoch, werden da weder die gebauten *.so's noch die executable gefunden, weil dort nur das source verzeichnis berücksichtigt wird. bei install(TARGETS) wird anscheinend immer der build-dest path benutzt (bin mir nicht ganz sicher wie die variable heißt).

Code: Alles auswählen

set(dummy_SRCS 
  dummy.cpp
)
ADD_EXECUTABLE(_dummy ${dummy_SRCS})
install(TARGETS 
	_dummy
        DESTINATION "/home/Xerces/"
)

Code: Alles auswählen

Xerces@linux-0u1s:~/devel/NV_APPLET/build> sudo make install
root's password:
[ 46%] Built target backend
[ 51%] Built target nvcontrol
[ 53%] Built target nvclock
[ 56%] Built target smartdimmer
[ 58%] Built target _dummy
[ 58%] Built target plasma_applet_NVDimmer_automoc
[ 79%] Built target plasma_applet_NVDimmer
[ 79%] Built target plasma_applet_NVInfo_automoc
[100%] Built target plasma_applet_NVInfo
Linking CXX executable CMakeFiles/CMakeRelink.dir/_dummy
Install the project...
-- Install configuration: ""
-- Installing: /usr/local/share/kde4/services/plasma-applet-NVInfo.desktop
-- Installing: /usr/local/share/kde4/services/plasma-applet-NVDimmer.desktop
slash-ex
Beiträge: 239
Registriert: 30. März 2005 21:40

Beitrag von slash-ex »

ich habe eben mal einen neuen projekt ordner angelegt, wo nur die geposteten zeilen in der cmakelists.txt stehen und es wird installiert. irgendetwas. ich habe die vermutung, dass irgendein kommando, oä die installation stoppt.

edit:

Code: Alles auswählen

# SEARCH LIBS
find_package(KDE4 REQUIRED)
include(KDE4Defaults)
interferiert mit der installation. warum? weis jemand wie man das umgeht? das ergibt doch überhaupt keinen sinn, aber sobald die beiden zeilen auskommentiert sind funktioniert die installation wieder. wie kann die kde.org demo dann aber funktionieren, die leute müssten den gleichen fehler kriegen?!
Zuletzt geändert von slash-ex am 13. Mai 2009 16:23, insgesamt 1-mal geändert.
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Funktioniert bei mir prima mit cmake 2.6.2/Linux
Welche cmake-Version hast Du?

Code: Alles auswählen

chris@chehrlic:~/tmp/tmp> cmake .        
-- The C compiler identification is GNU        
-- The CXX compiler identification is GNU      
-- Check for working C compiler: /usr/local/bin/gcc
-- Check for working C compiler: /usr/local/bin/gcc -- works
-- Detecting C compiler ABI info                            
-- Detecting C compiler ABI info - done                     
-- Check for working CXX compiler: /usr/local/bin/c++       
-- Check for working CXX compiler: /usr/local/bin/c++ -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
CMake Warning (dev) in CMakeLists.txt:
  No cmake_minimum_required command is present.  A line of code such as

    cmake_minimum_required(VERSION 2.6)

  should be added at the top of the file.  The version specified may be lower
  if you wish to support older CMake versions for this project.  For more
  information run "cmake --help-policy CMP0000".
This warning is for project developers.  Use -Wno-dev to suppress it.

-- Configuring done
-- Generating done
-- Build files have been written to: /home/ehrlicher_c/tmp/tmp
chris@chehrlic:~/tmp/tmp> make install
Scanning dependencies of target _dummy
[100%] Building CXX object CMakeFiles/_dummy.dir/dummy.o
Linking CXX executable _dummy
[100%] Built target _dummy
Install the project...
-- Install configuration: ""
-- Installing: /tmp/_dummy
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
slash-ex
Beiträge: 239
Registriert: 30. März 2005 21:40

Beitrag von slash-ex »

ich habe die gleiche :shock: aber ich bin auch froh, dass es wenigstens bei andern klappt. probier mal bitte :

# SEARCH LIBS
find_package(KDE4 REQUIRED)
include(KDE4Defaults)

einzufügen. ich glaube dann gehts nicht mehr.
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Geht bei mir immer noch

Code: Alles auswählen

chris@chehrlic:~/tmp/tmp> kde4-config --version
Qt: 4.5.2
KDE: 4.2.3 (KDE 4.2.3) "release 116"
kde4-config: 1.0
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
slash-ex
Beiträge: 239
Registriert: 30. März 2005 21:40

Beitrag von slash-ex »

hmm selbes system wie ich habe, aber ich denke ich habe die ursache. das problem tritt erst bei meinen verschachtelten unterordnern auf.

ich habe mal ein mini-beispiel mit der dummy eingefügt. im falle, dass nur ein ordner mit source existiert funktioniert die installation, auch mit

Code: Alles auswählen

 	
# SEARCH LIBS
find_package(KDE4 REQUIRED)
include(KDE4Defaults) 
sobald ich aber einen unterordner habe der mit einer weiteren cmakelists.txt aufgerufen wird, klappt das ganze bei mir nur noch ohne dieses

Code: Alles auswählen

 	
# SEARCH LIBS
find_package(KDE4 REQUIRED)
include(KDE4Defaults) 
in der demo ist die verzeichnisstruktur:

Code: Alles auswählen

projekt
|-CMakeLists.txt
|-uo1
   |-CMakeLists.txt
   |-dummy.cpp
evtl kannst du das mal ausprobieren, vielleicht weis jemand rat, wie man dieses kuriose problem umgehen kann.
Dateianhänge
projekt.tar.gz
(534 Bytes) 934-mal heruntergeladen
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Das ist interessant - sobald

Code: Alles auswählen

find_package(KDE4 REQUIRED)
include(KDE4Defaults)
Im obersten CMakeLists.txt stehen geht es bei mir.
Ich werde das mal weiter anschauen...

/edit: ein 'make install' im Unterordner funktioniert. komisch
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
slash-ex
Beiträge: 239
Registriert: 30. März 2005 21:40

Beitrag von slash-ex »

also ist das bei dir auch so, damit hätte ich auch nen workaround, aber ich habe fast den verstand verloren, weil das so schlecht reproduzierbar war. ich hattes in der hoffnung auch mal im c++ forum probiert, aber da kennt sich kaum einer mit cmake und kde aus. tja erstmal danke für die hilfe bisher.
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf »

Ich hab hier CMake-2.6.4 auf nem Gentoo-System laufen.
Egal ob die beiden Zeilen im Toplevel-CMakeLists.txt stehen, oder erst im Unterordner, beides geht.
Aber so weit ich mich zurück erinnern kann, hatte ich da noch nie Probleme...
slash-ex
Beiträge: 239
Registriert: 30. März 2005 21:40

Beitrag von slash-ex »

der witz ist, dass ich diese beiden kde-bezogenen zeilen nur im unterordner von meinem projekt brauche um den kram überhaupt zu compillieren und zu linken. und dann brauch ich die zeilen nochmal im hauptordner um das zu installieren... und ich verstehe nicht, warum das vorhandensein dieser zeilen im unterordner zu so einem fehlverhalten führt.

edit:
ich habe jetzt mal auch auf cmake 2.6.4 upgedatet. bei mir ist der fehler verschwunden. ich folgere einfach mal, dass es ein bug war.
Antworten