这使规则做了什么?

时间:2018-05-10 07:10:19

标签: makefile build

我正在通过另一个例子编写makefile并且偶然发现了这个目标规则:

ifeq ($(MAKECMDGOALS),build_executable)
$(firstword $(dependency_files)): $(application_path)/config/gcc/app.mk
    @rm -rf $(object_output_path)
-include $(dependency_files)
endif

这是在其他规则之间。这个makefile以不同的目标递归地重新调用自己。

所有变量几乎都解释了自己。先决条件app.mk仅包含一些在此make文件中使用的变量集的配置。依赖文件变量构造如下:

dependency_files := $(object_files:%.o=%.d)

我的问题是"常见做法"这个规则对应,它做了什么,为什么它是这样的。如果我的理解是正确的(如果我错了请纠正我),我明白首先它包括所有依赖文件(如果存在的话)。然后这条规则可以通过" makeflow"来运行。我不明白的是这样做的意图。此外,由于.d文件是使用GCC -MMD -MP选项生成的,因此在那个(基本上是随机的)依赖文件上运行此规则的触发器是什么。

提前致谢。

修改

###############################################################################
#
# @brief     This file is part of the TouchGFX 4.8.0 evaluation distribution.
#
# @author    Draupner Graphics A/S <http://www.touchgfx.com>
#
###############################################################################
#
# @section Copyright
#
# This file is free software and is provided for example purposes. You may
# use, copy, and modify within the terms and conditions of the license
# agreement.
#
# This is licensed software for evaluation use, any use must strictly comply
# with the evaluation license agreement provided with delivery of the
# TouchGFX software.
#
# The evaluation license agreement can be seen on www.touchgfx.com
#
# @section Disclaimer
#
# DISCLAIMER OF WARRANTY/LIMITATION OF REMEDIES: Draupner Graphics A/S has
# no obligation to support this software. Draupner Graphics A/S is providing
# the software "AS IS", with no express or implied warranties of any kind,
# including, but not limited to, any implied warranties of merchantability
# or fitness for any particular purpose or warranties against infringement
# of any proprietary rights of a third party.
#
# Draupner Graphics A/S can not be held liable for any consequential,
# incidental, or special damages, or any other relief, or for any claim by
# any third party, arising from your use of this software.
#
###############################################################################
# Get name of this Makefile
makefile_name := $(lastword $(MAKEFILE_LIST))

# Get path of this Makefile
makefile_path := $(dir $(abspath $(makefile_name)))

# Get path where the Application is
application_path := $(abspath $(makefile_path)/../..)

# Change makefile_name to a relative path
makefile_name := $(patsubst $(application_path)/%,%,$(abspath $(makefile_name)))

# Get relative path to makefile
makefile_path_relative = $(patsubst $(application_path)/%,%,$(makefile_path))

# Get path to bsp
bsp_path := $(patsubst $(application_path)/%,%,$(abspath $(makefile_path_relative)../bsp))

# Get OS path
os_path := $(patsubst $(application_path)/%,%, $(abspath $(makefile_path_relative)../CMSIS-RTOS2))

# Get target path 
cmsis_core_path := $(patsubst $(application_path)/%,%, $(abspath $(makefile_path_relative)../CMSIS-COREM))

# Get identification of this system
ifeq ($(OS),Windows_NT)
UNAME := MINGW32_NT-6.2
else
UNAME := $(shell uname -s)
endif

board_name := NONE
platform := cortex_m4f

.PHONY: all clean assets flash intflash

ifneq ($(words $(makefile_path))$(words $(MAKEFILE_LIST)),11)
all: $(filter clean,$(MAKECMDGOALS))
all clean assets flash intflash:
$(error Spaces not allowed in path)
else

all: $(filter clean,$(MAKECMDGOALS))
all clean assets:
    @cd $(application_path) && $(MAKE) -r -f $(makefile_name) -s $(MFLAGS) _$@_

flash intflash: all
    @cd $(application_path) && $(MAKE) -r -f $(makefile_name) -s $(MFLAGS) _$@_

# Directories containing application-specific source and header files.
# Additional components can be added to this list. make will look for
# source files recursively in comp_name/src and setup an include directive
# for comp_name/include.
components := gui target generated/gui_generated

# Location of folder containing bmp/png files.
asset_images_input  := assets/images

# Location of folder to search for ttf font files
asset_fonts_input  := assets/fonts

# Location of folder where the texts.xlsx is placed
asset_texts_input  := assets/texts

build_root_path := build
object_output_path := $(build_root_path)/$(board_name)
binary_output_path := $(build_root_path)/bin

# Location of output folders where autogenerated code from assets is placed
asset_root_path := generated
asset_images_output := $(asset_root_path)/images
asset_fonts_output := $(asset_root_path)/fonts
asset_texts_output := $(asset_root_path)/texts

#include application specific configuration
include $(application_path)/config/gcc/app.mk

os_source_files := $(os_path)/RTX/Config/RTX_Config.c \
                   $(os_path)/RTX/Source/rtx_lib.c

os_include_paths := $(os_path)/Include \
                    $(os_path)/RTX/Config \
                    $(os_path)/RTX/Include
                    #$(os_path)/RTX/Source \


os_wrapper := $(os_path)/OSWrappers_cmsis.cpp

### END OF USER SECTION. THE FOLLOWING SHOULD NOT BE MODIFIED ###

ifeq ($(UNAME), Linux)
imageconvert_executable := $(touchgfx_path)/framework/tools/imageconvert/build/linux/imageconvert.out
fontconvert_executable := $(touchgfx_path)/framework/tools/fontconvert/build/linux/fontconvert.out
else
imageconvert_executable := $(touchgfx_path)/framework/tools/imageconvert/build/win/imageconvert.out
fontconvert_executable := $(touchgfx_path)/framework/tools/fontconvert/build/win/fontconvert.out
st_link_executable := "$(PROGRAMFILES)\\STMicroelectronics\\STM32 ST-LINK Utility\\ST-LINK Utility\\ST-LINK_CLI.exe"
st_link_external_loader := "$(PROGRAMFILES)\\STMicroelectronics\\STM32 ST-LINK Utility\\ST-LINK Utility\\ExternalLoader\\N25Q128A_STM32469I-DISCO.stldr"
endif

target_executable := target.elf
target_hex := target.hex
########### include $(touchgfx_path)/config/toolchain-arm-none-eabi-gcc.mk #################
# Defines the assembler binary and options. These are optional and only
# of relevance if the component includes source files with an
# extension of .asm.

# Consider adding -Wall to c_compiler_options and cpp_compiler_options

#no_libs := -nostdlib -nodefaultlibs For now, include everything.

assembler         := arm-none-eabi-gcc
assembler_options += -g  \
                    -nostartfiles -fno-exceptions\
                    $(no_libs) -mthumb -mno-thumb-interwork  \
                     -Wall
assembler_options += $(float_options)

c_compiler         := arm-none-eabi-gcc
c_compiler_options += -g \
                    -nostartfiles -mthumb -fno-exceptions \
                    -mno-thumb-interwork -std=c99 \
                    $(no_libs) \
                    -Os -fno-strict-aliasing -fdata-sections -ffunction-sections

c_compiler_options += $(float_options)

cpp_compiler         := arm-none-eabi-g++
cpp_compiler_options += -g -mthumb \
                    -nostartfiles $(no_libs) \
                    -mno-thumb-interwork -fno-rtti -fno-exceptions  \
                    -Os -fno-strict-aliasing -fdata-sections -ffunction-sections

cpp_compiler_options += $(float_options)

linker         := arm-none-eabi-g++
linker_options += -g -Wl,-static -nostartfiles  -mthumb $(no_libs) -mno-thumb-interwork \
                  -fno-exceptions -fno-rtti \
                  -Os -fno-strict-aliasing -Wl,--gc-sections

objcopy := arm-none-eabi-objcopy

archiver := arm-none-eabi-ar

strip := arm-none-eabi-strip

####################### Additional toolchain configuration for Cortex-M4f targets.##########################
float_abi := hard

float_options := -mfpu=fpv4-sp-d16
ifneq ("$(float_abi)","hard")
float_options += -mfloat-abi=softfp
else
float_options += -mfloat-abi=hard
endif

assembler_options += -mcpu=cortex-m4 -march=armv7e-m -Wno-psabi $(float_options) -DCORE_M4 -D__irq=""
c_compiler_options += -mcpu=cortex-m4 -march=armv7e-m  -Wno-psabi $(float_options) -DCORE_M4 -D__irq=""
cpp_compiler_options += -mcpu=cortex-m4 -march=armv7e-m -Wno-psabi $(float_options) -DCORE_M4 -D__irq=""
linker_options += -mcpu=cortex-m4 -march=armv7e-m -Wno-psabi $(float_options)

############################################################################################################

#include everything + specific vendor folders
framework_includes := $(touchgfx_path)/framework/include

#this needs to change when assset include folder changes.
all_components := $(components) \
    $(asset_fonts_output) \
    $(asset_images_output) \
    $(asset_texts_output)

#keep framework include and source out of this mess! :)
include_paths := $(library_includes) $(foreach comp, $(all_components), $(comp)/include) $(framework_includes) $(source_bsp_paths)
source_paths = $(foreach comp, $(all_components), $(comp)/src)

# Finds files that matches the specified pattern. The directory list
# is searched recursively. It is safe to invoke this function with an
# empty list of directories.
#
# Param $(1): List of directories to search
# Param $(2): The file pattern to search for
define find
    $(foreach dir,$(1),$(foreach d,$(wildcard $(dir)/*),\
        $(call find,$(d),$(2))) $(wildcard $(dir)/$(strip $(2))))
endef
unexport find

fontconvert_ttf_lower_files := $(call find, $(asset_fonts_input), *.ttf)
fontconvert_ttf_upper_files := $(call find, $(asset_fonts_input), *.TTF)
fontconvert_otf_lower_files := $(call find, $(asset_fonts_input), *.otf)
fontconvert_otf_upper_files := $(call find, $(asset_fonts_input), *.OTF)
fontconvert_bdf_lower_files := $(call find, $(asset_fonts_input), *.bdf)
fontconvert_bdf_upper_files := $(call find, $(asset_fonts_input), *.BDF)
fontconvert_font_files := $(fontconvert_ttf_lower_files) \
              $(fontconvert_ttf_upper_files) \
              $(fontconvert_otf_lower_files) \
              $(fontconvert_otf_upper_files) \
              $(fontconvert_bdf_lower_files) \
              $(fontconvert_bdf_upper_files)

source_files := $(call find, $(source_paths),*.cpp)

gcc_source_files := $(touchgfx_path)/framework/config/gcc/stdio.c \
                    $(touchgfx_path)/framework/config/gcc/stdlib.c \
                    $(touchgfx_path)/framework/config/gcc/string.c

# bsp files
board_c_files := \
    $(bsp_path)/src/main.c \
    $(bsp_path)/src/debug.c

board_cpp_files := \
    $(bsp_path)/src/leds.cpp \
    $(bsp_path)/src/KeySampler.cpp \
    $(bsp_path)/src/app_gpio.cpp

# bsp include
board_include_paths := \
    $(bsp_path)/inc \
    gui/include \
    generated/gui_generated/include

# Compiler options
c_compiler_options += -DST -DSTM32F469xx -DUSE_OS_SYSTICK -DUSE_FLOATING_POINT -g -gdwarf-2
cpp_compiler_options +=  -DST -DSTM32F469xx -DUSE_OS_SYSTICK -DUSE_FLOATING_POINT -g -gdwarf-2

include_paths += $(application_path)/platform/os $(board_include_paths) $(os_include_paths)

c_source_files := $(call find, $(source_paths),*.c) $(os_source_files) $(makefile_path_relative)/isr.c $(board_c_files)
source_files += $(os_wrapper) target/gcc/gccstubs.cpp target/main.cpp \
                $(board_cpp_files) \
                $(bsp_path)/src/BoardConfiguration.cpp \
                $(bsp_path)/src/GPIO.cpp

object_files := $(source_files:$(touchgfx_path)/%.cpp=$(object_output_path)/touchgfx/%.o) $(c_source_files:$(touchgfx_path)/%.c=$(object_output_path)/touchgfx/%.o)
object_files := $(object_files:%.cpp=$(object_output_path)/%.o)
object_files := $(object_files:%.c=$(object_output_path)/%.o)
dependency_files := $(object_files:%.o=%.d)

textconvert_script_path := $(touchgfx_path)/framework/tools/textconvert
textconvert_executable := $(call find, $(textconvert_script_path), *.rb)

text_database := $(asset_texts_input)/texts.xlsx

libraries := touchgfx-float-abi-hard RTX_CM4F
library_include_paths := $(touchgfx_path)/lib/core/$(platform)/gcc
library_include_paths += $(os_path)/RTX/Library/GCC

.PHONY: _all_ _clean_ _assets_ _flash_ _intflash_ generate_assets build_executable

# Force linking each time
.PHONY: $(binary_output_path)/$(target_executable)

_all_: generate_assets

ifeq ($(shell find $(application_path) -wholename "$(application_path)/$(binary_output_path)/extflash.bin" -size +0c | wc -l | xargs echo),1)
_flash_: _extflash_
else
_flash_: _intflash_
endif

_extflash_:
    @$(st_link_executable) -c -P $(binary_output_path)/target.hex 0x90000000 -Rst -EL $(st_link_external_loader)

_intflash_:
    @$(st_link_executable) -c -P $(binary_output_path)/intflash.hex 0x08000000 -Rst

generate_assets: _assets_
    @$(MAKE) -f $(makefile_name) -r -s $(MFLAGS) build_executable
build_executable: $(binary_output_path)/$(target_executable)

$(binary_output_path)/$(target_executable): $(object_files)
    @echo Linking $(@)
    @mkdir -p $(@D)
    @mkdir -p $(object_output_path)
    @$(file >$(build_root_path)/objects.tmp) $(foreach F,$(object_files),$(file >>$(build_root_path)/objects.tmp,$F))
    @$(linker) \
        $(linker_options) -T $(makefile_path_relative)/application.ld -Wl,-Map=$(@D)/application.map $(linker_options_local) \
        $(patsubst %,-L%,$(library_include_paths)) \
        @$(build_root_path)/objects.tmp -o $@ \
        -Wl,--start-group $(patsubst %,-l%,$(libraries)) -Wl,--end-group
    @rm -f $(build_root_path)/objects.tmp
    @echo "Producing additional output formats..."
    @echo "  target.hex   - Combined internal+external hex"
    @$(objcopy) -O ihex $@ $(@D)/target.hex
    @echo "  intflash.elf - Internal flash, elf debug"
    @$(objcopy) --remove-section=ExtFlashSection $@ $(@D)/intflash.elf 2>/dev/null
    @echo "  intflash.hex - Internal flash, hex"
    @$(objcopy) -O ihex --remove-section=ExtFlashSection $@ $(@D)/intflash.hex
    @echo "  extflash.bin - External flash, binary"
    @$(objcopy) -O binary --only-section=ExtFlashSection $@ $(@D)/extflash.bin

$(object_output_path)/touchgfx/%.o: $(touchgfx_path)/%.cpp $(application_path)/config/gcc/app.mk
    @echo Compiling $<
    @mkdir -p $(@D)
    @$(cpp_compiler) \
        -MMD -MP $(cpp_compiler_options) $(cpp_compiler_options_local) $(user_cflags) \
        $(patsubst %,-I%,$(include_paths)) \
        -c $< -o $@

$(object_output_path)/%.o: %.cpp $(application_path)/config/gcc/app.mk
    @echo Compiling $<
    @mkdir -p $(@D)
    @$(cpp_compiler) \
        -MMD -MP $(cpp_compiler_options) $(cpp_compiler_options_local) $(user_cflags) \
        $(patsubst %,-I%,$(include_paths)) \
        -c $< -o $@

$(object_output_path)/%.o: %.c $(application_path)/config/gcc/app.mk
    @echo Compiling $<
    @mkdir -p $(@D)
    @$(c_compiler) \
        -MMD -MP $(c_compiler_options) $(c_compiler_options_local) $(user_cflags) \
        $(patsubst %,-I%,$(include_paths)) \
        -c $< -o $@

ifeq ($(MAKECMDGOALS),build_executable)
$(firstword $(dependency_files)): $(application_path)/config/gcc/app.mk
    @rm -rf $(object_output_path)
-include $(dependency_files)
endif

_assets_: BitmapDatabase $(asset_texts_output)/include/texts/TextKeysAndLanguages.hpp

alpha_dither ?= no
dither_algorith ?= 2
remap_identical_texts ?= yes

.PHONY: BitmapDatabase
BitmapDatabase:
    @echo Converting images
    @$(imageconvert_executable) -dither $(dither_algorithm) -alpha_dither $(alpha_dither) -opaque_image_format $(opaque_image_format) -non_opaque_image_format $(non_opaque_image_format) $(screen_orientation) -r $(asset_images_input) -w $(asset_images_output)

$(asset_texts_output)/include/texts/TextKeysAndLanguages.hpp: $(text_database) $(application_path)/config/gcc/app.mk $(textconvert_executable) $(fontconvert_executable) $(fontconvert_font_files)
    @rm -f $(asset_fonts_output)/src/*
    @rm -f $(asset_fonts_output)/include/fonts/*
    @rm -f $(asset_fonts_output)/UnicodeList*.txt
    @rm -f $(asset_fonts_output)/CharSizes*.csv
    @mkdir -p $(asset_texts_output)/include/texts
    @ruby $(textconvert_script_path)/main.rb $(text_database) $(fontconvert_executable) $(asset_fonts_output) $(asset_texts_output) $(asset_fonts_input) . $(remap_identical_texts) $(text_data_format)

_clean_:
    @echo Cleaning
    @rm -rf $(build_root_path)
    # Do not remove gui_generated
    @rm -rf $(asset_images_output)
    @rm -rf $(asset_fonts_output)
    @rm -rf $(asset_texts_output)
    # Create directory to avoid error if it does not exist
    @mkdir -p $(asset_root_path)
    # Remove assets folder if it is empty (i.e. no gui_generated folder)
    @rmdir --ignore-fail-on-non-empty $(asset_root_path)

endif

1 个答案:

答案 0 :(得分:2)

更改app.mk文件可能会使依赖项文件过时。此规则的作用是通过删除其目录来强制重新构建依赖项文件。

例如,因为添加或修改了预处理器符号,依赖关系可能会发生变化。我们假设在提供的示例中,<div style="text-align: center; padding: 1em; margin: 1em; background-color: #eee; border-radius: 10px;"> <strong style="display: inline-block; vertical-align: middle;">Total<br>Score</strong> <div style="display: inline-block; vertical-align: middle;"><span id="count" style="font-size: 2em;">87</span></div> </div> <div style="text-align: center; padding: 1em; margin: 1em; background-color: #eee; border-radius: 10px;"> Rank #1 out of 321 </div>已被修改以添加c_compiler_options选项:

-DUSE_FLOATING_POINT

在源文件中,这可能会添加或删除包含文件指令:

c_compiler_options += -DST -DSTM32F469xx -DUSE_OS_SYSTICK -DUSE_FLOATING_POINT -g -gdwarf-2

因此需要再次运行dependendy评估。