我自己写的一个makefile,研究了2周,写的还是这么粗糙,惭愧。。

来源:互联网 发布:doom4优化 编辑:程序博客网 时间:2024/04/30 06:13

#设置编译器参数
CC = gcc
AR= ar

#objects= base.o error.o shellsort.o sortfile_line.o string.o string.c
#设置程序名
result := wanwan
result ?= sortfile_line

#LIBS=$(result).lib
#文件目录
SRC  :=./src ./
HEAD :=./head
OBJ  :=./obj
CONFIG :=./config
DEPEND :=./depend_f
LIB := libwanwan.a

#目录变换
INCDIR  += ./ $(HEAD) E:/cygwin/usr/include
INCLUDE += $(foreach dir, $(INCDIR), -I$(dir))

SRC_C := $(foreach dir, $(SRC), $(wildcard $(dir)/*.c))

SRC_S := $(notdir $(SRC_C))

object_s := $(patsubst %.c, %.o, $(SRC_S) )
object_o := $(patsubst %.o, $(OBJ)/%.o, $(object_s))

#make程序的搜索路径
#VPATH = $(SRC):$(HEAD):$(OBJ):./
vpath %.h  $(HEAD) E:/cygwin/usr/include
vpath %.o  $(OBJ)
vpath %.c  $(SRC)

#编译参数
#INCLUDE += -I../..
flags=   -Wall $(INCLUDE)

#嵌套编译
ifeq (0,$(MAKELEVEL))
cur-dir := $(shell pwd)
whoami  := $(shell whoami)
MAKE  := $(MAKE) whoami=$(whoami) sur-dir=$(cur-dir)
endif

subdirs := config

#依赖文件删除命令包
define  depend_d
 -rm  $(DEPEND)/*.d -f
 @echo  -e "Delete $(DEPEND)/*.d doing...\n"
# -@rm print ola list
endef

#编译结果
$(result) : setup $(object_o)
 $(CC)  -o $@  $(object_o)

lib:  $(LIB) ;

$(LIB): $(object_o)
 $(AR) -cr $@   $^
 

applib:  $(LIB)
 $(CC) $(flags) -o $@   $(LIB)

r_lib: $(LIB)
 @[ -d ./obj ] || mkdir ./obj
 @cd ./obj && $(AR) -x ./../$<

print:
 $(CC) $(flags) -o $@  $(wildcard $(SRC)/*.c)

#object_s := $(foreach dir, $(object), )
ola: setup $(object_o)
# $(MAKE) -C $$CONFIG all && pwd
 @for dir in $(CONFIG); do \
 $(MAKE) -C $$dir || exit 1; \
 done
 pwd
 $(CC)  -o $@  $(object_o)


#目录检测,为防止报错
setup:
 @test -d $(OBJ) || mkdir $(OBJ)
 
#$(foreach file,$(objects), $(OBJ)/$(file))

#objects_t = $(wildcard $(OBJ)/*.o)
#模式规则
$(filter %.o ,$(object_o)) : $(OBJ)/%.o : %.c
 $(CC) $(flags) -o $@ -c $<;

 
.PHONY: clean depend lint
clean:
 -rm    $(objects)  *.o  $(OBJ) *.lib *.bin $(result) *.exe   -rf
# @$(depend_d)

.DEFAULT:
 @echo -e "wo kao!,搞什么啊这是...?"

depend:
 @$(CC) $(flags) -MM  $(wildcard $(SRC)/*.c) > depend.mk 
#-include depend.mk
#依赖性文件包含
-include $(SRC_S:%.c=$(DEPEND)/%.d)

#产生依赖性文件,并放在$(DEPEND)目录中
$(DEPEND)/%.d: %.c
 @test -d $(DEPEND) || mkdir $(DEPEND)
 @$(CC) $(flags) -MM  $<  > $@.$$$$; \
 cat $@.$$$$ | sed -e 's/\(.*\)\.o/\$$\(OBJ\)\/\1.o/g' | \
 sed 's,\($*\)\.o[ :]*,\1.o $@ : ,g' > $@; \
 rm -f $@.$$$$
# mv -f *.d $(OBJ)


#lint:
#ifeq (Linux, $(shell uname))
# -splint $(SRC_C)  $(INCLUDE)  +posixlib 
#else
# -LINT-NT $(SRC_C)  -i$(INCDIR) 
#endif

#lint源代码静态检查
lint:
 @if uname | grep -i 'linux';\
 then splint $(SRC_C)  $(INCLUDE)  +posixlib -exportlocal  -shadow  \
 -nestedextern  -exitarg -retvalint -compdef -mustdefine -paramuse &> \
 lint.txt || unix2dos lint.txt && exit 0;\
 else LINT-NT $(SRC_C)  $(INCLUDE) &> lint.txt || unix2dos lint.txt && exit 0;\
 fi

原创粉丝点击