26

パスのコロンで区切られたリストが与えられた場合、GNUMakeでスペースで区切られたリストを取得するの簡単です。

CPATHS := /usr/bin/foo:/usr/bin/baz:/usr/bin/baz
SPATHS := $(subst :, ,$(CPATHS))

しかし、私は反対の方向に進むための良い方法を見つけることができませんでした。次のハックは機能しますが(少なくともsedがインストールされている場合)、Makeの内部関数を使用するだけでこれを解決するためのより良い方法があると確信しています。

SPATHS := /usr/bin/foo /usr/bin/baz /usr/bin/baz
CPATHS := $(shell echo $(SPATHS) > tmp; sed 's/ \+/:/g' tmp; rm tmp)
4

2 に答える 2

30

ここでの唯一のトリッキーな部分は、リテラルスペースを定義することです。

space := $(subst ,, )

SPATHS := /usr/bin/foo /usr/bin/baz /usr/bin/baz
CPATHS := $(subst $(space),:,$(SPATHS))
于 2012-05-13T12:55:44.320 に答える
18

リテラルスペースを取得する最短の方法は、を使用すること$() $()です。したがって:

$(subst $() $(),:,$(CPATHS))

または、簡潔にするために:

_=$() $()
$(subst $(_),:,$(CPATHS))

同じトリックがcmakeのマクロで機能することは、おそらく興味深い好奇心です。つまり、それ${}はセパレーターですが、それ自体では空白を導入しません。

于 2018-08-16T10:23:37.233 に答える