2009-10-09 13 views
17

を作りますしかし、セパレータとしてセミコロンを使用しています:参加要素が、私はこのように、ディレクトリのリストで変数を持っている私のmakefileで

PATH = /usr:/usr/share/:/lib 

はどのように私はそれを行うのですか?つまり、スペースの代わりにセミコロンでDIRSリストの要素を結合するにはどうすればいいですか?

エリックMelski

+0

+1私はまったく同じ質問をしています。これは簡単だと思います。 –

答えて

30

あなたは、単一のスペースの値を持つ変数を取得するためにちょっとしたトリックと組み合わせ$(subst)コマンドを使用することができますきれいなフォーム(私は見つけることができること):

classpathify = $(subst $(eval) ,:,$(wildcard $1)) 
cp = a b c d/*.jar 

target: 
    echo $(call classpathify,$(cp)) 
# prints a:b:c:d/1.jar:d/2.jar 

注:

  • 擬似関数にすると、インラインストリング操作をインラインで行うよりも明確になります。
  • ほとんどの場合、クラスパスを指定するときにこれらの2つを一緒に使用するので、$(ワイルドカード)関数が含まれています
  • カンマの後に余分なスペースを入れないようにするか、 ":: a:b :c:d:e "と表示されます。
+0

うわー、魅力のように、多くの感謝の作品!数時間それを苦労している! –

+1

そこには '$(noop)'の代わりに '$(eval)'を使うこともできるので、noopを定義する必要はありません。 –

+2

+1そのような黒い魔法を見つける。 –

8

に、

p = /usr /usr/share /lib 
noop= 
space = $(noop) $(noop) 

all: 
     @echo $(subst $(space),:,$(p)) 

希望に役立ちます:

+0

私が追加したいこと:Javaが "-cp lib/*"構文をサポートするようになったので、$(ワイルドカード$ 1)を避けることができます。これは、JavaプロジェクトがJARの1トンは、特定のプラットフォームで長さ制限を超えるケースにつながる可能性があります。 –

+1

より一般的な形式: joinwith = $(subst $(eval)、$ 1、$ 2) $(joinwith、-o、$(list_of_files_separated_by_spaces)) –

関連する問題