读书人

前不久写的一个makefile可以配置编成

发布时间: 2013-03-21 10:08:17 作者: rapoo

最近写的一个makefile,可以配置编成elf,静态库,动态库

#environment
SHELL=/bin/bash
MAKE=make

#compiler
CC=gcc
AR=ar
CR=cr


#directory
MAKE_DIR=$(PWD)
SRC_DIR=$(MAKE_DIR)/src/
OBJ_DIR=$(MAKE_DIR)/obj/
LIB_DIR=$(MAKE_DIR)/lib/
INCLUDE_DIR=$(MAKE_DIR)/includes
DEBUG_DIR=$(MAKE_DIR)/debug/
RELEASE_DIR=$(MAKE_DIR)/release/

#vpath
vpath %.cpp $(SRC_DIR)
vpath %.o $(OBJ_DIR)
vpath %.d $(OBJ_DIR)

#VPATH = $(SRC_DIR) $(OBJ_DIR)

#include
INCLUDE=-I$(INCLUDE_DIR)

#src file
SRC_FILES:=$(wildcard $(SRC_DIR)*.cpp)

#obj file
OBJ_FILES:=$(notdir $(patsubst %.cpp, %.o, $(SRC_FILES)))

#depend file, which generated by g++ -MMD xx.cpp $(INCLUDE)
DEPEND_FILES:=$(notdir $(patsubst %.cpp, %.d, $(SRC_FILES)))

#lib, which used for link.
LIBS:=
LIB=-L$(LIB_DIR) $(LIBS)

#LOCAL_MODULE_ELF, which means the final executable file for this module
LOCAL_MODULE_ELF:=calc

LOCAL_MODULE_STATIC_LIB:=libcalc.a

LOCAL_MODULE_DYNAMIC_LIB:=libcalc.so


#flag
FLAG_DEBUG=-g
FLAG_COMPLE=-c
FLAG_LINK=

#debug
DEBUG=1

ifeq ($(DEBUG),1)
OUTPUT_DIR:=$(DEBUG_DIR)
FLAG_COMPLE:=$(FLAG_DEBUG) $(FLAG_COMPLE)
FLAG_LINK:=
else
OUTPUT_DIR:=$(RELEASE_DIR)
FLAG_COMPLE:=$(FLAG_COMPLE)
FLAG_LINK:=
endif

#output
OUTPUT_ELF=$(OUTPUT_DIR)$(LOCAL_MODULE_ELF)
OUTPUT_STATIC_LIB=$(OUTPUT_DIR)$(LOCAL_MODULE_STATIC_LIB)
OUTPUT_DYNAMIC_LIB=$(OUTPUT_DIR)$(LOCAL_MODULE_DYNAMIC_LIB)

.PHONY: all help dir elf staticlib dynamiclib obj move clean cleanall

all:dir obj

#放在任何命令之前
include $(DEPEND_FILES)

help:
@echo "A simple makefile!"

dir:
mkdir -p $(OBJ_DIR)
mkdir -p $(LIB_DIR)
mkdir -p $(DEBUG_DIR)
mkdir -p $(RELEASE_DIR)

obj:$(OBJ_FILES)

move:
mv -f *.o $(OBJ_DIR)
mv -f *.d $(OBJ_DIR)

%.d:$(SRC_DIR)%.cpp
@echo "~~~~~~~~~~~~~~~~~~"
$(CC) -MM -MD $^ $(INCLUDE)

%.o:
@echo "------------------"
$(CC) -fPIC -c $< -o $@ $(INCLUDE)

elf:$(OBJ_FILES)
@echo "building elf..."
@echo "OBJ_FILES: $(OBJ_FILES)"
@echo "LIB: $(LIB)"
@echo "OUTPUT_ELF: $(OUTPUT_ELF)"
$(CC) $(FLAG_LINK) -o $(OUTPUT_ELF) $(OBJ_FILES) $(LIB)

staticlib:$(OBJ_FILES)
@echo "building static lib..."
@echo "OUTPUT_LIB: $(OUTPUT_STATIC_LIB)"
$(AR) $(CR) $(OUTPUT_STATIC_LIB) $(OBJ_FILES)

dynamiclib:$(OBJ_FILES)
@echo "building dynamic lib..."
@echo "OUTPUT_LIB: $(OUTPUT_DYNAMIC_LIB)"
$(CC) -shared -o $(OUTPUT_DYNAMIC_LIB) $(OBJ_FILES)

clean:
@rm -f $(OBJ_DIR)* *.d *.o
@rm -f $(OUT)
@clear

cleanall:
@rm -f $(OBJ_DIR)*
@rm -f $(RELEASE_DIR)*
@rm -f $(DEBUG_DIR)*

读书人网 >移动开发

热点推荐