Ответ 1
Это рекурсивный вызов make
, пересылающий параметры -t
, -n
и -q
. Это имеет смысл: вы хотите, чтобы вложенные вызовы make
запускались с этими параметрами.
В настоящее время я изучаю, как писать make файлы. У меня есть следующий make файл (который автоматически генерируется для C-проекта, который должен запускаться на чипе ARM), и я пытаюсь это понять:
RM := rm -rf
# All of the sources participating in the build are defined here
-include sources.mk
-include FreeRTOS/Supp_Components/subdir.mk
-include FreeRTOS/MemMang/subdir.mk
-...
-include subdir.mk
-include objects.mk
ifneq ($(MAKECMDGOALS),clean)
ifneq ($(strip $(S_UPPER_DEPS)),)
-include $(S_UPPER_DEPS)
endif
ifneq ($(strip $(C_DEPS)),)
-include $(C_DEPS)
endif
endif
-include ../makefile.defs
# Add inputs and outputs from these tool invocations to the build variables
# All Target
all: FreeRTOS_T02.elf
# Tool invocations
FreeRTOS_T02.elf: $(OBJS) $(USER_OBJS)
@echo 'Building target: [email protected]'
@echo 'Invoking: MCU GCC Linker'
arm-none-eabi-gcc -mcpu=cortex-m7 -mthumb -mfloat-abi=hard -mfpu=fpv5-sp-d16 -specs=nosys.specs -specs=nano.specs -T LinkerScript.ld -Wl,-Map=output.map -Wl,--gc-sections -lm -o "FreeRTOS_T02.elf" @"objects.list" $(USER_OBJS) $(LIBS)
@echo 'Finished building target: [email protected]'
@echo ' '
$(MAKE) --no-print-directory post-build
# Other Targets
clean:
-$(RM) *
[email protected] ' '
post-build:
[email protected] 'Generating binary and Printing size information:'
arm-none-eabi-objcopy -O binary "FreeRTOS_T02.elf" "FreeRTOS_T02.bin"
arm-none-eabi-size "FreeRTOS_T02.elf"
[email protected] ' '
.PHONY: all clean dependents
.SECONDARY: post-build
-include ../makefile.targets
Я пытаюсь обвести голову вокруг строки $(MAKE) --no-print-directory post-build
в правиле для создания файла .elf
.
Я не могу найти определение для переменной $(MAKE)
, поэтому я предполагаю, что это нечто встроенное. Что делает эта линия на самом деле?
Это рекурсивный вызов make
, пересылающий параметры -t
, -n
и -q
. Это имеет смысл: вы хотите, чтобы вложенные вызовы make
запускались с этими параметрами.
Из docs:
Значение этой переменной - это имя файла, с которым был вызван make
Это полезно в случаях, когда нужно сделать какую-то цель, которую вы должны будете вызвать в своем make файле, но вы выполняете какой-то сухой прогон с -t
(--touch
), -n
(--just-print
), или -q
(--question
). Это поведение будет рекурсивно распространяться, если используется ($MAKE)
.
Пожалуйста, не смущайтесь с более ранними ответами, говорящими рекурсивный вызов. $ MAKE - это переменная по умолчанию, которая заменяется на "make".
И в вашем сценарии $ MAKE используется в части команд (рецепт) make файла. Это означает, что всякий раз, когда происходит изменение в зависимости, make выполняет команду "make --no-print-directory post-build" в каталоге, в котором вы находитесь.
Например, если у меня есть случай, когда в test.o: test.c cd/root/ $ (MAKE) все В нем говорится, что если в test.c есть изменения, выполните команду "make all" в каталоге /root.