2015-07-23 11 views
5

Ich habe ein Projekt mit einer CMakeLists.txt Dateien im root und das Projekt kompiliert gut unter Linux und OSX. Jetzt möchte ich es für MIPS OpenWRT kompilieren. Ich möchte es so weit wie möglich automatisieren, so würde ich Code nach dem Werkzeugkette zum Herunterladen und die Compiler-Variablen gesetzt:Wie lade ich eine Toolchain zum Cross-Compilieren in cmake aus einer separaten Datei herunter?

ExternalProject_Add(ar71xx-toolchain 
    PREFIX "${PROJECT_BINARY_DIR}/external/openwrt" 
    URL "http://downloads.openwrt.org/barrier_breaker/14.07/ar71xx/generic/OpenWrt-Toolchain-ar71xx-for-mips_34kc-gcc-4.8-linaro_uClibc-0.9.33.2.tar.bz2" 
    UPDATE_COMMAND "" 
    PATCH_COMMAND "" 
    BUILD_COMMAND "" 
    CONFIGURE_COMMAND "" 
    INSTALL_COMMAND "" 
) 
ExternalProject_Get_Property(ar71xx-toolchain SOURCE_DIR) 
SET(CMAKE_C_COMPILER ${SOURCE_DIR}/toolchain-mips_34kc_gcc-4.8-linaro_uClibc-0.9.33.2/bin/mips-openwrt-linux-gcc) 
SET(CMAKE_CXX_COMPILER ${SOURCE_DIR}/toolchain-mips_34kc_gcc-4.8-linaro_uClibc-0.9.33.2/bin/mips-openwrt-linux-g++) 
SET(CMAKE_STRIP ${SOURCE_DIR}/toolchain-mips_34kc_gcc-4.8-linaro_uClibc-0.9.33.2/bin/mips-openwrt-linux-strip) 

Ich dachte, dass ich es in einem separaten Toolchain-Datei setzen können und es passieren mit -DCMAKE_TOOLCHAIN_FILE, aber es scheint, dass ExternalProject_Add nicht innerhalb der Toolchain-Datei ausgeführt wird. Ich möchte vermeiden, den Toolchain-Download-Schritt in die Haupt-CMakeLists.txt, da es eigentlich nicht wichtig für das Projekt selbst ist und würde das gleiche für jede Zielplattform tun müssen ... So gibt es eine Möglichkeit, optionale Schritte für definieren ein laufendes Cross Compile Build und übertrage es irgendwie als Kommandozeilenparameter, der vor dem Hauptprojekt Build ausgeführt werden soll?

UPDATE: Basierend auf Tsyvarev Antwort, die für mich in der Toolchain-Datei funktioniert:

set(CMAKE_SYSTEM_NAME Linux) 
set(TOOLCHAIN_DIR ${PROJECT_BINARY_DIR}/external/openwrt/toolchain) 

if(NOT EXISTS ${TOOLCHAIN_DIR}) 
    file(DOWNLOAD http://downloads.openwrt.org/barrier_breaker/14.07/ar71xx/generic/OpenWrt-Toolchain-ar71xx-for-mips_34kc-gcc-4.8-linaro_uClibc-0.9.33.2.tar.bz2 ${TOOLCHAIN_DIR}/toolchain.tar.bz2 SHOW_PROGRESS) 
    execute_process(COMMAND tar --strip-components=2 -xjf ${TOOLCHAIN_DIR}/toolchain.tar.bz2 WORKING_DIRECTORY ${TOOLCHAIN_DIR}) 
    execute_process(COMMAND rm ${TOOLCHAIN_DIR}/toolchain.tar.bz2) 
endif() 

SET(CMAKE_C_COMPILER ${TOOLCHAIN_DIR}/bin/mips-openwrt-linux-gcc) 
SET(CMAKE_CXX_COMPILER ${TOOLCHAIN_DIR}/bin/mips-openwrt-linux-g++) 
SET(CMAKE_STRIP ${TOOLCHAIN_DIR}/bin/mips-openwrt-linux-strip) 
SET(CMAKE_FIND_ROOT_PATH ${TOOLCHAIN_DIR}) 
SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) 
SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) 
SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) 

Es gibt ein Problem, wenn -DCMAKE_TOOLCHAIN_FILE als CMAKE Parameter zu anderen Projekten mit ExternalProject_Add hinzugefügt vorbei. Wegen des eigenen $ {PROJECT_BINARY_DIR} wird die Toolchain erneut heruntergeladen. Aber das ist ein anderes Problem ...

+0

Für mich wäre es ein sauberer Ansatz, die Toolchain-bezogenen Maschinen auf das Skript zu verschieben, das den Build steuert, bevor Ihre Haupt-CMakeLists.txt ins Spiel kommt. –

+0

Sie haben Recht, aber ich möchte, dass der Benutzer "cmake -DCMAKE_TOOLCHAINFILE = ../platforms/openwrt_ar71xx/mips.toolchain.cmake .." anstelle von "cmake .." aus dem Build-Verzeichnis aufruft, wenn er entscheidet, Cross-Compiling zu tun anstatt ihm zu sagen, wie man eine weitere cmake-Datei erstellt ... – Gamadril

Antwort

3

ExternalProject_add alle Schritte bei Build Zeit ausgeführt wird, nicht bei Konfiguration Zeit.

Für die Download-Datei können Sie file(DOWNLOAD ...) Befehl verwenden. Für extrahieren Dateien von Arhive verwenden Sie einfach execute_process mit entsprechenden Befehl.

+0

Das funktioniert in der Toolchain-Datei. – Gamadril