bash - 在 Makefile 中使用通配符和 ifneq
问题描述
这是我的 Makefile 的一部分:
MY_CONFIG ?= .config.yaml
...
.PHONY: %/foo
%/foo: %/bar.yaml
ifneq ($(wildcard $*/$(MY_CONFIG)),)
$(info **FOUND CONFIG FILE** )
else
$(info **DIDNT FIND CONFIG FILE** )
endif
我称这个目标为,该目录下有make myfolder/foo
文件。但是, ifneq 似乎不起作用并且它总是打印,所以我想知道如何修复我的条件(?)以使其找到配置文件。bar.yaml
.config.yaml
myfolder
DIDN'T FIND CONFIG FILE
wildcard
ifneq
文件结构:
-- Makefile
-- myfolder
---- bar.yaml
---- .config.yaml
解决方案
问题是这种说法:
ifneq (...)
$(info ... )
else
$(info ... )
endif
在 Make 语法中。它实际上并不是规则的一部分。Make 将在执行任何规则之前对其进行评估。在这种情况下:
ifneq ($(wildcard $*/$(MY_CONFIG)),)
...
在 Make 将模式规则匹配到任何东西之前,$*
没有值并且扩展为无,因此除非您的根目录中有配置文件,否则搜索将始终为负。
有几种方法可以得到你想要的结果。最简单的大概就是把规则分成两条规则:
.PHONY: %/foo
%/foo: %/bar.yaml %/$(MY_CONFIG)
@echo **FOUND CONFIG FILE**
%/foo: %/bar.yaml
@echo **DIDNT FIND CONFIG FILE**
或者,您可以按照您使用的 shell 的语法在规则中放置一个 shell 条件。
推荐阅读
- python - Pandas Dataframe groupby:一次应用多个 lambda 函数
- java - NumberFormat.getCurrencyInstance() 不返回语言环境中国和法国的货币符号 (jdk-1.8)
- c# - 用户数据未显示在模态中,但在单击按钮时会打开新选项卡,但第一条记录除外
- java - TokenEnhancer 不仅向 jwt 添加了附加信息,还向响应对象添加了附加信息
- google-cloud-platform - 通过 jenkins 推送 docker 镜像
- django - “WSGIRequest”对象没有属性“thema”
- r - 使用字符串作为参数的替换在 R 中编辑函数
- azure - jenkins 作业无法读取服务结构注册表项
- javascript - 在表格单元格内添加段落
- php - 解析时间格式