我寫一個Makefile,我被卡住的過濾功能限制濾波器。 事實上,過濾器只有一個通配符。的Makefile:如何申請一個相當於多個通配符
我想這樣做的是: 我有一個列表中的文件,一些相匹配的正則表達式布拉布拉的,有些不是。但爲此,我需要2個通配符,因此我無法使用過濾器功能。
我想分裂在2只列出了我原來的列表,其中包含所有包含字符串布拉布拉(過濾器等同),並含有不匹配(過濾出當量)的另一種元素。
感謝您的幫助。
我寫一個Makefile,我被卡住的過濾功能限制濾波器。 事實上,過濾器只有一個通配符。的Makefile:如何申請一個相當於多個通配符
我想這樣做的是: 我有一個列表中的文件,一些相匹配的正則表達式布拉布拉的,有些不是。但爲此,我需要2個通配符,因此我無法使用過濾器功能。
我想分裂在2只列出了我原來的列表,其中包含所有包含字符串布拉布拉(過濾器等同),並含有不匹配(過濾出當量)的另一種元素。
感謝您的幫助。
一個製作的最大的缺點是它的處理正則表達式的能力較差。功能filter
和filter-out
無法在單詞中找到「老」字。我建議這個破解:
NOT_OLD = $(shell echo $(LIST) | sed 's/[^ ]*old[^ ]* *//g')
OLD = $(filter-out $(NOT_OLD), $(LIST))
你可以利用你的shell的更高級的字符串處理能力。假設你有bash
,你可以用你的makefile
如下:
LIST := a_old_tt x_old_da a_new_da q_ty_we
LIST_NOT_OLD := $(shell l=($(LIST)); echo $${l[@]//*old*})
LIST_OLD := $(filter-out $(LIST_NOT_OLD),$(LIST))
你可以找到bash的字符串替換機制的解釋在how to delete elements from an array based on a pattern。需要雙$
才能將$
登錄保留在shell調用中。
你可以做到這一點沒有運行任何外部命令。定義兩個宏
containing = $(foreach v,$2,$(if $(findstring $1,$v),$v))
not-containing = $(foreach v,$2,$(if $(findstring $1,$v),,$v))
現在你可以做
LIST := a_old_tt x_old_da a_new_da q_ty_we
LIST_OLD := $(call containing,old,$(LIST))
LIST_NOT_OLD := $(call not-containing,old,$(LIST))
+1,看起來合理,我個人會以相同的方式實現它。 –
限制如果您需要完整的正則表達式來計算'contains'布爾值,但它適用於此特定情況。我個人不會擔心外部命令,因爲Make的性能/內部循環很可能在構建/編譯命令的目標中。 –
當然,作爲測試版他的回答說,'make'不能處理所有的正則表達式,所以如果你需要他們(但OP沒有),你顯然不能用這個答案。對這個問題的第一反應往往是拿出大槍並且引用外部命令來進行匹配,但正如本案例所示,這可能是巨大的矯枉過正。儘可能避免運行外部命令,無論是便攜性還是速度。我已經看到在大型基於製造的構建系統中擺脫不必要的外部命令會帶來巨大的性能提升。 – Idelic
您使用的GNU做或其他一些變異?並且顯示你當前的代碼,不清楚問題是什麼。 – Gilles
請提供文件的示例列表,過濾器表達式和期望的結果。現在你描述它的方式,我不清楚爲什麼'$(filter ...)'和'$(filter-out ...)'函數對你來說不夠好。 –
感謝您的回覆。我正在使用gnu make。我沒有要顯示的代碼,因爲我無法弄清楚如何編寫它。 說我有LIST = a_old_tt x_old_da a_new_da q_ty_we。 我想排序在列表內容:包含不包含表達老(a_new_da q_ty_we在列表中的所有成員 LIST_OLD包含含(在我的例子a_old_tt和x_old_da)表達舊列表中的所有成員,並 LIST_NOT_OLD我的例子)。 – user1654361