Что делает это правило? - PullRequest
0 голосов
/ 10 мая 2018

Я пишу makefile на примере другого и наткнулся на это целевое правило:

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

Это находится между другими правилами. Этот make-файл запускается рекурсивно, вызывая себя с разными целями.

Все переменные объясняются сами собой. Предварительная версия app.mk содержит только конфигурацию с набором переменных, которые используются в этом файле make. Переменная файлов зависимостей построена так:

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

Мой вопрос: какой «обычной практике» соответствует это правило, что оно делает и почему оно так. Если мое понимание верно (пожалуйста, исправьте меня, если я ошибаюсь), я понимаю, что в первую очередь это включает в себя все файлы зависимостей, если они существуют. Тогда это правило может быть запущено "makeflow". Что я не понимаю, так это намерение сделать это. Кроме того, что является триггером запуска этого правила для этого одного (в основном случайного) файла зависимостей, поскольку файлы .d создаются с параметрами GCC -MMD -MP.

Заранее спасибо.

EDIT:

###############################################################################
#
# @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 голосов
/ 10 мая 2018

Изменение файла app.mk может сделать файлы зависимостей устаревшими. Это правило заставляет пересоздавать файлы зависимостей, удаляя их каталог.

Например, зависимости могут измениться, потому что символы препроцессора были добавлены или изменены. Предположим, что в представленном примере c_compiler_options был изменен для добавления опции -DUSE_FLOATING_POINT:

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

В исходном файле это может добавить или удалить директивы включаемого файла:

#ifdef USE_FLOATING_POINT
#include <some_file.h>
#else
#incude <anotherfile.h>
#endif

Отсюда необходимость повторного запуска оценки зависимостей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...