fix missing itype in SEL(x, 0/1, 1/0) --> (x ==/!= 0)
[smatch.git] / Makefile
blob69d20e72b6c4604d5d35f427b8c40a47e01cd09b
1 VERSION=0.6.3
3 ########################################################################
4 # The following variables can be overwritten from the command line
5 OS = linux
8 CC = gcc
9 CXX = g++
10 LD = $(CC)
11 AR = ar
13 CFLAGS ?= -O2 -g
15 DESTDIR ?=
16 PREFIX ?= $(HOME)
17 BINDIR ?= $(PREFIX)/bin
18 MANDIR ?= $(PREFIX)/share/man
20 PKG_CONFIG ?= pkg-config
22 CHECKER_FLAGS ?= -Wno-vla
24 # Allow users to override build settings without dirtying their trees
25 # For debugging, put this in local.mk:
27 # CFLAGS += -O0 -DDEBUG -g3 -gdwarf-2
29 SPARSE_LOCAL_CONFIG ?= local.mk
30 -include ${SPARSE_LOCAL_CONFIG}
31 ########################################################################
34 LIB_OBJS :=
35 LIB_OBJS += allocate.o
36 LIB_OBJS += builtin.o
37 LIB_OBJS += char.o
38 LIB_OBJS += compat-$(OS).o
39 LIB_OBJS += cse.o
40 LIB_OBJS += dissect.o
41 LIB_OBJS += dominate.o
42 LIB_OBJS += evaluate.o
43 LIB_OBJS += expand.o
44 LIB_OBJS += expression.o
45 LIB_OBJS += flow.o
46 LIB_OBJS += flowgraph.o
47 LIB_OBJS += inline.o
48 LIB_OBJS += ir.o
49 LIB_OBJS += lib.o
50 LIB_OBJS += linearize.o
51 LIB_OBJS += liveness.o
52 LIB_OBJS += memops.o
53 LIB_OBJS += opcode.o
54 LIB_OBJS += optimize.o
55 LIB_OBJS += options.o
56 LIB_OBJS += parse.o
57 LIB_OBJS += predefine.o
58 LIB_OBJS += pre-process.o
59 LIB_OBJS += ptrlist.o
60 LIB_OBJS += ptrmap.o
61 LIB_OBJS += scope.o
62 LIB_OBJS += show-parse.o
63 LIB_OBJS += simplify.o
64 LIB_OBJS += sort.o
65 LIB_OBJS += ssa.o
66 LIB_OBJS += stats.o
67 LIB_OBJS += storage.o
68 LIB_OBJS += symbol.o
69 LIB_OBJS += target.o
70 LIB_OBJS += target-alpha.o
71 LIB_OBJS += target-arm.o
72 LIB_OBJS += target-arm64.o
73 LIB_OBJS += target-bfin.o
74 LIB_OBJS += target-default.o
75 LIB_OBJS += target-h8300.o
76 LIB_OBJS += target-m68k.o
77 LIB_OBJS += target-microblaze.o
78 LIB_OBJS += target-mips.o
79 LIB_OBJS += target-nds32.o
80 LIB_OBJS += target-nios2.o
81 LIB_OBJS += target-openrisc.o
82 LIB_OBJS += target-ppc.o
83 LIB_OBJS += target-riscv.o
84 LIB_OBJS += target-s390.o
85 LIB_OBJS += target-sh.o
86 LIB_OBJS += target-sparc.o
87 LIB_OBJS += target-x86.o
88 LIB_OBJS += target-xtensa.o
89 LIB_OBJS += tokenize.o
90 LIB_OBJS += unssa.o
91 LIB_OBJS += utils.o
92 LIB_OBJS += version.o
94 PROGRAMS :=
95 PROGRAMS += compile
96 PROGRAMS += ctags
97 PROGRAMS += example
98 PROGRAMS += graph
99 PROGRAMS += obfuscate
100 PROGRAMS += sparse
101 PROGRAMS += test-dissect
102 PROGRAMS += test-lexing
103 PROGRAMS += test-linearize
104 PROGRAMS += test-parsing
105 PROGRAMS += test-show-type
106 PROGRAMS += test-unssa
108 INST_PROGRAMS=sparse cgcc
109 INST_MAN1=sparse.1 cgcc.1
112 all:
114 ########################################################################
115 # common flags/options/...
117 cflags = -fno-strict-aliasing
118 cflags += -Wall -Wwrite-strings
120 GCC_BASE := $(shell $(CC) --print-file-name=)
121 cflags += -DGCC_BASE=\"$(GCC_BASE)\"
123 MULTIARCH_TRIPLET := $(shell $(CC) -print-multiarch 2>/dev/null)
124 cflags += -DMULTIARCH_TRIPLET=\"$(MULTIARCH_TRIPLET)\"
127 bindir := $(DESTDIR)$(BINDIR)
128 man1dir := $(DESTDIR)$(MANDIR)/man1
130 ########################################################################
131 # target specificities
133 compile: compile-i386.o
134 EXTRA_OBJS += compile-i386.o
136 # Can we use GCC's generated dependencies?
137 HAVE_GCC_DEP:=$(shell touch .gcc-test.c && \
138 $(CC) -c -Wp,-MP,-MMD,.gcc-test.d .gcc-test.c 2>/dev/null && \
139 echo 'yes'; rm -f .gcc-test.d .gcc-test.o .gcc-test.c)
140 ifeq ($(HAVE_GCC_DEP),yes)
141 cflags += -Wp,-MP,-MMD,$(@D)/.$(@F).d
142 endif
144 # Can we use libxml (needed for c2xml)?
145 HAVE_LIBXML:=$(shell $(PKG_CONFIG) --exists libxml-2.0 2>/dev/null && echo 'yes')
146 ifeq ($(HAVE_LIBXML),yes)
147 PROGRAMS+=c2xml
148 INST_PROGRAMS+=c2xml
149 c2xml-ldlibs := $(shell $(PKG_CONFIG) --libs libxml-2.0)
150 c2xml-cflags := $(shell $(PKG_CONFIG) --cflags libxml-2.0)
151 else
152 $(warning Your system does not have libxml, disabling c2xml)
153 endif
155 HAVE_SQLITE := $(shell $(PKG_CONFIG) --exists sqlite3 2>/dev/null && echo 'yes')
156 ifeq ($(HAVE_SQLITE),yes)
157 SQLITE_VERSION:=$(shell $(PKG_CONFIG) --modversion sqlite3)
158 SQLITE_VNUMBER:=$(shell printf '%d%02d%02d' $(subst ., ,$(SQLITE_VERSION)))
159 ifeq ($(shell expr "$(SQLITE_VNUMBER)" '>=' 32400),1)
160 PROGRAMS += semind
161 INST_PROGRAMS += semind
162 INST_MAN1 += semind.1
163 semind-ldlibs := $(shell $(PKG_CONFIG) --libs sqlite3)
164 semind-cflags := $(shell $(PKG_CONFIG) --cflags sqlite3)
165 semind-cflags += -std=gnu99
166 else
167 $(warning Your SQLite3 version ($(SQLITE_VERSION)) is too old, 3.24.0 or later is required.)
168 endif
169 else
170 $(warning Your system does not have sqlite3, disabling semind)
171 endif
173 # Can we use gtk (needed for test-inspect)
174 GTK_VERSION:=3.0
175 HAVE_GTK:=$(shell $(PKG_CONFIG) --exists gtk+-$(GTK_VERSION) 2>/dev/null && echo 'yes')
176 ifneq ($(HAVE_GTK),yes)
177 GTK_VERSION:=2.0
178 HAVE_GTK:=$(shell $(PKG_CONFIG) --exists gtk+-$(GTK_VERSION) 2>/dev/null && echo 'yes')
179 endif
180 ifeq ($(HAVE_GTK),yes)
181 GTK_CFLAGS := $(shell $(PKG_CONFIG) --cflags gtk+-$(GTK_VERSION))
182 ast-view-cflags := $(GTK_CFLAGS)
183 ast-model-cflags := $(GTK_CFLAGS)
184 ast-inspect-cflags := $(GTK_CFLAGS)
185 test-inspect-cflags := $(GTK_CFLAGS)
186 test-inspect-ldlibs := $(shell $(PKG_CONFIG) --libs gtk+-$(GTK_VERSION))
187 test-inspect: ast-model.o ast-view.o ast-inspect.o
188 EXTRA_OBJS += ast-model.o ast-view.o ast-inspect.o
189 PROGRAMS += test-inspect
190 INST_PROGRAMS += test-inspect
191 else
192 $(warning Your system does not have gtk3/gtk2, disabling test-inspect)
193 endif
195 # Can we use LLVM (needed for ... sparse-llvm)?
196 LLVM_CONFIG:=llvm-config
197 HAVE_LLVM:=$(shell $(LLVM_CONFIG) --version >/dev/null 2>&1 && echo 'yes')
198 ifeq ($(HAVE_LLVM),yes)
199 arch := $(shell uname -m)
200 ifeq (${MULTIARCH_TRIPLET},x86_64-linux-gnux32)
201 arch := x32
202 endif
203 ifneq ($(filter ${arch},i386 i486 i586 i686 x86_64 amd64),)
204 LLVM_VERSION:=$(shell $(LLVM_CONFIG) --version)
205 LLVM_VERSION_MAJOR:=$(firstword $(subst ., ,$(LLVM_VERSION)))
206 ifeq ($(shell expr "$(LLVM_VERSION_MAJOR)" '>=' 3),1)
207 LLVM_PROGS := sparse-llvm
208 $(LLVM_PROGS): LD := $(CXX)
209 LLVM_LDFLAGS := $(shell $(LLVM_CONFIG) --ldflags)
210 LLVM_CFLAGS := $(shell $(LLVM_CONFIG) --cppflags)
211 LLVM_LIBS := $(shell $(LLVM_CONFIG) --libs)
212 LLVM_LIBS += $(shell $(LLVM_CONFIG) --system-libs 2>/dev/null)
213 LLVM_LIBS += $(shell $(LLVM_CONFIG) --cxxflags | grep -F -q -e '-stdlib=libc++' && echo -lc++)
214 PROGRAMS += $(LLVM_PROGS)
215 INST_PROGRAMS += sparse-llvm sparsec
216 sparse-llvm-cflags := $(LLVM_CFLAGS)
217 sparse-llvm-ldflags := $(LLVM_LDFLAGS)
218 sparse-llvm-ldlibs := $(LLVM_LIBS)
219 else
220 $(warning LLVM 3.0 or later required. Your system has version $(LLVM_VERSION) installed.)
221 endif
222 else
223 $(warning sparse-llvm disabled on ${arch})
224 endif
225 else
226 $(warning Your system does not have llvm, disabling sparse-llvm)
227 endif
229 ifeq ($(HAVE_BOOLECTOR),yes)
230 PROGRAMS += scheck
231 scheck-cflags := -I${BOOLECTORDIR}/include/boolector
232 scheck-ldflags := -L${BOOLECTORDIR}/lib
233 scheck-ldlibs := -lboolector -llgl -lbtor2parser
234 endif
236 ########################################################################
237 LIBS := libsparse.a
238 OBJS := $(LIB_OBJS) $(EXTRA_OBJS) $(PROGRAMS:%=%.o)
240 # Pretty print
241 V := @
242 Q := $(V:1=)
244 ########################################################################
245 all: $(PROGRAMS)
247 ldflags += $($(@)-ldflags) $(LDFLAGS)
248 ldlibs += $($(@)-ldlibs) $(LDLIBS)
249 $(PROGRAMS): % : %.o $(LIBS)
250 @echo " LD $@"
251 $(Q)$(LD) $(ldflags) $^ $(ldlibs) -o $@
253 libsparse.a: $(LIB_OBJS)
254 @echo " AR $@"
255 $(Q)$(AR) rcs $@ $^
258 cflags += $($(*)-cflags) $(CPPFLAGS) $(CFLAGS)
259 %.o: %.c
260 @echo " CC $@"
261 $(Q)$(CC) $(cflags) -c -o $@ $<
263 %.sc: %.c sparse
264 @echo " CHECK $<"
265 $(Q)CHECK=./sparse ./cgcc -no-compile $(CHECKER_FLAGS) $(cflags) -c $<
267 selfcheck: $(OBJS:.o=.sc)
269 SPARSE_VERSION:=$(shell git describe --dirty 2>/dev/null || echo '$(VERSION)')
270 version.o: version.h
271 version.h: FORCE
272 @echo '#define SPARSE_VERSION "$(SPARSE_VERSION)"' > version.h.tmp
273 @if cmp -s version.h version.h.tmp; then \
274 rm version.h.tmp; \
275 else \
276 echo " GEN $@"; \
277 mv version.h.tmp version.h; \
281 check: all
282 $(Q)cd validation && ./test-suite
283 validation/%: $(PROGRAMS) FORCE
284 $(Q)validation/test-suite $*
287 clean: clean-check
288 @rm -f *.[oa] .*.d $(PROGRAMS) version.h
289 clean-check:
290 @echo " CLEAN"
291 @find validation/ \( -name "*.c.output.*" \
292 -o -name "*.c.error.*" \
293 -o -name "*.o" \
294 \) -exec rm {} \;
297 install: install-bin install-man
298 install-bin: $(INST_PROGRAMS:%=$(bindir)/%)
299 install-man: $(INST_MAN1:%=$(man1dir)/%)
301 $(bindir)/%: %
302 @echo " INSTALL $@"
303 $(Q)install -D $< $@ || exit 1;
304 $(man1dir)/%: %
305 @echo " INSTALL $@"
306 $(Q)install -D -m 644 $< $@ || exit 1;
308 .PHONY: FORCE
310 # GCC's dependencies
311 -include $(OBJS:%.o=.%.o.d)