Как работает $ @ в условных выражениях? - PullRequest
2 голосов
/ 14 января 2011

Я использую GNU Make 3.80.В моем Makefile я использую автоматическую переменную $ @ для ссылки на текущую цель.

    @echo current target is ... [$@]
ifeq ($@,sms)
    @echo yep, they are equal
else
    @echo no, they are not equal
endif

Кажется, что $ @ расширяется до смс, как показано в выходных данных ниже.

Вывод:

current target is ... [sms]
no, they are not equal

Мой вопрос: поскольку $ @ (по-видимому) расширяется до sms, разве не должна выполняться «истинная» ветвь условного выражения ifeq (с тем результатом, что вывод должен читать yep, ониравно)?[Я в недоумении относительно того, почему выходные данные нет, они не равны.]

1 Ответ

4 голосов
/ 14 января 2011

Из GNU Make manual :

10.5.3 Автоматические переменные ... Очень важно, чтобы вы узнали ограниченную область, в которой доступны значения автоматических переменных: онииметь только значения в рецепте.... есть специальная особенность GNU make - вторичное расширение (см. Secondary Expansion), которое позволяет использовать автоматические значения переменных в списках предварительных требований.

То есть, $@ может толькоиспользоваться внутри раздела, содержащего команды для построения цели, и, с некоторыми ограничениями, внутри списка предварительных условий.

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

    @echo current target is ... [$@]
    if [[ "$@" == "sms" ]]; then \
         echo yep, they are equal; \
    else \
         echo no, they are not equal; \
    fi

Также, если вы хотите проверить, какие цели были указаны в командной строке, используйте переменную MAKECMDGOALS.

...