2016-07-13 18 views
1

Ich versuche, cmake in einem Projekt zu verwenden, das mit armcc kompiliert wird, aber einen benutzerdefinierten proprietären Linker verwenden (nicht armlink).CMake AMRCC + benutzerdefinierte Linker

unset (CMAKE_LINKER CACHE) 
set (CMAKE_LINKER "my_linker" CACHE STRING "" FORCE) 

unset (CMAKE_ARMCC_LINKER CACHE) 
set (CMAKE_ARMCC_LINKER "my_linker" CACHE STRING "" FORCE) 

unset (CMAKE_EXE_LINKER_FLAGS CACHE) 
set (CMAKE_EXE_LINKER_FLAGS "-flag1 -flag2" CACHE STRING "" FORCE) 

unset (CMAKE_C_LINK_EXECUTABLE) 
set (CMAKE_C_LINK_EXECUTABLE "<CMAKE_LINKER> <CMAKE_EXE_LINKER_FLAGS> <OBJECTS> <LINK_LIBRARIES> -o <TARGET>") 

unset (CMAKE_CXX_LINK_EXECUTABLE) 
set (CMAKE_CXX_LINK_EXECUTABLE "<CMAKE_LINKER> <CMAKE_EXE_LINKER_FLAGS> <OBJECTS> <LINK_LIBRARIES> -o <TARGET>") 

Aber wenn cmake versucht meine Compiler Suite zu überprüfen, schlägt es in dem Verknüpfungsschritt:

Ich habe die Variablen in der toolchain.cmake Datei wie folgt geändert

-- Check for working C compiler: armcc.exe -- broken 
CMake Error at C:/Program Files (x86)/CMake/share/cmake-3.6/Modules/CMakeTestCCompiler.cmake:61 (message): 
    The C compiler "armcc.exe" is not able to compile a simple test program. 

... (compiling commands that worked hidden here) 

Linking C executable cmTC_c08ef.elf 

"C:\Program Files (x86)\CMake\bin\cmake.exe" -E cmake_link_script CMakeFiles\cmTC_c08ef.dir\link.txt --verbose=1 

my_linker -flag1 -flag2 CMakeFiles/cmTC_c08ef.dir/testCCompiler.o -o cmTC_c08ef.elf --list cmTC_c08ef.map 

Das Problem ist die --list cmTC_c08ef.map am Ende der Befehlszeile (die nicht in der Datei toolchain.cmake existiert).

Um es funktioniert, muß ich die Datei ändern <cmake_install_dir>\Modules\Compiler\ARMCC.cmake, wie folgend:

set(CMAKE_${lang}_LINK_EXECUTABLE  "<CMAKE_LINKER> <CMAKE_${lang}_LINK_FLAGS> <LINK_FLAGS> <LINK_LIBRARIES> <OBJECTS> -o <TARGET> --list <TARGET_BASE>.map") 
# set(CMAKE_${lang}_LINK_EXECUTABLE  "<CMAKE_LINKER> <CMAKE_${lang}_LINK_FLAGS> <LINK_FLAGS> <LINK_LIBRARIES> <OBJECTS> -o <TARGET>") 

Es gibt einen besseren Ansatz, um dieses Problem zu lösen, oder es ist der einzige Weg?

Edit: Anscheinend ist dies ein Fehler in der ArmCC-Unterstützung des cmake, also behalte ich meine Änderung in der ARMCC.cmake-Datei.

Antwort

0

Anscheinend ist dies ein Fehler in der CMCC-Unterstützung, also behalte ich meine Änderung in der ARMCC.cmake-Datei.

2

Das ist genau der Anwendungsfall einer relativ neuen (version 3.6) globalen CMake-Variablen mit dem Namen CMAKE_TRY_COMPILE_TARGET_TYPE. So fügen Sie einfach die folgende in der Toolchain-Datei:

set(CMAKE_TRY_COMPILE_TARGET_TYPE STATIC_LIBRARY) 

bearbeiten: Wenn Sie Ihre eigene Linker Sie auch Probleme außerhalb der Check-Compiler gibt, einfach teilen Sie Ihre Werkzeugkette in zwei Dateien (toolchain.cmake vor zu lesenden und makerules.cmake nach dem CMake Compiler-Erkennung):

toolchain.cmake

[...] 
set (CMAKE_USER_MAKE_RULES_OVERRIDE "${CMAKE_CURRENT_LIST_FILE}/makerules.cmake") 

makerules.cmake

set (CMAKE_C_LINK_EXECUTABLE "<CMAKE_LINKER> <CMAKE_EXE_LINKER_FLAGS> <OBJECTS> <LINK_LIBRARIES> -o <TARGET>") 
set (CMAKE_CXX_LINK_EXECUTABLE "<CMAKE_LINKER> <CMAKE_EXE_LINKER_FLAGS> <OBJECTS> <LINK_LIBRARIES> -o <TARGET>") 

Refrenzen

+0

Danke für Ihre Antwort @Florian. Auf diese Weise funktioniert der Prüfschritt, aber wenn ich versuche, meine Anwendung zu verknüpfen, wird die "--list .map" immer noch hier (Ignorieren der Überschreibung der Variable CMAKE_CXX_LINK_EXECUTABLE). – Valmir

+1

@Valmir Die Toolchain ist vor allem anderen geladen (siehe [hier] (http://stackoverflow.com/questions/30503631)).Wenn Sie nach der CMake-Compiler-Erkennung normale Variablen ändern wollen, benötigen Sie ein anderes Skript, das über ['CMAKE_USER_MAKE_RULES_OVERRIDE'] (https://cmake.org/cmake/help/latest/variable/CMAKE_USER_MAKE_RULES_OVERRIDE.html) eingegeben werden muss (siehe [hier ] (http://stackoverflow.com/questions/28732209)). Normalerweise sollten Sie Ihre 'CMAKE_CXX_LINK_EXECUTABLE'-Einstellungen nicht von Ihrer Toolchain in eine solche separate Datei verschieben. Ich betrachte diese Variablen als nicht zwischengespeichert einen Fehler in der ARMCC-Unterstützung. – Florian

+0

Danke nochmal @Florian. Leider werde ich meine Änderung in ARMCC.cmake behalten, um mein Projekt in Gang zu halten. – Valmir