В 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 он напечатает всю базу данных всех переменных, правил и т. д. с номерами строк, где они были определены в последний раз.

Другие вопросы по тегам