2016-08-16 3 views
2

В настоящее время я изучаю, как писать make-файлы. У меня есть следующий Makefile (который был автоматически создан для 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

https://www.gnu.org/software/make/manual/html_node/MAKE-Variable.html#MAKE-Variable – Notlikethat

ответ

3

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

+0

Большое спасибо за ваш ответ. У меня есть еще один (не имеющий отношения) вопрос. Почему команды '@ echo' в post-build имеют предшествующий символ' -'? Команды '@ echo' в правиле для создания исполняемого файла не имеют его. –

+0

@ K.Mulier: Смотрите [этот существующий вопрос и ответы] (http://stackoverflow.com/a/14248293/15416). – MSalters

1

Из docs:

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

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

+0

Что такое «имя файла, с которым был вызван make»? –

+1

Остаток абзаца из документа: * Если это имя файла было/bin/make, то рецепт выполнен «cd subdir &&/bin/make». Если вы используете специальную версию make для запуска make-файла верхнего уровня, для рекурсивных вызовов будет выполняться одна и та же специальная версия. * – Daerdemandt

+0

Итак, если я запустил программу GNU make, дважды щелкнув файл 'C: \ Apps \ SysGCC \ arm-eabi \ bin \ make.exe', то переменная $ (MAKE) будет расширена до строки '' C: \ Apps \ SysGCC \ arm-eabi \ bin \ make.exe'''? –