【问题标题】:Why does indenting if-else with tabs break a Makefile?为什么使用制表符缩进 if-else 会破坏 Makefile?
【发布时间】:2018-12-05 15:08:39
【问题描述】:

这是一个 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 设置为空。这是为什么呢?

我的make版本:

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.

【问题讨论】:

    标签: linux makefile gnu-make


    【解决方案1】:

    当您使用 TAB 缩进一行时,make 假定它是前一个目标的配方的一部分(如果有的话)。在这种情况下,有 .PHONY 目标,因此 make 假设这两行是 .PHONY 目标(从未使用过)的配方的一部分。因此,这些 make 变量赋值不会运行。

    makefile 的简单规则是,始终使用 TAB 缩进配方行,并且永远不要使用 TAB 缩进任何其他行。

    【讨论】:

      猜你喜欢
      • 2013-05-09
      • 2010-09-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-25
      • 2015-03-25
      • 1970-01-01
      相关资源
      最近更新 更多