`Makefile` | 一个简单的项目编译的Makefile

Makefile | 一个简单的项目编译的Makefile

#######################################################################
# FOR TEST@2021-by FLYER
######################################################################

#
# Makefile for module.
#

CROSS           ?=
NAME            := prjname
SUFFIX          := .bin
BIN_NAME        = '${NAME}${SUFFIX}'

#
# color printf
#
BR_FW   = "\e[1;41m"
BG_FW   = "\e[1;42m"
BY_FW   = "\e[1;43m"
BB_FW   = "\e[1;44m"
NONE    = "\e[0m"
RED             = "\e[1;31m"
GREEN   = "\e[1;32m"
YELLOW  = "\e[1;33m"
BLUE    = "\e[1;34m"

#
# Load variables of flag.
#

ASFLAGS         := -g -ggdb -Wall -O3
CFLAGS          := -g -ggdb -Wall -O3
CXXFLAGS        := -g -ggdb -Wall -O3
LDFLAGS         :=
ARFLAGS         :=
OCFLAGS         :=
ODFLAGS         :=
MCFLAGS         :=

LIBDIRS         :=
LIBS            :=
INCDIRS         :=
SRCDIRS         :=

BIN_STR_CFLAGS = \
                        -D_BIN_NAME_STR_='"$(BIN_NAME)"' \
                        -D_TEST_CRYPT_ENABLE_

#
# Add necessary directory for INCDIRS and SRCDIRS
#
CURR_PATH       := ${shell pwd}
INCDIRS         += $(CURR_PATH)
SRCDIRS         += $(CURR_PATH)
OBJDIRS         += .obj

#
## You shouldn't need to change anything below this point.
#
AS                      := $(CROSS)gcc -x assembler-with-cpp
CC                      := $(CROSS)gcc
CXX                     := $(CROSS)g++
LD                      := $(CROSS)ld
AR                      := $(CROSS)ar
OC                      := $(CROSS)objcopy
OD                      := $(CROSS)objdump
MKDIR           := mkdir -p
CP                      := cp -af
RM                      := rm -fr
CD                      := cd
FIND            := find
MKHEADER        :=

#
## X variables
#
X_ASFLAGS       := $(MCFLAGS) $(ASFLAGS)
X_CFLAGS        := $(MCFLAGS) $(CFLAGS) $(BIN_STR_CFLAGS)
X_CXXFLAGS      := $(MCFLAGS) $(CXXFLAGS)
X_LDFLAGS       := $(LDFLAGS)
X_OCFLAGS       := $(OCFLAGS)
X_LIBDIRS       := $(LIBDIRS)
X_LIBS          := $(LIBS) -lgcc

X_OUT           := output
X_NAME          := $(patsubst %, $(X_OUT)/%, $(NAME))
X_INCDIRS       := $(patsubst %, -I %, $(INCDIRS))
X_SRCDIRS       := $(patsubst %, %, $(SRCDIRS))
X_OBJDIRS       := $(patsubst %, $(OBJDIRS)/%, $(X_SRCDIRS))

X_SFILES        := $(foreach dir, $(X_SRCDIRS), $(wildcard $(dir)/*.S))
X_CFILES        := $(foreach dir, $(X_SRCDIRS), $(wildcard $(dir)/*.c))
X_CPPFILES      := $(foreach dir, $(X_SRCDIRS), $(wildcard $(dir)/*.cpp))

X_SDEPS         := $(patsubst %, $(OBJDIRS)/%, $(X_SFILES:.S=.o.d))
X_CDEPS         := $(patsubst %, $(OBJDIRS)/%, $(X_CFILES:.c=.o.d))
X_CPPDEPS       := $(patsubst %, $(OBJDIRS)/%, $(X_CPPFILES:.cpp=.o.d))
X_DEPS          := $(X_SDEPS) $(X_CDEPS) $(X_CPPDEPS)

X_SOBJS         := $(patsubst %, $(OBJDIRS)/%, $(X_SFILES:.S=.o))
X_COBJS         := $(patsubst %, $(OBJDIRS)/%, $(X_CFILES:.c=.o))
X_CPPOBJS       := $(patsubst %, $(OBJDIRS)/%, $(X_CPPFILES:.cpp=.o))
X_OBJS          := $(X_SOBJS) $(X_COBJS) $(X_CPPOBJS)

VPATH           := $(X_OBJDIRS)

all : $(X_NAME)

$(X_NAME) : $(X_OBJS)
        @echo [LD] Linking $@.elf
        @$(CC) $(X_LDFLAGS) $(X_LIBDIRS) -Wl,--cref,-Map=$@.map $^ -o $@.elf $(X_LIBS)
        @echo -e $(GREEN)"[OC] Objcopying "$@"$(SUFFIX)"$(NONE)
        @$(OC) $(X_OCFLAGS) $@.elf $@$(SUFFIX)
#@echo make header information for irom booting
#@$(MKHEADER) [email protected]

$(X_SOBJS) : $(OBJDIRS)/%.o : %.S
        @echo [AS] $<
        @$(AS) $(X_ASFLAGS) $(X_INCDIRS) -c $< -o $@
        @$(AS) $(X_ASFLAGS) -MD -MP -MF $@.d $(X_INCDIRS) -c $< -o $@

$(X_COBJS) : $(OBJDIRS)/%.o : %.c
        @echo [CC] $<
        @$(CC) $(X_CFLAGS) $(X_INCDIRS) -c $< -o $@
        @$(CC) $(X_CFLAGS) -MD -MP -MF $@.d $(X_INCDIRS) -c $< -o $@

$(X_CPPOBJS) : $(OBJDIRS)/%.o : %.cpp
        @echo [CXX] $<
        @$(CXX) $(X_CXXFLAGS) $(X_INCDIRS) -c $< -o $@
        @$(CXX) $(X_CXXFLAGS) -MD -MP -MF $@.d $(X_INCDIRS) -c $< -o $@

clean:
        @$(RM) $(X_DEPS) $(X_OBJS) $(X_OBJDIRS) $(X_OUT) $(OBJDIRS)
        @$(RM) $(OBJDIRS) .*.sw? a.out
        @echo -e $(BLUE)"Clean complete."$(NONE)

test:
        @./output/$(BIN_NAME)

t0:
        @echo $(BIN_NAME)
        @echo $(CURR_PATH)

prj:
        @make clean;make all

#
# Include the dependency files, should be place the last of makefile
#
sinclude $(shell $(MKDIR) $(X_OBJDIRS) $(X_OUT)) $(X_DEPS)

.PHONY:all clean test prj test help install uninstall clean_all t0

help:
        @echo "====================================================="
        @echo "make help             -> show make command info"
        @echo "make all              -> build all"
        @echo "make prj              -> clean and build all"
        @echo "make test             -> test the software "
        @echo "make clean            -> clean all "
        @echo "make install          -> install software "
        @echo "make uninstall        -> uninstall software "
        @echo "====================================================="

INS_DIR = /usr/bin

install:
        @${CP} ${X_OUT}/${BIN_NAME} ${INS_DIR}/
        @echo Install Complete.

uninstall:
        @$(RM) ${INS_DIR}/${BIN_NAME}
        @echo Uninstall Complete.

clean_all:
        @make clean;make -C test clean;

使用说明

1.工程根目录下新建Makefile,复制上述内容;
2.固件名修改:
NAME := prjname
SUFFIX := .bin
3.交叉编译工具链修改:
CROSS ?=
4.代码添加(添加目录路径,自动编译目录下所有代码):
SRCDIRS += $(CURR_PATH)

猜你喜欢

转载自blog.csdn.net/I_feige/article/details/129801245