我想將所有先決條件復制到一個檔案夾中,然后在那里處理它們。我嘗試了一個 shell for 回圈,但語法似乎不同
for f in $^; do cp $f some/folder/; done
我還嘗試了 GNU make 的 foreach 回圈
$(foreach f,$^,cp $f some/folder/)
我找到了這個解釋,但我真的不明白
make:為每個先決條件執行一個動作
這是我的食譜
CURRENT := $(PWD)
IMAGE_TREE_SOURCE := ./device/layer/kernelFitImage.its
FIT_PREREQUISITES := $(TARGET_OUT_INTERMEDIATES)/KERNEL_OBJ/arch/$(TARGET_KERNEL_ARCH)/boot/Image \
$(PRODUCT_OUT)/ramdisk-recovery.img \
$(TARGET_OUT_INTERMEDIATES)/KERNEL_OBJ/arch/$(TARGET_KERNEL_ARCH)/boot/dts/freescale/imx8mm-gpv-distec.dtb \
$(IMAGE_TREE_SOURCE)
FIT_IMAGE_TARGET := $(PRODUCT_OUT)/boot/fitImage
$(FIT_IMAGE_TARGET): $(FIT_PREREQUISITES)
echo "Creating FIT image"
mkdir -p $(dir $@)
# for f in $^; do $$f $(PRODUCT_OUT)/boot; done
cd $(PRODUCT_OUT)/boot
cp $(TARGET_OUT_INTERMEDIATES)/KERNEL_OBJ/arch/$(TARGET_KERNEL_ARCH)/boot/Image .
cp $(PRODUCT_OUT)/ramdisk-recovery.img .
cp $(TARGET_OUT_INTERMEDIATES)/KERNEL_OBJ/arch/$(TARGET_KERNEL_ARCH)/boot/dts/freescale/imx8mm-gpv-distec.dtb .
cp $(IMAGE_TREE_SOURCE) .
mkimage -f kernelFitImage.its $@
rm ./Image
rm ./ramdisk-recovery.img
rm ./imx8mm-gpv-distec.dtb
rm ./kernelFitImage.its
cd $(CURRENT)
我試圖替換所有的復制陳述句來清理這個配方。
uj5u.com熱心網友回復:
你不需要回圈;你為什么不能使用cp $^ $(PRODUCT_OUT)/boot?但是,for 回圈確實有效。失敗后去目錄看看,沒看到你復制的檔案嗎?如果某件事失敗了,您將不得不尋找其他問題。
我要指出的是,除非您在 makefile 中設定 oneshell,否則這是行不通的:
cd $(PRODUCT_OUT)/boot
cp $(TARGET_OUT_INTERMEDIATES)/KERNEL_OBJ/arch/$(TARGET_KERNEL_ARCH)/boot/Image .
...
配方中的每個單獨的邏輯行都在單獨的 shell 中運行。所以在每一行完成后,shell 退出(所以 make 知道它的退出代碼是什么以及它是否失敗)。當這種情況發生時,shell 本地的所有背景關系(包括環境變數和作業目錄)都將被丟棄。
因此,cd ...上面的行是一個空操作:它將更改為子shell 中的目錄,然后子shell 退出,您又回到了開始的地方。下一個 shell 仍將在原始目錄中。
您必須通過添加分號和反斜杠將其轉換為單個邏輯行:
cd $(PRODUCT_OUT)/boot; \
cp $(TARGET_OUT_INTERMEDIATES)/KERNEL_OBJ/arch/$(TARGET_KERNEL_ARCH)/boot/Image .; \
...
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/338045.html
