Как передать флаг компиляции в начальный тест компилятора cmake?
Я пытаюсь использовать CMake для создания проекта, который использует кросс-компилятор MSPGCC для микроконтроллера MSP430. Чтобы успешно скомпилировать любую простую программу с его помощью, нам нужно передать флаг компиляции, указывающий целевой процессор, иначе он завершится с ошибкой следующим образом:
$ msp430-gcc -o test test.c
In file included from test.c:1:0:
/usr/local/lib/gcc/msp430/4.6.3/../../../../msp430/include/msp430.h:813:2: warning: #warning Unable to identify and include MCU header, use -mmcu=MCU [-Wcpp]
/usr/local/lib/gcc/msp430/4.6.3/../../../../msp430/bin/ld: cannot open linker script file memory.x: No such file or directory
collect2: ld returned 1 exit status
Следовательно, если я укажу процессор, использующий -mmcu
Переключатель работает нормально. Проблема в том, что я уже указал это в своем файле CMakeLists.txt:
cmake_minimum_required (VERSION 2.6)
project (test-project C)
set (SOURCES
test.c
)
add_executable (test-project ${SOURCES})
set (CPU_FLAG "-mmcu=msp430f148")
set (CMAKE_C_FLAGS ${CPU_FLAG})
set (CMAKE_EXE_LINKER_FLAGS ${CPU_FLAG})
CMake жалуется, что компилятор не прошел тест, чтобы скомпилировать простую программу, что, я уверен, происходит потому, что он, вероятно, не использует -mmcu
переключатель (обратите внимание на сообщение о невозможности открыть файл сценария компоновщика memory.x):
$ cd ~/git/test-project
$ mkdir build
$ cd build
$ cmake -DCMAKE_TOOLCHAIN_FILE=../msp430.cmake ..
-- The C compiler identification is GNU 4.6.3
-- Check for working C compiler: /usr/local/bin/msp430-gcc
-- Check for working C compiler: /usr/local/bin/msp430-gcc -- broken
CMake Error at /usr/share/cmake-2.8/Modules/CMakeTestCCompiler.cmake:52 (MESSAGE):
The C compiler "/usr/local/bin/msp430-gcc" is not able to compile a simple
test program.
It fails with the following output:
Change Dir: /home/claudio/git/test-project/build/CMakeFiles/CMakeTmp
Run Build Command:/usr/bin/gmake "cmTryCompileExec2889462763/fast"
/usr/bin/gmake -f CMakeFiles/cmTryCompileExec2889462763.dir/build.make
CMakeFiles/cmTryCompileExec2889462763.dir/build
gmake[1]: Entering directory
`/home/claudio/git/test-project/build/CMakeFiles/CMakeTmp'
/usr/bin/cmake -E cmake_progress_report
/home/claudio/git/test-project/build/CMakeFiles/CMakeTmp/CMakeFiles 1
Building C object
CMakeFiles/cmTryCompileExec2889462763.dir/testCCompiler.c.o
/usr/local/bin/msp430-gcc -o
CMakeFiles/cmTryCompileExec2889462763.dir/testCCompiler.c.o -c
/home/claudio/git/test-project/build/CMakeFiles/CMakeTmp/testCCompiler.c
Linking C executable cmTryCompileExec2889462763
/usr/bin/cmake -E cmake_link_script
CMakeFiles/cmTryCompileExec2889462763.dir/link.txt --verbose=1
/usr/local/bin/msp430-gcc
CMakeFiles/cmTryCompileExec2889462763.dir/testCCompiler.c.o -o
cmTryCompileExec2889462763 -rdynamic
/usr/local/lib/gcc/msp430/4.6.3/../../../../msp430/bin/ld: cannot open
linker script file memory.x: No such file or directory
collect2: ld returned 1 exit status
gmake[1]: Leaving directory
`/home/claudio/git/test-project/build/CMakeFiles/CMakeTmp'
gmake[1]: *** [cmTryCompileExec2889462763] Error 1
gmake: *** [cmTryCompileExec2889462763/fast] Error 2
CMake will not be able to correctly generate this project.
Call Stack (most recent call first):
CMakeLists.txt:3 (project)
-- Configuring incomplete, errors occurred!
Просто для записи, мой файл инструментария выглядит следующим образом, а моя переменная PATH позволяет ему находить двоичные файлы компилятора в /usr/local/bin
:
# the name of the target operating system
#SET(CMAKE_SYSTEM_NAME Linux)
# which C and C++ compiler to use
SET(CMAKE_C_COMPILER msp430-gcc)
SET(CMAKE_CXX_COMPILER msp430-g++)
# here is the target environment located
SET(CMAKE_FIND_ROOT_PATH /usr/local/msp430)
# adjust the default behaviour of the FIND_XXX() commands:
# search headers and libraries in the target environment, search
# programs in the host environment
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
Все, что сказал, может кто-нибудь сказать мне, как проверить, какие флаги компиляции CMake использует для выполнения теста компилятора, и как мы можем передать пользовательские флаги (например, -mmcu
например) так что не подведет?
2 ответа
Согласно Документам:
http://www.cmake.org/Wiki/CMake_Cross_Compiling
Вы должны использовать вещь CMakeForceCompiler
INCLUDE(CMakeForceCompiler)
# this one is important
SET(CMAKE_SYSTEM_NAME eCos)
# specify the cross compiler
CMAKE_FORCE_C_COMPILER(arm-elf-gcc GNU)
CMAKE_FORCE_CXX_COMPILER(arm-elf-g++ GNU)
# where is the target environment
SET(CMAKE_FIND_ROOT_PATH /home/alex/src/ecos/install )
# search for programs in the build host directories
SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
# for libraries and headers in the target directories
SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
(скопируйте и вставьте из документов)
Используя это прекрасно здесь для моего MSP430 тоже
Другой ответ здесь устарел.
Файл цепочки инструментов должен включать необходимые флаги в соответствующих
CMAKE_<KIND>_FLAGS(_<CONFIG>)_INIT
переменные, например:
set(CMAKE_C_FLAGS_INIT "-mmcu=msp430f148")
set(CMAKE_CXX_FLAGS_INIT "-mmcu=msp430f148")
set(CMAKE_EXE_LINKER_FLAGS_INIT "-mmcu=msp430f148")
Подпрограммы обнаружения компилятора CMake будут использовать эти флаги при компиляции тестового исполняемого файла. Полный список доступен в документации по переменным CMake , но полный список (на момент написания) такой:
-
CMAKE_<LANG>_FLAGS_<CONFIG>_INIT
-
CMAKE_<LANG>_FLAGS_INIT
-
CMAKE_EXE_LINKER_FLAGS_<CONFIG>_INIT
-
CMAKE_EXE_LINKER_FLAGS_INIT
-
CMAKE_MODULE_LINKER_FLAGS_<CONFIG>_INIT
-
CMAKE_MODULE_LINKER_FLAGS_INIT
-
CMAKE_SHARED_LINKER_FLAGS_<CONFIG>_INIT
-
CMAKE_SHARED_LINKER_FLAGS_INIT
-
CMAKE_STATIC_LINKER_FLAGS_<CONFIG>_INIT
-
CMAKE_STATIC_LINKER_FLAGS_INIT
Где находится любое имя конфигурации ALL CAPS, включая, помимо прочего,
DEBUG
,
RELWITHDEBINFO
,
MINSIZEREL
, а также
RELEASE
. Неварианты применяются ко всем
конфигурациям и дополняются<CONFIG>
варианты.
И где
<LANG>
какой-либо из языков, известных
enable_language()
, в настоящее время включая
CXX
,
C
,
CUDA
,
OBJC
,
OBJCXX
,
Fortran
,
HIP
,
ISPC
, а также
ASM
. Актуальный список можно найти вenable_language
документация .