4

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

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

因此问题出在其他地方!

4

2 回答 2

10

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

ifeq ($(EXT), .zip)

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

于 2013-09-10T17:10:23.810 回答
9

您不能在配方中使用 ifeq() 等。ifeq() 是预处理器语句:它们在读入 makefile 时立即被解释。配方直到很久以后才运行,在所有 makefile 被解析并且 make 决定需要更新这个目标之后。因此,尝试使用 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
于 2013-09-11T01:56:42.730 回答