shell - 执行 shell 命令的 Makefile 挂起
问题描述
我的 makefile 遇到问题,因为它在我发出make debug
.
这是目录的树:
├── makefile
└── src
└── config
├── config_192_168_3_226.h
└── config.h
这是三个文件的内容:
生成文件:
BOARD := $(shell awk '/BOARD_VERS/{print $NF}' $(echo "src/config/$(grep -oP "(?<=\")(.*?)(?=\")" src/config/config.h)"))
.PHONY: debug
# Debug rule
debug:
@echo 'BOARD :' $(BOARD)
配置.h:
#ifndef _CONFIG_H
#define _CONFIG_H
#include "config_192_168_3_226.h"
#endif /* _CONFIG_H */
config_192_168_3_226.h:
#define BOARD_VERS V1
我用来设置BOARD变量的命令工作正常,但在我的 makefile 中发出时却没有。
awk '/BOARD_VERS/{print $NF}' $(echo "src/config/$(grep -oP "(?<=\")(.*?)(?=\")" src/config/config.h)")
我的makefile有什么问题?谢谢你。
解决方案
$
做起来很特别。如果你想将它传递给 shell,在一个配方和一个函数$(shell ...)
中,你必须将它转义为$$
.
所以在这里:
BOARD := $(shell awk '/BOARD_VERS/{print $NF}' $(echo "src/config/$(grep -oP "(?<=\")(.*?)(?=\")" src/config/config.h)"))
make将$(echo ...)
其视为具有长而奇怪的名称的 make 变量,并扩展为空字符串。所以基本上你没有传递任何参数,awk
这意味着它正在读取标准输入以进行操作,这就是它看起来挂起的原因。
您必须将所有$
不是 make 变量的变量加倍:
BOARD := $(shell awk '/BOARD_VERS/{print $$NF}' $$(echo "src/config/$$(grep -oP "(?<=\")(.*?)(?=\")" src/config/config.h)"))