2016-07-13 12 views
1

Я пытаюсь использовать cmake в проекте, который скомпилирован с использованием armcc, но используйте собственный собственный компоновщик (не armlink).

CMake AMRCC + custom linker

Я изменил переменные в файле toolchain.cmake следующим образом:

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>") 

Но когда cmake пытается проверить мой компилятор пакет, он не в стадии компоновки:

-- 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 

Проблема заключается в --list cmTC_c08ef.map в конце командной строки (которая не существует в файле toolchain.cmake).

Для того, чтобы заставить его работать, мне нужно изменить файл <cmake_install_dir>\Modules\Compiler\ARMCC.cmake следующим образом:

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>") 

Существует лучший подход к решению этой проблемы, или это единственный способ?

Редактирование: По-видимому, это ошибка в поддержке CMAC cmake, поэтому я сохраню свое изменение в файле ARMCC.cmake.

ответ

0

Видимо, это ошибка в поддержке кронштейна cmake, поэтому я сохраню свое изменение в файле ARMCC.cmake.

2

Это именно тот вариант использования относительно новой (version 3.6) глобальной переменной CMake с именем CMAKE_TRY_COMPILE_TARGET_TYPE. Так что просто добавьте следующие строки в ваш файл ToolChain:

set(CMAKE_TRY_COMPILE_TARGET_TYPE STATIC_LIBRARY) 

Edit: Если ваш пользовательский компоновщик также дает вам неприятности за пределами проверки компилятора, просто разделить свой набор инструментов в 2-х файлов (toolchain.cmake прочитать перед и makerules.cmake после обнаружения компилятор CMake в):

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>") 

Refrences

+0

Спасибо за ваш ответ @Florian. Таким образом работает шаг проверки, но когда я пытаюсь связать свое приложение «-list .map» все еще здесь (игнорируя переопределение переменной CMAKE_CXX_LINK_EXECUTABLE). – Valmir

+1

@Valmir Инструментарий загружается перед всем остальным (см. [Здесь] (http://stackoverflow.com/questions/30503631)).Если вы хотите изменить обычные переменные после обнаружения компилятора CMake, вам нужен другой скрипт, который будет предоставлен через ['CMAKE_USER_MAKE_RULES_OVERRIDE'] (https://cmake.org/cmake/help/latest/variable/CMAKE_USER_MAKE_RULES_OVERRIDE.html) (см. [Здесь ] (http://stackoverflow.com/questions/28732209)). Обычно вам не нужно перемещать настройки 'CMAKE_CXX_LINK_EXECUTABLE' из вашей инструментальной цепочки в такой отдельный файл. Я считаю, что эти переменные не кэшированы в поддержку ARMCC. – Florian

+0

Еще раз спасибо @Florian. К сожалению, я сохраню свои изменения в ARMCC.cmake, чтобы поддерживать работу моего проекта. – Valmir