2016-05-20 14 views
0

Ich habe eine Cmake Cross-Compiler Toolchain-Datei, Kurz als:CMake Command Line Definitionen Verewigung Nichtsein Toolchain Datei

set(CMAKE_SYSTEM_NAME Linux) 
if(DEFINED TC_PATH) 
    message(STATUS " TC_PATH IS defined. ${TC_PATH}") 
else() 
    message(FATAL_ERROR " TC_PATH not defined.") 
endif() 

set(CMAKE_C_COMPILER ${TC_PATH}/usr/bin/i586-linux/i586-linux-gcc) 
set(CMAKE_CXX_COMPILER ${TC_PATH}/usr/bin/i586-linux/i586-linux-g++) 
set(CMAKE_LINKER ${TC_PATH}/usr/bin/i586-linux/i586-linux-ld) 

Ich nenne cmake, die TC_PATH sowie die Toolchain-Datei festlegen:

~/CMakeTest/output $ cmake -DTC_PATH:PATH=/opt/toolchain -DCMAKE_TOOLCHAIN_FILE=../toolchain.cmake ../ 

Es scheint, dass cmake die Toolchain-Datei mehrmals aufruft. Auf der ersten zwei Zeit gelingt es der TC_PATH überprüfen, aber später, nach dem Compiler identifiziert, wirft es einen Fehler:

-- TC_PATH IS defined. /opt/toolchain 
-- TC_PATH IS defined. /opt/toolchain 
-- The C compiler identification is GNU 4.9.1 
-- The CXX compiler identification is GNU 4.9.1 
-- Check for working C compiler: /opt/toolchain/usr/bin/i586-linux/i586-linux-gcc 
CMake Error at /home/gnac/CMakeTest/toolchain.cmake:4 (message): 
    TC_PATH not defined. 
Call Stack (most recent call first): 
    /home/gnac/CMakeTest/output/CMakeFiles/3.0.2/CMakeSystem.cmake:6 (include) 
    CMakeLists.txt:2 (project) 

also außerhalb ein permanentes Umgebungsvariable in der Shell-Einstellung, wie ich die TC_PATH einstellen Variable über die Kommandozeile, so dass sie beim Ausführen des Befehls cmake generate im Kontext bleibt?

Antwort

0

Ihre Toolchain muss autark sein. Der fehlgeschlagene Schritt ist ein try_compile(), der Ihre zwischengespeicherten Variablen nicht erhält.

Ihre Toolchain-Datei sieht nicht, wie Sie Cross-Kompilierung (es keine CMAKE_SYSTEM_NAME hat), so können Sie eine der folgenden Möglichkeiten zu tun (außer das CC und CXX-Umgebung Variablen, wie Sie erwähnt haben):

  1. Es ist ausreichend, um den vollständigen Pfad zu Ihrem C und/oder CXX Compiler (je nachdem, welche Sprachen Sie aktiviert) zu geben, wird CMake den Rest des GNU-Toolchain

    cmake -DCMAKE_C_COMPILER:PATH=/opt/toolchain/usr/bin/i586-linux/i586-linux-gcc 
         -DCMAKE_CXX_COMPILER:PATH=/opt/toolchain/usr/bin/i586-linux/i586-linux-g++ ... 
    
  2. automatisch erkennen
  3. Folgendes Ihre Werkzeugkette Fügen Sie die Compiler-Tests überspringen

    set(CMAKE_C_COMPILER_WORKS 1 CACHE INTERNAL "") 
    set(CMAKE_CXX_COMPILER_WORKS 1 CACHE INTERNAL "") 
    

    Oder nur die verwenden (da nicht alle Optionen kann oder weil Ihr Compiler/Linker der Wahl produzieren wird keine gültige ausführbare Datei übergeben werden) CMakeForceCompiler Makros, aber die Verwendung ist "entmutigt. Vermeiden Sie die Verwendung dieses Moduls, wenn möglich.“

  4. Verwenden configure_file() den Weg in die Toolchain-Datei zu setzen (nur sicherstellen, dass es tun vor dem project() Aufruf)

  5. Bevorzugen find_program(), wenn die möglichen Wege des Werkzeugkette sind bekannt über die Einstellung von außen (siehe z. B.here)

Referenzen

+0

Florian, meine Toolchain-Datei hat in der Tat gesetzt CMAKE_SYSTEM_NAME. Ich habe es aus der "gekürzten" Version herausgelassen, um die Frage präziser zu halten. Ich habe es jetzt hinzugefügt, um eine vollständigere/korrekte Frage zu stellen. Vielen Dank. – gnac