とパスに$(DIR)または$(notdirを)作るの使用:私はスペースなしのディレクトリにこれを使用する場合は私はMakefileの中で次のようなコード使用していますスペース
empty:=
space:= $(empty) $(empty)
path_escape = $(subst $(space),\$(space),$(1))
TOP=$(call path_escape,$(abspath .))
TARGET=$(TOP)/foo
$(info TOP='$(TOP)')
$(info TARGET='$(TARGET)')
all: $(TARGET)
$(TARGET):
touch '$(notdir [email protected])'
.PHONY: $(TARGET)
を、 space-test
を言う、それが正常に動作します:
TOP='/tmp/space\ test'
TARGET='/tmp/space\ test/foo'
touch 'space foo'
:
$ make
TOP='/tmp/space-test'
TARGET='/tmp/space-test/foo'
touch 'foo'
をしかし、私は、スペースを含むディレクトリにそれを使用space test
を言うなら、$(notdir)
は間違ったことをして
ここで起こっている何が$(notdir)
/tmp/space test/foo
としてパスを解釈し、両方(すなわち、space
及びfoo
)の「ファイル部分」を返すことです。これの奇妙な部分は、TARGET
が適切にエスケープされていることです。何らかの形で、ルール内または$(notdir)
の中で、バックスラッシュのエスケープは無視されます。
私はここで間違っていますか?
ありがとう、ヴィル。このハック(またはそう思われる)を除いて、入力を$(notdir)にエスケープする方法がないことはかなりばかげている。 –
うん。 GNU Makeは実際に、言語と標準関数のバージョン2をオプションで有効にすることができます(後方互換性はありません)。あるいは、実際のプログラミング言語を使ってSConsや何かを使うだけの方がいいかもしれません。 –