【问题标题】:Getting the compiler default include path into a makefile将编译器默认包含路径获取到生成文件中
【发布时间】:2020-05-05 17:47:42
【问题描述】:

我可以运行 shell 命令从编译器中获取默认包含路径(并附加 -I):

arm-none-eabi-gcc -xc -E  -Wp,-v  /dev/null 2>&1 | sed -En '/#include <...> search starts here:/,/End of search list./{//!p;};' | sed 's/^ /-I/'

我正在尝试将其添加到 Makefile 中:

PROJECT_INC = $(shell arm-none-eabi-gcc -xc -E  -Wp,-v /dev/null 2>&1 | sed -En "/#include <...> search starts here:/,/End of search list./{//!p;}" | sed "s/^ /-I/")

然后我得到一个错误:

Makefile:104: *** unterminated call to function `shell': missing `)'.  Stop.

我尝试使用反引号,但没有帮助。尝试对 sed 命令使用单引号或双引号。我能在 SO 上找到的大多数类似问题都与命令中有 $ 时的扩展有关,但在这里应该不是问题。

如果我删掉命令:

PROJECT_INC = $(shell arm-none-eabi-gcc -xc -E  -Wp,-v /dev/null 2>&1  )

然后它似乎正在减少输出。 外壳会返回

ignoring duplicate directory "/Users/mjeanson/miniconda3/envs/project/bin/../lib/gcc/../../lib/gcc/arm-none-eabi/8.3.1/include"
ignoring nonexistent directory "/Users/mjeanson/miniconda3/envs/project/bin/../arm-none-eabi/usr/local/include"
ignoring duplicate directory "/Users/mjeanson/miniconda3/envs/project/bin/../lib/gcc/../../lib/gcc/arm-none-eabi/8.3.1/include-fixed"
ignoring duplicate directory "/Users/mjeanson/miniconda3/envs/project/bin/../lib/gcc/../../lib/gcc/arm-none-eabi/8.3.1/../../../../arm-none-eabi/include"
ignoring nonexistent directory "/Users/mjeanson/miniconda3/envs/project/bin/../arm-none-eabi/usr/include"
#include "..." search starts here:
#include <...> search starts here:
 /Users/mjeanson/miniconda3/envs/project/bin/../lib/gcc/arm-none-eabi/8.3.1/include
 /Users/mjeanson/miniconda3/envs/project/bin/../lib/gcc/arm-none-eabi/8.3.1/include-fixed
 /Users/mjeanson/miniconda3/envs/project/bin/../lib/gcc/arm-none-eabi/8.3.1/../../../../arm-none-eabi/include
End of search list.
# 1 "/dev/null"
# 1 "<built-in>"
# 1 "<command-line>"
# 1 "/dev/null"

在 Makefile 中运行它,它将从第一行以#include 开始丢弃,但否则它可以工作。不确定在sed 命令的管道正常工作后这是否仍然是一个问题(?)

如果这是相关的(并且在上面的代码 sn-ps 中还不是很明显),我的环境正在使用交叉编译器 (arm-none-eabi-gcc) 并且在 conda 环境中并且全部在 Mac 上运行。

我认为这无关紧要,但我需要这样做的原因是我可以使用一些静态分析工具。在自己编译代码的时候,我不需要添加默认的包含路径。

奖励:我尝试将 sed 命令合二为一,但不知道该怎么做...

【问题讨论】:

    标签: c gcc sed makefile include-path


    【解决方案1】:

    发现问题... sed 命令中的“#”字符导致了问题,并导致 make 将所有内容视为注释。

    对于后人来说,固定命令要容易得多,因为包含路径以''开头:

    arm-none-eabi-gcc -xc -E  -Wp,-v  /dev/null 2>&1 | sed -En '/^ /s/^ /-I/p'
    

    【讨论】:

      【解决方案2】:

      GNU Make 中宏扩展的语法非常具体(针对 make,而不是针对 shell),并且通常不考虑 shell 元字符,如 "

      您已经包含了其中的几个,这意味着要制作与外壳不同的东西(例如: 等)。

      您最好将完整的管道写入一个 shell 脚本,然后只使用Makefile 中的 shell 脚本名称。

      不要使用受 shell 引用保护的参数构建管道,因为 make 根本不考虑引用。

      【讨论】:

        猜你喜欢
        • 2012-07-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-12-06
        • 2011-05-16
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多