web-dev-qa-db-ja.com

メイクファイルの変数$(MAKE)は何ですか?

私は現在メイクファイルの書き方を学んでいます。私は次のメイクファイル(ARMチップ上で実行する必要があるCプロジェクト用に自動的に生成された)を持っているので、それを理解しようとしています:

_    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: $@'
        @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: $@'
        @echo ' '
        $(MAKE) --no-print-directory post-build

    # Other Targets
    clean:
        -$(RM) *
        -@echo ' '

    post-build:
        -@echo '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"
        -@echo ' '

    .PHONY: all clean dependents
    .SECONDARY: post-build

    -include ../makefile.targets
_

_.elf_ファイルを作成するためのルールで、$(MAKE) --no-print-directory post-buildの行を頭で囲んでいます。

変数$(MAKE)の定義が見つからないので、組み込みの変数だと思います。この行は実際に何をしていますか?

12
K.Mulier

これはmake自体の再帰的な呼び出しであり、-t-n、および-qオプションを転送します。これは理にかなっています:ネストされたmake呼び出しもこれらのオプションで実行する必要があります。

11
MSalters

docs から:

この変数の値は、makeが呼び出されたファイル名です

これは、ターゲットを作成するためにitsmakefileを呼び出さなければならない場合に役立ちますが、-t--touch)、-n--just-print)、または-q--question)フラグ。 ($MAKE)が使用されている場合、その動作は再帰的に伝播します。

2
Daerdemandt

再帰呼び出しと言っている以前の回答と混同しないでください。 $ MAKEは "make"で置き換えられるデフォルトの変数です。

そしてあなたのシナリオでは、$ MAKEはmakefileのコマンド部分(レシピ)で使用されます。これは、依存関係に変更がある場合は常に、makeがどのディレクトリにいてもコマンド「make --no-print-directory post-build」を実行することを意味します

たとえば、test.oでtest.cを実行するケースがある場合:test.c cd/root/$(MAKE)allこれは、test.cに変更がある場合は、/ rootディレクトリで「make all」を実行することを示しています。

0
user3275158