Makefile中路径中的双斜杠
下面是一个Makefile示例,它在目标路径中使用双斜杠:Makefile中路径中的双斜杠,makefile,Makefile,下面是一个Makefile示例,它在目标路径中使用双斜杠: out/file.txt: @mkdir -p $(dir $@) @echo aaa > $@ out//file.txt: @mkdir -p $(dir $@) @echo bbb > $@ make将其解释为两个不同的目标。如果运行make out/file.txt,将执行第一条规则。如果运行make out//file.txt,将执行第二条规则 另外,如果运行make out//
out/file.txt:
@mkdir -p $(dir $@)
@echo aaa > $@
out//file.txt:
@mkdir -p $(dir $@)
@echo bbb > $@
make将其解释为两个不同的目标。如果运行make out/file.txt
,将执行第一条规则。如果运行make out//file.txt
,将执行第二条规则
另外,如果运行make out///file.txt
并且file.txt
不存在,则会出现以下错误:
make: *** No rule to make target `out///file.txt'
但是,如果文件存在,它只会说:
make: Nothing to be done for `out///file.txt'
如果运行make.///out/file.txt
或甚至make.///.//.//.///out/file.txt
那么,make如何处理不同的路径,但指向文件系统中的同一文件,是否有任何已定义的行为
我从答案中得到的答案是,操作系统本身并没有这种不同的路径。但就制造而言,它们是不同的
问题源于这种用法:
my_target: $(SOME_DIR)/some_file
如果SOME_DIR
已经有尾随斜杠,则上面的代码不起作用。它扩展为这样的内容:some\u dir//some\u file
,并且双斜杠的特定情况的规则不存在
如何避免这些问题?make中是否有任何路径规范化方法?以下是解决我问题的直接方法-创建修剪尾部斜杠的宏:
trslashes = $(if $(filter %/,$(1)),$(call trslashes,$(patsubst %/,%,$(1))),$(1))
在双斜杠可能导致问题的每个地方都必须使用此宏:
my_target: $(call trslashes,$(SOME_DIR))/some_file
如果$(SOME_DIR)
为空,则将使用根目录中的文件:
/some_文件
。如果空变量表示当前目录,则应使用另一个宏:
trslashes_cur = $(if $(1),$(call trslashes,$(1)),.)
然后,
$(调用trslashes,$(SOME_DIR))/SOME_file
将扩展到/somefile
。主要技术是确保人们不会在路径组件上使用尾随斜线,这些组件将与其他组件组合,并用斜线分隔二者,或者至少在预期内容上保持一致。在编写宏的值时,这是一个(相对轻松的)规程。除此之外,我不知道解决这个问题的方法。