capstone
/
Makefile
649 строк · 16.1 Кб
1# Capstone Disassembly Engine
2# By Nguyen Anh Quynh <aquynh@gmail.com>, 2013-2014
3
4include config.mk
5include pkgconfig.mk # package version
6include functions.mk
7
8# Verbose output?
9V ?= 0
10
11OS := $(shell uname)
12ifeq ($(OS),Darwin)
13LIBARCHS ?= x86_64 arm64
14PREFIX ?= /usr/local
15endif
16
17ifeq ($(PKG_EXTRA),)
18PKG_VERSION = $(PKG_MAJOR).$(PKG_MINOR)
19else
20PKG_VERSION = $(PKG_MAJOR).$(PKG_MINOR).$(PKG_EXTRA)
21endif
22
23ifeq ($(CROSS),)
24RANLIB ?= ranlib
25else ifeq ($(ANDROID), 1)
26CC = $(CROSS)/../../bin/clang
27AR = $(CROSS)/ar
28RANLIB = $(CROSS)/ranlib
29STRIP = $(CROSS)/strip
30else
31CC = $(CROSS)gcc
32AR = $(CROSS)ar
33RANLIB = $(CROSS)ranlib
34STRIP = $(CROSS)strip
35endif
36
37ifeq ($(OS),OS/390)
38RANLIB = touch
39endif
40
41ifneq (,$(findstring yes,$(CAPSTONE_DIET)))
42CFLAGS ?= -Os
43CFLAGS += -DCAPSTONE_DIET
44else
45CFLAGS ?= -O3
46endif
47
48# C99 has been enforced elsewhere like xcode
49CFLAGS += -std=gnu99
50
51ifneq (,$(findstring yes,$(CAPSTONE_X86_ATT_DISABLE)))
52CFLAGS += -DCAPSTONE_X86_ATT_DISABLE
53endif
54
55ifeq ($(CC),xlc)
56CFLAGS += -qcpluscmt -qkeyword=inline -qlanglvl=extc1x -Iinclude
57ifneq ($(OS),OS/390)
58CFLAGS += -fPIC
59endif
60else
61CFLAGS += -fPIC -Wall -Wwrite-strings -Wmissing-prototypes -Iinclude
62endif
63
64ifeq ($(CAPSTONE_USE_SYS_DYN_MEM),yes)
65CFLAGS += -DCAPSTONE_USE_SYS_DYN_MEM
66endif
67
68ifeq ($(CAPSTONE_HAS_OSXKERNEL), yes)
69CFLAGS += -DCAPSTONE_HAS_OSXKERNEL
70SDKROOT ?= $(shell xcodebuild -version -sdk macosx Path)
71CFLAGS += -mmacosx-version-min=10.5 \
72-isysroot$(SDKROOT) \
73-I$(SDKROOT)/System/Library/Frameworks/Kernel.framework/Headers \
74-mkernel \
75-fno-builtin
76endif
77
78PREFIX ?= /usr
79DESTDIR ?=
80ifndef BUILDDIR
81BLDIR = .
82OBJDIR = .
83else
84BLDIR = $(abspath $(BUILDDIR))
85OBJDIR = $(BLDIR)/obj
86endif
87INCDIR ?= $(PREFIX)/include
88
89UNAME_S := $(shell uname -s)
90
91LIBDIRARCH ?= lib
92# Uncomment the below line to installs x86_64 libs to lib64/ directory.
93# Or better, pass 'LIBDIRARCH=lib64' to 'make install/uninstall' via 'make.sh'.
94#LIBDIRARCH ?= lib64
95LIBDIR = $(DESTDIR)$(PREFIX)/$(LIBDIRARCH)
96BINDIR = $(DESTDIR)$(PREFIX)/bin
97
98LIBDATADIR = $(LIBDIR)
99
100# Don't redefine $LIBDATADIR when global environment variable
101# USE_GENERIC_LIBDATADIR is set. This is used by the pkgsrc framework.
102
103ifndef USE_GENERIC_LIBDATADIR
104ifeq ($(UNAME_S), FreeBSD)
105LIBDATADIR = $(DESTDIR)$(PREFIX)/libdata
106endif
107ifeq ($(UNAME_S), DragonFly)
108LIBDATADIR = $(DESTDIR)$(PREFIX)/libdata
109endif
110endif
111
112INSTALL_BIN ?= install
113INSTALL_DATA ?= $(INSTALL_BIN) -m0644
114INSTALL_LIB ?= $(INSTALL_BIN) -m0755
115
116LIBNAME = capstone
117
118
119DEP_ARM =
120DEP_ARM += $(wildcard arch/ARM/ARM*.inc)
121
122LIBOBJ_ARM =
123ifneq (,$(findstring arm,$(CAPSTONE_ARCHS)))
124CFLAGS += -DCAPSTONE_HAS_ARM
125LIBSRC_ARM += $(wildcard arch/ARM/ARM*.c)
126LIBOBJ_ARM += $(LIBSRC_ARM:%.c=$(OBJDIR)/%.o)
127endif
128
129DEP_AARCH64 =
130DEP_AARCH64 += $(wildcard arch/AArch64/AArch64*.inc)
131
132LIBOBJ_AARCH64 =
133ifneq (,$(findstring aarch64,$(CAPSTONE_ARCHS)))
134CFLAGS += -DCAPSTONE_HAS_ARM64
135CFLAGS += -DCAPSTONE_HAS_AARCH64
136LIBSRC_AARCH64 += $(wildcard arch/AArch64/AArch64*.c)
137LIBOBJ_AARCH64 += $(LIBSRC_AARCH64:%.c=$(OBJDIR)/%.o)
138endif
139
140
141DEP_M68K =
142DEP_M68K += $(wildcard arch/M68K/M68K*.inc)
143DEP_M68K += $(wildcard arch/M68K/M68K*.h)
144
145LIBOBJ_M68K =
146ifneq (,$(findstring m68k,$(CAPSTONE_ARCHS)))
147CFLAGS += -DCAPSTONE_HAS_M68K
148LIBSRC_M68K += $(wildcard arch/M68K/M68K*.c)
149LIBOBJ_M68K += $(LIBSRC_M68K:%.c=$(OBJDIR)/%.o)
150endif
151
152DEP_MIPS =
153DEP_MIPS += $(wildcard arch/Mips/Mips*.inc)
154
155LIBOBJ_MIPS =
156ifneq (,$(findstring mips,$(CAPSTONE_ARCHS)))
157CFLAGS += -DCAPSTONE_HAS_MIPS
158LIBSRC_MIPS += $(wildcard arch/Mips/Mips*.c)
159LIBOBJ_MIPS += $(LIBSRC_MIPS:%.c=$(OBJDIR)/%.o)
160endif
161
162DEP_SH = $(wildcard arch/SH/SH*.inc)
163
164LIBOBJ_SH =
165ifneq (,$(findstring sh,$(CAPSTONE_ARCHS)))
166CFLAGS += -DCAPSTONE_HAS_SH
167LIBSRC_SH += $(wildcard arch/SH/SH*.c)
168LIBOBJ_SH += $(LIBSRC_SH:%.c=$(OBJDIR)/%.o)
169endif
170
171DEP_PPC =
172DEP_PPC += $(wildcard arch/PowerPC/PPC*.inc)
173
174LIBOBJ_PPC =
175ifneq (,$(findstring powerpc,$(CAPSTONE_ARCHS)))
176CFLAGS += -DCAPSTONE_HAS_POWERPC
177LIBSRC_PPC += $(wildcard arch/PowerPC/PPC*.c)
178LIBOBJ_PPC += $(LIBSRC_PPC:%.c=$(OBJDIR)/%.o)
179endif
180
181
182DEP_SPARC =
183DEP_SPARC += $(wildcard arch/Sparc/Sparc*.inc)
184
185LIBOBJ_SPARC =
186ifneq (,$(findstring sparc,$(CAPSTONE_ARCHS)))
187CFLAGS += -DCAPSTONE_HAS_SPARC
188LIBSRC_SPARC += $(wildcard arch/Sparc/Sparc*.c)
189LIBOBJ_SPARC += $(LIBSRC_SPARC:%.c=$(OBJDIR)/%.o)
190endif
191
192
193DEP_SYSZ =
194DEP_SYSZ += $(wildcard arch/SystemZ/SystemZ*.inc)
195
196LIBOBJ_SYSZ =
197ifneq (,$(findstring systemz,$(CAPSTONE_ARCHS)))
198CFLAGS += -DCAPSTONE_HAS_SYSZ
199LIBSRC_SYSZ += $(wildcard arch/SystemZ/SystemZ*.c)
200LIBOBJ_SYSZ += $(LIBSRC_SYSZ:%.c=$(OBJDIR)/%.o)
201endif
202
203
204# by default, we compile full X86 instruction sets
205X86_REDUCE =
206ifneq (,$(findstring yes,$(CAPSTONE_X86_REDUCE)))
207X86_REDUCE = _reduce
208CFLAGS += -DCAPSTONE_X86_REDUCE -Os
209endif
210
211
212DEP_X86 =
213DEP_X86 += $(wildcard arch/X86/X86*.inc)
214
215LIBOBJ_X86 =
216ifneq (,$(findstring x86,$(CAPSTONE_ARCHS)))
217CFLAGS += -DCAPSTONE_HAS_X86
218LIBOBJ_X86 += $(OBJDIR)/arch/X86/X86DisassemblerDecoder.o
219LIBOBJ_X86 += $(OBJDIR)/arch/X86/X86Disassembler.o
220LIBOBJ_X86 += $(OBJDIR)/arch/X86/X86InstPrinterCommon.o
221LIBOBJ_X86 += $(OBJDIR)/arch/X86/X86IntelInstPrinter.o
222# assembly syntax is irrelevant in Diet mode, when this info is suppressed
223ifeq (,$(findstring yes,$(CAPSTONE_DIET)))
224ifeq (,$(findstring yes,$(CAPSTONE_X86_ATT_DISABLE)))
225LIBOBJ_X86 += $(OBJDIR)/arch/X86/X86ATTInstPrinter.o
226endif
227endif
228LIBOBJ_X86 += $(OBJDIR)/arch/X86/X86Mapping.o
229LIBOBJ_X86 += $(OBJDIR)/arch/X86/X86Module.o
230endif
231
232
233DEP_XCORE =
234DEP_XCORE += $(wildcard arch/XCore/XCore*.inc)
235
236LIBOBJ_XCORE =
237ifneq (,$(findstring xcore,$(CAPSTONE_ARCHS)))
238CFLAGS += -DCAPSTONE_HAS_XCORE
239LIBSRC_XCORE += $(wildcard arch/XCore/XCore*.c)
240LIBOBJ_XCORE += $(LIBSRC_XCORE:%.c=$(OBJDIR)/%.o)
241endif
242
243
244DEP_TMS320C64X =
245DEP_TMS320C64X += $(wildcard arch/TMS320C64x/TMS320C64x*.inc)
246
247LIBOBJ_TMS320C64X =
248ifneq (,$(findstring tms320c64x,$(CAPSTONE_ARCHS)))
249CFLAGS += -DCAPSTONE_HAS_TMS320C64X
250LIBSRC_TMS320C64X += $(wildcard arch/TMS320C64x/TMS320C64x*.c)
251LIBOBJ_TMS320C64X += $(LIBSRC_TMS320C64X:%.c=$(OBJDIR)/%.o)
252endif
253
254DEP_M680X =
255DEP_M680X += $(wildcard arch/M680X/*.inc)
256DEP_M680X += $(wildcard arch/M680X/M680X*.h)
257
258LIBOBJ_M680X =
259ifneq (,$(findstring m680x,$(CAPSTONE_ARCHS)))
260CFLAGS += -DCAPSTONE_HAS_M680X
261LIBSRC_M680X += $(wildcard arch/M680X/*.c)
262LIBOBJ_M680X += $(LIBSRC_M680X:%.c=$(OBJDIR)/%.o)
263endif
264
265
266DEP_EVM =
267DEP_EVM += $(wildcard arch/EVM/EVM*.inc)
268
269LIBOBJ_EVM =
270ifneq (,$(findstring evm,$(CAPSTONE_ARCHS)))
271CFLAGS += -DCAPSTONE_HAS_EVM
272LIBSRC_EVM += $(wildcard arch/EVM/EVM*.c)
273LIBOBJ_EVM += $(LIBSRC_EVM:%.c=$(OBJDIR)/%.o)
274endif
275
276DEP_RISCV =
277DEP_RISCV += $(wildcard arch/RISCV/RISCV*.inc)
278
279LIBOBJ_RISCV =
280ifneq (,$(findstring riscv,$(CAPSTONE_ARCHS)))
281CFLAGS += -DCAPSTONE_HAS_RISCV
282LIBSRC_RISCV += $(wildcard arch/RISCV/RISCV*.c)
283LIBOBJ_RISCV += $(LIBSRC_RISCV:%.c=$(OBJDIR)/%.o)
284endif
285
286DEP_WASM =
287DEP_WASM += $(wildcard arch/WASM/WASM*.inc)
288
289LIBOBJ_WASM =
290ifneq (,$(findstring wasm,$(CAPSTONE_ARCHS)))
291CFLAGS += -DCAPSTONE_HAS_WASM
292LIBSRC_WASM += $(wildcard arch/WASM/WASM*.c)
293LIBOBJ_WASM += $(LIBSRC_WASM:%.c=$(OBJDIR)/%.o)
294endif
295
296
297DEP_MOS65XX =
298DEP_MOS65XX += $(wildcard arch/MOS65XX/MOS65XX*.inc)
299
300LIBOBJ_MOS65XX =
301ifneq (,$(findstring mos65xx,$(CAPSTONE_ARCHS)))
302CFLAGS += -DCAPSTONE_HAS_MOS65XX
303LIBSRC_MOS65XX += $(wildcard arch/MOS65XX/MOS65XX*.c)
304LIBOBJ_MOS65XX += $(LIBSRC_MOS65XX:%.c=$(OBJDIR)/%.o)
305endif
306
307
308DEP_BPF =
309DEP_BPF += $(wildcard arch/BPF/BPF*.inc)
310
311LIBOBJ_BPF =
312ifneq (,$(findstring bpf,$(CAPSTONE_ARCHS)))
313CFLAGS += -DCAPSTONE_HAS_BPF
314LIBSRC_BPF += $(wildcard arch/BPF/BPF*.c)
315LIBOBJ_BPF += $(LIBSRC_BPF:%.c=$(OBJDIR)/%.o)
316endif
317
318DEP_TRICORE =
319DEP_TRICORE +=$(wildcard arch/TriCore/TriCore*.inc)
320
321LIBOBJ_TRICORE =
322ifneq (,$(findstring tricore,$(CAPSTONE_ARCHS)))
323CFLAGS += -DCAPSTONE_HAS_TRICORE
324LIBSRC_TRICORE += $(wildcard arch/TriCore/TriCore*.c)
325LIBOBJ_TRICORE += $(LIBSRC_TRICORE:%.c=$(OBJDIR)/%.o)
326endif
327
328DEP_ALPHA =
329DEP_ALPHA +=$(wildcard arch/Alpha/Alpha*.inc)
330
331LIBOBJ_ALPHA =
332ifneq (,$(findstring alpha,$(CAPSTONE_ARCHS)))
333CFLAGS += -DCAPSTONE_HAS_ALPHA
334LIBSRC_ALPHA += $(wildcard arch/Alpha/Alpha*.c)
335LIBOBJ_ALPHA += $(LIBSRC_ALPHA:%.c=$(OBJDIR)/%.o)
336endif
337
338DEP_HPPA =
339DEP_HPPA += $(wildcard arch/HPPA/HPPA*.inc)
340
341LIBOBJ_HPPA =
342ifneq (,$(findstring hppa,$(CAPSTONE_ARCHS)))
343CFLAGS += -DCAPSTONE_HAS_HPPA
344LIBSRC_HPPA += $(wildcard arch/HPPA/HPPA*.c)
345LIBOBJ_HPPA += $(LIBSRC_HPPA:%.c=$(OBJDIR)/%.o)
346endif
347
348DEP_LOONGARCH =
349DEP_LOONGARCH += $(wildcard arch/LoongArch/LoongArch*.inc)
350
351LIBOBJ_LOONGARCH =
352ifneq (,$(findstring loongarch,$(CAPSTONE_ARCHS)))
353CFLAGS += -DCAPSTONE_HAS_LOONGARCH
354LIBSRC_LOONGARCH += $(wildcard arch/LoongArch/LoongArch*.c)
355LIBOBJ_LOONGARCH += $(LIBSRC_LOONGARCH:%.c=$(OBJDIR)/%.o)
356endif
357
358LIBOBJ =
359LIBOBJ += $(OBJDIR)/cs.o $(OBJDIR)/utils.o $(OBJDIR)/SStream.o $(OBJDIR)/MCInstrDesc.o $(OBJDIR)/MCRegisterInfo.o $(OBJDIR)/MCInst.o $(OBJDIR)/MCInstPrinter.o $(OBJDIR)/Mapping.o
360LIBOBJ += $(LIBOBJ_ARM) $(LIBOBJ_AARCH64) $(LIBOBJ_M68K) $(LIBOBJ_MIPS) $(LIBOBJ_PPC) $(LIBOBJ_RISCV) $(LIBOBJ_SPARC) $(LIBOBJ_SYSZ) $(LIBOBJ_SH)
361LIBOBJ += $(LIBOBJ_X86) $(LIBOBJ_XCORE) $(LIBOBJ_TMS320C64X) $(LIBOBJ_M680X) $(LIBOBJ_EVM) $(LIBOBJ_MOS65XX) $(LIBOBJ_WASM) $(LIBOBJ_BPF)
362LIBOBJ += $(LIBOBJ_TRICORE) $(LIBOBJ_ALPHA) $(LIBOBJ_HPPA) $(LIBOBJ_LOONGARCH)
363
364
365ifeq ($(PKG_EXTRA),)
366PKGCFGDIR = $(LIBDATADIR)/pkgconfig
367else
368PKGCFGDIR ?= $(LIBDATADIR)/pkgconfig
369ifeq ($(PKGCFGDIR),)
370PKGCFGDIR = $(LIBDATADIR)/pkgconfig
371endif
372endif
373
374API_MAJOR=$(shell echo `grep -e CS_API_MAJOR include/capstone/capstone.h | grep -v = | awk '{print $$3}'` | awk '{print $$1}')
375VERSION_EXT =
376
377IS_APPLE := $(shell $(CC) -dM -E - < /dev/null 2> /dev/null | grep __APPLE__ | wc -l | tr -d " ")
378ifeq ($(IS_APPLE),1)
379# on MacOS, do not build in Universal format by default
380MACOS_UNIVERSAL ?= no
381ifeq ($(MACOS_UNIVERSAL),yes)
382CFLAGS += $(foreach arch,$(LIBARCHS),-arch $(arch))
383LDFLAGS += $(foreach arch,$(LIBARCHS),-arch $(arch))
384endif
385EXT = dylib
386VERSION_EXT = $(API_MAJOR).$(EXT)
387$(LIBNAME)_LDFLAGS += -dynamiclib -install_name lib$(LIBNAME).$(VERSION_EXT) -current_version $(PKG_MAJOR).$(PKG_MINOR).$(PKG_EXTRA) -compatibility_version $(PKG_MAJOR).$(PKG_MINOR)
388AR_EXT = a
389# Homebrew wants to make sure its formula does not disable FORTIFY_SOURCE
390# However, this is not really necessary because 'CAPSTONE_USE_SYS_DYN_MEM=yes' by default
391ifneq ($(HOMEBREW_CAPSTONE),1)
392ifneq ($(CAPSTONE_USE_SYS_DYN_MEM),yes)
393# remove string check because OSX kernel complains about missing symbols
394CFLAGS += -D_FORTIFY_SOURCE=0
395endif
396endif
397else
398CFLAGS += $(foreach arch,$(LIBARCHS),-arch $(arch))
399LDFLAGS += $(foreach arch,$(LIBARCHS),-arch $(arch))
400ifeq ($(OS), AIX)
401$(LIBNAME)_LDFLAGS += -qmkshrobj
402else
403$(LIBNAME)_LDFLAGS += -shared
404endif
405# Cygwin?
406IS_CYGWIN := $(shell $(CC) -dumpmachine 2>/dev/null | grep -i cygwin | wc -l)
407ifeq ($(IS_CYGWIN),1)
408EXT = dll
409AR_EXT = lib
410# Cygwin doesn't like -fPIC
411CFLAGS := $(CFLAGS:-fPIC=)
412# On Windows we need the shared library to be executable
413else
414# mingw?
415IS_MINGW := $(shell $(CC) --version 2>/dev/null | grep -i "\(mingw\|MSYS\)" | wc -l)
416ifeq ($(IS_MINGW),1)
417EXT = dll
418AR_EXT = lib
419# mingw doesn't like -fPIC either
420CFLAGS := $(CFLAGS:-fPIC=)
421# On Windows we need the shared library to be executable
422else
423# Linux, *BSD
424EXT = so
425VERSION_EXT = $(EXT).$(API_MAJOR)
426AR_EXT = a
427$(LIBNAME)_LDFLAGS += -Wl,-soname,lib$(LIBNAME).$(VERSION_EXT)
428endif
429endif
430endif
431
432ifeq ($(CAPSTONE_SHARED),yes)
433ifeq ($(IS_MINGW),1)
434LIBRARY = $(BLDIR)/$(LIBNAME).$(VERSION_EXT)
435else ifeq ($(IS_CYGWIN),1)
436LIBRARY = $(BLDIR)/$(LIBNAME).$(EXT)
437else # *nix
438LIBRARY = $(BLDIR)/lib$(LIBNAME).$(VERSION_EXT)
439CFLAGS += -fvisibility=hidden
440endif
441endif
442
443ifeq ($(CAPSTONE_STATIC),yes)
444ifeq ($(IS_MINGW),1)
445ARCHIVE = $(BLDIR)/$(LIBNAME).$(AR_EXT)
446else ifeq ($(IS_CYGWIN),1)
447ARCHIVE = $(BLDIR)/$(LIBNAME).$(AR_EXT)
448else
449ARCHIVE = $(BLDIR)/lib$(LIBNAME).$(AR_EXT)
450endif
451endif
452
453PKGCFGF = $(BLDIR)/$(LIBNAME).pc
454
455.PHONY: all clean install uninstall dist
456
457all: $(LIBRARY) $(ARCHIVE) $(PKGCFGF)
458ifeq (,$(findstring yes,$(CAPSTONE_BUILD_CORE_ONLY)))
459@V=$(V) CC=$(CC) $(MAKE) -C cstool
460endif
461
462ifeq ($(CAPSTONE_SHARED),yes)
463$(LIBRARY): $(LIBOBJ)
464ifeq ($(V),0)
465$(call log,LINK,$(@:$(BLDIR)/%=%))
466@$(create-library)
467else
468$(create-library)
469endif
470endif
471
472$(LIBOBJ): config.mk
473
474$(LIBOBJ_ARM): $(DEP_ARM)
475$(LIBOBJ_AARCH64): $(DEP_AARCH64)
476$(LIBOBJ_M68K): $(DEP_M68K)
477$(LIBOBJ_MIPS): $(DEP_MIPS)
478$(LIBOBJ_PPC): $(DEP_PPC)
479$(LIBOBJ_SH): $(DEP_SH)
480$(LIBOBJ_SPARC): $(DEP_SPARC)
481$(LIBOBJ_SYSZ): $(DEP_SYSZ)
482$(LIBOBJ_X86): $(DEP_X86)
483$(LIBOBJ_XCORE): $(DEP_XCORE)
484$(LIBOBJ_TMS320C64X): $(DEP_TMS320C64X)
485$(LIBOBJ_M680X): $(DEP_M680X)
486$(LIBOBJ_EVM): $(DEP_EVM)
487$(LIBOBJ_RISCV): $(DEP_RISCV)
488$(LIBOBJ_WASM): $(DEP_WASM)
489$(LIBOBJ_MOS65XX): $(DEP_MOS65XX)
490$(LIBOBJ_BPF): $(DEP_BPF)
491$(LIBOBJ_TRICORE): $(DEP_TRICORE)
492$(LIBOBJ_ALPHA): $(DEP_ALPHA)
493$(LIBOBJ_HPPA): $(DEP_HPPA)
494$(LIBOBJ_LOONGARCH): $(DEP_LOONGARCH)
495
496ifeq ($(CAPSTONE_STATIC),yes)
497$(ARCHIVE): $(LIBOBJ)
498@rm -f $(ARCHIVE)
499ifeq ($(V),0)
500$(call log,AR,$(@:$(BLDIR)/%=%))
501@$(create-archive)
502else
503$(create-archive)
504endif
505endif
506
507$(PKGCFGF):
508ifeq ($(V),0)
509$(call log,GEN,$(@:$(BLDIR)/%=%))
510@$(generate-pkgcfg)
511else
512$(generate-pkgcfg)
513endif
514
515# create a list of auto dependencies
516AUTODEPS:= $(patsubst %.o,%.d, $(LIBOBJ))
517
518# include by auto dependencies
519-include $(AUTODEPS)
520
521install: $(PKGCFGF) $(ARCHIVE) $(LIBRARY)
522mkdir -p $(LIBDIR)
523$(call install-library,$(LIBDIR))
524ifeq ($(CAPSTONE_STATIC),yes)
525$(INSTALL_DATA) $(ARCHIVE) $(LIBDIR)
526endif
527mkdir -p $(DESTDIR)$(INCDIR)/$(LIBNAME)
528$(INSTALL_DATA) include/capstone/*.h $(DESTDIR)$(INCDIR)/$(LIBNAME)
529mkdir -p $(PKGCFGDIR)
530$(INSTALL_DATA) $(PKGCFGF) $(PKGCFGDIR)
531ifeq (,$(findstring yes,$(CAPSTONE_BUILD_CORE_ONLY)))
532mkdir -p $(BINDIR)
533$(INSTALL_LIB) cstool/cstool $(BINDIR)
534endif
535
536uninstall:
537rm -rf $(DESTDIR)$(INCDIR)/$(LIBNAME)
538rm -f $(LIBDIR)/lib$(LIBNAME).*
539rm -f $(PKGCFGDIR)/$(LIBNAME).pc
540ifeq (,$(findstring yes,$(CAPSTONE_BUILD_CORE_ONLY)))
541rm -f $(BINDIR)/cstool
542endif
543
544clean:
545rm -f $(LIBOBJ)
546rm -f $(BLDIR)/lib$(LIBNAME).* $(BLDIR)/$(LIBNAME).pc
547rm -f $(PKGCFGF)
548rm -f $(AUTODEPS)
549[ "${ANDROID}" = "1" ] && rm -rf android-ndk-* || true
550
551ifeq (,$(findstring yes,$(CAPSTONE_BUILD_CORE_ONLY)))
552$(MAKE) -C cstool clean
553$(MAKE) -C suite/fuzz clean
554endif
555
556ifdef BUILDDIR
557rm -rf $(BUILDDIR)
558endif
559
560ifeq (,$(findstring yes,$(CAPSTONE_BUILD_CORE_ONLY)))
561$(MAKE) -C bindings/python clean
562$(MAKE) -C bindings/java clean
563$(MAKE) -C bindings/ocaml clean
564endif
565
566
567TAG ?= HEAD
568ifeq ($(TAG), HEAD)
569DIST_VERSION = latest
570else
571DIST_VERSION = $(TAG)
572endif
573
574dist:
575git archive --format=tar.gz --prefix=capstone-$(DIST_VERSION)/ $(TAG) > capstone-$(DIST_VERSION).tgz
576git archive --format=zip --prefix=capstone-$(DIST_VERSION)/ $(TAG) > capstone-$(DIST_VERSION).zip
577
578checkfuzz: fuzztest fuzzallcorp
579
580FUZZ_INPUTS = $(shell find suite/MC -type f -name '*.cs')
581
582buildfuzz:
583ifndef BUILDDIR
584$(MAKE) -C suite/fuzz
585else
586$(MAKE) -C suite/fuzz BUILDDIR=$(BLDIR)
587endif
588
589fuzztest:
590./suite/fuzz/fuzz_disasm $(FUZZ_INPUTS)
591
592fuzzallcorp:
593ifneq ($(wildcard suite/fuzz/corpus-libFuzzer-capstone_fuzz_disasmnext-latest),)
594./suite/fuzz/fuzz_bindisasm suite/fuzz/corpus-libFuzzer-capstone_fuzz_disasmnext-latest/ > fuzz_bindisasm.log || (tail -1 fuzz_bindisasm.log; false)
595else
596@echo "Skipping tests on whole corpus"
597endif
598
599$(OBJDIR)/%.o: %.c
600@mkdir -p $(@D)
601ifeq ($(V),0)
602$(call log,CC,$(@:$(OBJDIR)/%=%))
603@$(compile)
604else
605$(compile)
606endif
607
608
609ifeq ($(CAPSTONE_SHARED),yes)
610define install-library
611$(INSTALL_LIB) $(LIBRARY) $1
612$(if $(VERSION_EXT),
613cd $1 && \
614rm -f lib$(LIBNAME).$(EXT) && \
615ln -s lib$(LIBNAME).$(VERSION_EXT) lib$(LIBNAME).$(EXT))
616endef
617else
618define install-library
619endef
620endif
621
622ifeq ($(AR_FLAGS),)
623AR_FLAGS := q
624endif
625
626define create-archive
627$(AR) $(AR_FLAGS) $(ARCHIVE) $(LIBOBJ)
628$(RANLIB) $(ARCHIVE)
629endef
630
631
632define create-library
633$(CC) $(LDFLAGS) $($(LIBNAME)_LDFLAGS) $(LIBOBJ) -o $(LIBRARY)
634endef
635
636
637define generate-pkgcfg
638mkdir -p $(BLDIR)
639echo 'Name: capstone' > $(PKGCFGF)
640echo 'Description: Capstone disassembly engine' >> $(PKGCFGF)
641echo 'Version: $(PKG_VERSION)' >> $(PKGCFGF)
642echo 'libdir=$(LIBDIR)' >> $(PKGCFGF)
643echo 'includedir=$(INCDIR)/capstone' >> $(PKGCFGF)
644echo 'archive=$${libdir}/libcapstone.a' >> $(PKGCFGF)
645echo 'Libs: -L$${libdir} -lcapstone' >> $(PKGCFGF)
646echo 'Libs.private: -L$${libdir} -l:libcapstone.a' >> $(PKGCFGF)
647echo 'Cflags: -I$${includedir}' >> $(PKGCFGF)
648echo 'archs=${CAPSTONE_ARCHS}' >> $(PKGCFGF)
649endef
650