ifeq问题:比较包含点的2个字符串

时间:2013-09-10 13:51:18

标签: gnu-make

我正在尝试实现一个简单的字符串比较来获取文件的类型(使用其扩展名),如下所示:

extract_pkg: $(PKG)
    $(eval EXT := $(suffix $(PKG)))
    @echo $(EXT)
ifeq ($(EXT), .zip)
    @echo "is zip file"
else
    @echo "is not a zip file"
endif

extract_pkg : PKG = mypkg.zip

然而,当我运行它时,它会进入else分支。我的猜测是,它与点有关,但我没有找到解决方案。谢谢你的帮助!

编辑1:基本代码实际上有点类似于以下内容,它按预期工作:

test_cmp:
ifeq (.zip,.zip)
        @echo ".zip==.zip"
endif
ifeq (zip,zip)
        @echo "zip==zip"
endif

因此问题出在其他地方!

2 个答案:

答案 0 :(得分:9)

要注意的一件事 - if构造中的空格很重要。所以如果你有类似的东西:

ifeq ($(EXT), .zip)

只有当$(EXT)扩展到“.zip”时才会匹配 - 包括句点之前的空格。因此,您的第一个示例将始终打印is not a zip file,因为$(EXT)将永远不会包含空格。

答案 1 :(得分:8)

您不能在食谱中使用ifeq()等。 ifeq()是预处理程序语句:在读入makefile时会立即解释它们。在解析所有makefile并决定需要更新此目标之后,配方才会运行很久。因此,尝试使用eval等在配方中设置变量,然后使用ifeq()测试该变量无效。

你必须为此使用shell构造;类似的东西:

extract_pkg: $(PKG)
        @EXT=$(suffix $<); \
         echo $$EXT; \
         if [ $$EXT = .zip ]; then \
            echo "is zip file"; \
        else \
            echo "is not a zip file"; \
        fi