- -----------MAKE FILE LEVEL 1---------------
- .SUFFIXES:
- .SUFFIXES:.c .o .a .so
- export CC =gcc
- export CFlag :=-c -g -Wall -pg -Winline
- export DFlag :=-shared -fPIC
- export LFlag :=-pg
- export SHELL =/bin/sh
- vpath %.so ./bin
- vpath %.so ./
- vpath %.c ./src
- vpath %.d ./info
- DNames :=$(shell find ./src -name "????*" -type d|sed "s/\\.\\///g")
- # src/stack
- MKFiles :=$(patsubst %,./%/Makefile,$(DNames))
- # ./src/stack/Makefile
- MKOBJS :=$(patsubst src/%,$(obj_%),$(DNames))
- DEPD :=
- VPATH =./
- #VPATH=./bin
- #GPATH=./bin
- TARGET =./bin/a.out
- inc =./inc
- subdirs :=$(filter-out ./src/general,$(shell find ./src -name "??*" -type d | sed "1d"))
- #lib_llist :=$(patsubst %,./bin/%.so,$(foreach dir,$(subdirs),$(notdir $(dir))))
- Lib_llist :=$(patsubst %,-l%,$(foreach dir,$(subdirs),$(notdir $(dir))))
- INC :=-I$(inc)
- .PHONY:clean all MSG Libs_dp tar
- include ./src/Mk.obj
- include $(MKFiles)
- OBJ :=$(obj_src)
- define obj_template
- OBJ +=$$(obj_$$(patsubst src/%,%,$(1)))
- vpath %.c $(patsubst %,./%/,$(1))
- endef
- $(foreach sdir,$(DNames),$(eval $(call obj_template,$(sdir))))
- DEPD :=$(patsubst %.o,%.d,$(OBJ))
- INFO :=./info/
- IDP :=$(addprefix $(INFO),$(DEPD))
- ifeq ($(MAKELEVEL),0)
- #all:Libs_dp $(TARGET)
- all:Libs_dp $(DEPD) $(TARGET)
- else
- all:MSG
- endif
- Libs_dp:
- $(MAKE) -C ./src -w
- $(TARGET):LFlag+=-L./bin
- $(TARGET):LFlag+=-L./
- $(TARGET):$(OBJ)
- $(CC) $(INC) $(LFlag) -o $@ $^
- $(OBJ):%.o:%.c
- $(CC) $(CFlag) $(INC) -o $@ $<
- -include $(IDP)
- $(DEPD):%.d:%.c
- @echo "==>update dependency<== ["$@"]"
- @set -e;\\
- rm -f $(INFO)$@;\\
- $(CC) $(INC) -MM $< >$(INFO)$@.$$$$;\\
- sed -e "s;^\\([a-z|0-9|_]*\\).o;\\1.o \\1.d;1" $(INFO)$@.$$$$ >$(INFO)$@;\\
- rm -f $(INFO)$@.$$$$;
- tar:
- tar -zcvf ../code-backup/data_struct.`date +"%y-%m-%d"`.tar.gz ./
- MSG:
- -@echo "invoke makefile error. init makefile indeed."
- -@echo "MAKELEVEL = " $(MAKELEVEL)", " "but 0 required."
- clean:
- -rm -f $(lib_llist) $(TARGET) $(IDP)
- $(MAKE) -C ./src -w clean
- .INTERMEDIATE:$(OBJ)
- -----------MAKE FILE LEVEL 2---------------
- NAMES=$(shell find ./ -name "??*" -type d|sed "s/\\.\\///g")
- BlackS=
- SPACE:=$(BlackS)
- AR :=ar
- AFlag :=cr
- ALL_OBJS :=
- # linear_list
- TARS:=$(filter-out general.so,$(patsubst %,%.so,$(NAMES)))
- # linear_list.so
- DTAR:=$(addprefix ../bin/,$(TARS))
- # ../bin/linear_list.so
- ARCH_TAR :=../lib/libgeneral.a
- vpath %.a ../lib
- inc =../inc
- INC :=-I$(inc)
- .SUFFIXES:
- .SUFFIXES:.c .o .a .so
- .PHONY:all MSG ARCH_LIB
- include ./general/Makefile
- ALL_OBJS+=$(addprefix ./general/,$(obj_general))
- ifeq ($(MAKELEVEL),1)
- all:$(ARCH_TAR) $(DTAR)
- else
- all:MSG
- endif
- define DIRS_template
- include $(addsuffix Makefile,./$(basename $(notdir $(1)))/)
- $(1):$$(patsubst %,./$(basename $(notdir $(1)))/%,$$(obj_$(basename $(notdir $(1)))))
- ALL_OBJS+=$$(patsubst %,./$(basename $(notdir $(1)))/%,$$(obj_$(basename $(notdir $(1)))))
- endef
- $(foreach sdir,$(DTAR),$(eval $(call DIRS_template,$(sdir))))
- $(ARCH_TAR):$(addprefix ./general/,$(obj_general))
- $(AR) $(AFlag) -o $@ $^
- $(DTAR):LFlag+=-L../lib -lgeneral
- $(DTAR):
- $(CC) $(DFlag) $(LFlag) -o $@ $^ $(ARCH_TAR)
- $(ALL_OBJS):%.o:%.c
- $(CC) $(CFlag) $(INC) -o $@ $<
- MSG:
- -@echo "Second level sub Makefile, please check make levels."
- -@echo "MAKELEVEL = " $(MAKELEVEL)", " "but 1 required."
- clean:
- -rm -f $(DTAR) $(ARCH_TAR)
- .INTERMEDIATE:$(ALL_OBJS)
- //该片段来自于http://www.codesnippet.cn/detail/051220137778.html
来源: http://www.codesnippet.cn/detail/051220137778.html