Почему CMake удаляет некоторые включаемые каталоги из вызовов INCLUDE_DIRECTORIES ()? - PullRequest
0 голосов
/ 24 октября 2019

Мы пытаемся выполнить кросс-компиляцию определенного программного обеспечения, и в большинстве случаев оно работает. Однако включаемые файлы разделены на несколько каталогов, и, если каталог находится за пределами дерева 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 звонки?

1 Ответ

0 голосов
/ 28 октября 2019

Через несколько дней я не смог найти лучшего ответа, поэтому я опубликую этот ответ для себя, так как он работает.

Во время обнаружения компилятора CMake извлечет ряд неявных путей включениякоторые обычно всегда доступны и, если они добавлены для включения путей, могут нарушить процесс компиляции (спасибо @Tsyvarev за предостережение). Однако, если этот путь будет неправильно добавлен к исключенным путям, единственный способ, которым я смог найти переопределение, это полное удаление списка исключений с помощью:

unset(CMAKE_C_IMPLICIT_INCLUDE_DIRECTORIES)
unset(CMAKE_CXX_IMPLICIT_INCLUDE_DIRECTORIES)

Как описано в https://gitlab.kitware.com/cmake/cmake/issues/17966, но этоВ решении используется внутреннее устройство CMake, поэтому оно может зависеть или зависеть от вашего компилятора или средыВ данном конкретном случае исправление сработало.

В аналогичной ситуации, опять же с проприетарным + старинным набором инструментов gcc, работало простое обновление до последней версии CMake, по-видимому, из-за лучшего обнаружения компилятора.

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