1# Capstone Disassembler Engine
2# By Nguyen Anh Quynh <aquynh@gmail.com>, 2013-2014
3
4include ../config.mk
5include ../functions.mk
6
7# Verbose output?
8V ?= 0
9
10INCDIR = ../include
11ifndef BUILDDIR
12TESTDIR = .
13OBJDIR = .
14LIBDIR = ..
15else
16TESTDIR = $(BUILDDIR)/tests
17OBJDIR = $(BUILDDIR)/obj/tests
18LIBDIR = $(BUILDDIR)
19endif
20
21ifeq ($(CROSS),)
22CC ?= cc
23else
24CC = $(CROSS)gcc
25endif
26
27
28CFLAGS += -Wall -I$(INCDIR)
29LDFLAGS += -L$(LIBDIR)
30
31CFLAGS += $(foreach arch,$(LIBARCHS),-arch $(arch))
32LDFLAGS += $(foreach arch,$(LIBARCHS),-arch $(arch))
33
34LIBNAME = capstone
35
36BIN_EXT =
37AR_EXT = a
38
39# Cygwin?
40IS_CYGWIN := $(shell $(CC) -dumpmachine | grep -i cygwin | wc -l)
41ifeq ($(IS_CYGWIN),1)
42CFLAGS := $(CFLAGS:-fPIC=)
43BIN_EXT = .exe
44AR_EXT = lib
45else
46# mingw?
47IS_MINGW := $(shell $(CC) --version | grep -i mingw | wc -l)
48ifeq ($(IS_MINGW),1)
49CFLAGS := $(CFLAGS:-fPIC=)
50BIN_EXT = .exe
51AR_EXT = lib
52endif
53endif
54
55ifeq ($(CAPSTONE_STATIC),yes)
56ifeq ($(IS_MINGW),1)
57ARCHIVE = $(LIBDIR)/$(LIBNAME).$(AR_EXT)
58else ifeq ($(IS_CYGWIN),1)
59ARCHIVE = $(LIBDIR)/$(LIBNAME).$(AR_EXT)
60else
61ARCHIVE = $(LIBDIR)/lib$(LIBNAME).$(AR_EXT)
62endif
63endif
64
65.PHONY: all clean
66
67SOURCES = test_basic.c test_detail.c test_skipdata.c test_iter.c
68ifneq (,$(findstring arm,$(CAPSTONE_ARCHS)))
69SOURCES += test_arm.c
70endif
71ifneq (,$(findstring aarch64,$(CAPSTONE_ARCHS)))
72SOURCES += test_arm64.c
73endif
74ifneq (,$(findstring mips,$(CAPSTONE_ARCHS)))
75SOURCES += test_mips.c
76endif
77ifneq (,$(findstring powerpc,$(CAPSTONE_ARCHS)))
78SOURCES += test_ppc.c
79endif
80ifneq (,$(findstring sparc,$(CAPSTONE_ARCHS)))
81SOURCES += test_sparc.c
82endif
83ifneq (,$(findstring systemz,$(CAPSTONE_ARCHS)))
84SOURCES += test_systemz.c
85endif
86ifneq (,$(findstring x86,$(CAPSTONE_ARCHS)))
87SOURCES += test_x86.c
88endif
89ifneq (,$(findstring xcore,$(CAPSTONE_ARCHS)))
90SOURCES += test_xcore.c
91endif
92
93OBJS = $(addprefix $(OBJDIR)/,$(SOURCES:.c=.o))
94BINARY = $(addprefix $(TESTDIR)/,$(SOURCES:.c=$(BIN_EXT)))
95
96all: $(BINARY)
97
98clean:
99	rm -rf $(OBJS) $(BINARY) $(TESTDIR)/*.exe $(TESTDIR)/*.static $(OBJDIR)/lib$(LIBNAME).* $(OBJDIR)/$(LIBNAME).*
100
101$(BINARY): $(OBJS)
102
103$(TESTDIR)/%$(BIN_EXT): $(OBJDIR)/%.o
104	@mkdir -p $(@D)
105ifeq ($(V),0)
106ifeq ($(CAPSTONE_SHARED),yes)
107	$(call log,LINK,$(notdir $@))
108	@$(link-dynamic)
109endif
110ifeq ($(CAPSTONE_STATIC),yes)
111	$(call log,LINK,$(notdir $(call staticname,$@)))
112	@$(link-static)
113endif
114else
115ifeq ($(CAPSTONE_SHARED),yes)
116	$(link-dynamic)
117endif
118ifeq ($(CAPSTONE_STATIC),yes)
119	$(link-static)
120endif
121endif
122
123$(OBJDIR)/%.o: %.c
124	@mkdir -p $(@D)
125ifeq ($(V),0)
126	$(call log,CC,$(@:$(OBJDIR)/%=%))
127	@$(compile)
128else
129	$(compile)
130endif
131
132
133define link-dynamic
134	$(CC) $(LDFLAGS) $< -l$(LIBNAME) -o $@
135endef
136
137
138define link-static
139	$(CC) $(LDFLAGS) $< $(ARCHIVE) -o $(call staticname,$@)
140endef
141
142
143staticname = $(subst $(BIN_EXT),,$(1)).static$(BIN_EXT)
144