我似乎在製作Makefile,列表處理和模式規則方面存在一些問題。當我的源代碼安裝在名稱包含'%'的目錄中時,它無法正確構建。我已經將它歸結爲任何人都可以運行的簡單測試案例。製作和百分號登錄路徑
我有下面的Makefile:
INSTALL_DIR=$(shell pwd)/idir
INSTALL_TREE =
INSTALL_TREE += $(INSTALL_DIR)/dir1
INSTALL_TREE += $(INSTALL_DIR)/dir2
INSTALL_TREE += $(INSTALL_DIR)/dir3
create_tree: $(INSTALL_TREE)
$(INSTALL_TREE):
mkdir -p [email protected]
我把這個目錄中名爲Test1,當我運行它,我得到我想要的東西......在INSTALL_TREE中列出的所有目錄中創建:
% make -n
mkdir -p /home/christopher.arguin/test/test1/idir/dir1
mkdir -p /home/christopher.arguin/test/test1/idir/dir2
mkdir -p /home/christopher.arguin/test/test1/idir/dir3
現在使用完全相同的Makefile文件名爲test%2目錄,這就是我得到:
% make -n
mkdir -p /home/christopher.arguin/test/test2%/idir/dir1
它在第一個目錄之後停止。有趣的是,如果第一個目錄沒有%符號,他們都得到產生......,例如,
INSTALL_TREE =
INSTALL_TREE += ./idir/dir4
INSTALL_TREE += $(INSTALL_DIR)/dir1
INSTALL_TREE += $(INSTALL_DIR)/dir2
INSTALL_TREE += $(INSTALL_DIR)/dir3
給我:
mkdir -p dir4
mkdir -p /home/christopher.arguin/test/test2%/idir/dir1
mkdir -p /home/christopher.arguin/test/test2%/idir/dir2
mkdir -p /home/christopher.arguin/test/test2%/idir/dir3
另一個有趣的事情是,文件名正確的...如果%被誤解爲前綴規則或者你可能期望有一些替換,但是如果我讓它創建目錄,它絕對是正確的。
我試過轉義%字符,但無濟於事。添加以下代碼:
PERCENT := %
ITREE = $(subst $(PERCENT),$(PERCENT)$(PERCENT),$(INSTALL_TREE))
create_tree2: $(ITREE)
$(ITREE):
mkdir -p [email protected]
就產生
mkdir -p /home/christopher.arguin/test/test2%%/idir/dir1
的替代工作,但它實際上並沒有逃脫百分號。 「$(PERCENT)」替換爲「%」,因爲文件名後面只包含了$(PERCENT)。
我發現了兩個相關的問題, Does GNU Make support '%' in a filename? 和How to correctly escape "%" sign when using pattern rules and patsubst in GNU make? 但那些都遭受了基本的問題,我有......我的源目錄是在我的掌握。
背景: 原因是這對我來說是一個問題,我試圖遷移到詹金斯多分支管道。當詹金斯檢測到提交時,它會根據分支的名稱創建一個工作區。如果你的分支命名約定恰好有斜線,Jenkins會做正確的事情並將它們轉換爲「%2F」。我的makefile與這些文件發生衝突。
你可以做一個符號鏈接嗎? – Beta
不幸的是,因爲在這種情況下,工作區的名稱由Jenkins處理。 –
看起來詹金斯傢伙現在正在積極努力避免這個問題:https://issues.jenkins-ci.org/browse/JENKINS-34564 –