2015-10-20 3 views
6

Wie kann ich externe Projekte in CMake hinzufügen, wenn das Repo des Projekts nicht das Stammverzeichnis der Bibliothek ist, die ich verwenden möchte, sondern tatsächlich zwei Verzeichnisse enthält, die jeweils Stammverzeichnisse von Repos sind, die ich in meinem Projekt verwenden möchte?Wie behandelt man CMake ExternalProject, wenn Repo (googeltest) mehrere Bibliotheken hat?

Ich arbeite einen Rahmen CMake Projekt einrichten, die Google-Test und Mock zum Testen verwendet, aber wenn ich versuche, den Google-Test Repo (https://github.com/google/googletest) mit ExternalProject_Add herunterladen, klagt sie auf Build, der es nicht finden kann, die Quelle für das Projekt. Das liegt daran, dass Google googletest und googlemock zu einem einzigen Projekt zusammengeführt hat, mit Ausnahme von zwei Projekten.

Einige der Dateistruktur des Repo:

googletest-master/ 
├──[...no CMakeFiles.txt exists here...] 
├──googletest/ 
│ ├──src/ 
│ └──CMakeFiles.txt 
└──googlemock/ 
    ├──src/ 
    └──CMakeFiles.txt 

Wenn ich die folgende ...

ExternalProject_Add(
    gtest 
    GIT_REPOSITORY https://github.com/google/googletest.git 
    TIMEOUT 10 
    INSTALL_COMMAND "" 
    LOG_DOWNLOAD ON 
    LOG_CONFIGURE ON 
    LOG_BUILD ON 
    PREFIX "googletest-master" 
) 

... es lädt die tatsächlichen Repo googletest-master/src/gtest, weil ich die Repo bin prefixing mit "googletest-master", um es von meinem Hauptquellcode fernzuhalten, und es setzt voraus, dass ich ein Projekt herunterlade, das nur eine Quelle ist und diese Quelle im Stammverzeichnis ist.

So würde Ich mag zwei Dinge erreichen:

  1. Laden Sie die repo in das googletest-Master-Verzeichnis, genau so, wie es wäre, wenn ich den Repo dort geklont oder heruntergeladen die Zip-off GitHub und extrahierte es.
  2. gebaut und umfassen sowohl googletest und googlemock in meinem CMake Projekt

Antwort

7

Sie benötigen einzigen herunterladen Schritt, aber zwei Erstellungsschritte. Verschiedene ExternalProject_add Befehl können keine Anrufe Aktien Schritte, aber Sie können alle diese Schritte in verschiedene Anrufe mit entsprechenden Abhängigkeiten zwischen ihnen arrangieren: tun einige Anpassungen einiger der relativen Pfade

# Single download(git clone) 
ExternalProject_Add(
    googletest-master 
    DOWNLOAD_DIR "googletest-master/src" # The only dir option which is required 
    GIT_REPOSITORY https://github.com/google/googletest.git 
    TIMEOUT 10 
    LOG_DOWNLOAD ON 
    # Disable all other steps 
    CONFIGURE_COMMAND "" 
    BUILD_COMMAND "" 
    INSTALL_COMMAND "" 
) 

# Build gtest from existing sources 
ExternalProject_Add(
    gtest 
    DOWNLOAD_COMMAND "" # No download required 
    SOURCE_DIR "googletest-master/src/googletest" # Use specific source dir 
    PREFIX "googletest-master" # But use prefix for compute other dirs 
    INSTALL_COMMAND "" 
    LOG_CONFIGURE ON 
    LOG_BUILD ON 
) 

# gtest should be build after being downloaded 
add_dependencies(gtest googletest-master) 

# Build gmock from existing sources 
ExternalProject_Add(
    gmock 
    DOWNLOAD_COMMAND "" # No download required 
    SOURCE_DIR "googletest-master/src/googlemock" # Use specific source dir 
    PREFIX "googletest-master" # But use prefix for compute other dirs 
    INSTALL_COMMAND "" 
    LOG_CONFIGURE ON 
    LOG_BUILD ON 
) 

# gmock should be build after being downloaded 
add_dependencies(gmock googletest-master) 
+0

landete ich auf meine Bedürfnisse/Vorlieben anpassen ein bisschen mehr - diese rohe Lösung führte zu unnötig komplexen Verzeichnisstrukturen (googletest-master/src/googletest/src). Aber das funktioniert und ist genau das, was ich brauchte. – AberrantWolf

0

Ich habe einen repository wo ich Gtest und gmock Bibliotheken CMake importieren verwenden, wie Sie wollen, aber die alte SVN Quellcode-Repository statt GIT mit .

Ich denke, der Schlüssel ist Quellen nur für Gmock, da es Gtest Quellen enthält und exportieren Sie dann beide Bibliotheken.

Die CMakeLists.txt sieht wie folgt aus:

cmake_minimum_required(VERSION 2.8) 

include(ExternalProject) 

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11") 

set(GMOCK_VERSION "1.7.0") 
set(GMOCK_DIR "${CMAKE_CURRENT_BINARY_DIR}/gmock-${GMOCK_VERSION}") 
ExternalProject_Add(project_gmock 
    SVN_REPOSITORY http://googlemock.googlecode.com/svn/tags/release-${GMOCK_VERSION} 
    PREFIX ${GMOCK_DIR} 
    CMAKE_ARGS -DCMAKE_C_COMPILER:PATH=${CMAKE_C_COMPILER} -DCMAKE_CXX_COMPILER:PATH=${CMAKE_CXX_COMPILER} 
    # Disable update step 
    UPDATE_COMMAND "" 
    # Disable install step 
    INSTALL_COMMAND "" 
) 
ExternalProject_Get_Property(project_gmock source_dir) 
ExternalProject_Get_Property(project_gmock binary_dir) 

include_directories(${source_dir}/gtest/include) 
add_library(gtest STATIC IMPORTED) 
set_property(TARGET gtest PROPERTY IMPORTED_LOCATION ${binary_dir}/gtest/libgtest.a) 
add_dependencies(gtest project_gmock) 
add_library(gtest_main STATIC IMPORTED) 
set_property(TARGET gtest_main PROPERTY IMPORTED_LOCATION ${binary_dir}/gtest/libgtest_main.a) 
add_dependencies(gtest_main project_gmock) 
include_directories(${source_dir}/include) 
add_library(gmock STATIC IMPORTED) 
set_property(TARGET gmock PROPERTY IMPORTED_LOCATION ${binary_dir}/libgmock.a) 
add_dependencies(gmock project_gmock) 
add_library(gmock_main STATIC IMPORTED) 
set_property(TARGET gmock_main PROPERTY IMPORTED_LOCATION ${binary_dir}/libgmock_main.a) 
add_dependencies(gmock_main project_gmock) 

include_directories(${cpp_utest_SOURCE_DIR}/src) 
set(CMAKE_EXE_LINKER_FLAGS "-static-libgcc -static-libstdc++") 
#add_executable(utests) 
#target_link_libraries(utests gmock_main gmock gtest pthread) 
Verwandte Themen