Output directories unter CMake



  • Hi,

    weiss zufällig jemand wie man Output directories für die erstellten Libraries oder Binaries mit CMake festlegt?

    Bisher habe ich das immer so gemacht, indem ich den Ausgabe Ordner bei den Subdirectories mitgegen habe, z.B. mittels:

    ADD_SUBDIRECTORY(libfeat ${CMAKE_LIBRARY_OUTPUT_DIRECTORY})
    

    Dummerweise legt CMake dann auch ein Makefile, den CMakeFiles Ordner und den ganzen anderen Schnickschnack in diesen Ordner, was ich aber nicht unbedingt möchte.

    Kenn zufällig jemand eine bessere Methode dafür?



  • einfach CMAKE_LIBRARY_OUTPUT_DIRECTORY setzen

    oder Targetspezifisch mit set_target_properties (... LIBRARY_OUTPUT_DIRECTORY



  • Hmm, irgendetwas scheine ich falsch zu machen.

    Das ist meine CMakeList.txt im obersten Verzeichnis Knoten

    PROJECT(Test) 
    
    # Check requirements
    CMAKE_MINIMUM_REQUIRED(VERSION 2.4.0)
    
    # set the compiler flags
    SET(CMAKE_BUILD_TYPE debug)
    SET(CMAKE_CXX_FLAGS "-Wall")
    SET(CMAKE_CXX_COMPILER g++)
    
    # Include directories and Link directories
    INCLUDE_DIRECTORIES(${Test_SOURCE_DIR}/include
    )
    
    LINK_DIRECTORIES(${Test_BINARY_DIR}/lib
    )
    
    SET(CMAKE_LIBRARY_OUTPUT_DIRECTORY lib)
    SET(CMAKE_RUNTIME_OUTPUT_DIRECTORY bin)
    
    SET_TARGET_PROPERTIES(Test CMAKE_LIBRARY_OUTPUT_DIRECTORY lib)
    
    ADD_SUBDIRECTORY(src .)
    

    und im src-Verzeichnis

    SET(Test_SRCS
    	main.cpp
    )
    
    ADD_LIBRARY(Test STATIC ${Test_SRCS})
    

    Aber wenn ich das so ausfüge erzeugt der Aufruf von cmake . komischerweise KEIN Makefile, stattdessen wird ein Verzeichnis mit Namen libTest angelegt, warum auch immer.

    Wenn ich

    SET_TARGET_PROPERTIES(SIFT CMAKE_LIBRARY_OUTPUT_DIRECTORY lib)
    

    weglasse und ausserdem

    ADD_SUBDIRECTORY(src ${CMAKE_LIBRARY_OUTPUT_DIRECTORY})
    

    schreibe, dann erzeugt er wie gesagt die Library korrekt im entsprechenden Verzeichnis, aber schmeisst wie gesagt auch die ganzen CMake Files und Ordner ins lib Verzeichnis.



  • du solltest 1.) lieber eine aktuelle cmake-version nehmen (2.6) und 2.) die Doku zu den Kommandos lesen.

    Das zweite Argument zu add_subdirectory bestimmt das Build-Verzeichnis und set_target_properties benutzt du auch falsch (PROPERTIES fehlt).

    Ausserdem reicht es wenn du einfach CMAKE_..._OUTPUT_DIRECTORY setzt.



  • Ah ok, die Zeile mit CMake 2.4 required ist nur noch so drinne. Ich verwende schon die aktuelle Version.

    Das mit dem add-subdirectory Argument ist gut, dass du das erwähnst. Wusste ich noch gar nicht. Erklärt aber, warum dann die ganzen CMake-Files auch in dem Ordner abgelegt werden. Cool.

    Wie benutzt man denn dann set_target_properties richtig? In der Doku steht ja auch nur

    set_target_properties(target1 target2 ...
                            PROPERTIES prop1 value1
                            prop2 value2 ...)
    

    Okay, das PROPERTIES hatte ich vergessen, hab das jetzt in

    SET_TARGET_PROPERTIES(Test PROPERTIES CMAKE_LIBRARY_OUTPUT_DIRECTORY lib)
    

    geändert. Aber das scheint immer noch falsch zu sein, weil er dann ein Verzeichnis libTest anlegt und das noch nicht einmal als Unterverzeichnis von lib.

    Ausserdem reicht es wenn du einfach CMAKE_..._OUTPUT_DIRECTORY setzt.

    Das hab ich leider nicht verstanden. Ich setze das doch mit

    SET(CMAKE_LIBRARY_OUTPUT_DIRECTORY lib)
    SET(CMAKE_RUNTIME_OUTPUT_DIRECTORY bin)
    

    Aber das alleine bringt leider nichts.



  • Jiddoo schrieb:

    SET(CMAKE_LIBRARY_OUTPUT_DIRECTORY lib)
    SET(CMAKE_RUNTIME_OUTPUT_DIRECTORY bin)
    

    Aber das alleine bringt leider nichts.

    doch eigentlich schon



  • Das ist seltsam.

    Bei mir ändert sich überhaupt nichts, wenn ich die beiden SET Befehle setze.

    Und wenn ich zusätzlich noch

    ADD_SUBDIRECTORY(src ${CMAKE_LIBRARY_OUTPUT_DIRECTORY})
    

    schreibe, dann wie gesagt kopiert er zwar das Executable in den bin Ordner aber eben auch die CMakeFiles.

    Naja, ich kann erstmal damit leben, aber seltsam ist es trotzdem.

    Trotzdem vielen Dank für die Hilfe.



  • mach doch mal ein mini-beispiel, nur mit set und add_executable. Wer weiß was du da mittlerweile zusammengefrickelt hast 😉



  • ok...jetzt würde ich noch gerne wissen wie das mit der eingabe von libraries ist. Ich benutzte eine lib.a . diese liegt bei jedem user ganz wo anders. Wie kann ich dem cmake eine library über die shell übergeben bzw. den pfad so dass gegen diese lib gelinkt wird?



  • mit set eine CACHE-Variable definieren (cmake --help-command set) die den pfad enthält. Die kann dann mit ccmake vom benutzer gesetzt werden.



  • und mit wenn du in SET noch FORCE machst, dann wird sie auch brav in der GUI aktualisiert



  • basclatrocac



  • http://www.message_bozelacelvar.com/



  • http://www.message_ersitdomal.com/


Anmelden zum Antworten