Makefile target внутри условного - PullRequest
       5

Makefile target внутри условного

0 голосов
/ 09 октября 2019

Извините, если это простой вопрос, но большинство ресурсов, которые я смог найти для учебников по Makefile, охватывают только экстремальные основы.

Я пытаюсь интерпретировать Makefile, у которого есть цель внутри условного ifneq. Кроме того, указанная цель никогда не объявляется как .PHONY, но называется «все по умолчанию». См. Ниже:

ifneq ($(SOME_VARIABLE)$(ANOTHER_VARIABLE,)
    all default: check_a check_b 
        $(MAKE) ARCH=somearch CROSS_COMPILE=archcompiler -C $(KDIR) M=$(PWD) modules
else 
    obj-m += ...
endif

Это упрощенная версия, но, мы надеемся, все поймете. Мой вопрос по сути:

Почему «все по умолчанию» не объявлено как .PHONY? Определенно не делает файл под названием «все по умолчанию».

Выполняет ли Makefile сверху вниз, как обычный код? Как вы могли бы выполнить что-либо выше цели?

Этот Makefile собирает ядро ​​Linux (или просто модули ядра?), Что я предполагаю, почему я так растерялся. Кто-нибудь может порекомендовать ресурсы, которые помогут мне начать понимать, как все это работает? Я даже не знаю с чего начать.

1 Ответ

1 голос
/ 09 октября 2019

Это не определение правила для создания цели с именем all default.

Это определение двух правил для создания двух разных целей, одна из которых называется all, а другая - default. Несколько целей, разделенных пробелами в явном правиле, определяют одно и то же правило для каждой цели.

Также обратите внимание, что объявление цели .PHONY не является обязательным. Обычно make будет работать одинаково независимо от того, будет ли цель помечена явно .PHONY.

Маркировка цели .PHONY имеет следующие преимущества: она немного более эффективна (но едва заметна), а если вам случится создать какой-нибудь файл или каталог с тем же именем, что и ваша цель, то он продолжит работать.

Другими словами, до тех пор, пока вы не создадите файл или каталог с именемall или default, тогда ваш make-файл будет работать правильно, даже если эти цели не объявлены .PHONY.

Что касается вашего второго вопроса: нет, make-файлы не обрабатываются процедурно, как программы или сценарии оболочки.

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

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