分享

通用makefile编写

 昵称5169677 2016-08-30
#
# 2016.4.13
# xuwei



#指定makefile隐式规则的变量
AR = ar    #库打包命令
ARFLAGS =  cr#库打包命令参数
AS = as    #汇编命令
ARFLAGS =  #汇编语言编译器参数
CC = gcc   #C 编译命令
CXX = g++  #C++ 编译命令
CFLAGS= -g -Wall -fshort-wchar #C 编译器参数
CXXFLAGS = -g -Wall #C++ 编译器参数
CPPFLAGS= -g  #C 预处理器参数
LDFLAGS= ld #链接器参数(ld)

#指定makefile搜索目标文件和依赖文件的路径
VPATH        = .:./MIPS

#
FILENAME = MIPS
#生成目标文件
GOAL        = main.out

#指定库文件路径,在命令行中使用,指定编译器搜索库文件路径
#-l表示包含的库文件 -L 指定库文件路径
LDLIBS = -L./ -liconv
#指定include文件路径,在命令行中使用,指定编译器搜索包含文件路径
INCLUDE_DIR    = -I.

#设定编译器使用静态库,默认优先使用动态库
STATIC = -static
                            
#
# SOURCES
#
SOURCES        = \
    main.cpp\
    CCodeConverter.cpp\
    

#addprefix 将.d文件前添加MIPS生成MIPS/%.d        
DEPENDS_CPP    = \
        $(addprefix MIPS/,$(SOURCES:.cpp=.d))

DEPENDS        = $(DEPENDS_CPP)

OBJS        = $(DEPENDS:.d=.o)
ASMS        = $(DEPENDS:.d=.s))
DISASMS        = $(DEPENDS:.d=.dis))

#
#伪目标
#
.PHONY:        all clean creatdir


#
# main target
#
all:    creatdir $(GOAL)
    @echo \"$(GOAL) made\"

#
#生成目标文件
#
$(GOAL): $(OBJS)
    @echo \"start compile..\"
    $(CXX) $(CXXFLAGS) -o $(GOAL)  $(OBJS) $(LDLIBS)
#
#文件生成规则  
#
MIPS/%.o : %.d

MIPS/%.o : %.cpp
    $(CXX) -c $(INCLUDE_DIR) $(CXXFLAGS) $<  -o $@

MIPS/%.o : %.c
    $(CC) -c $(INCLUDE_DIR) $(CFLAGS) $<  -o $@


#生成依赖文件.d
#sed -e 's,\($*\)\.o[ :]*,MIPS\/\1.o $@ : ,g' -e '1a \    $$(CXX) -c $$<  -o $$@' <$@.$$$$ >$@;
MIPS/%.d: %.cpp
    @echo $<
    @set -e; rm -f $@; \
    $(CXX) -MM $(CPPFLAGS) $< > $@.$$$$; \
    sed 's,\($*\)\.o[ :]*,MIPS\/\1.o $@ : ,g'<$@.$$$$ >$@;\
    rm -f $@.$$$$

MIPS/%.d: %.c
    @echo $<
    @set -e; rm -f $@; \
    $(CC) -MM $(CPPFLAGS) $< > $@.$$$$; \
    sed 's,\($*\)\.o[ :]*,MIPS\/\1.o $@ : ,g' < $@.$$$$ > $@; \
    rm -f $@.$$$$    

#
#伪命令
#
clean:
    -rm -rf $(GOAL) ./MIPS/* ./*.o

creatdir:
ifeq ($(FILENAME),$(wildcard $(FILENAME)))
    @echo mips is have
else
    @set -e;mkdir MIPS
endif     

#
#将.d文件添加到makefile中,MAKECMDGOALS 表示命令行输入的目标
#
ifneq ($(MAKECMDGOALS),clean)
sinclude    $(DEPENDS)
endif

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多