繁体   English   中英

Makefile 中变量扩展中的斩波后缀

[英]Chopping suffixes in variable expansion within a Makefile

如标题所述,如果我需要提供多个后缀(模式列表),我无法从 package 名称中删除后缀

注意:我在 Makefile ( SHELL=/bin/bash ) 中强制使用 bash

  • DEST_DIR : Makefile 变量

  • PKG_LIST :Makefile 变量,保存文件夹名称列表(例如“packageFsOPT1 packageAdc packageMemOPT2 .....”)。 有些名称可能有 OPT1 后缀,有些则没有。

  • tmp :存在的文件夹,包含文件夹 packageFs、packageAdc、packageMem .....

这是 Makefile 的一部分,它执行从 tmp 到 dest 的复制以及名称截断:

for pkg in $(PKG_LIST) ; do \
    cd tmp && tar xzf $$pkg-$(MAJOR).$(MINOR).$(TARGET).tar.gz tmp ; \
    cp -a tmp/$${pkg%OPT1} $(DEST_DIR) ; \
done

这是“有效的”,意味着 OPT1 确实是从 packageFsOPT1 中切下来的。 但我需要的是能够截断不同的后缀。 在这种情况下 OPT1 或 OPT2

我试过这个:

cp -a tmp/$${pkg%+(OPT1|OPT2)} $(DEST_DIR) ; \

如果直接在控制台中测试而不是在 Makefile 中测试,这是有效的(无法切碎 => OPT1 保留在文件夹名称中,该文件夹名称不存在 => 复制失败)

我有点像这样的东西(但导致 pkg_stripped 为空):

pkg_stripped=$(shell echo ${pkg%+(OPT1|OPT2)}) ; \
cp -a tmp/$$pkg_stripped $(DEST_DIR) ; \

有人有想法吗?

编辑:解决方案

要么(使用扩展全局)

for pkg in $(PKG_LIST) ; do \
    cd tmp && tar xzf $$pkg-$(MAJOR).$(MINOR).$(TARGET).tar.gz tmp ; \
    shopt -s extglob ; \
    cp -a tmp/$${pkg%+(OPT1|OPT2)} $(DEST_DIR) ; \
done

或者(使用 sed)

查看MadScientist 的回答

也许使用 GNU make 函数更简单? 是这样的:

for pkg in $(patsubst %OPT1,%,$(patsubst %OPT2,%,$(PKG_LIST))) ; do \
    cp -a tmp/$${pkg} $(DEST_DIR) ; \
done

如果您有像 fooOPT1OPT2 这样的名称(两者都将被删除),这将做错事(也许?),但这也可以解决。

预计到达时间

如果您需要两者,则必须在 shell 中完成。您不能在食谱中使用$(shell...) :这是一个 make function 所以它在 shell 启动之前由 make 扩展:它不能当然,对循环变量的任何 shell 的值进行操作。

为此,我会简单地使用sed

for pkg in $(PKG_LIST) ; do \
    prefix=$$(echo "$$pkg" | sed 's/OPT[12]$$//'); \
    cd tmp && tar xzf $$pkg-$(MAJOR).$(MINOR).$(TARGET).tar.gz tmp ; \
    cp -a tmp/$$prefix $(DEST_DIR) ; \
done

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM