CMake Anfänger
-
dürfte ich vielleicht deine CMakeLists.txt sehen? Weil ich dachte man muss pro directory jeweils ein CmakeLists.txt haben...
-
testo schrieb:
dürfte ich vielleicht deine CMakeLists.txt sehen? Weil ich dachte man muss pro directory jeweils ein CmakeLists.txt haben...
natürlich kannst du sie sehen!
CMAKE_MINIMUM_REQUIRED(VERSION 2.6) INCLUDE("../../../../../../../../CMakeCABMacros.txt") INCLUDE("../../../../../../../../CMakePCHMacros.txt") INCLUDE("../../../../../../../../CMakeSetCompilerFlags.txt") INCLUDE("../../../../../../../../CMakeFindBoost.txt") CHECK_FOR_VARIABLE(CAB_MACHINE "machine name, e.g. ALTIX, ARWEN") SET(CMAKE_CONFIG_FILE "${SOURCE_ROOT}/cmake_config_files/${CAB_MACHINE}.config.cmake") IF(CAB_MACHINE AND EXISTS ${CMAKE_CONFIG_FILE} ) PROJECT(mp3d_rcf) SET(EXECUTABLE_NAME mp3d_rcf) #erst hier das config file einfügen, ansonsten werden manche settings durch (Project) überschrieben) INCLUDE(${CMAKE_CONFIG_FILE}) ################################################################# ### PACKAGES ### ################################################################# SET(WITH_SUBFOLDERS_FOR_SG YES) INCLUDE(${SOURCE_ROOT}/basics/objects/CMakePackage.txt) INCLUDE(${SOURCE_ROOT}/basics/utilities/CMakePackage.txt) INCLUDE(${SOURCE_ROOT}/basics/memory/CMakePackage.txt) INCLUDE(${SOURCE_ROOT}/basics/container/CMakePackage.txt) INCLUDE(${SOURCE_ROOT}/basics/writer/CMakePackage.txt) INCLUDE(${SOURCE_ROOT}/basics/parallel/CMakePackage.txt) INCLUDE(${SOURCE_ROOT}/numerics/geometry3d/CMakePackage.txt) INCLUDE(${SOURCE_ROOT}/numerics/geometry3d/creator/CMakePackage.txt) INCLUDE(${SOURCE_ROOT}/numerics/geometry3d/fem/CMakePackage.txt) INCLUDE(${SOURCE_ROOT}/3rdParty/MuParser/CMakePackage.txt) INCLUDE(${SOURCE_ROOT}/3rdParty/rcf/CMakePackage.txt) INCLUDE(${SOURCE_ROOT}/3rdParty/metis/CMakePackage.txt) INCLUDE(${SOURCE_ROOT}/3rdParty/MarchingCubes/CMakePackage.txt) INCLUDE(${SOURCE_ROOT}/topology/CMakePackage.txt) INCLUDE(${SOURCE_ROOT}/topology/transmitter/CMakePackage.txt) SET(WITH_SUBFOLDERS_FOR_SG NO) INCLUDE(${SOURCE_ROOT}/topology/amr3d/CMakePackage.txt) INCLUDE(${SOURCE_ROOT}/topology/amr3d/blockadaptation/CMakePackage.txt) INCLUDE(${SOURCE_ROOT}/topology/amr3d/gridadaptation/CMakePackage.txt) INCLUDE(${SOURCE_ROOT}/topology/amr3d/interactor/CMakePackage.txt) SET(WITH_SUBFOLDERS_FOR_SG YES) INCLUDE(${SOURCE_ROOT}/topology/amr3d/services/CMakePackage.txt) INCLUDE(${SOURCE_ROOT}/topology/amr3d/services/interfaces/CMakePackage.txt) INCLUDE(${SOURCE_ROOT}/topology/amr3d/services/adapter/CMakePackage.txt) SET(WITH_SUBFOLDERS_FOR_SG NO) INCLUDE(${SOURCE_ROOT}/topology/amr3d/lbmd3q19/CMakePackage.txt) INCLUDE(${SOURCE_ROOT}/topology/amr3d/lbmd3q19/interactor/CMakePackage.txt) INCLUDE(${SOURCE_ROOT}/topology/amr3d/lbmd3q19/gridadaptation/CMakePackage.txt) INCLUDE(${SOURCE_ROOT}/topology/amr3d/lbmd3q19/blockadaptation/CMakePackage.txt) INCLUDE(${SOURCE_ROOT}/topology/amr3d/lbmd3q19/bcadapter/CMakePackage.txt) #SET(WITH_SUBFOLDERS_FOR_SG YES) INCLUDE(${SOURCE_ROOT}/topology/amr3d/lbmd3q19/utils/CMakePackage.txt) INCLUDE(${SOURCE_ROOT}/topology/amr3d/lbmd3q19/steering/CMakePackage.txt) INCLUDE(${SOURCE_ROOT}/topology/amr3d/lbmd3q19/services/CMakePackage.txt) INCLUDE(${SOURCE_ROOT}/topology/amr3d/lbmd3q19/services/interfaces/CMakePackage.txt) INCLUDE(${SOURCE_ROOT}/topology/amr3d/lbmd3q19/services/adapter/CMakePackage.txt) SET(WITH_SUBFOLDERS_FOR_SG NO) INCLUDE(${SOURCE_ROOT}/topology/amr3d/lbmd3q19/connector/CMakePackage.txt) INCLUDE(${SOURCE_ROOT}/topology/amr3d/lbmd3q19/connector/scalemodules/CMakePackage.txt) #SET(WITH_SUBFOLDERS_FOR_SG YES) INCLUDE(${SOURCE_ROOT}/topology/amr3d/lbmd3q19/multiphase/CMakePackage.txt) INCLUDE(${SOURCE_ROOT}/topology/amr3d/lbmd3q19/multiphase/gridadaptation/CMakePackage.txt) INCLUDE(${SOURCE_ROOT}/topology/amr3d/lbmd3q19/multiphase/blockadaptation/CMakePackage.txt) INCLUDE(${SOURCE_ROOT}/topology/amr3d/lbmd3q19/multiphase/connector/CMakePackage.txt) INCLUDE(${SOURCE_ROOT}/topology/amr3d/lbmd3q19/multiphase/connector/scalemodules/CMakePackage.txt) INCLUDE(${SOURCE_ROOT}/topology/amr3d/lbmd3q19/multiphase/bcadapter/CMakePackage.txt) INCLUDE(${SOURCE_ROOT}/topology/amr3d/lbmd3q19/multiphase/services/adapter/CMakePackage.txt) ################################################################# ### LOCAL FILES ### ################################################################# FILE(GLOB SPECIFIC_FILES ${CMAKE_CURRENT_SOURCE_DIR}/*.h ${CMAKE_CURRENT_SOURCE_DIR}/*.cpp ${CMAKE_CURRENT_SOURCE_DIR}/*.hpp ) SET(ALL_SOURCES ${ALL_SOURCES} ${SPECIFIC_FILES}) SOURCE_GROUP(z_main FILES ${SPECIFIC_FILES}) ################################################################# ### PCH ################################################################# #folgendes brauch man, egal ob PCH verwendet wird oder nicht!!! SET(PRECOMPILED_H ${CMAKE_CURRENT_SOURCE_DIR}/precompiled.h) ADD_DEFINITIONS(-DPRECOMPILED_HEADER_FILE=\"${PRECOMPILED_H}\") OPTION(USE_PRECOMPILED_HEADER "vorkompilierte header verwenden" OFF) IF( USE_PRECOMPILED_HEADER ) SET(PRECOMPILED_CPP ${CMAKE_CURRENT_SOURCE_DIR}/precompiled.cpp) FILE(GLOB CPP_USING_PCH ${CMAKE_CURRENT_SOURCE_DIR}/*.cpp) list(REMOVE_ITEM CPP_USING_PCH ${PRECOMPILED_CPP}) SET_PCH_FLAGS(${PRECOMPILED_H} ${PRECOMPILED_CPP} ${CPP_USING_PCH}) ENDIF() ################################################################# ### OWN DEFINES ### ################################################################# ADD_DEFINITIONS( -D${CAB_MACHINE} ) SET(NEED_MPI TRUE) ################################################################# ### COMPILER ### ################################################################# SET_COMPILER_SPECIFIC_FLAGS(${CAB_COMPILER}) ################################################################# ### RCF ### ################################################################# IF(USE_SF_SERIALIZATION) SET(EXECUTABLE_NAME ${EXECUTABLE_NAME}_sf) ELSE() SET(EXECUTABLE_NAME ${EXECUTABLE_NAME}_boost) ENDIF() ################################################################# ### BOOST ### ################################################################# IF(NEED_MPI) SET_BOOST_STUFF( ${NECESSARY_BOOST_LIBS} ) ENDIF() ################################################################# ### MPI ### ################################################################# IF(NEED_MPI) SET_MPI_STUFF(CAB_MACHINE) SET(EXECUTABLE_NAME ${EXECUTABLE_NAME}_mpi) ELSE() SET(EXECUTABLE_NAME ${EXECUTABLE_NAME}_rcf) ENDIF() ################################################################# ### QT SPECIFIC (only has effects if a QT source is included) ### ################################################################# IF(NEED_QT AND QT_FOUND) INCLUDE_DIRECTORIES( ${QT_INCLUDE_DIR} ${QT_INCLUDE_PATH} ${QT_QTCORE_INCLUDE_DIR} ${QT_QTGUI_INCLUDE_DIR} ${QT_QTNETWORK_INCLUDE_DIR} ) LINK_LIBRARIES ( debug ${QT_QTCORE_LIBRARY_DEBUG} debug ${QT_QTGUI_LIBRARY_DEBUG} debug ${QT_QTNETWORK_LIBRARY_DEBUG} ${QT_QTCORE_LIBRARY} ${QT_QTGUI_LIBRARY} ${QT_QTNETWORK_LIBRARY} ) ADD_DEFINITIONS( ${QT_DEFINITIONS}) ENDIF(NEED_QT AND QT_FOUND) IF(NEED_QT AND NOT QT_FOUND) MESSAGE("Ups\nAt least one package needs Qt!\nPlease check Qt settings\n(e.g. librarys within Advanced Values)") ENDIF(NEED_QT AND NOT QT_FOUND) ################################################################# ### ADDITIONAL_MAKE_CLEAN_FILES ### ################################################################# SET_DIRECTORY_PROPERTIES(PROPERTIES ADDITIONAL_MAKE_CLEAN_FILES "${GENERATED_FILES}") ################################################################# ### EXCECUTABLE ### ################################################################# ADD_EXECUTABLE(${EXECUTABLE_NAME} ${ALL_SOURCES} ) ################################################################# ### ADDITIONAL LINK LIBRARIES ### ################################################################# IF(ADDITIONAL_LINK_LIBRARIES) TARGET_LINK_LIBRARIES(${EXECUTABLE_NAME} ${ADDITIONAL_LINK_LIBRARIES}) ENDIF(ADDITIONAL_LINK_LIBRARIES) ################################################################# ### ADDITIONAL LINK PROPERTIES ### ################################################################# IF(ADDITIONAL_LINK_PROPS) SET_TARGET_PROPERTIES(${EXECUTABLE_NAME} PROPERTIES LINK_FLAGS ${ADDITIONAL_LINK_PROPS}) ENDIF(ADDITIONAL_LINK_PROPS) IF(ADDITIONAL_LINK_PROPS_DEBUG) SET_TARGET_PROPERTIES(${EXECUTABLE_NAME} PROPERTIES LINK_FLAGS_DEBUG ${ADDITIONAL_LINK_PROPS_DEBUG}) ENDIF(ADDITIONAL_LINK_PROPS_DEBUG) IF(ADDITIONAL_LINK_PROPS_RELEASE) SET_TARGET_PROPERTIES(${EXECUTABLE_NAME} PROPERTIES LINK_FLAGS_RELEASE ${ADDITIONAL_LINK_PROPS_RELEASE}) ENDIF(ADDITIONAL_LINK_PROPS_RELEASE) ELSEIF(CAB_MACHINE) MESSAGE("CAB_MACHINE error - following file is missing: \n ${CMAKE_CONFIG_FILE}") ELSE() MESSAGE("check CAB_MACHINE!!!") ENDIF()
um deine Frage zu beantworten: unser Source-Tree ist durch die Ordner in "packages" eingeteilt.EIne Menge selbstgeschriebener Macros fügen die entsprechenden libs (wie mpi, metis, qt, zlib, rcf, etc) hinzu. diese werden teils von mir erstellt (macht cmake automatisch durch das erkennen der abhängigkeiten). je nach compiler oder betriebssystem werden zustätzliche compilerflags, präprozeesor macros, etc. benötigt. jedes package liefert hie reine reihe von optionen, die dann in ccmake nach belieben angepasst weren koennen, wenn einem die defaults nicht gefallen (z.B. auschalten des rangechecks bei STL vectoren unter windows, metis als lib verwenden oder direkt in die sourcen mit aufnehmen, andere RCF / boost version verwenden, anderes serialiserungs framework verwenden). ich hoffe ich konnte damit helfen
-
PS: du kannst das binary dir übrigens doch setzen, mein kollege macht das ständig.
Das war irgendwas mit CMAKE_BINARY_DIR
-
herzlichen dank...
und ihr/Du habt nur ein CmakeLists das ihr in dem jeweiligen package aufruft? Liegt denn im source-verzeichnis nicht noch eines ?
-
ah - anscheinend braucht man nur ein CMakeLists.txt da wo die sourcen liegen - kann das sein?
-
ja klar! nur ein CMakeList.txt. Das übergibst du CMake und der prst dann alles durch.
In unseren CMakePackage.txt Dateien stehen meist nur diese zwei Zeilen:GET_FILENAME_COMPONENT( CURRENT_DIR ${CMAKE_CURRENT_LIST_FILE} PATH) COLLECT_PACKAGE_DATA_WITH_OPTION(${CURRENT_DIR} ALL_SOURCES)
Wobei eben nur die jeweilg in diesem Verzeichnis vorhanden quelldateien eingelesen werden
-
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?
-
Das macht diese Zeile
SET(externalLib "/opt/blabla.a") TARGET_LINK_LIBRARIES(binary_name ${externalLib} )
den Pfad musst du zuvor entweder per Variable in CMakeList.txt setzen oder die Variable in der GUI aus setzen.
oder bei cmake angeben:
cmake -D externalLib="/opt/blabla.a" ../src/.
-
danke dir vielmals
ich bin untröstlich - ich suche jetzt eine möglichkeit auch nach libs zu suchen - also wenn sie irgndwo liegt bzw. installiert ist dann so nehmen ansonsten schauen ob der user sie übergeben und sonst halt error...bin natürlich schon auf der suche
-
schau dir mal ein paar der findXXX.cmake files an... dort wird meist ebenfalls nach libs gesucht. die suchorte sind meist standardpfade oder unter windows registry einträge. alle ordner zu durchsuchen kann etwas langwierig sein.
aber das bekommt man hin
-
Uff - das wird ja ein riesenbrocken da die libs ja immer wo anders sind. und da jetzt so ein riesen-find file zu schreiben das schaffe ich alleine nicht
-
ach was. wirst doch jetzt nicht aufgeben!
schau dir einfach mal:FIND_LIBRARY
an.. die Endung kann man weglassen, denn die ist plattformabh. und kann separat gesetzt werden
-
ja aufgeben tu ich (noch) nicht
also ich hab hier ein beispiel gefunden...
kann es wirlich sein dass ich einfach den Namen der lib angebe über NAMES und die Pfade wo diese liegen könnte? Aberso finde ich die ja evtl. gar nicht wenn der user seine lib ganz wo anders hat...wenn er sie z.B. bei sich im home dir hat?Und wie könnte ich den pfad vom user nehmen und in die find_library hineinsetzen?...
FIND_LIBRARY(XERCES_CPP_LIB NAMES xerces-c xerces-c_2 xerces-c_static_2 PATHS /usr/lib /usr/local/lib ${USERLIB_ROOT}/lib c:/libraries/lib )
ich lese schon ausgiebig die doku - nur ist die wie ich finde nicht ganz so toll...
-
dann habe ich noch ein gravierenderes problem. Ich habe noch verschiedene lib optionen die (wie ich glaube) je nach system unterschiedlich sein müssen. Z.b. muss die option
-llapack -L/usr/lib/atlas -lblas -latlas -lrt
gesetzt sein bei mir im moment.
wo anders sieht sie dann aber so aus-L/usr/lib64/liblapack.a -llapack -L/usr/lib/atlas -atlas -L/usr/lib64 -lblas -lg2c
nur wie soll ihc das anstellen?
-
ok es ist nicht ganz so schlimm
im prinzip muss es einmal -lrt und einem -lg2c hinten sein für die libs - wie ich das wohl herausfinde...
-
ALso für lapack habe ich folgendes find-makro gefunden das ziemlich lang ist.
Ich weiß allerdings nicht wie ich die makro-funktion in meiner CMakeLists.txt verwenden soll. Kann mir jemand dabei helfen? Da steht als Makro-definition:macro(Check_Lapack_Libraries LIBRARIES _prefix _name _flags _list _blas) # This macro checks for the existence of the combination of fortran libraries # given by _list. If the combination is found, this macro checks (using the # Check_Fortran_Function_Exists macro) whether can link against that library # combination using the name of a routine given by _name using the linker # flags given by _flags. If the combination of libraries is found and passes # the link test, LIBRARIES is set to the list of complete library paths that # have been found. Otherwise, LIBRARIES is set to FALSE. # N.B. _prefix is the prefix applied to the names of all cached variables that # are generated internally and marked advanced by this macro.
das gesamte file ist hier zu finden.
http://www.cmake.org/pipermail/cmake/2007-August/016023.html
-
wie bereits erwähnt kommt CMake mit einer Vielzahl an vorgefertigten Find-Makros. u.a. ist schon seit Ewigkeiten das "FindLAPACK.cmake" dabei.
schau mal unterCMake 2.6\share\cmake-2.6\Modules
Eingebunden werden diese mit FIND_PACKAGE.--> www.gidf.de
-
vielen dank - aber wo bitte soll ich schauen? Ich arbeite unter Linux. Ich suche gerade online eine Variante. Danke Dir für Deinen Tipp.
-
ah - jetzt hab ichs begriffen
Danke nochmals
-
Also ich versteh das nicht. Ich versuche das mit der lapack library jetzt so:
Ich habe einen Ordner cmake/Modules in meinem root-dir erstellt wo auch bin/ und src/ liegen.
Dann habe ich in den Modules-Ordner die FindLAPACK.cmake gelegt.
Gleichzeitig habe ich meine CmakeLists.txt so angepasst:FIND_PACKAGE(LAPACK)
und dann schreit cmake so:
CMake Error: LAPACK_DIR is not set. It must be set to the directory containing LAPACKConfig.cmake in order to use LAPACK.
Aber wenn ich in der CMakeLists.txt jetzt schreibe SET(LAPACK_DIR "../cmake/Modules") oder auch SET(LAPACK_DIR "cmake/Modules") dann schreit er:
CMake Error: Error in cmake code at /home/<ich>/tmp/prog/cmake/Modules/LAPACKConfig.cmake:25: Unknown CMake command "get_property".
Was heißt das jetzt?