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