首页 > 解决方案 > cmake 总是在导入的接口目标上使用 `-isystem`

问题描述

我正在尝试编写一个 CMakeLists.txt 来编译我的 Arduino-Projects 以更好地了解 cmake。我将 Arduino-Core 库定义为一个导入的接口,并尝试将我自己的目标链接到它。问题是,当调用makeavr-gcc 时,提供了指定的包含路径,-isystem而不是-I. 这会导致几个错误。

CMakeLists.txt(重现问题的最小版本)

cmake_minimum_required(VERSION 3.1)
set(ARDUINO_DIR "/opt/arduino/arduino-1.8.13")
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_C_COMPILER ${ARDUINO_DIR}/hardware/tools/avr/bin/avr-gcc)
set(CMAKE_CXX_COMPILER ${ARDUINO_DIR}/hardware/tools/avr/bin/avr-g++)
set(CMAKE_SYSTEM_NAME NONE)
set(CMAKE_SYSTEM_PROCESSOR NONE)

add_library(Arduino::Core INTERFACE IMPORTED)
target_include_directories(Arduino::Core INTERFACE 
  "${ARDUINO_DIR}/hardware/arduino/avr/cores/arduino/"
  "${ARDUINO_DIR}/hardware/arduino/avr/variants/eightanaloginputs/"
)
file(GLOB_RECURSE ARDUINO_CORE_SRC "${ARDUINO_DIR}/hardware/arduino/avr/cores/arduino/*.c[p]*")
file(GLOB_RECURSE ARDUINO_CORE_ASM "${ARDUINO_DIR}/hardware/arduino/avr/cores/arduino/*.S")
target_sources(Arduino::Core INTERFACE ${ARDUINO_CORE_SRC} ${ARDUINO_CORE_ASM})
project(Blinky)

set(${PROJECT_NAME}_SRC
  src/Blink.cpp
)
add_executable(${PROJECT_NAME} ${${PROJECT_NAME}_SRC})
target_link_libraries(${PROJECT_NAME} Arduino::Core)

这是我的 Blink.cpp:

#include <Arduino.h>
void setup()
{
  pinMode(13,OUTPUT);
}
void loop()
{
  digitalWrite(13,HIGH);
  delay(1000);
  digitalWrite(13,LOW);
  delay(1000);
}

make --trace给我以下输出:

[  5%] Building CXX object CMakeFiles/Blinky.dir/src/Blink.cpp.obj
/opt/arduino/arduino-1.8.13/hardware/tools/avr/bin/avr-g++  -isystem     /opt/arduino/arduino-1.8.13/hardware/arduino/avr/cores/arduino -isystem /opt/arduino/arduino-1.8.13/hardware/arduino/avr/variants/eightanaloginputs -std=gnu++11 -o CMakeFiles/Blinky.dir/src/Blink.cpp.obj -c /tmp/so/src/Blink.cpp

如您所见,-isystem即使我没有SYSTEM在任何地方声明,链接到导入的目标也包括依赖项?我怎么能防止呢?!是不是因为它是一个INTERFACE IMPORTED目标?我试过taget_include_directories(Arduino::Core PRIVATE ${my_include_dirs})了,但显然INTERFACE-Targets 不允许这样做。

提前感谢您的每一个提示。

PS请注意,我知道,这不会编译我的arduino代码。这只是一个 mcve 向您展示我的问题。

编辑

我正在使用 Arduino-SDK 1.8.13 和 cmake 3.18.2

标签: gcccmakeinclude-pathavr-gcccompiler-flags

解决方案


推荐阅读