2016-08-16 3 views
2

Ich lerne gerade, Makefiles zu schreiben. Ich habe die folgende Makefile bekommt (das automatisch für ein C-Projekt erzeugt wurde, der auf einem ARM-Chip ausgeführt werden soll), und ich versuche, es zu verstehen:

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 

Ich versuche, meinen Kopf zu wickeln um die Linie $(MAKE) --no-print-directory post-build in der Regel für die Erstellung der .elf Datei.

Ich kann keine Definition für die Variable $(MAKE) finden, also nehme ich an, dass es etwas eingebautes ist. Was macht diese Linie eigentlich?

+1

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

Antwort

3

Es ist ein rekursive Aufruf von make selbst, Weiterleiten der -t, -n und -q Optionen. Dies ist sinnvoll: Sie möchten, dass die verschachtelten Aufrufe make auch mit diesen Optionen ausgeführt werden.

+0

Vielen Dank für Ihre Antwort. Ich habe eine andere (nicht wirklich verwandte) Frage. Warum haben die '@ echo'-Befehle im Post-Build ein' -'-Zeichen vor? Die '@ echo'-Befehle in der Regel zum Erstellen der ausführbaren Datei haben sie nicht. –

+0

@ K.Mulier: Siehe [diese bestehende Q & A] (http://stackoverflow.com/a/14248293/15416). – MSalters

1

Vom docs:

Der Wert dieser Variablen ist der Dateiname, mit dem Aufruf machen wurde

Es ist nützlich in Fällen, in denen einige Ziel, damit Sie nennen müss seine Make-Datei, aber Sie tun, eine Art Probelauf mit -t (--touch), -n (--just-print) oder -q (--question) Fahnen. Dieses Verhalten würde rekursiv propagieren, wenn ($MAKE) verwendet wird.

+0

Was genau ist "der Dateiname, mit dem make aufgerufen wurde"? –

+1

Rest des Absatzes aus dem Dokument: * Wenn dieser Dateiname/bin/make war, dann ist das ausgeführte Rezept 'cd subdir &&/bin/make'. Wenn Sie eine spezielle Version von make verwenden, um das Makefile der obersten Ebene auszuführen, wird dieselbe spezielle Version für rekursive Aufrufe ausgeführt. * – Daerdemandt

+0

Also, wenn ich das GNU-make-Programm durch Doppelklick auf die Datei 'C: \ Apps \ SysGCC starte \ arm-eabi \ bin \ make.exe ", dann wird die Variable $ (MAKE) in den String" C: \ Apps \ SysGCC \ arm-eabi \ bin \ make.exe "'? –