| VERSION=0.4.1 | 
 |  | 
 | OS = linux | 
 |  | 
 |  | 
 | CC = gcc | 
 | CFLAGS = -O2 -finline-functions -fno-strict-aliasing -g | 
 | CFLAGS += -Wall -Wwrite-strings | 
 | LDFLAGS += -g | 
 | AR = ar | 
 |  | 
 | # | 
 | # For debugging, put this in local.mk: | 
 | # | 
 | #     CFLAGS += -O0 -DDEBUG -g3 -gdwarf-2 | 
 | # | 
 |  | 
 | HAVE_LIBXML=$(shell pkg-config --exists libxml-2.0 2>/dev/null && echo 'yes') | 
 | HAVE_GCC_DEP=$(shell touch .gcc-test.c && 				\ | 
 | 		$(CC) -c -Wp,-MD,.gcc-test.d .gcc-test.c 2>/dev/null && \ | 
 | 		echo 'yes'; rm -f .gcc-test.d .gcc-test.o .gcc-test.c) | 
 |  | 
 | CFLAGS += -DGCC_BASE=\"$(shell $(CC) --print-file-name=)\" | 
 |  | 
 | ifeq ($(HAVE_GCC_DEP),yes) | 
 | CFLAGS += -Wp,-MD,$(@D)/.$(@F).d | 
 | endif | 
 |  | 
 | DESTDIR= | 
 | PREFIX=$(HOME) | 
 | BINDIR=$(PREFIX)/bin | 
 | LIBDIR=$(PREFIX)/lib | 
 | MANDIR=$(PREFIX)/share/man | 
 | MAN1DIR=$(MANDIR)/man1 | 
 | INCLUDEDIR=$(PREFIX)/include | 
 | PKGCONFIGDIR=$(LIBDIR)/pkgconfig | 
 |  | 
 | PROGRAMS=test-lexing test-parsing obfuscate compile graph sparse \ | 
 | 	 test-linearize example test-unssa test-dissect ctags | 
 | INST_PROGRAMS=sparse cgcc | 
 | INST_MAN1=sparse.1 cgcc.1 | 
 |  | 
 | ifeq ($(HAVE_LIBXML),yes) | 
 | PROGRAMS+=c2xml | 
 | INST_PROGRAMS+=c2xml | 
 | c2xml_EXTRA_OBJS = `pkg-config --libs libxml-2.0` | 
 | endif | 
 |  | 
 | LIB_H=    token.h parse.h lib.h symbol.h scope.h expression.h target.h \ | 
 | 	  linearize.h bitmap.h ident-list.h compat.h flow.h allocate.h \ | 
 | 	  storage.h ptrlist.h dissect.h | 
 |  | 
 | LIB_OBJS= target.o parse.o tokenize.o pre-process.o symbol.o lib.o scope.o \ | 
 | 	  expression.o show-parse.o evaluate.o expand.o inline.o linearize.o \ | 
 | 	  sort.o allocate.o compat-$(OS).o ptrlist.o \ | 
 | 	  flow.o cse.o simplify.o memops.o liveness.o storage.o unssa.o dissect.o | 
 |  | 
 | LIB_FILE= libsparse.a | 
 | SLIB_FILE= libsparse.so | 
 |  | 
 | # If you add $(SLIB_FILE) to this, you also need to add -fpic to CFLAGS above. | 
 | # Doing so incurs a noticeable performance hit, and Sparse does not have a | 
 | # stable shared library interface, so this does not occur by default.  If you | 
 | # really want a shared library, you may want to build Sparse twice: once | 
 | # without -fpic to get all the Sparse tools, and again with -fpic to get the | 
 | # shared library. | 
 | LIBS=$(LIB_FILE) | 
 |  | 
 | # | 
 | # Pretty print | 
 | # | 
 | V	      = @ | 
 | Q	      = $(V:1=) | 
 | QUIET_CC      = $(Q:@=@echo    '     CC       '$@;) | 
 | QUIET_AR      = $(Q:@=@echo    '     AR       '$@;) | 
 | QUIET_GEN     = $(Q:@=@echo    '     GEN      '$@;) | 
 | QUIET_LINK    = $(Q:@=@echo    '     LINK     '$@;) | 
 | # We rely on the -v switch of install to print 'file -> $install_dir/file' | 
 | QUIET_INST_SH = $(Q:@=echo -n  '     INSTALL  ';) | 
 | QUIET_INST    = $(Q:@=@echo -n '     INSTALL  ';) | 
 |  | 
 | define INSTALL_CMD | 
 | 	$(Q)$(QUIET_INST_SH)install -v $1 $(DESTDIR)$2/$1 || exit 1; | 
 |  | 
 | endef | 
 |  | 
 | SED_PC_CMD = 's|@version@|$(VERSION)|g;		\ | 
 | 	      s|@prefix@|$(PREFIX)|g;		\ | 
 | 	      s|@libdir@|$(LIBDIR)|g;		\ | 
 | 	      s|@includedir@|$(INCLUDEDIR)|g' | 
 |  | 
 |  | 
 |  | 
 | # Allow users to override build settings without dirtying their trees | 
 | -include local.mk | 
 |  | 
 |  | 
 | all: $(PROGRAMS) sparse.pc | 
 |  | 
 | install: $(INST_PROGRAMS) $(LIBS) $(LIB_H) sparse.pc | 
 | 	$(Q)install -d $(DESTDIR)$(BINDIR) | 
 | 	$(Q)install -d $(DESTDIR)$(LIBDIR) | 
 | 	$(Q)install -d $(DESTDIR)$(MAN1DIR) | 
 | 	$(Q)install -d $(DESTDIR)$(INCLUDEDIR)/sparse | 
 | 	$(Q)install -d $(DESTDIR)$(PKGCONFIGDIR) | 
 | 	$(foreach f,$(INST_PROGRAMS),$(call INSTALL_CMD,$f,$(BINDIR))) | 
 | 	$(foreach f,$(INST_MAN1),$(call INSTALL_CMD,$f,$(MAN1DIR))) | 
 | 	$(foreach f,$(LIBS),$(call INSTALL_CMD,$f,$(LIBDIR))) | 
 | 	$(foreach f,$(LIB_H),$(call INSTALL_CMD,$f,$(INCLUDEDIR)/sparse)) | 
 | 	$(call INSTALL_CMD,sparse.pc,$(PKGCONFIGDIR)) | 
 |  | 
 | sparse.pc: sparse.pc.in | 
 | 	$(QUIET_GEN)sed $(SED_PC_CMD) sparse.pc.in > sparse.pc | 
 |  | 
 |  | 
 | compile_EXTRA_DEPS = compile-i386.o | 
 |  | 
 | PROG_LINK_CMD = $(QUIET_LINK)$(CC) $(LDFLAGS) -o $@ $^ $($@_EXTRA_OBJS)  | 
 |  | 
 | define BUILD_PROGRAM | 
 | $(prog): $(prog).o $$($(prog)_EXTRA_DEPS) $$(LIBS) | 
 | 	$$(PROG_LINK_CMD) | 
 | endef | 
 |  | 
 | $(foreach prog,$(PROGRAMS),$(eval $(BUILD_PROGRAM))) | 
 |  | 
 | $(LIB_FILE): $(LIB_OBJS) | 
 | 	$(QUIET_AR)$(AR) rcs $@ $(LIB_OBJS) | 
 |  | 
 | $(SLIB_FILE): $(LIB_OBJS) | 
 | 	$(QUIET_LINK)$(CC) $(LDFLAGS) -Wl,-soname,$@ -shared -o $@ $(LIB_OBJS) | 
 |  | 
 | DEP_FILES := $(wildcard .*.o.d) | 
 | $(if $(DEP_FILES),$(eval include $(DEP_FILES))) | 
 |  | 
 | c2xml.o: c2xml.c $(LIB_H) | 
 | 	$(QUIET_CC)$(CC) `pkg-config --cflags libxml-2.0` -o $@ -c $(CFLAGS) $< | 
 |  | 
 | compat-linux.o: compat/strtold.c compat/mmap-blob.c $(LIB_H) | 
 | compat-solaris.o: compat/mmap-blob.c $(LIB_H) | 
 | compat-mingw.o: $(LIB_H) | 
 | compat-cygwin.o: $(LIB_H) | 
 |  | 
 | .c.o: | 
 | 	$(QUIET_CC)$(CC) -o $@ -c $(CFLAGS) $< | 
 |  | 
 | clean: clean-check | 
 | 	rm -f *.[oa] .*.d *.so $(PROGRAMS) $(SLIB_FILE) pre-process.h sparse.pc | 
 |  | 
 | dist: | 
 | 	@if test "`git describe`" != "$(VERSION)" ; then \ | 
 | 		echo 'Update VERSION in the Makefile before running "make dist".' ; \ | 
 | 		exit 1 ; \ | 
 | 	fi | 
 | 	git archive --format=tar --prefix=sparse-$(VERSION)/ HEAD^{tree} | gzip -9 > sparse-$(VERSION).tar.gz | 
 |  | 
 | check: all | 
 | 	$(Q)cd validation && ./test-suite | 
 |  | 
 | clean-check: | 
 | 	find validation/ \( -name "*.c.output.expected" \ | 
 | 	                 -o -name "*.c.output.got" \ | 
 | 	                 -o -name "*.c.output.diff" \ | 
 | 	                 -o -name "*.c.error.expected" \ | 
 | 	                 -o -name "*.c.error.got" \ | 
 | 	                 -o -name "*.c.error.diff" \ | 
 | 	                 \) -exec rm {} \; |