Make: переменные требования, которые зависят от цели - PullRequest
0 голосов
/ 18 ноября 2018

Марка: переменные требования, которые зависят от цели

У меня есть Makefile, который выглядит примерно так:

default: en

.PHONY: default en es

en: NUMBER=number
es: NUMBER=numero

TARGET=$(NUMBER)-word
INTERMEDIATE=$(NUMBER)-tmp

en: number
es: number

number: $(INTERMEDIATE)
  touch $(TARGET)

$(INTERMEDIATE):
  @echo Please provide file $(INTERMEDIATE)
  @exit 1

clean:
  rm *-word *-tmp

Чтобы использовать его, вы должны позвонить make en (также по умолчанию) или make es. На мой взгляд, этот Makefile имеет две основные функции:

  • Промежуточное требование ($(INTERMEDIATE)) должно быть предоставлено пользователем заранее.
  • Это требование является переменной, значение которой зависит от цели.

Когда я запускаю это, я получаю следующее:

$ make
Please provide file number-tmp
make: *** [-tmp] Error 1

Эта ошибка подсказывает мне, что переменные разрешаются на одну стадию слишком поздно для того, что я намереваюсь. Неправильное правило - -tmp, подразумевая, что оно не может сказать значение $(NUMBER) при решении, какие правила запускать. Однако оно разрешается к тому времени, когда запускается правило.

Так, как я мог заставить это работать?

1 Ответ

0 голосов
/ 18 ноября 2018

В документации ясно, что вы не можете использовать значения переменных, специфичные для цели, внутри целей или предпосылок:

Другое исключение - значения переменных, специфичные для цели.Эта функция позволяет вам определять разные значения для одной и той же переменной, основываясь на цели, которую делает make в данный момент. Как и в случае с автоматическими переменными, эти значения доступны только в контексте рецепта цели (и в других назначениях для цели).

Существует несколько способов справиться с этим.,Простейшим было бы изменить выбор на использование переменной вместо цели и использовать сконструированные имена макросов .Предположим, вы сохранили значение в переменной LV (вы не должны использовать LANG и т. Д., Потому что это особенное значение для оболочки), например:

# Must be set on the command line
LV =

en_NUMBER := number
es_NUMBER := numero

TARGET := $($(LV)_NUMBER)-word
INTERMEDIATE := $($(LV)_NUMBER)-tmp

ifeq ($(TARGET),-word)
  $(error Missing/invalid LV value: '$(LV)')
endif

number: $(INTERMEDIATE)
        touch $(TARGET)

clean:
        rm *-word *-tmp

Если вы запускаете make LV=en you 'Я получу number-word.Если вы запустите make LV=es, вы получите numero-word.Если вы запустите make (без настроек) или make LV=foo (недопустимые настройки), вы получите ошибку.

Есть другие способы сделать это, но без полного понимания того, что вы хотите, мы можем 'могу сказать наверняка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...