为什么使用制表符缩进 if-else 会破坏 Makefile?
Why does indenting if-else with tabs break a Makefile?
这是一个 Makefile:
.PHONY: all
ifeq ($(OS),Windows_NT)
DETECTED_OS := Windows
else
DETECTED_OS := $(shell uname -s)
endif
$(info DETECTED_OS is set to '$(DETECTED_OS)')
使用制表符缩进时打印
DETECTED_OS is set to ''
但是当缩进 0 个或更多空格时,它会打印
DETECTED_OS is set to 'Linux'
但是如果你删除第一行 .PHONY: all
它会打印
DETECTED_OS is set to 'Linux'
不考虑制表符或空格。
所以第一个版本被破坏了,因为它将 DETECTED_OS
设置为空。这是为什么?
我的制作版本:
GNU Make 4.1
Built for x86_64-pc-linux-gnu
Copyright (C) 1988-2014 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
当您使用 TAB 缩进一行时,make 假定它是前一个目标的配方的一部分(如果有的话)。在这种情况下,有 .PHONY
目标,因此 make 假设这两行是 .PHONY
目标(从未使用过)的配方的一部分。因此,这些 make 变量赋值不是 运行.
makefile 的简单规则是,始终使用 TAB 缩进配方行,永远不要使用 TAB 缩进任何其他行。
这是一个 Makefile:
.PHONY: all
ifeq ($(OS),Windows_NT)
DETECTED_OS := Windows
else
DETECTED_OS := $(shell uname -s)
endif
$(info DETECTED_OS is set to '$(DETECTED_OS)')
使用制表符缩进时打印
DETECTED_OS is set to ''
但是当缩进 0 个或更多空格时,它会打印
DETECTED_OS is set to 'Linux'
但是如果你删除第一行 .PHONY: all
它会打印
DETECTED_OS is set to 'Linux'
不考虑制表符或空格。
所以第一个版本被破坏了,因为它将 DETECTED_OS
设置为空。这是为什么?
我的制作版本:
GNU Make 4.1
Built for x86_64-pc-linux-gnu
Copyright (C) 1988-2014 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
当您使用 TAB 缩进一行时,make 假定它是前一个目标的配方的一部分(如果有的话)。在这种情况下,有 .PHONY
目标,因此 make 假设这两行是 .PHONY
目标(从未使用过)的配方的一部分。因此,这些 make 变量赋值不是 运行.
makefile 的简单规则是,始终使用 TAB 缩进配方行,永远不要使用 TAB 缩进任何其他行。