Объясните Makefile, сгенерированный mkmakefile (ядро Linux, buildroot, busybox)

Сценарий mkmakefile создает следующий Makefile в каталоге builddir.

При вызове все цели передаются в Makefile srcdir.

Кто-нибудь может объяснить, почему? Где магия?

lastword = $(word $(words $(1)),$(1))
makedir := $(dir $(call lastword,\$(MAKEFILE_LIST)))

MAKEARGS := -C path_to_srcdir
MAKEARGS += O=$(if $(patsubst /%,,$(makedir)),$(CURDIR)/)$(patsubst %/,%,$(makedir))

MAKEFLAGS += --no-print-directory

.PHONY: all $(MAKECMDGOALS)

all := $(filter-out all Makefile,$(MAKECMDGOALS))

all:
    $(MAKE) $(MAKEARGS) $(all)

Makefile:;

$(all): all
    @:

%/: all
    @:

person arved    schedule 31.07.2012    source источник


Ответы (1)


Давайте сломаем это. Во-первых, использование all в качестве цели и имени переменной просто неприятно, что сделал бы начинающий программист или генератор кода. Давайте переименуем переменную all_targs и предположим, что мы вызываем make Makefile foo bar baz. Если мы вычеркнем несколько частей, которые не имеют отношения к вопросу, мы получим

MAKEARGS := -C path_to_srcdir

.PHONY: all $(MAKECMDGOALS)

all_targs := $(filter-out all Makefile,$(MAKECMDGOALS)) # foo bar baz

all:
    $(MAKE) $(MAKEARGS) $(all_targs)

Makefile:;

$(all_targs): all
    @: # do nothing

Итак, мы ничего не делаем Makefile, all_targs это foo bar baz, и для этих трех целей мы ничего не делаем, но нам требуется all. Правило для all запускает команду

make -C path_to_srcdir foo bar baz

(Есть еще несколько поворотов, но это суть.)

person Beta    schedule 31.07.2012