Что такое переменная $(MAKE) в 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), поэтому я предполагаю, что это нечто встроенное. Что делает эта линия на самом деле?

Ответ 1

Это рекурсивный вызов make, пересылающий параметры -t, -n и -q. Это имеет смысл: вы хотите, чтобы вложенные вызовы make запускались с этими параметрами.

Ответ 2

Из docs:

Значение этой переменной - это имя файла, с которым был вызван make

Это полезно в случаях, когда нужно сделать какую-то цель, которую вы должны будете вызвать в своем make файле, но вы выполняете какой-то сухой прогон с -t (--touch), -n (--just-print), или -q (--question). Это поведение будет рекурсивно распространяться, если используется ($MAKE).

Ответ 3

Пожалуйста, не смущайтесь с более ранними ответами, говорящими рекурсивный вызов. $ MAKE - это переменная по умолчанию, которая заменяется на "make".

И в вашем сценарии $ MAKE используется в части команд (рецепт) make файла. Это означает, что всякий раз, когда происходит изменение в зависимости, make выполняет команду "make --no-print-directory post-build" в каталоге, в котором вы находитесь.

Например, если у меня есть случай, когда в test.o: test.c     cd/root/     $ (MAKE) все В нем говорится, что если в test.c есть изменения, выполните команду "make all" в каталоге /root.