2017-06-12 6 views
3

Mein Projekt hängt von mariadb-connector-c ab und ich versuche den Download-, Build- und Linkprozess mit CMake zu automatisieren.Wie kann ich cmake von innerhalb von cmake ausführen?

ich zur Zeit das Projekt in ein Verzeichnis downloaden, ich versuche dann auszuführen ninja-Dateien zu erzeugen und sie laufen, aber ich kann nicht cmake überhaupt laufen:

execute_process(COMMAND "cmake -GNinja ." WORKING_DIRECTORY ${mariadb-connector-c_SOURCE_DIR}) 

Ich weiß das nicht, weil der nächste Schritt nicht funktioniert , läuft ninja, schlägt fehl:

execute_process(COMMAND "ninja" WORKING_DIRECTORY ${mariadb-connector-c_SOURCE_DIR}) 

Cmake läuft in CLI in Ordnung, ich habe versucht, den vollständigen Pfad zum Cmake Executable mit und den Punkt mit den variablen mit dem vollständigen Verzeichnis (die auch eine gültige Variable ersetzt, wenn Sie sich wundern.)

Wie kann ich Cmake sagen, um cmake auf diesem externen Projekt auszuführen?

+0

Sieht so aus, als könnten Sie von [ExternalProject] (https://cmake.org/cmake/help/v3.0/module/ExternalProject.html) profitieren – riodoro1

+0

Für ExternalProject ist die neueste Dokumentation [hier] (https: // cmake .org/cmake/help/Neueste/Modul/ExternalProject.html) – Antonio

Antwort

2

Sie können Ihr Projekt zu einem Top-Level CMakeLists.txt Build Ihre Teilprojekte wie ExternalProject organisieren.

Dieser Ansatz erfordert mehr Arbeit und Wartung von mehr CMake-Modulen, aber es hat seine eigenen Vorteile. Ich herunterladen Google-Test wie folgt:

# Create download URL derived from version number. 
set(GTEST_HOME https://github.com/google/googletest/archive) 
set(GTEST_DOWNLOAD_URL ${GTEST_HOME}/release-${GTEST_VERSION}.tar.gz) 
unset(GTEST_HOME) 

# Download and build the Google Test library and add its properties to the third party arguments. 
set(GTEST_ROOT ${THIRDPARTY_INSTALL_PATH}/gtest CACHE INTERNAL "") 
ExternalProject_Add(gtest 
    URL ${GTEST_DOWNLOAD_URL} 
    CMAKE_ARGS -DBUILD_GTEST=ON -DBUILD_GMOCK=ON -DCMAKE_INSTALL_PREFIX=${GTEST_ROOT} 
    INSTALL_COMMAND make install 
) 

list(APPEND GLOBAL_THIRDPARTY_LIB_ARGS "-DGTEST_ROOT:PATH=${GTEST_ROOT}") 
unset(GTEST_DOWNLOAD_URL) 
unset(GTEST_ROOT) 

Der Code abowe ist in meinem ExternalGoogleTest.cmake Modul, das durch CMakeLists.txt von Bibliotheken von Drittanbietern enthalten ist:

set_directory_properties(PROPERTIES EP_BASE ${CMAKE_BINARY_DIR}/ThirdParty) 
get_directory_property(THIRDPARTY_BASE_PATH EP_BASE) 

set(THIRDPARTY_INSTALL_PATH ${THIRDPARTY_BASE_PATH}/Install) 
set(GTEST_VERSION 1.8.0) 

include(ExternalProject) 
include(ExternalGoogleTest) 

Ihr eigenes Projekt, das auf einer externen Bibliothek abhängig werden brauche ein CMake-Modul, um es als ExternalProject zu bauen. Es kann wie folgt aussieht:

ExternalProject_Add(my_project 
    DEPENDS gtest whatever 
    SOURCE_DIR ${CMAKE_SOURCE_DIR}/lib 
    CMAKE_ARGS 
     ${GLOBAL_DEFAULT_ARGS} 
     ${GLOBAL_THIRDPARTY_LIB_ARGS} 
     -DCMAKE_INSTALL_PREFIX=${DESIRED_INSTALL_PATH}/my_project 
    BUILD_COMMAND make 
) 

Sie können weitere Tipps zu diesem Muster here gefunden.