首页 > 解决方案 > makefile 中的 grep 函数

问题描述

我正在尝试SonarQube对我的C代码进行分析。我想将分析作为 make 目标运行。我想通过使用 git 命令添加一个属性来获取分支名称

我尝试构建 git 命令来获取分支名称(也涵盖了处于分离HEAD状态时的条件)。

我的 Makefile 中的这一特定行导致了问题

SONAR_SCANNER_OPTS = -Dsonar.branch.name=$(shell git ls-remote --heads origin | grep $(git rev-parse HEAD) | cut -d / -f3,4) -Dsonar.projectVersion=$(shell date +%Y%m%d%H%M-${USER})

我得到的错误是:

用法:grep [OPTION]... PATTERN [FILE]... 尝试 'grep --help' 获取更多信息。

谁能帮我理解我的语法有什么问题?我已经尝试了更多的东西,比如双引号命令,使用 $$ 和改变括号,但它的行为不像预期的那样。

标签: gitshellmakefile

解决方案


SONAR_SCANNER_OPTS = -Dsonar.branch.name=$(shell git ls-remote --heads origin | grep $(git rev-parse HEAD) | cut -d / -f3,4) -Dsonar.projectVersion=$(shell date +%Y%m%d%H%M-${USER})

你有

| grep $(git rev-parse HEAD) |

Make 认为这git是一个 make 函数,就像它认为shell是一个 make 函数一样。但与 不同shell的是,Make 函数git不存在,所以它是空的,所以上面的管道相当于

| grep |

这就是为什么您会收到 grep 的使用信息。

您需要将其替换为

| grep $(shell git rev-parse HEAD) |

另一种方法是让 shell 执行 git 而不是让 Make 执行它:

| grep $$(git rev-parse HEAD) |

但这不太可读。


推荐阅读