Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Makefile中路径中的双斜杠_Makefile - Fatal编程技术网

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//

下面是一个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///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

。主要技术是确保人们不会在路径组件上使用尾随斜线,这些组件将与其他组件组合,并用斜线分隔二者,或者至少在预期内容上保持一致。在编写宏的值时,这是一个(相对轻松的)规程。除此之外,我不知道解决这个问题的方法。