-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathMakefile
147 lines (112 loc) · 4.36 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
134
135
136
137
138
139
140
141
142
143
144
145
146
147
# Made with C Project Manager
# Author: Caswall Engelsman ([email protected])
include config.mk
include project.mk
ARCHIVE_FILES := ${APP_NAME:%=lib%.a}
LIBRARY_FILES := ${APP_NAME:%=lib%.so}
LIBRARY_FILES_VERSIONS := ${LIBRARY_FILES:%.so=%.so.${VERSION}}
GITLAB_DEP := ${DEPENDENCIES:gitlab/%=${DEP_PATH}/gitlab/%}
LDFLAGS += ${DEPENDENCIES:%=-L${DEP_PATH}/%}
CFLAGS += ${DEPENDENCIES:%=-I${DEP_PATH}/%}
TAR_NAME ?= ${APP_NAME}-${VERSION}.tar.gz
PACKAGE_CONTENTS ?= ${APP_NAME} ${ARCHIVE_FILES}
all: set_debug_vars dep ${APP_NAME}
set_debug_vars:
${eval DEBUG = -g3}
${APP_NAME}: %: ${SRC_PATH}/%.o ${COMP_O} ${UTILS_O}
${call print,${GREEN}BIN $@}
${Q}${CC} $^ -o $@ ${CFLAGS} ${LDFLAGS}
%.o: %.c
${call print,${CYAN}CC $@}
${Q}${CC} -c $< -o $@ ${CFLAGS}
static_library: dep ${ARCHIVE_FILES}
${ARCHIVE_FILES}: ${COMP_O} ${UTILS_O}
${call print,${BROWN}AR $@}
${Q}cd ${LIB_PATH}; ar -x *.a || true
${Q}ar -cq $@ $^ ${shell find ${LIB_PATH} -name '*.o'}
set_pic:
${eval CFLAGS += -fPIC}
set_debug:
${eval DEBUG = -g3}
shared_library: dep ${LIBRARY_FILES}
${LIBRARY_FILES}: %.so: %.so.${VERSION}
${call print,${BRIGHT_CYAN}SYMLINK $@}
${Q}ln -sf $< $@
${LIBRARY_FILES_VERSIONS}: set_pic ${COMP_O} ${UTILS_O}
${call print,${BRIGHT_MAGENTA}LIB $@}
${Q}${CC} -shared -Wl,-soname,$@ -o $@ ${filter-out set_pic,$^} ${LDFLAGS}
dep: ${GITLAB_DEP}
test: set_debug dep ${TESTS_OUT}
@for exe in $(TESTS_OUT) ; do \
valgrind --error-exitcode=1 --leak-check=full $$exe ; \
done
${TESTS_OUT}: %.out: %.c ${COMP_O} ${UTILS_O}
${call print,${GREEN}BIN $@}
${Q}${CC} $^ -o $@ ${CFLAGS} ${LDFLAGS}
release:
${call print,${GREEN}RELEASE v${VERSION}}
${Q}git tag -a v${VERSION} -m 'Version ${VERSION}'
${Q}git push origin v${VERSION}
${GITLAB_DEP}:
${eval PREFIX = ${DEP_PATH}/gitlab}
${eval CLEAN_PREFIX = ${PREFIX:./%=%}}
${eval INFO = ${@:${CLEAN_PREFIX}/%=%}}
${eval WORD_LIST = ${subst /, ,${INFO}}}
${eval PROJECT = ${word 1, ${WORD_LIST}}}
${eval VERSION = ${word 2, ${WORD_LIST}}}
${Q}mkdir -p $@
${call gitlab_get_file,${PROJECT},${VERSION},$@}
${Q}cd $@ && tar xvf dist.tar.gz
${LIB_PATH}/%.a:
${eval WORD_LIST = ${subst /, ,$@}}
${eval ORG = ${word 2, ${WORD_LIST}}}
${eval PROJECT = ${word 3, ${WORD_LIST}}}
${eval VERSION = ${word 4, ${WORD_LIST}}}
${eval FILE_NAME = ${word 5, ${WORD_LIST}}}
${Q}mkdir -p ${dir $@}
${call get_archive,${ORG}/${PROJECT},${VERSION},${FILE_NAME},$@}
${Q}ln -sf ${shell pwd}/$@ ${shell pwd}/${LIB_PATH}/${FILE_NAME}
${LIB_PATH}/%.h:
${eval WORD_LIST = ${subst /, ,$@}}
${eval ORG = ${word 2, ${WORD_LIST}}}
${eval PROJECT = ${word 3, ${WORD_LIST}}}
${eval VERSION = ${word 4, ${WORD_LIST}}}
${eval FILE_NAME = ${word 5, ${WORD_LIST}}}
${Q}mkdir -p ${dir $@}
${Q}mkdir -p ${INCLUDE_PATH}
${call get_header,${ORG}/${PROJECT},${VERSION},${FILE_NAME},$@}
${Q}ln -sf ${shell pwd}/$@ ${shell pwd}/${INCLUDE_PATH}/${FILE_NAME}
set_prod_vars:
${eval DEBUG = -O3}
prod: set_prod_vars dep ${APP_NAME}
package: dep ${TAR_NAME}
${TAR_NAME}: ${PACKAGE_CONTENTS}
${call print,${GREEN}TAR $@}
${Q}mkdir -p ${DIST_PATH}
${Q}cp -R $^ ${DIST_PATH}
${Q}tar -czf $@ -C ${DIST_PATH} .
install: ${INSTALL_STEPS}
install_binary: ${INSTALL_PATH}/bin/
${call print,${GREEN}INSTALL $<}
${Q}cp ${APP_NAME} ${INSTALL_PATH}/bin/
install_static: ${ARCHIVE_FILES} ${APP_NAME:%=${SRC_PATH}/%.h} ${INSTALL_PATH}/include/ ${INSTALL_PATH}/lib/
${call print,${GREEN}INSTALL $<}
${Q}cp ${APP_NAME:%=${SRC_PATH}/%.h} ${INSTALL_PATH}/include/
${Q}cp ${ARCHIVE_FILES} ${INSTALL_PATH}/lib/
install_shared: ${APP_NAME:%=lib%.so.${VERSION}} ${APP_NAME:%=${SRC_PATH}/%.h} ${INSTALL_PATH}/include/ ${INSTALL_PATH}/lib/
${call print,${GREEN}INSTALL $<}
${Q}cp ${APP_NAME:%=${SRC_PATH}/%.h} ${INSTALL_PATH}/include/
${Q}cp ${APP_NAME:%=lib%.so.${VERSION}} ${INSTALL_PATH}/lib/
install_share_folder: ${APP_NAME:%=${INSTALL_PATH}/share/%}
${call print,${GREEN}INSTALL $<}
${Q}cp -R ${SHARE_PATH}/* ${APP_NAME:%=${INSTALL_PATH}/share/%}
${INSTALL_PATH}/%:
${call print,${GREEN}MKDIR $@}
${Q}mkdir -p $@
clean:
${call print,${BRIGHT_CYAN}CLEAN ${APP_NAME}}
${Q}${RM} ${APP_NAME} ${APP_NAME:%=${SRC_PATH}/%.o} ${APP_NAME:%=lib%.*} ${COMP_O} ${UTILS_O}
${Q}${RM} -R ${DIST_PATH}
${call print,${BRIGHT_CYAN}CLEAN tests}
${Q}${RM} ${TESTS_OUT}
.PHONY: package clean set_prod_vars set_debug_vars prod all set_pic install install_share_folder install_shared install_binary install_static dep