簡體   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