Почему отступ if-else с помощью вкладок нарушает Makefile? - PullRequest
0 голосов
/ 05 декабря 2018

Вот 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.

1 Ответ

0 голосов
/ 05 декабря 2018

Когда вы делаете отступ в строке с помощью клавиши TAB, make предполагает, что это часть рецепта для предыдущей цели, если она есть.В этом случае есть цель .PHONY, поэтому make предполагает, что эти две строки являются частью рецепта для цели .PHONY (которая никогда не используется).По этой причине эти назначения переменных не выполняются.

Простое правило для make-файлов: всегда делайте отступы строк рецепта с помощью TAB и никогда не делайте отступы другим строкам с помощью TAB.

...