-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathMakefile
133 lines (113 loc) · 4.07 KB
/
Makefile
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
CC=g++
AS=as
AR=ar
LD=ld
CP=llvm-objcopy
PLATFORM_ARCH = $(shell uname -s)
PLATFORM_ARCH_LINUX = Linux
PLATFORM_ARCH_DARWIN = Darwin
PLATFORM_ARCH_FREEBSD = FreeBSD
MK_FALSE = 0
MK_TRUE = 1
# 输出类型配置
TARGET_TYPE_BIN = $(MK_FALSE)
TARGET_TYPE_LIB = $(MK_TRUE)
TARGET_TYPE_DLL = $(MK_TRUE)
# ** 项目配置区 **
#
# 输出文件名称
TARGET_NAME = libes
# 输出文件后缀 [自动判别]
TARGET_BIN_EXT =
TARGET_LIB_EXT_STATIC =
TARGET_LIB_EXT_DYNAMIC =
# 安装位置
INSTALL_PATH_PREFIX = /usr/local
TARGET_BIN_DIR := ./bin
TARGET_LIB_DIR := ./lib
PROJECT_ROOT = .
PROJECT_DIR_BESIDES = \(
PROJECT_DIR_BESIDES += -path ./.git
PROJECT_DIR_BESIDES += -o -path ./obj
PROJECT_DIR_BESIDES += -o -path ./bin
PROJECT_DIR_BESIDES += -o -path ./lib
PROJECT_DIR_BESIDES += -o -path ./.trash
PROJECT_DIR_BESIDES += \)
PROJECT_DIRS = $(shell find $(PROJECT_ROOT) $(PROJECT_DIR_BESIDES) -prune -o -type d -print)
TARGET_HEADERS = $(foreach dir,$(PROJECT_DIRS),$(wildcard $(dir)/*.h))
TARGET_SOURCES_AS += $(foreach dir,$(PROJECT_DIRS),$(wildcard $(dir)/*.s))
TARGET_OBJECTS_AS += $(patsubst %.s,%.o,$(TARGET_SOURCES_AS))
TARGET_SOURCES_CC += $(foreach dir,$(PROJECT_DIRS),$(wildcard $(dir)/*.c))
TARGET_OBJECTS_CC += $(patsubst %.c,%.o,$(TARGET_SOURCES_CC)) # $(patsubst %.cpp,${TARGET_OBJECTS_DIR}/%.o,$(notdir ${TARGET_SOURCES}))
TARGET_SOURCES_PP += $(foreach dir,$(PROJECT_DIRS),$(wildcard $(dir)/*.cpp))
TARGET_OBJECTS_PP += $(patsubst %.cpp,%.o,$(TARGET_SOURCES_PP))
TARGET_HEADER_DIRS += $(foreach dir,$(PROJECT_DIRS),-I$(dir)) # $(wildcard $(TARGET_HEADERS_DIR)/*.h)
# 需要链接的库
TARGET_LIBS = -lstdc++
ASFLAGS =
CCFLAGS = -c -fPIC -Wall -fvisibility=hidden -std=c++11
PPFLAGS = -c -fPIC -Wall -fvisibility=hidden -std=c++11
LDFLAGS =
ifdef SUPER_INCLUDE_PATH
CCFLAGS += -I${SUPER_INCLUDE_PATH}
PPFLAGS += -I${SUPER_INCLUDE_PATH}
endif
ifdef SUPER_LIBRARY_PATH
LDFLAGS += -L${SUPER_LIBRARY_PATH}
endif
# 平台检测 -- DARWIN
ifeq (${PLATFORM_ARCH},${PLATFORM_ARCH_DARWIN})
TARGET_BIN_EXT :=
TARGET_LIB_EXT_STATIC := a
TARGET_LIB_EXT_DYNAMIC := so
endif
# 平台检测 -- LINUX
ifeq (${PLATFORM_ARCH},${PLATFORM_ARCH_LINUX})
TARGET_BIN_EXT :=
TARGET_LIB_EXT_STATIC := a
TARGET_LIB_EXT_DYNAMIC := so
endif
# 平台检测 -- FreeBSD
ifeq (${PLATFORM_ARCH},${PLATFORM_ARCH_FreeBSD})
TARGET_BIN_EXT :=
TARGET_LIB_EXT_STATIC := a
TARGET_LIB_EXT_DYNAMIC := so
endif
TARGETS =
ifeq ($(TARGET_TYPE_LIB),$(MK_TRUE))
TARGETS += ${TARGET_LIB_DIR}/${TARGET_NAME}.${TARGET_LIB_EXT_STATIC}
endif
ifeq ($(TARGET_TYPE_DLL),$(MK_TRUE))
TARGETS += ${TARGET_LIB_DIR}/${TARGET_NAME}.${TARGET_LIB_EXT_DYNAMIC}
endif
ifeq ($(TARGET_TYPE_BIN),$(MK_TRUE))
TARGETS += ${TARGET_BIN_DIR}/${TARGET_NAME}.${TARGET_BIN_EXT}
endif
ALL : $(TARGETS)
${TARGET_LIB_DIR}/${TARGET_NAME}.${TARGET_LIB_EXT_STATIC}:$(TARGET_OBJECTS_PP) $(TARGET_OBJECTS_CC) $(TARGET_OBJECTS_AS)
$(AR) -crvs $@ $^
${TARGET_LIB_DIR}/${TARGET_NAME}.${TARGET_LIB_EXT_DYNAMIC}:$(TARGET_OBJECTS_PP) $(TARGET_OBJECTS_CC) $(TARGET_OBJECTS_AS)
$(CC) -fPIC -shared $(TARGET_LIBS) -o $@ $^ ${LDFLAGS}
$(TARGET_OBJECTS_AS):%.o:%.s
$(AS) ${ASFLAGS} $< -o $@
$(TARGET_OBJECTS_CC):%.o:%.c
$(CC) ${CCFLAGS} $< -o $@
$(TARGET_OBJECTS_PP):%.o:%.cpp
$(CC) ${PPFLAGS} $< -o $@
clean :
rm -f $(TARGET_OBJECTS_AS)
rm -f $(TARGET_OBJECTS_CC)
rm -f $(TARGET_OBJECTS_PP)
rm -f ${TARGET_LIB_DIR}/*
rm -f ${TARGET_BIN_DIR}/*
install :
rm -rf $(INSTALL_PATH_PREFIX)/include/$(TARGET_NAME)
rm -rf $(INSTALL_PATH_PREFIX)/lib/$(TARGET_NAME).*
mkdir $(INSTALL_PATH_PREFIX)/include/$(TARGET_NAME)
cp $(TARGET_HEADERS) $(INSTALL_PATH_PREFIX)/include/$(TARGET_NAME)
cp $(TARGET_LIB_DIR)/$(TARGET_NAME).$(TARGET_LIB_EXT_STATIC) $(INSTALL_PATH_PREFIX)/lib/
cp $(TARGET_LIB_DIR)/$(TARGET_NAME).$(TARGET_LIB_EXT_DYNAMIC) $(INSTALL_PATH_PREFIX)/lib/
uninstall :
rm -rf $(INSTALL_PATH_PREFIX)/include/$(TARGET_NAME)
rm -rf $(INSTALL_PATH_PREFIX)/lib/$(TARGET_NAME).*
rm -rf $(INSTALL_PATH_PREFIX)/lib/pkgconfig/$(TARGET_NAME).pc