在makefile中获取编译器默认的include路径

问题描述 投票:0回答:1

我可以运行一个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/'

sed -En '

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.

我试着用反引号代替,但没有用。我试着用单引号或双引号来代替Makefile。sed 命令。我在SO上能找到的类似问题大多与命令中有$时的扩展有关,但这里应该没有问题。

如果我把命令切下来。

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

那么它似乎是在减少输出,shell会返回:

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 命令工作正常(?)

如果这是相关的(而且在上面的代码片段中还不明显),我的环境使用的是交叉编译器(arm-none-eabi-gcc)和conda环境,而且都在Mac上运行。

我想这应该没有什么关系,但我之所以需要这样做,是为了让我可以使用一些静态分析工具。当编译代码本身时,我不需要添加默认的include路径。

奖励:我试着把sed命令合二为一,但不知道怎么做......。

c gcc sed makefile include-path
1个回答
0
投票

找到问题了......sed命令中的'#'字符导致了这个问题,并使后面的所有内容被视为注释。

为了方便后人,固定的命令要简单得多,因为include路径是以''开始的。

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

0
投票

GNU Make中的宏扩展语法是非常特殊的 (make的语法,而不是shell的语法),通常不会考虑shell的元字符,如 ".

你已经包括了其中的几个,这意味着不同的东西,使(例如。:等)比他们对shell的作用更大。

你最好把整个管道写成一个shell脚本,然后在 Makefile.

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

© www.soinside.com 2019 - 2024. All rights reserved.