2015-07-23 24 views
5

Ho un progetto con un file CMakeLists.txt nella radice e il progetto si compila bene su Linux e OSX. Ora voglio incrociarlo per MIPS OpenWRT. Vorrei automatizzare il più possibile, quindi vorrei usare seguente codice per scaricare la toolchain e impostare le variabili del compilatore:Come scaricare una toolchain per la compilazione incrociata in cmake da un file separato?

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) 

ho pensato che posso mettere in un file toolchain separato e passarlo con -DCMAKE_TOOLCHAIN_FILE, ma sembra che ExternalProject_Add non sia eseguito all'interno del file toolchain. Vorrei evitare di inserire il passo di download del toolchain nel CMakeList.txt principale poiché in realtà non è essenziale per il progetto stesso e richiederebbe di fare lo stesso per ogni piattaforma di destinazione ... Quindi c'è un modo per definire i passaggi opzionali per una compilazione di compilazione incrociata corrente e passarla in qualche modo come parametro della riga di comando da eseguire prima della creazione del progetto principale?

UPDATE: in base alla risposta del Tsyvarev che funziona per me nel file toolchain:

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) 

c'è un problema quando si passa -DCMAKE_TOOLCHAIN_FILE come parametro di CMAKE ad altri progetti aggiunti con ExternalProject_Add. A causa del proprio $ {PROJECT_BINARY_DIR}, scaricherà nuovamente la toolchain. Ma questo è un altro problema ...

+0

Per me sarebbe un approccio più pulito per spostare i macchinari relativi alla toolchain allo script che controlla la build, prima che il tuo CMakeLists.txt principale entri in gioco. –

+0

hai ragione, ma voglio che l'utente chiami "cmake -DCMAKE_TOOLCHAIN_FILE = ../platforms/openwrt_ar71xx/mips.toolchain.cmake .." invece di "cmake .." dalla directory di compilazione se decide di eseguire la compilazione incrociata invece di dirgli come creare un altro file cmake ... – Gamadril

risposta

3

ExternalProject_add esegue tutte le misure a accumulo tempo, non a configurazione tempo.

Per il file di download è possibile utilizzare il comando file(DOWNLOAD ...). Per i file estratti da arhive basta usare execute_process con il comando appropriato.

+0

Che funziona nel file toolchain. – Gamadril

Problemi correlati