首页 > 技术文章 > Linux Makefile多目录的编写

jojodru 2014-09-01 17:32 原文

手头一个项目,需要编写项目的makefile

多目录结构:

csource/  

├── common
│   └── sqlite3
├── inc
│   ├── curl
│   ├── lua
│   └── Protection
├── lib
│   ├── arm
│   └── linux
├── obj
├── out
│   ├── arm
│   └── linux
├── src

源码目录src,输出目录out,include目录inc,输入链接库目录lib,常用静态函数和sqlite3目录common

makefile如下:

 

 1 PLAT= none
 2 CC=
 3 CXX=
 4 CFLAGS=
 5 LDFLAGS=
 6 MKDIR_P=mkdir -p
 7 
 8 PLATS= linux arm
 9 
10 root= libroot.so
11 root_a= libroot.a
12 
13 INC_DIR= ./inc
14 COM_DIR= ./common
15 SQL_DIR= ./common/sqlite3
16 LUA_DIR= ./inc/lua
17 PRO_DIR= ./inc/Protection
18 INCLUDE= -I$(LUA_DIR) -I$(INC_DIR) -I$(COM_DIR) -I$(SQL_DIR) -I$(PRO_DIR)
19 DIR_SRC= ./src
20 
21 SRC = $(wildcard ${DIR_SRC}/*.cpp)
22 OBJ = $(patsubst %.cpp,${DIR_OBJ}/%.o,$(notdir ${SRC})) $(DIR_OBJ)/sqlite3.o
23 
24 SO_TARGET = ${DIR_BIN}/${root}
25 LIB_TARGET= ${DIR_BIN}/${root_a}
26 
27 
28 # Targets start here.
29 default: $(PLAT)
30 
31 none:
32     @echo "Please do 'make PLATFORM' where PLATFORM is one of these:"
33     @echo "  $(PLATS)"
34 
35 ${SO_TARGET}:${OBJ}
36     $(CXX) $(OBJ) -o $@ $(LDFLAGS)
37     cp ${DIR_BIN}/${root} ./test/ -f
38 
39 ${LIB_TARGET}:${OBJ} 
40     $(AR) $@ ${OBJ} 
41     $(RANLIB) $@
42 
43 dir:
44     $(MKDIR_P) $(DIR_OBJ) $(DIR_BIN);
45 
46 all:$(SO_TARGET) $(LIB_TARGET)
47 
48 ALL = dir all
49 
50 linux:
51     $(MAKE) $(ALL) DIR_OBJ="./obj_linux/" DIR_BIN="./out/linux" \
52     CC="gcc" CXX="g++" AR="ar rcu" RANLIB="ranlib" \
53     CFLAGS="-Wno-write-strings -m32 -O2 -D_DEBUG -D_LINUX -fPIC" \
54     LDFLAGS="-O2 -shared -m32 -ldl -pthread -lrt -L./lib/linux -llua -lProtection -lz -lcurl"
55 
56 arm:
57     $(MAKE) $(ALL) DIR_OBJ="./obj_arm/" DIR_BIN="./out/arm" \
58     CC="arm-linux-gnueabihf-gcc" CXX="arm-linux-gnueabihf-g++" \
59     AR="arm-linux-gnueabihf-ar rcu" RANLIB="arm-linux-gnueabihf-ranlib" \
60     CFLAGS="-Wno-write-strings -O2 -D_ARM -D__LINUX -fPIC" \
61     LDFLAGS="-O2 -shared -ldl -pthread -lrt -L./lib/arm -llua -lProtection -lz -lcurl"
62 
63 
64 # list targets that do not create files (but not all makes understand .PHONY)
65 .PHONY: all $(PLATS) default clean none
66 
67 ${DIR_OBJ}/%.o:${DIR_SRC}/%.cpp 
68     $(CXX) $(CFLAGS) $(INCLUDE) -c $< -o $@
69 
70 ${DIR_OBJ}/sqlite3.o:${DIR_SRC}/sqlite3.c 
71     $(CC) $(CFLAGS) $(INCLUDE) -c $< -o $@
72 
73 .PHONY:clean
74 clean: 
75     -find ${DIR_OBJ} -name *.o -exec rm -rf {} \;

 

推荐阅读