Как мне заставить CMake играть хорошо с проприетарным компилятором C ++? - PullRequest
0 голосов
/ 04 апреля 2020

Я создаю приложение, для которого я хотел бы поддерживать определенную проприетарную платформу. Он использует модифицированную версию ARM CC, которая, похоже, не нравится CMake - независимо от того, что я делаю, он пытается установить странные флаги для armlink там, где это не следует, игнорируя попытки переопределить его поведение.

Можно ли по существу предоставить совершенно новое определение того, как CMake должен работать с конкретным компилятором? т.е. укажите двоичный файл и флаги, используемые для компиляции, компоновки и т. д. c., ожидаемые расширения файлов и т. д. c. на протяжении всего процесса, так что CMake не делает ничего противного? CMake, кажется, делает пользовательские определения компилятора невероятно непонятными для выполнения sh.

Редактировать: Я сделал так, чтобы он предоставил большинство правильных флагов, но теперь я понимаю, что не может изменить тестовую программу CMake - программы для этой платформы не будут созданы, если не существует определенного нетипичного набора символов (альтернативная точка входа, а не основная).

Редактировать 2: Я пропустил тестовую программу, но теперь она терпит неудачу при попытке получить информацию о компиляторе (зачем? Я дал ей все, что нужно знать для ситуации ...) с этой ошибкой:

Error: C9912E: No --cpu selected

Для полной ясности, команда, представленная в строке выше, явно имеет флаг --cpu с допустимым значением:

armcc.exe -xc++ --cpu=MPCore -fpch-preprocess -v -dD -E

Хотя я совершенно не уверен относительно того, что он пытается сделать с остальным - я не могу переопределить эту часть.

1 Ответ

2 голосов
/ 28 апреля 2020

Для начала вам нужен файл toolchain.cmake. Здесь вы указываете пути к вашему armcc компилятору, компоновщику и т. Д. c.

SET(CMAKE_SYSTEM_NAME Generic)
SET(CMAKE_SYSTEM_VERSION 1)

# this one is important
SET( CMAKE_SYSTEM_PROCESSOR  arm )

SET(MCU_ARCH Cortex-M4) #MCU architecture

SET(TOOLCHAIN_BIN_DIR "C:/Keil_v5/ARM/ARMCC/bin/")
set(LINKER_SCATTER_SCRIPT ${PROJECT_SOURCE_DIR}/Scatter_file.sct)

SET(CMAKE_C_COMPILER            ${TOOLCHAIN_BIN_DIR}/armcc.exe      CACHE FILEPATH "C compiler")
SET(CMAKE_CXX_COMPILER          ${TOOLCHAIN_BIN_DIR}/armcc.exe      CACHE FILEPATH "C++ compiler")
SET(CMAKE_LINKER                ${TOOLCHAIN_BIN_DIR}/armlink.exe    CACHE FILEPATH "linker")
SET(CMAKE_AR                    ${TOOLCHAIN_BIN_DIR}/armar.exe      CACHE FILEPATH "Archiver")
SET(CMAKE_ASM_COMPILER          ${TOOLCHAIN_BIN_DIR}/armasm.exe     CACHE FILEPATH "Assembler")
SET(CMAKE_FROMELF               ${TOOLCHAIN_BIN_DIR}/fromelf.exe    CACHE FILEPATH "From ELF tool")

SET(CMAKE_TRY_COMPILE_TARGET_TYPE STATIC_LIBRARY)

SET(CMAKE_EXE_LINKER_FLAGS_INIT "--cpu ${MCU_ARCH} --myFlag1 --myFlag2 ${LINKER_SCATTER_SCRIPT}")

Далее, в файле CMakeLists.txt вы можете передать флаги компилятора и компоновщика:

cmake_minimum_required(VERSION 3.10)
SET(CMAKE_VERBOSE_MAKEFILE ON)
project (MyProject C CXX ASM)


#Source Files -> Let CMake know your source files
SET(SRC_FILES       ${CMAKE_SOURCE_DIR}/Dir/main.c) 

add_executable(
        ${PROJECT_NAME}
        ${SRC_FILES})

#Defining compiler preprocessor directives
target_compile_definitions(${PROJECT_NAME} PRIVATE
        $<$<COMPILE_LANGUAGE:C>:  DEFINE_1;__DEBUG;>
        $<$<COMPILE_LANGUAGE:CXX>:DEFINE_2;__DEBUG;>)

#Defining compiler flags
target_compile_options(${PROJECT_NAME} PRIVATE
        $<$<COMPILE_LANGUAGE:C>:    --c99 -c -O0 --cpu ${MCU_ARCH};>
        $<$<COMPILE_LANGUAGE:CXX>:--cpp11 -c -O0 --cpu ${MCU_ARCH};>
        $<$<COMPILE_LANGUAGE:ASM>:--cpu ${MCU_ARCH} -g>)

SET(CMAKE_ASM_FLAGS         "--pd \"DEFINE_3"")
target_link_libraries(${PROJECT_NAME} ${CMAKE_SOURCE_DIR}/SomeLibFile.lib --flagForLibFile)
target_link_options(${PROJECT_NAME} PRIVATE --linkerFlags)

target_include_directories(${PROJECT_NAME} PUBLIC
        ${CMAKE_SOURCE_DIR})

Для необходимых флагов посмотрите, что использует Keil.

Затем вы можете создать приложение, передав файл toolchain.cmake как -DCMAKE_TOOLCHAIN_FILE=toolchain.cmake

РЕДАКТИРОВАТЬ: Обновлено на основе отзывов KamilCuk

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...