我可以运行一个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命令合二为一,但不知道怎么做......。
找到问题了......sed命令中的'#'字符导致了这个问题,并使后面的所有内容被视为注释。
为了方便后人,固定的命令要简单得多,因为include路径是以''开始的。
arm-none-eabi-gcc -xc -E -Wp,-v /dev/null 2>&1 | sed -En '/^ /s/^ /-I/p'
GNU Make中的宏扩展语法是非常特殊的 (make的语法,而不是shell的语法),通常不会考虑shell的元字符,如 "
.
你已经包括了其中的几个,这意味着不同的东西,使(例如。:
等)比他们对shell的作用更大。
你最好把整个管道写成一个shell脚本,然后在 Makefile
.
不要用shell引号保护的参数来构建管道,因为make根本不考虑引号。