【问题标题】:Makefile executing shell command hangs执行 shell 命令的 Makefile 挂起
【发布时间】:2021-07-11 12:50:14
【问题描述】:

我的 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)

config.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 "(?&lt;=\")(.*?)(?=\")" src/config/config.h)")

我的 makefile 有什么问题?谢谢。

【问题讨论】:

    标签: shell awk sed makefile grep


    【解决方案1】:

    $ 是特殊的。如果你想将它传递给 shell,在 BOTH 一个配方 AND 在一个 $(shell ...) 函数中,你必须将它转义为 $$

    所以这里:

    BOARD :=  $(shell awk '/BOARD_VERS/{print $NF}' $(echo "src/config/$(grep -oP "(?<=\")(.*?)(?=\")" src/config/config.h)"))
    

    $(echo ...) 被 make 视为具有长而奇怪的名称的 make 变量,并扩展为空字符串。所以基本上你没有向awk 传递任何参数,这意味着它正在读取要操作的标准输入,这就是它看起来挂起的原因。

    你必须将所有不是 make 变量的 $ 加倍:

    BOARD :=  $(shell awk '/BOARD_VERS/{print $$NF}' $$(echo "src/config/$$(grep -oP "(?<=\")(.*?)(?=\")" src/config/config.h)"))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-09
      • 2023-03-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多