#create:2018-10-12
#auther:zsl,wb

#方便阅读本文件的知识
#(1)字符'\'表示换行
#(2)所有目标的第一条指令前必须有一个tab，不可用4个空格代替
#(3)$@  表示目标文件
#   $^  表示所有的依赖文件
#   $<  表示第一个依赖文件
#   $?  表示比目标还要新的依赖文件列表

#定义本文件中使用到的变量【根据实际需要修改】
#控制台输出程序路径
printf    := echo

#.C文件文件夹
SRC_C := ./srcc
#.S文件文件夹
SRC_S := ./srcs
#.o文件存放目录
D_OBJ := ./obj
#.d文件存放目录
D_MK  := ./dmk
#.C文件列表
SRC_CList := $(wildcard ./srcc/*.c)
#.S文件列表
SRC_SList := $(wildcard ./srcs/*.S)

#链接文件(.ld)的存储路径
LDS_SRCS := ../03_MCU/Linker_File/msp432p401r.lds
#定义生成的文件名
finalGoal := UARTMSP432-20210410
#定义头文件所在的路径
include := -I"C:\Users\lenovo\Desktop\MSP-20210417\MSP-20210417\User-MSP432-20210417\CH06-UART\UART(MSP432)-20210410\.launches" -I"C:\Users\lenovo\Desktop\MSP-20210417\MSP-20210417\User-MSP432-20210417\CH06-UART\UART(MSP432)-20210410\01_Doc" -I"C:\Users\lenovo\Desktop\MSP-20210417\MSP-20210417\User-MSP432-20210417\CH06-UART\UART(MSP432)-20210410\02_CPU" -I"C:\Users\lenovo\Desktop\MSP-20210417\MSP-20210417\User-MSP432-20210417\CH06-UART\UART(MSP432)-20210410\03_MCU" -I"C:\Users\lenovo\Desktop\MSP-20210417\MSP-20210417\User-MSP432-20210417\CH06-UART\UART(MSP432)-20210410\04_GEC" -I"C:\Users\lenovo\Desktop\MSP-20210417\MSP-20210417\User-MSP432-20210417\CH06-UART\UART(MSP432)-20210410\05_UserBoard" -I"C:\Users\lenovo\Desktop\MSP-20210417\MSP-20210417\User-MSP432-20210417\CH06-UART\UART(MSP432)-20210410\06_SoftComponent" -I"C:\Users\lenovo\Desktop\MSP-20210417\MSP-20210417\User-MSP432-20210417\CH06-UART\UART(MSP432)-20210410\07_NosPrg" -I"C:\Users\lenovo\Desktop\MSP-20210417\MSP-20210417\User-MSP432-20210417\CH06-UART\UART(MSP432)-20210410\Debug" -I"C:\Users\lenovo\Desktop\MSP-20210417\MSP-20210417\User-MSP432-20210417\CH06-UART\UART(MSP432)-20210410\03_MCU\Linker_File" -I"C:\Users\lenovo\Desktop\MSP-20210417\MSP-20210417\User-MSP432-20210417\CH06-UART\UART(MSP432)-20210410\03_MCU\MCU_drivers" -I"C:\Users\lenovo\Desktop\MSP-20210417\MSP-20210417\User-MSP432-20210417\CH06-UART\UART(MSP432)-20210410\03_MCU\startup" -I"C:\Users\lenovo\Desktop\MSP-20210417\MSP-20210417\User-MSP432-20210417\CH06-UART\UART(MSP432)-20210410\Debug\obj" -I"C:\Users\lenovo\Desktop\MSP-20210417\MSP-20210417\User-MSP432-20210417\CH06-UART\UART(MSP432)-20210410\Debug\srcc" -I"C:\Users\lenovo\Desktop\MSP-20210417\MSP-20210417\User-MSP432-20210417\CH06-UART\UART(MSP432)-20210410\Debug\srcs"
#定义优化级别。共有O0、O1、O2、Os和Og，默认使用Og
opt := Og
#.o文件列表
OBJ_C := $(addprefix $(D_OBJ)/,$(patsubst %.c,%.o,$(notdir $(SRC_CList))))
OBJ_C += $(addprefix $(D_OBJ)/,$(patsubst %.S,%.o,$(notdir $(SRC_SList))))
#.d文件列表
SRC_MK := $(addprefix $(D_OBJ)/, $(patsubst %.c,%.d,$(notdir $(SRC_CList))))
SRC_MK += $(addprefix $(D_OBJ)/, $(patsubst %.S,%.d,$(notdir $(SRC_SList))))

#将文件夹./Source中的.c文件编译为.o文件
$(D_OBJ)/%.o:$(SRC_C)/%.c
	@echo 'Building file: $<'
	@echo 'Invoking: GNU Compiler'
	arm-none-eabi-gcc -c -mcpu=cortex-m4 -march=armv7e-m -mthumb -mfloat-abi=hard -mfpu=fpv4-sp-d16 -D__MSP432P401R__ -DTARGET_IS_FALCON -Dgcc $(include)  -g -gdwarf-3 -gstrict-dwarf -Wall -Wa,-adhlns="$@.lst" -MMD -MP -MF"$(@:%.o=%.d)" -MT"$(@)" -o"$@" "$<"
	@echo 'Finished building: $<'
	@echo ' '

#将文件夹./Source中的.S文件编译为.o文件 
$(D_OBJ)/%.o:$(SRC_S)/%.S
	@echo 'Building file: $<'
	@echo 'Invoking: GNU Compiler'
	arm-none-eabi-gcc -c -mcpu=cortex-m4 -march=armv7e-m -mthumb -mfloat-abi=hard -mfpu=fpv4-sp-d16 -D__MSP432P401R__ -DTARGET_IS_FALCON -Dgcc $(include)  -g -gdwarf-3 -gstrict-dwarf -Wall -Wa,-adhlns="$@.lst" -MMD -MP -MF"$(@:%.o=%.d)" -MT"$(@)" -o"$@" "$<"
	@echo 'Finished building: $<'
	@echo ' '

# 罗列文件中的目标。目标为希望生成的文件。其中“all”和“clean”为伪目标
all: $(finalGoal).lst $(finalGoal).hex

$(finalGoal).out: $(OBJ_C) $(LDS_SRCS)
	@echo 'Building target: $@'
	@echo 'Invoking: GNU Linker'
	arm-none-eabi-gcc -o "$(finalGoal).out" $(OBJ_C) -mcpu=cortex-m4 -T $(LDS_SRCS) \
--specs=nosys.specs -Wl,-Map="$(finalGoal).map" -Wl,--gc-sections -static --specs=nano.specs -mfpu=fpv4-sp-d16 \
-mfloat-abi=hard -mthumb -Wl,--start-group -lc -lm -Wl,--end-group
	@echo 'Finished building target: $@'
	@echo ' '

$(finalGoal).lst: $(finalGoal).out
	@echo 'Invoking: GNU Objcopy Utility'
	arm-none-eabi-objdump --source --all-headers --demangle --line-numbers --wide "$(finalGoal).out" > "$(finalGoal).lst"
	@echo 'Finished building: $@'
	@echo ' '

$(finalGoal).hex: $(finalGoal).out 
	@echo 'Invoking: GNU Objcopy Utility'
	arm-none-eabi-objcopy.exe -I ihex  "$<"  "$@"
	@echo 'Finished building: $@'
	@echo ' '

#设置清理工作空间的伪目标
#仅删除目标文件，其它文件若未发生变动则不编译，有利于提高编译速度
fastClean:
	rm -rf "$(finalGoal).out" "$(finalGoal).hex" "$(finalGoal).map"
	-@$(printf) 'make: fast clean has be done'
	-@$(printf) ' '
#删除所有中间文件和目标文件，全部重新编译	
clean:
	rm -rf  "$(finalGoal).out" "$(finalGoal).hex" "$(finalGoal).map" "$(finalGoal).lst" $(OBJ_C) $(SRC_MK)
	-@$(printf) 'make: clean has be done'
	
second-target:$(finalGoal).lst
	
#指定哪些目标为伪目标
.PHONY: all clean fastClean test


