Makefile | 一个简单的项目代码编译用的Makefile
时间:2024年3月7日12:54:48
目录
[TOC]
1.参考
1.Makefile | Makefile几个常用函数_makefile的file()函数-CSDN博客
2.
Makefile
| 一个简单的项目编译的Makefile_makefile $(prj_cc_defs) aip_debug_sim=1-CSDN博客
2.实例
2-1.实例1
#######################################################################
# 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) $@.bin
$(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)
2-2.实例2
CC = gcc
CFLAGS = -g -Wall -O0
OBJS=iniparser
SRC= dictionary.c strlib.c iniparser.c main.c
$(OBJS) : $(SRC)
$(CC) $(CFLAGS) -o $@ $^
clean:
$(RM) $(OBJS) .*.sw?
2-3.实例3
SRC=${wildcard *.c}
BIN=${patsubst %.c, %, $(SRC)}
CFLAGS= -g -Wall
LIBS= -lm
all:$(BIN)
$(BIN):%:%.c
$(CC) -o $@ $< $(CFLAGS) $(LIBS)
clean:
$(RM) a.out $(BIN)
.PHONY:all clean test
test:
@echo $(SRC)
@echo $(BIN)
2-4.实例4
编译动态库/静态库: linux-app:linux应用开发与学习 - code/04-IPC/03-semaphore/Makefile