Ошибка правила make-файла: *** смешанные неявные и нормальные правила - PullRequest
4 голосов
/ 20 февраля 2012

в ядре Makefile

# Modules                                                                                                                                                                               
/ %/: prepare scripts FORCE
    $(cmd_crmodverdir)
    $(Q)$(MAKE) KBUILD_MODULES=$(if $(CONFIG_MODULES),1) \
    $(build)=$(build-dir)
%.ko: prepare scripts FORCE
    $(cmd_crmodverdir)
    $(Q)$(MAKE) KBUILD_MODULES=$(if $(CONFIG_MODULES),1)   \
    $(build)=$(build-dir) $(@:.ko=.o)
    $(Q)$(MAKE) -f $(srctree)/scripts/Makefile.modpost

вызывает ошибку Makefile смешивает неявные и нормальные правила. (к первой строке предоставленного кода)

Я думаю, что-то не так с синтаксисом /% / , как я могу это исправить?

Пока я думаю о разделении правил следующим образом:

# Modules                                                                                                                                                                               
/: prepare scripts FORCE
    $(cmd_crmodverdir)
    $(Q)$(MAKE) KBUILD_MODULES=$(if $(CONFIG_MODULES),1) \
    $(build)=$(build-dir)
%/: prepare scripts FORCE
    $(cmd_crmodverdir)
    $(Q)$(MAKE) KBUILD_MODULES=$(if $(CONFIG_MODULES),1) \
    $(build)=$(build-dir)
%.ko: prepare scripts FORCE
    $(cmd_crmodverdir)
    $(Q)$(MAKE) KBUILD_MODULES=$(if $(CONFIG_MODULES),1)   \
    $(build)=$(build-dir) $(@:.ko=.o)
    $(Q)$(MAKE) -f $(srctree)/scripts/Makefile.modpost

Но меня это смущает.

1 Ответ

3 голосов
/ 20 февраля 2012

Как вы думаете, что делает правило / %/ (кроме как запутать вас и make - и меня)?Чего вы пытаетесь достичь с помощью бита %/?

У вас может быть две (или более) цели слева от двоеточия, но обе они должны быть на процент меньше.

prog1 prog2: something
    $(CC) -o $@ $@.o ${LIBRARIES}

Метасимвол % нельзя использовать с правилом без %, но make интерпретирует:

/ %/:

аналогично примеру prog1 prog2, но одинодна из целей имеет %, а другая - нет, и вам нельзя смешивать их.Правило / является явным правилом;Похоже, что это инструкции по обновлению корневого каталога вашей системы.%/ является неявным правилом;возможно, что-то связано с обновлением каталогов.


Копирование некоторых материалов из комментариев:

DIRECTORY_BUILD_RULES = \
    $(cmd_crmodverdir); \
    $(Q)$(MAKE) KBUILD_MODULES=$(if $(CONFIG_MODULES),1) $(build)=$(build-dir)

/:  prepare scripts FORCE; $(DIRECTORY_BUILD_RULES)

%/: prepare scripts FORCE; $(DIRECTORY_BUILD_RULES)

Эта запись должна работать (именно поэтому я использовал еев комментарии), но я бы написал в makefile:

DIRECTORY_DEPENDENCIES = prepare scripts FORCE
DIRECTORY_BUILD_RULES = \
    $(cmd_crmodverdir); \
    $(Q)$(MAKE) KBUILD_MODULES=$(if $(CONFIG_MODULES),1) $(build)=$(build-dir)

/:  $(DIRECTORY_DEPENDENCIES)
    $(DIRECTORY_BUILD_RULES)

%/: $(DIRECTORY_DEPENDENCIES)
    $(DIRECTORY_BUILD_RULES)

Если это все еще вызывает проблемы, просмотрите, что делает первое (/:) правило.Вы уверены, что это нужно?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...