У меня нет опыта работы с 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 ' '