首页 > 解决方案 > 执行 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有什么问题?谢谢你。

标签: shellawksedmakefilegrep

解决方案


$做起来很特别。如果你想将它传递给 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)"))

推荐阅读