首页 > 解决方案 > 在 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.yamlmyfolderDIDN'T FIND CONFIG FILEwildcardifneq

文件结构:

-- Makefile
-- myfolder
---- bar.yaml
---- .config.yaml

标签: bashmakefile

解决方案


问题是这种说法:

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 条件。


推荐阅读