Использование файла makefile в качестве обязательного условия в правиле - PullRequest
0 голосов
/ 24 февраля 2020

У меня нет опыта работы с make, и я хотел скопировать структуру сборки, предоставляемую каким-либо сторонним SDK, и адаптировать ее к моему собственному компилятору и проекту.

Дело в том, что я обнаружил, что генерируются некоторые правила используя make-файл в качестве предварительного условия, что-то вроде:

...
$(eval $(1): Makefile | $(dir $(1)).) \
...

или

$(OUTPUT_DIRECTORY)/%.inc: Makefile | $(OUTPUT_DIRECTORY)
    $(info Generating $@)
    $(NO_ECHO)$(call dump, $(call target_specific, INC_PATHS, $*)) > $@

Первоначально, их make-файл имеет заглавные буквы ( Makefile ) и тот, над которым я работаю строчная ( makefile ). Во всяком случае, когда я пробую свои текущие изменения, появляется эта ошибка:

*** No rule to make target 'Makefile', needed by '...'

Я предположил, что это произошло из-за заглавных букв, поэтому в обоих местах изменился на строчные буквы и повторил попытку, но на этот раз ошибка заключается в том, что makefile рассматривается как C файл (это мое предположение ...)

"makefile", line 1: error #171: expected a declaration
  -include makefile.local
                          ^

"makefile", line 67: error #8: missing closing quote
  ${CG_TOOL_ROOT}/include"
                         ^

"makefile", line 99: error #10: "#" not expected here
  .SUFFIXES: # ignore built-in rules
             ^

"makefile", line 100: error #10: "#" not expected here
  %.d:       # don't try to make .d files
             ^

"makefile", line 100: error #8: missing closing quote
  %.d:       # don't try to make .d files

В чем здесь может быть проблема? Что-то мне не хватает?

РЕДАКТИРОВАТЬ 1: Это файлы, которые я пытаюсь использовать.

Nordi c предоставляет их как часть своего SDK для разработка с использованием arm-g cc для платформ ARM. Существует Makefile на проект, и Makefile.common включено в основной Makefile.

С другой стороны, я пытаюсь понять и воспроизвести то же самое, но для другого проприетарного компилятора с другими параметрами и синтаксисом (TI cl430 для платформ MSP430). Из оригинального Makefile.common я удалил некоторые ссылки на пакет gnu-arm и заменил его соответствующими инструментами компиляции. В makefile я также пытался воспроизвести ту же структуру оригинала, но используя мои источники и параметры.

Просто чтобы прояснить ситуацию, оригиналы пишутся с большой буквы, мои строчные.

РЕДАКТИРОВАТЬ 2:

После запуска make --debug --print-data-base Я нашел это:

Ошибка появляется при первой попытке создать файл:

Updating goal targets....
 File 'default' does not exist.
   File 'test_project' does not exist.
     File '_build/test_project.out' does not exist.
       File '_build/test_project/<SOURCE_FILE>.c.o' does not exist.
      Must remake target '_build/test_project/<SOURCE_FILE>.c.o'.
Building file: "makefile"
Invoking: MSP430 Compiler
"cl430" -vmspx --use_hw_mpy=F5 <... a lot of options ...> --obj_directory="./_build"  "makefile"
"makefile", line 1: error #171: expected a declaration
  -include makefile.local
  ^
[ ... more errors ...]

Однако из информации об отладке и БД я обнаружил, что правило исходного файла действительно требует make-файл, и этот make-файл не является целью, но каким-то образом он пытается его собрать:

# Not a target:
makefile:
#  Implicit rule search has been done.
#  Last modified 2020-02-25 11:43:33.609423171
#  File has been updated.
#  Successfully updated.

_build/test_project/<SOURCE_FILE>.c.o: makefile | _build/test_project/.
#  Implicit rule search has been done.
#  Implicit/static pattern stem: '_build/test_project/<SOURCE_FILE>'
#  Modification time never checked.
#  File has been updated.
#  Failed to be updated.
# automatic
# @ := _build/test_project/<SOURCE_FILE>.c.o
# automatic
# % := 
# automatic
# * := _build/test_project/<SOURCE_FILE>
# automatic
# + := makefile
# automatic
# | := _build/test_project/.
# automatic
# < := makefile
# automatic
# ^ := makefile
# automatic
# ? := makefile
# variable set hash-table stats:
# Load=8/32=25%, Rehash=0, Collisions=1/30=3%
#  recipe to execute (from 'makefile.common', line 192):
    @echo 'Building file: "$<"'
    @echo 'Invoking: MSP430 Compiler'
    "${CG_TOOL_ROOT}/bin/cl430" -vmspx --use_hw_mpy=F5 <... a lot of options ...> "$(shell echo $<)"
    @echo 'Finished building: "$<"'
    @echo ' '

1 Ответ

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

Эта зависимость от Makefile заключается в том, чтобы убедиться, что он перестраивается при изменении Makefile. Например, если вы измените CFLAGS в Makefile или правило для компиляции или ссылки, эта зависимость вызывает перестроение (при условии, что объектные файлы зависят от Makefile, как и должно). Без зависимости от Makefile эти изменения не приведут к перестройке.

Сообщения об ошибках в виде "makefile", line 1: error #171: expected a declaration предполагают, что makefile передается как исходный файл компилятору C, который производит сообщение об ошибке.

Скорее всего, правила $(filter-out Makefile,$^). Вам необходимо заменить все вхождения с Makefile на makefile.

*** No rule to make target 'Makefile', needed by '...' означает, что Makefile по-прежнему является обязательным условием для некоторых целей. Вы можете узнать, что это за цели, передав параметры командной строки --debug --print-data-base в make.

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