Предимство на празно изрично правило и имплицитно правило

Моето разбиране за имплицитното правило е, че имплицитното правило ще се използва само ако няма изрично правило, което съответства на цел. Ако има както изрично правило, така и неявно правило, които съответстват на цел, че ще се използва изричното правило, неявното правило ще бъде игнорирано.

Но изпълнението на следния пример показва, че се използва имплицитно правило, а празното явно правило не се използва.

Makefile

all:

%:
      #match-anything implicit rule

резултатът от make е #match-anything имплицитно правило

Makefile

all:
      #explicit rule

%:
      #match-anything implicit rule

резултатът от make е #explicit правило


person PeopleMoutainPeopleSea    schedule 30.07.2014    source източник
comment
изглежда, че един ред, съдържащ всички:, не се брои за празно правило. ако първият makefile се промени на all:; тогава резултатът от make е `all' е актуален   -  person PeopleMoutainPeopleSea    schedule 30.07.2014
comment
Предполагам, че all: се разглежда като ред за предпоставка за настройка, а не като правило (тъй като няма тяло).   -  person Etan Reisner    schedule 30.07.2014
comment
правилото се състои от цел, предпоставки и рецепта.   -  person PeopleMoutainPeopleSea    schedule 30.07.2014
comment
Какво означава изрично правило? Изглежда, че едно изрично правило трябва да има изрична цел, изрична предпоставка и изрична рецепта.   -  person PeopleMoutainPeopleSea    schedule 30.07.2014
comment
Вижте Синтаксис на правило, Какво съдържат Makefiles и последния параграф на Множество правила за една цел. За какво трябва да има достатъчно подробности, за да има смисъл в това. (По-конкретно последната връзка.)   -  person Etan Reisner    schedule 30.07.2014
comment
здравей Etan, прочетох онези раздели, които спомена в ръководството за GNU make. Но ръководството не споменава множество смесени имплицитни правила и изрични правила за една цел   -  person PeopleMoutainPeopleSea    schedule 30.07.2014
comment
Точно за това се говори в последния параграф от последния ми линк. Той изрично казва, че ако нито едно от изричните правила за дадена цел няма рецепта, тогава make търси приложимо имплицитно правило, за да намери такова. Това е точното поведение, което виждате и за което питате. Изрично правило без рецепта не отменя имплицитно правило.   -  person Etan Reisner    schedule 30.07.2014
comment
Благодаря ти много, Итън, това отговаря на въпроса ми. Изглежда, че трябва да прочета ръководството по-внимателно.   -  person PeopleMoutainPeopleSea    schedule 02.08.2014


Отговори (2)


Това поведение е документирано в ръководството за GNU make в Множество правила за едно Целеви раздел.

Ако нито едно от изричните правила за дадена цел няма рецепта, тогава направете търсене за приложимо имплицитно правило, за да намерите такова, вижте Използване на имплицитни правила).

Допълнителна информация (съответна за разбиране на различните взаимосвързани поведения) е достъпна в Синтаксис на правило и Какво съдържат Makefiles секции.

person Etan Reisner    schedule 03.08.2014

От Използване на празни правила в GNU make manual:

Понякога е полезно да се дефинират рецепти, които не правят нищо. Това се прави просто чрез даване на рецепта, която не се състои само от интервали. Например:

мишена: ;

дефинира празна рецепта за target. Можете също така да използвате ред, започващ с префикс на рецепта, за да дефинирате празна рецепта, но това би било объркващо, защото такъв ред изглежда празен.

Може би се чудите защо искате да дефинирате рецепта, която не прави нищо. Единствената причина, поради която това е полезно, е да се попречи на дадена цел да получи неявни рецепти (от неявни правила или специалната цел .DEFAULT; вижте Неявни правила и вижте Дефиниране на правила по подразбиране за последна инстанция).

person Hai Zhang    schedule 13.08.2015