Какова цель использования dir & @ в качестве предварительных условий только для заказа? - PullRequest
0 голосов
/ 02 февраля 2020

Ниже код является частью Makefile, я путаю, какова цель использования $$$$(dir $$$$@) в качестве пререквизитов только для заказа в cc_template function

.SECONDEXPANSION:
# get .o obj files: (#files[, packet])
toobj = $(addprefix $(OBJDIR)$(SLASH)$(if $(2),$(2)$(SLASH)),\
                $(addsuffix .o,$(basename $(1))))

# get .d dependency files: (#files[, packet])
todep = $(patsubst %.o,%.d,$(call toobj,$(1),$(2)))

# cc compile template, generate rule for dep, obj: (file, cc[, flags, dir])
define cc_template
$$(call todep,$(1),$(4)): $(1) | $$$$(dir $$$$@)
        @$(2) -I$$(dir $(1)) $(3) -MM $$< -MT "$$(patsubst %.d,%.o,$$@) $$@"> $$@
$$(call toobj,$(1),$(4)): $(1) | $$$$(dir $$$$@)
        @echo + cc $$<
        $(V)$(2) -I$$(dir $(1)) $(3) -c $$< -o $$@
ALLOBJS += $$(call toobj,$(1),$(4))
endef

Весь Makefile из https://github.com/chyyuu/ucore_os_lab/blob/master/labcodes/lab1/tools/function.mk

1 Ответ

2 голосов
/ 02 февраля 2020

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

Итак, если ваша цель my/foo/bar.o, тогда my/foo будет обязательным условием для этой цели только для заказа.

Это делается для того, чтобы убедиться, что целевой каталог существует до вызова правила, которое создает в нем объектный файл (компилятор не будет создавать для вас выходные каталоги: если они не существуют, он просто потерпит неудачу).

В другом месте вашего make-файла вы должны найти правило, которое создает каталоги:

<sometargets>:
        mkdir -p $@
.PHONY: <sometargets>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...