2012-09-07 2 views
5

私はMakefileを作成していますが、フィルタ機能の制限があります。 実際、フィルタにはワイルドカードが1つしかありません。私がやりたい何メイクファイル:複数のワイルドカードにフィルタをかける方法を適用するには

は次のとおりです。 私はリストにファイルを、いくつかの正規表現にマッチするblablaを持って、いくつかではありません。しかし、私は2つのワイルドカードが必要なので、私はフィルタ機能を使用することはできません。

元のリストを2つのリストに分割したいと思います.1つはblabla文字列(フィルタ相当)を含むすべての要素と一致しないもの(フィルタアウト相当)を含むものです。

ご協力いただきありがとうございます。

+1

を行うことができますが、GNU作るか、または他のいくつかの変種を使用していますか?現在のコードを表示すると、問題の内容が明確ではありません。 – Gilles

+1

ファイルリスト、フィルター式、および希望の結果を入力してください。あなたが今説明しているように、 '$(filter ...)'と '$(filter-out ...)'関数があなたにとって十分でない理由は私には分かりません。 –

+0

ご返信ありがとうございます。私はgnu makeを使用しています。私はそれを書く方法を理解することができないので、表示するコードがありません。 LIST = a_old_tt x_old_da a_new_da q_ty_weと言ってください。 LISTのすべてのメンバー(私の例ではa_old_ttとx_old_da)を含むLISTと、式old(a_new_da q_ty_we in)を含まないLISTのすべてのメンバーを含む LIST_NOT_OLDを含むLIST_OLD私の例)。 – user1654361

答えて

1

Makeの最大の欠点の1つは、正規表現を処理する能力が低いことです。 filterfilter-outは、単語の途中で「古い」を見つけることができません。私はこのハックを提案します:

NOT_OLD = $(shell echo $(LIST) | sed 's/[^ ]*old[^ ]* *//g') 
OLD = $(filter-out $(NOT_OLD), $(LIST)) 
0

あなたのシェルのより高度な文字列処理機能を利用することができます。あなたは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)) 

あなたはhow to delete elements from an array based on a patternで、bashの文字列置換メカニズムの説明を見つけることができます。ダブル$は、$サインをシェル呼び出しのままにしておく必要があります。

7

これは、外部コマンドを実行することなく実行できます。二つのマクロ

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)) 
+0

+1、私は同じ方法でそれを実装すると個人的には合理的に見えます。 –

+0

'contains'ブール値を計算するために完全な正規表現が必要な場合に制限しますが、この特殊なケースでは機能します。私は個人的に外部コマンドについては心配しません。なぜなら、Makeのパフォーマンス/内部ループはbuild/compileコマンドのターゲットになる可能性が高いからです。 –

+0

確かに、ベータは彼の答えで言ったように、 'make 'は正規表現をまったく扱うことができないので、あなたがそれらを必要とするなら(OPはしません)、あなたは明らかにこの答えを使うことができません。この問題への最初の反応は、しばしば大きな銃を引き出し、外部のコマンドを呼び出してマッチングを行うことですが、このケースが示すように、それは巨大な過度の攻撃になる可能性があります。私は移植性と速度の両方のために、できるだけ外部コマンドを実行することを避けます。私は、大規模なメイクベースのビルドシステムで不要な外部コマンドを取り除くことで大きなパフォーマンスの向上を見ました。 – Idelic

関連する問題