[英]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.