2015-11-04 49 views
0

我想在我的Makefile中運行uninstall目標時使用函數/宏來交換兩個文件。如何在GNU make函數中交換兩個文件?

這裏是我有的只留下其中的一個文件和刪除其他兩個:

swap = mv $(1) $(3); mv $(2) $(1); mv $(3) $(2) 

uninstall: 
    @$(call swap,`printf "%s\n" $(FILE).* | sort -r | sed -n 1p`,\ 
     $(FILE),$(shell mktemp $(FILE).XXX)) 
+0

你沒有運行'mktemp'命令的任何地方。試試'@set -x; $(call ....)'看看實際運行的是什麼。這應該對你有所幫助。 –

+0

從我的編輯器複製粘貼時出現本地錯誤。我正在嘗試使用'ticks'和'$(shell ...)'。我已經更新了這個例子。 –

+0

上述函數實際上起作用,如果我只是'$(call 1,2,3)',問題出現在'mktemp'的某處。 –

回答

0

如果你知道什麼樣的文件交換,你可以嘗試像下面這樣。我假設交換對是fooXXX, barXXX

define SWAP_files 
swap_$(1): 
    @temp=$$(shell mktemp temp.XXXXXX); \ 
    to_swap_with=$$(patsubst foo%,bar%,$(1)); \ 
    mv $(1) $$$$temp; \ 
    mv $$$$to_swap_with $(1); \ 
    mv $$$$temp $$$$to_swap_with 

uninstall: swap_$(1) 
endef 

$(foreach foo,$(FOOS),$(eval $(call SWAP_files,$(foo)))) 

的foreach fooXXX文件時,它實例化一個規則:

swap_fooXXX: 
    @temp=$(shell mktemp temp.XXXXXX); \ 
    to_swap_with=$(patsubst foo%,bar%,fooXXX); \ 
    mv fooXXX $$temp; \ 
    mv $$to_swap_with fooXXX; \ 
    mv $$temp $$to_swap_with 

和規則:

uninstall: swap_fooXXX