Мы пытаемся выполнить кросс-компиляцию определенного программного обеспечения, и в большинстве случаев оно работает. Однако включаемые файлы разделены на несколько каталогов, и, если каталог находится за пределами дерева sysroot, иногда CMake решает не добавлять его в список включения в файлах Makefile.
Набор инструментов:
- GCC 4.4.1 для ARM (исполняемые файлы Windows)
- MinGW Make (без MSYS)
Вызов CMake выглядит следующим образом:
cmake -G"MinGW Makefiles" -DCMAKE_TOOLCHAIN_FILE=toolchain-vde.cmake -DCMAKE_BUILD_TYPE=Debug -DCMAKE_INSTALL_PREFIX=C:\vf-install ..
Файл toolchain-vde.cmake
:
# the name of the target operating system
set(CMAKE_SYSTEM_NAME Linux)
# which compilers to use for C and C++
include(CMakeForceCompiler)
#Use 8.1 names if path has spaces since it will break on paths with spaces
set(CMAKE_C_COMPILER "C:/VDE/toolchains/windows/vos/arm-vf-linux-gnueabi/bin/arm-vf-linux-gnueabi-gcc.exe")
set(CMAKE_CXX_COMPILER "C:/VDE/toolchains/windows/vos/arm-vf-linux-gnueabi/bin/arm-vf-linux-gnueabi-g++.exe")
# here is the target environment located
SET(VF_SYSROOT "C:/VDE/SDKs/vos/default")
#Vf includes and libs
#Declared as variables for compatibility and usage by CMake scripts down the line
SET(VF_ADK_INCLUDE "C:\\VDE\\ADKs\\default\\vos\\include")
SET(VF_ADK_LIB "C:/VDE/ADKs/default/vos/lib")
SET(VF_SDK_USR_LIB "${VF_SYSROOT}/usr/lib")
SET(VF_SDK_USR_LOCAL_LIB "${VF_SYSROOT}/usr/local/lib")
SET(VF_SDK_USR "${VF_SDK_USR_LIB}") #<-- Compatibility with old Vf detection
SET(VF_SVCMGR "${VF_SYSROOT}/usr/local/lib/svcmgr")
MESSAGE("debug1: --- ${VF_ADK_INCLUDE} --- ${VF_SYSROOT} ---")
SET(CMAKE_SYSROOT "${VF_SYSROOT}")
#Define variables for compiler and CMAKE scripts
set(VF_UX_410 TRUE)
add_definitions(-DVF_UX_410="${VF_UX_410}")
LINK_DIRECTORIES("${CMAKE_INSTALL_PREFIX}/lib")
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY BOTH)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE BOTH)
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -lrt --std=gnu99")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -lrt")
LIST(APPEND CMAKE_PREFIX_PATH "${CMAKE_INSTALL_PREFIX}")
INCLUDE_DIRECTORIES("${CMAKE_INSTALL_PREFIX}/include")
INCLUDE_DIRECTORIES("${VF_ADK_INCLUDE}")
Обратите внимание на последнюю строку, INCLUDE_DIRECTORIES("${VF_ADK_INCLUDE}")
этот каталог, VF_ADK_INCLUDE
, если он существует, будет игнорироваться во время сборки . Это означает, что вызов make
не будет иметь аргумента -IC:\VDE\ADKs\default\vos\include
, но если каталога там нет, make-файлы будут иметь правильный аргумент -I[...]
.
Если я добавлюINCLUDE_DIRECTORIES
, например:
INCLUDE_DIRECTORIES(
"X:\\"
"C:\\VDE\\ADKs\\default\\vos\\include"
"Y:\\"
)
И X:
, и Y:
будут отображаться при вызове компилятора как -IX:\ -IY:\
, но почему-то отсутствует среднее включение. Вдвойне странно, если я переименую каталог include во время конфигурации (поэтому cmake не может его найти), а затем переименую его обратно во время компиляции, CMake добавит правильный аргумент -I[...]
, и программа прекрасно скомпилируется.
КакОбходной путь, сейчас я жестко кодирую аргумент -I[...]
для переменных CMAKE_C_FLAGS
и CMAKE_CXX_FLAGS
, но это решение далеко, далеко, далеко от правильного.
edit: theMESSAGE
вызов показывает правильный путь / значение во время конфигурации CMake. Так что это не должно быть проблемой «переменная не определена».
По сути, и чтобы сделать это правильным вопросом:
Почему CMake удаляет или игнорирует включенные пути из INCLUDE_DIRECTORIES
звонки?