GNU make 在 -I(共享目录)选项后添加白色 space

GNU make is adding white space after -I (shared directory) option

我正在尝试通过 GNU makefile 使用 armclang 编译器,但是在使用 -I 选项时这两个工具之间存在冲突。

对于 armclang 编译器,-I 表示没有 space 的 "Adds the specified directory to the list of places that are searched to find included files.Syntax -Idir"。

对于 GNU makefile ‘-I dir’ 具有相同的含义(但带有 space)。

在我的 makefile 中有以下内容:

$(aarch32_bootobj): %.o: %.s
     @echo " [ASM ] $<"
     @armclang --target=armv8a-arm-none-eabi -Icommon/shared -c $< -o $@

当 运行 Makefile 时,我收到以下警告和错误:

    armclang: warning: argument unused during compilation: '-I common/shared'
    aarch32/shared/bootcode.s:32:10: error: Could not find include file 'boot_defs.hs'

其中 boot_defs.hs 存在于 common/shared

当 运行在 makefile 之外使用相同的 armclang 命令时,它可以工作。因此我假设 makefile 已经格式化了 -Icommon/share 选项并在 -I.

之后添加了自动 space

有什么方法可以正确运行 armclang 命令吗?在其他世界中,是否可以让 makefile 解析 -Icommon/shared 而无需任何自动格式化?

我已经尝试了很多技巧来解决这个问题,但都没有成功。

非常感谢。

GNU make 不会拆分 -Icommon/shared 选项,即使拆分了 armclang 也能解析它。如果您从 Makefile 中的 armclang 调用中删除 @,您将确切地看到 make 做了什么并且 -Icommon/shared 参数保持不变。

你的问题是armclang;查看智能设备上的 this bug。它不会将 -I 标志传递给它的集成汇编器。那么,解决方法应该是将 -no-integrated-as 传递给 armclang:

     @armclang -no-integrated-as --target=armv8a-arm-none-eabi -Icommon/shared -c $< -o $@

如果这不起作用,请将 .include 指令替换为 #include 并将您的 asm 文件重命名为 .S(大写 S),这表明他们需要 C 预处理,或者传递 armclang -x assembler-with-cpp 标志。此行为记录在案 here.