В make-файле ядра (вызов cmd, теги), что здесь означает cmd?
В Kernel Makefile я нашел код, как показано ниже:
ctags CTAGS CSCOPE: $(HEADERS) $(SOURCES)
$(ETAGS) $(ETAGSFALGS) $(HEADERS) $(SOURCES)
$(call cmd, ctags)
Кроме того, где я могу найти макрос или функцию?
2 ответа
Используя метод MadScientist на ядре v4.1:
make -p | grep -B1 -E '^cmd '
мы нашли:
# makefile (from `scripts/Kbuild.include', line 211)
cmd = @$(echo-cmd) $(cmd_$(1))
scripts/Kbuild.include
входит на верхнем уровне Makefile
, Он также содержит:
echo-cmd = $(if $($(quiet)cmd_$(1)),\
echo ' $(call escsq,$($(quiet)cmd_$(1)))$(echo-why)';)
quiet
: установить на верхнем уровне make-файл, в зависимости от значенияV
,Будет либо:
quiet_
печататьCC file.c
- пусто, чтобы напечатать команду на
V=
silent_
ничего не печатать наmake -s
escsq
определяется как:squote := ' escsq = $(subst $(squote),'\$(squote)',$1)
Он избегает одинарных кавычек, так что
echo '$(call escsq,Letter 'a'.'
будет правильно печатать вsh
,echo-why
: определено ниже вKbuild.include
,Используется для
make V=2
и говорит, почему цель переделывается.
Настройка make tags
делается в Makefile
:
quiet_cmd_tags = GEN $@
cmd_tags = $(CONFIG_SHELL) $(srctree)/scripts/tags.sh $@
tags TAGS cscope gtags: FORCE
$(call cmd,tags)
Который показывает типичный шаблон использования для вызова команд в kbuild:
quiet_cmd_XXX = NAME $@
cmd_XXX = actual-command $@
target: prerequisites
$(call cmd,tags)
Комментарий к Makefile
объясняет, как все это делается, чтобы сделать make
выход красивее:
# Beautify output
# ---------------------------------------------------------------------------
#
# Normally, we echo the whole command before executing it. By making
# that echo $($(quiet)$(cmd)), we now have the possibility to set
# $(quiet) to choose other forms of output instead, e.g.
#
# quiet_cmd_cc_o_c = Compiling $(RELDIR)/$@
# cmd_cc_o_c = $(CC) $(c_flags) -c -o $@ $<
Если вы бежите make -p
он напечатает всю базу данных всех переменных, правил и т. д. с номерами строк, где они были определены в последний раз.