本文是一个简单地makefile示例
$@ 表示目标文件
$^ 表示所有的依赖文件
$< 表示第一个依赖文件
$? 表示比目标还要新的依赖文件列表
SRCDIRS :=src
INCDIRS :=src
TARGET := sdk
OUTPUT_DIR_NAME := obj
cross_complier :=
complier :=$(cross_complier)gcc
cpp_complier:=$(cross_complier)g++
LD :=$(cross_complier)ld
OBJCOPY :=$(cross_complier)objcopy
CFILES := $(foreach dir, $(SRCDIRS), $(wildcard $(dir)/*.c))
CPLUSPLUSFILES := $(foreach dir, $(SRCDIRS), $(wildcard $(dir)/*.cpp))
SFILES :=$(foreach dir, $(SRCDIRS), $(wildcard $(dir)/*.S))
CSOUCEFILE_NODIR :=$(notdir $(CFILES))
SSOUCEFILE_NODIR :=$(notdir $(SFILES))
CPLUSPLUSSOUCEFILE_NODIR :=$(notdir $(CPLUSPLUSFILES))
COBJS :=$(CSOUCEFILE_NODIR:%.c=$(OUTPUT_DIR_NAME)/%.o)
CPLUSPLUSOBJS :=$(CPLUSPLUSSOUCEFILE_NODIR:%.cpp=$(OUTPUT_DIR_NAME)/%.o)
SOBJS :=$(SSOUCEFILE_NODIR:%.S=$(OUTPUT_DIR_NAME)/%.o)
OBJS := $(COBJS) $(SOBJS) $(CPLUSPLUSOBJS)
INCLUDE := $(patsubst %, -I %, $(INCDIRS))
C_DEFINES:=-D__HELLO__
CFLAGS :=$(C_DEFINES) -Wall -std=c11 -O2
CPPFLAGS :=$(C_DEFINES) -Wall -std=c++11 -O2
VPATH := $(SRCDIRS)
.PHONY:clean rebuild debug
$(TARGET).bin:$(OBJS)
$(cpp_complier) -o $(OUTPUT_DIR_NAME)/$(TARGET).exe $^
$(OUTPUT_DIR_NAME)/%.o:%.c
$(complier) -c $(CFLAGS) $(INCLUDE) -o $@ $<
$(OUTPUT_DIR_NAME)/%.o:%.S
$(complier) -c $(CFLAGS) $(INCLUDE) -o $@ $<
$(OUTPUT_DIR_NAME)/%.o:%.cpp
$(cpp_complier) -c $(CPPFLAGS) $(INCLUDE) -o $@ $<
clean:
rm -rf $(OUTPUT_DIR_NAME)/*.o $(OUTPUT_DIR_NAME)/*.out $(TARGET).bin $(OUTPUT_DIR_NAME)/$(TARGET).elf
rebuild:clean $(TARGET).bin
debug:
@echo $(CFILES)
@echo $(SFILES)
@echo $(CPLUSPLUSFILES)
@echo $(CSOUCEFILE_NODIR)
@echo $(SSOUCEFILE_NODIR)
@echo $(CPLUSPLUSSOUCEFILE_NODIR)
@echo $(OBJS)