This repository was archived by the owner on Jun 3, 2023. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathmakefile
331 lines (266 loc) · 10.3 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
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
#Variables which can be pre-set (non-exhaustive list)
#ARCH: value for the switch: -march=
#GCC: path to g++
#debug: set to true for a debug build
#gprof: set to true for a gprof build
#san: set to address, thread, leak, undefined, etc. for a -fsanitize= enabled build
#list: set to true to enable listings
#map: set to true to enable linker map
#strip: set to true to strip binary (using STRIPFLAGS)
#cross: set to true if building on Unix, but build target is Windows
#V: set to true to show full command lines
#nopch: disable use of pre-compiled header
#noflto: disable use of link-time optimisation
#On Unixy platforms only
#WXCFGFLAGS: arguments for wx-config
#Note that to build on or for Windows, the include/lib search paths will need to be edited below and/or
#a number of libs/includes will need to be placed/built in a corresponding location where gcc can find them.
OBJS_SRC := $(patsubst src/%,%,$(filter-out src/version.cpp,$(wildcard src/*.cpp)) $(wildcard src/filter/*.cpp) $(wildcard src/emoji/*.cpp))
TCOBJS_SRC := $(patsubst src/%,%,$(wildcard src/libtwitcurl/*.cpp))
COBJS_SRC := utf8proc/utf8proc.c
OTHER_SRC := version.cpp
EXCOBJS_SRC :=
RTROBJS_SRC :=
OUTNAME := retcon
COMMONCFLAGS := -Wall -Wextra -Wshadow -Wno-unused-parameter -Ideps
MCFLAGS := -Wcast-qual
COBJS_CFLAGS := -Wno-missing-field-initializers -Wno-sign-compare
OPTIMISE_FLAGS := -O3
CFLAGS = $(OPTIMISE_FLAGS) $(COMMONCFLAGS)
AFLAGS :=
CXXFLAGS := -std=c++11
TCFLAGS := -DSHA1_NO_UTILITY_FUNCTIONS -DSHA1_NO_STL_FUNCTIONS
WXCFGFLAGS := --version=2.8
GCC := g++
LD := ld
OBJDIR := objs
DIRS = $(OBJDIR) $(OBJDIR)/libtwitcurl $(OBJDIR)/res $(OBJDIR)/res/twemoji/16x16 $(OBJDIR)/res/twemoji/36x36 $(OBJDIR)/deps/utf8proc $(OBJDIR)/filter $(OBJDIR)/emoji $(OBJDIR)/pch
EXECPREFIX := ./
MKDIR := mkdir -p
VERSION_STRING := $(shell git describe --tags --always --dirty=-m 2>/dev/null)
ifdef VERSION_STRING
BVCFLAGS += -DRETCON_BUILD_VERSION='"${VERSION_STRING}"'
endif
OUTNAMEPOSTFIX :=
RESCLEAN :=
ifdef debug
OPTIMISE_FLAGS :=
CFLAGS += -g
AFLAGS += -g
DEBUGPOSTFIX := _debug
OBJDIR := $(OBJDIR)$(DEBUGPOSTFIX)
OUTNAMEPOSTFIX := $(OUTNAMEPOSTFIX)$(DEBUGPOSTFIX)
WXCFGFLAGS += --debug=yes
else ifndef noflto
CFLAGS += -flto
AFLAGS += -flto=jobserver $(OPTIMISE_FLAGS)
#Don't use flto jobserver in dry-run mode
ifneq (n, $(findstring n,$(filter-out --%,$(MFLAGS))))
LINK_PREFIX := +
endif
endif
ifdef gprof
CFLAGS += -pg
AFLAGS += -pg
GPROFPOSTFIX := _gprof
OBJDIR := $(OBJDIR)$(GPROFPOSTFIX)
OUTNAMEPOSTFIX := $(OUTNAMEPOSTFIX)$(GPROFPOSTFIX)
endif
ifdef san
ifeq ($(san), thread)
CFLAGS += -fPIE -pie
AFLAGS += -fPIE -pie -ltsan
endif
CFLAGS += -g -fsanitize=$(san) -fno-omit-frame-pointer
AFLAGS += -g -fsanitize=$(san)
SANPOSTFIX := _san_$(san)
OBJDIR := $(OBJDIR)$(SANPOSTFIX)
OUTNAMEPOSTFIX := $(OUTNAMEPOSTFIX)$(SANPOSTFIX)
endif
all:
GCCMACHINE := $(shell $(GCC) -dumpmachine)
ifeq (mingw, $(findstring mingw,$(GCCMACHINE)))
#WIN
PLATFORM := WIN
AFLAGS += -mwindows -s -static -Lwxlib -Llib
GFLAGS := -mthreads
CFLAGS += -D CURL_STATICLIB
SUFFIX := .exe
LIBS := -lpcre -lcurl -lwxmsw28u_richtext -lwxmsw28u_aui -lwxbase28u_xml -lwxexpat -lwxmsw28u_html -lwxmsw28u_adv -lwxmsw28u_media -lwxmsw28u_core -lwxbase28u -lwxjpeg -lwxpng -lwxtiff -lrtmp -lssh2 -lidn -lssl -lz -lcrypto -leay32 -lwldap32 -lws2_32 -lgdi32 -lshell32 -lole32 -luuid -lcomdlg32 -lwinspool -lcomctl32 -loleaut32 -lwinmm
MCFLAGS += -Icurl -isystem wxinclude -Isqlite -Izlib -Isrc -I.
TCFLAGS += -Icurl
HDEPS :=
EXCOBJS_SRC += sqlite/sqlite3.c
DIRS += $(OBJDIR)/deps/sqlite
ARCH := i686
RTROBJS_SRC += cacert.pem.zlib
DIRS += $(OBJDIR)/rtres
RESCLEAN += cacert.pem.zlib
cacert.pem.zlib: cacert.pem
@echo ' deflate $<'
$(call EXEC,zpipe < cacert.pem > cacert.pem.zlib)
ifndef cross
EXECPREFIX :=
DIRS := $(subst /,\\,$(DIRS))
MKDIR := mkdir
HOST := WIN
endif
else
#UNIX
PLATFORM := UNIX
LIBS := -lpcre -lrt `wx-config --libs std $(WXCFGFLAGS)` -lcurl -lsqlite3 -lz
MCFLAGS += $(patsubst -I/%,-isystem /%,$(shell wx-config --cxxflags $(WXCFGFLAGS)))
wxconf := $(shell wx-config --selected-config)
LIBLIST := libvlc
ifeq (gtk, $(findstring gtk,$(wxconf)))
LIBLIST += glib-2.0 gdk-2.0 gtk+-2.0
endif
LIBS += `pkg-config --libs $(LIBLIST)`
MCFLAGS += $(patsubst -I/%,-isystem /%,$(shell pkg-config --cflags $(LIBLIST))) -D USE_LIBVLC
endif
ifdef V
define EXEC
$1
endef
else
ifeq ($HOST, WIN)
define EXEC
@$1
endef
else
define EXEC
@$1 ; rv=$$? ; [ $${rv} -ne 0 ] && echo 'Failed: $(subst ','"'"',$(1))' ; exit $${rv}
endef
endif
endif
OUTNAME := $(OUTNAME)$(OUTNAMEPOSTFIX)
GCCVER := $(shell $(GCC) -dumpversion)
ifeq (4.7.0, $(GCCVER))
$(error GCC 4.7.0 has a nasty bug in std::unordered_multimap, this will cause problems)
endif
ifneq (, $(filter 4.7.%, $(GCCVER)))
CXXFLAGS += -Wno-type-limits -Wno-uninitialized -Wno-maybe-uninitialized
#these cannot be feasibly suppressed at the local level in gcc 4.7
endif
GCC_MAJOR := $(shell $(GCC) -dumpversion | cut -d'.' -f1)
GCC_MINOR := $(shell $(GCC) -dumpversion | cut -d'.' -f2)
ifdef debug
OPTIMISE_FLAGS += $(shell [ $(GCC_MAJOR) -gt 4 -o \( $(GCC_MAJOR) -eq 4 -a $(GCC_MINOR) -ge 8 \) ] && echo -Og)
endif
CFLAGS += $(shell [ -t 0 ] && [ $(GCC_MAJOR) -gt 4 -o \( $(GCC_MAJOR) -eq 4 -a $(GCC_MINOR) -ge 9 \) ] && echo -fdiagnostics-color)
TARGS := $(OUTNAME)$(SUFFIX)
all: $(TARGS)
ifdef list
CFLAGS += -masm=intel -g --save-temps -Wa,-msyntax=intel,-aghlms=$*.lst
endif
ifdef map
AFLAGS += -Wl,-Map=$(OUTNAME).map
$(OUTNAME).map: $(OUTNAME)$(SUFFIX)
all: $(OUTNAME).map
endif
OBJS := $(patsubst src/%.cpp,$(OBJDIR)/%.o,$(addprefix src/,$(OBJS_SRC)))
TCOBJS := $(patsubst src/%.cpp,$(OBJDIR)/%.o,$(addprefix src/,$(TCOBJS_SRC)))
COBJS := $(patsubst deps/%.c,$(OBJDIR)/deps/%.o,$(addprefix deps/,$(COBJS_SRC)))
ROBJS := $(patsubst src/res/%.png,$(OBJDIR)/res/%.o,$(wildcard src/res/*.png))
PSRCROBJS := $(patsubst src/res/%.png,$(OBJDIR)/res/%.o,$(wildcard src/res/twemoji/16x16/*.png) $(wildcard src/res/twemoji/36x36/*.png))
PACKROBJS := $(OBJDIR)/res/tw16.o $(OBJDIR)/res/tw36.o
RTROBJS := $(patsubst %,$(OBJDIR)/rtres/%.o,$(RTROBJS_SRC))
EXOBJS := $(patsubst %.c,$(OBJDIR)/deps/%.o,$(EXCOBJS_SRC))
ALL_OBJS := $(OBJS) $(TCOBJS) $(COBJS) $(SPOBJS) $(ROBJS) $(RTROBJS) $(EXOBJS) $(PACKROBJS)
ifneq ($(ARCH),)
CFLAGS2 += -march=$(ARCH)
endif
.SUFFIXES:
-include $(ALL_OBJS:.o=.d) $(OBJDIR)/pch/pch.h.d
MAKEDEPS = -MMD -MP -MT '$@ $(patsubst %.o,%.d,$(patsubst %.gch,%.d,$@))'
ifndef nopch
MPCFLAGS := -I $(OBJDIR)/pch -include pch.h -Winvalid-pch
#These cannot be reliably suppressed locally when using PCHs
MPCFLAGS += -Wno-strict-aliasing
COMMONCFLAGS := $(filter-out -Wshadow,$(COMMONCFLAGS))
$(OBJDIR)/pch/pch.h.gch: src/pch.h | $(DIRS)
@echo ' g++ PCH $<'
$(call EXEC,$(GCC) -c src/pch.h -o $(OBJDIR)/pch/pch.h.gch $(CFLAGS) $(MCFLAGS) $(CFLAGS2) $(CXXFLAGS) $(GFLAGS) $(MAKEDEPS))
$(OBJS): $(OBJDIR)/pch/pch.h.gch
endif
#This is to avoid unpleasant side-effects of over-writing executable in-place if it is currently running
$(TARGS): $(ALL_OBJS) src/version.cpp
@echo ' g++ src/version.cpp'
$(call EXEC,$(GCC) -c src/version.cpp -o $(OBJDIR)/version.o $(CFLAGS) $(MCFLAGS) $(CFLAGS2) $(CXXFLAGS) $(BVCFLAGS) $(GFLAGS) $(MAKEDEPS))
@echo ' Link $(OUTNAME)$(SUFFIX)'
ifeq "$(HOST)" "WIN"
$(call EXEC,$(LINK_PREFIX)$(GCC) $(ALL_OBJS) $(OBJDIR)/version.o -o $(OUTNAME)$(SUFFIX) $(LIBS) $(AFLAGS) $(GFLAGS))
else
$(call EXEC,$(LINK_PREFIX)$(GCC) $(ALL_OBJS) $(OBJDIR)/version.o -o $(OUTNAME)$(SUFFIX).tmp $(LIBS) $(AFLAGS) $(GFLAGS))
$(call EXEC,rm -f $(OUTNAME)$(SUFFIX))
$(call EXEC,mv $(OUTNAME)$(SUFFIX).tmp $(OUTNAME)$(SUFFIX))
endif
ifdef strip
@echo ' Strip $(OUTNAME)$(SUFFIX)'
$(call EXEC,strip $(STRIPFLAGS) $(OUTNAME)$(SUFFIX))
endif
$(OBJS): $(OBJDIR)/%.o: src/%.cpp
@echo ' g++ $<'
$(call EXEC,$(GCC) -c $< -o $@ $(CFLAGS) $(MCFLAGS) $(MPCFLAGS) $(CFLAGS2) $(CXXFLAGS) $(GFLAGS) $(MAKEDEPS))
$(COBJS): $(OBJDIR)/deps/%.o: deps/%.c
@echo ' gcc $<'
$(call EXEC,$(GCC:++=cc) -c $< -o $@ $(CFLAGS) $(CFLAGS2) $(COBJS_CFLAGS) $(GFLAGS) $(MAKEDEPS))
$(TCOBJS): $(OBJDIR)/%.o: src/%.cpp
@echo ' g++ $<'
$(call EXEC,$(GCC) -c $< -o $@ $(CFLAGS) $(TCFLAGS) $(CFLAGS2) $(CXXFLAGS) $(GFLAGS) $(MAKEDEPS))
$(OBJDIR)/res/tw16.o: $(patsubst src/res/%.png,$(OBJDIR)/res/%.o,$(wildcard src/res/twemoji/16x16/*.png))
$(LD) -r -relocatable $^ -o $@
$(OBJDIR)/res/tw36.o: $(patsubst src/res/%.png,$(OBJDIR)/res/%.o,$(wildcard src/res/twemoji/36x36/*.png))
$(LD) -r -relocatable $^ -o $@
ifeq "$(PLATFORM)" "WIN"
LINKRES = $(GCC) -Wl,-r -Wl,-b,binary $< -o $@ -nostdlib
else
LINKRES = $(LD) -r -b binary $< -o $@
endif
OBJCOPYRES = objcopy --rename-section .data=.rodata,alloc,load,readonly,data,contents $@ $@
$(ROBJS) $(PSRCROBJS): $(OBJDIR)/%.o: src/%.png
$(RTROBJS): $(OBJDIR)/rtres/%.o: %
$(ROBJS) $(PSRCROBJS) $(RTROBJS):
$(call EXEC,$(LINKRES))
$(call EXEC,$(OBJCOPYRES))
$(TARGS): $(OBJDIR)/resdone
RESCLEAN += $(OBJDIR)/resdone
$(OBJDIR)/resdone: $(ROBJS) $(RTROBJS)
@echo ' Res $(words $?) assets'
@touch '$@'
$(EXOBJS): $(OBJDIR)/deps/%.o: %.c
@echo ' gcc $<'
$(call EXEC,$(GCC:++=cc) -c $< -o $@ $(CFLAGS) $(CFLAGS2) $(GFLAGS) $(MAKEDEPS))
$(ALL_OBJS): | $(DIRS)
$(DIRS):
-$(call EXEC,$(MKDIR) $@)
.PHONY: clean mostlyclean quickclean install uninstall all
quickclean:
@echo ' Clean main objects, target'
$(call EXEC,rm -f $(OBJDIR)/pch/pch.h.d $(OBJDIR)/pch/pch.h.gch $(OBJS) $(OBJS:.o=.ii) $(OBJS:.o=.lst) $(OBJS:.o=.s) $(OBJS:.o=.d) $(OUTNAME)$(SUFFIX) $(OUTNAME)$(SUFFIX).tmp)
mostlyclean: quickclean
@echo ' Clean libtwitcurl objects'
$(call EXEC,rm -f $(TCOBJS) $(TCOBJS:.o=.ii) $(TCOBJS:.o=.lst) $(TCOBJS:.o=.s) $(TCOBJS:.o=.d))
ifneq "$(SPOBJS)" ""
@echo ' Clean "special" objects'
$(call EXEC,rm -f $(SPOBJS) $(SPOBJS:.o=.ii) $(SPOBJS:.o=.lst) $(SPOBJS:.o=.s) $(SPOBJS:.o=.d))
endif
clean: mostlyclean
@echo ' Clean utf8proc objects'
$(call EXEC,rm -f $(COBJS) $(COBJS:.o=.ii) $(COBJS:.o=.lst) $(COBJS:.o=.s) $(COBJS:.o=.d))
@echo ' Clean res objects'
$(call EXEC,rm -f $(ROBJS) $(ROBJS:.o=.d) $(RTROBJS) $(RTROBJS:.o=.d) $(RESCLEAN))
install:
ifeq "$(PLATFORM)" "WIN"
@echo Install only supported on Unixy platforms
else
@echo ' Install to /usr/local/bin/$(OUTNAME)$(SUFFIX)'
$(call EXEC,cp --remove-destination $(OUTNAME)$(SUFFIX) /usr/local/bin/$(OUTNAME)$(SUFFIX))
endif
uninstall:
ifeq "$(PLATFORM)" "WIN"
@echo Uninstall only supported on Unixy platforms
else
@echo ' Delete from /usr/local/bin/$(OUTNAME)$(SUFFIX)'
$(call EXEC,rm /usr/local/bin/$(OUTNAME)$(SUFFIX))
endif