Tôi đang sử dụng mã tương tự như sau trong một 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)
Nếu tôi sử dụng này trong một thư mục không có dấu cách, nói space-test
, nó hoạt động tốt:
$ make
TOP='/tmp/space-test'
TARGET='/tmp/space-test/foo'
touch 'foo'
Tuy nhiên, nếu tôi sử dụng nó trong một thư mục với các không gian, nói space test
, sau đó $(notdir)
làm điều sai:
TOP='/tmp/space\ test'
TARGET='/tmp/space\ test/foo'
touch 'space foo'
gì đang xảy ra ở đây là $(notdir)
diễn giải /tmp/space test/foo
như hai đường dẫn và trả về "một phần tập tin" của cả (ví dụ: space
và foo
). Phần kỳ lạ của điều này là TARGET
được thoát đúng cách; bằng cách nào đó, bên trong quy tắc hoặc bên trong $(notdir)
, các dấu gạch chéo ngược được bỏ qua.
Tôi đang làm gì sai ở đây?
Cảm ơn, Ville. Nó là vô lý mà không có cách nào để thoát khỏi đầu vào đến $ (notdir) ngoại trừ thông qua hack này (hoặc vì vậy nó có vẻ). –
Vâng. GNU Make thực sự có thể sử dụng một phiên bản tùy chọn được kích hoạt (ngược lại không tương thích) 2 của ngôn ngữ và các chức năng tiêu chuẩn. Hoặc có lẽ tốt nhất là chỉ cần sử dụng, nói, SCons hoặc một cái gì đó với một ngôn ngữ lập trình thực sự. –