CMake AMRCC + пользовательский компоновщик

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

Я изменил переменные в 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>")

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

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

1

Решение

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

set(CMAKE_TRY_COMPILE_TARGET_TYPE STATIC_LIBRARY)

редактировать: Если ваш пользовательский компоновщик также создает проблемы вне проверки компилятора, просто разбейте ваш набор инструментов на 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

2

Другие решения

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

0

По вопросам рекламы [email protected]