1###################################################################################################
2
3.PHONY:	r d p sh cr cd cp csh lr ld lp lsh config all install install-headers install-lib\
4        install-bin clean distclean
5all:	r lr lsh
6
7## Load Previous Configuration ####################################################################
8
9-include config.mk
10
11## Configurable options ###########################################################################
12
13# Directory to store object files, libraries, executables, and dependencies:
14BUILD_DIR      ?= build
15
16# Include debug-symbols in release builds
17MINISAT_RELSYM ?= -g
18
19# Sets of compile flags for different build types
20MINISAT_REL    ?= -O3 -D NDEBUG
21MINISAT_DEB    ?= -O0 -D DEBUG
22MINISAT_PRF    ?= -O3 -D NDEBUG
23MINISAT_FPIC   ?= -fpic
24
25# GNU Standard Install Prefix
26prefix         ?= /usr/local
27
28## Write Configuration  ###########################################################################
29
30config:
31	@( echo 'BUILD_DIR?=$(BUILD_DIR)'           ; \
32	   echo 'MINISAT_RELSYM?=$(MINISAT_RELSYM)' ; \
33	   echo 'MINISAT_REL?=$(MINISAT_REL)'       ; \
34	   echo 'MINISAT_DEB?=$(MINISAT_DEB)'       ; \
35	   echo 'MINISAT_PRF?=$(MINISAT_PRF)'       ; \
36	   echo 'MINISAT_FPIC?=$(MINISAT_FPIC)'     ; \
37	   echo 'prefix?=$(prefix)'                 ) > config.mk
38
39## Configurable options end #######################################################################
40
41INSTALL ?= install
42
43# GNU Standard Install Variables
44exec_prefix ?= $(prefix)
45includedir  ?= $(prefix)/include
46bindir      ?= $(exec_prefix)/bin
47libdir      ?= $(exec_prefix)/lib
48datarootdir ?= $(prefix)/share
49mandir      ?= $(datarootdir)/man
50
51# Target file names
52MINISAT      = minisat#       Name of MiniSat main executable.
53MINISAT_CORE = minisat_core#  Name of simplified MiniSat executable (only core solver support).
54MINISAT_SLIB = lib$(MINISAT).a#  Name of MiniSat static library.
55MINISAT_DLIB = lib$(MINISAT).so# Name of MiniSat shared library.
56
57# Shared Library Version
58SOMAJOR=2
59SOMINOR=1
60SORELEASE?=.0#   Declare empty to leave out from library file name.
61
62MINISAT_CXXFLAGS = -I. -D __STDC_LIMIT_MACROS -D __STDC_FORMAT_MACROS -Wall -Wno-parentheses -Wextra
63MINISAT_LDFLAGS  = -Wall -lz
64
65ECHO=@echo
66ifeq ($(VERB),)
67VERB=@
68else
69VERB=
70endif
71
72SRCS = $(wildcard minisat/core/*.cc) $(wildcard minisat/simp/*.cc) $(wildcard minisat/utils/*.cc)
73HDRS = $(wildcard minisat/mtl/*.h) $(wildcard minisat/core/*.h) $(wildcard minisat/simp/*.h) $(wildcard minisat/utils/*.h)
74OBJS = $(filter-out %Main.o, $(SRCS:.cc=.o))
75
76r:	$(BUILD_DIR)/release/bin/$(MINISAT)
77d:	$(BUILD_DIR)/debug/bin/$(MINISAT)
78p:	$(BUILD_DIR)/profile/bin/$(MINISAT)
79sh:	$(BUILD_DIR)/dynamic/bin/$(MINISAT)
80
81cr:	$(BUILD_DIR)/release/bin/$(MINISAT_CORE)
82cd:	$(BUILD_DIR)/debug/bin/$(MINISAT_CORE)
83cp:	$(BUILD_DIR)/profile/bin/$(MINISAT_CORE)
84csh:	$(BUILD_DIR)/dynamic/bin/$(MINISAT_CORE)
85
86lr:	$(BUILD_DIR)/release/lib/$(MINISAT_SLIB)
87ld:	$(BUILD_DIR)/debug/lib/$(MINISAT_SLIB)
88lp:	$(BUILD_DIR)/profile/lib/$(MINISAT_SLIB)
89lsh:	$(BUILD_DIR)/dynamic/lib/$(MINISAT_DLIB).$(SOMAJOR).$(SOMINOR)$(SORELEASE)
90
91## Build-type Compile-flags:
92$(BUILD_DIR)/release/%.o:			MINISAT_CXXFLAGS +=$(MINISAT_REL) $(MINISAT_RELSYM)
93$(BUILD_DIR)/debug/%.o:				MINISAT_CXXFLAGS +=$(MINISAT_DEB) -g
94$(BUILD_DIR)/profile/%.o:			MINISAT_CXXFLAGS +=$(MINISAT_PRF) -pg
95$(BUILD_DIR)/dynamic/%.o:			MINISAT_CXXFLAGS +=$(MINISAT_REL) $(MINISAT_FPIC)
96
97## Build-type Link-flags:
98$(BUILD_DIR)/profile/bin/$(MINISAT):		MINISAT_LDFLAGS += -pg
99$(BUILD_DIR)/release/bin/$(MINISAT):		MINISAT_LDFLAGS += --static $(MINISAT_RELSYM)
100$(BUILD_DIR)/profile/bin/$(MINISAT_CORE):	MINISAT_LDFLAGS += -pg
101$(BUILD_DIR)/release/bin/$(MINISAT_CORE):	MINISAT_LDFLAGS += --static $(MINISAT_RELSYM)
102
103## Executable dependencies
104$(BUILD_DIR)/release/bin/$(MINISAT):	 	$(BUILD_DIR)/release/minisat/simp/Main.o $(BUILD_DIR)/release/lib/$(MINISAT_SLIB)
105$(BUILD_DIR)/debug/bin/$(MINISAT):	 	$(BUILD_DIR)/debug/minisat/simp/Main.o $(BUILD_DIR)/debug/lib/$(MINISAT_SLIB)
106$(BUILD_DIR)/profile/bin/$(MINISAT):	 	$(BUILD_DIR)/profile/minisat/simp/Main.o $(BUILD_DIR)/profile/lib/$(MINISAT_SLIB)
107# need the main-file be compiled with fpic?
108$(BUILD_DIR)/dynamic/bin/$(MINISAT):	 	$(BUILD_DIR)/dynamic/minisat/simp/Main.o $(BUILD_DIR)/dynamic/lib/$(MINISAT_DLIB)
109
110## Executable dependencies (core-version)
111$(BUILD_DIR)/release/bin/$(MINISAT_CORE):	$(BUILD_DIR)/release/minisat/core/Main.o $(BUILD_DIR)/release/lib/$(MINISAT_SLIB)
112$(BUILD_DIR)/debug/bin/$(MINISAT_CORE):	 	$(BUILD_DIR)/debug/minisat/core/Main.o $(BUILD_DIR)/debug/lib/$(MINISAT_SLIB)
113$(BUILD_DIR)/profile/bin/$(MINISAT_CORE):	$(BUILD_DIR)/profile/minisat/core/Main.o $(BUILD_DIR)/profile/lib/$(MINISAT_SLIB)
114# need the main-file be compiled with fpic?
115$(BUILD_DIR)/dynamic/bin/$(MINISAT_CORE): 	$(BUILD_DIR)/dynamic/minisat/core/Main.o $(BUILD_DIR)/dynamic/lib/$(MINISAT_DLIB)
116
117## Library dependencies
118$(BUILD_DIR)/release/lib/$(MINISAT_SLIB):	$(foreach o,$(OBJS),$(BUILD_DIR)/release/$(o))
119$(BUILD_DIR)/debug/lib/$(MINISAT_SLIB):		$(foreach o,$(OBJS),$(BUILD_DIR)/debug/$(o))
120$(BUILD_DIR)/profile/lib/$(MINISAT_SLIB):	$(foreach o,$(OBJS),$(BUILD_DIR)/profile/$(o))
121$(BUILD_DIR)/dynamic/lib/$(MINISAT_DLIB).$(SOMAJOR).$(SOMINOR)$(SORELEASE)\
122 $(BUILD_DIR)/dynamic/lib/$(MINISAT_DLIB).$(SOMAJOR)\
123 $(BUILD_DIR)/dynamic/lib/$(MINISAT_DLIB):	$(foreach o,$(OBJS),$(BUILD_DIR)/dynamic/$(o))
124
125## Compile rules (these should be unified, buit I have not yet found a way which works in GNU Make)
126$(BUILD_DIR)/release/%.o:	%.cc
127	$(ECHO) Compiling: $@
128	$(VERB) mkdir -p $(dir $@)
129	$(VERB) $(CXX) $(MINISAT_CXXFLAGS) $(CXXFLAGS) -c -o $@ $< -MMD -MF $(BUILD_DIR)/release/$*.d
130
131$(BUILD_DIR)/profile/%.o:	%.cc
132	$(ECHO) Compiling: $@
133	$(VERB) mkdir -p $(dir $@)
134	$(VERB) $(CXX) $(MINISAT_CXXFLAGS) $(CXXFLAGS) -c -o $@ $< -MMD -MF $(BUILD_DIR)/profile/$*.d
135
136$(BUILD_DIR)/debug/%.o:	%.cc
137	$(ECHO) Compiling: $@
138	$(VERB) mkdir -p $(dir $@)
139	$(VERB) $(CXX) $(MINISAT_CXXFLAGS) $(CXXFLAGS) -c -o $@ $< -MMD -MF $(BUILD_DIR)/debug/$*.d
140
141$(BUILD_DIR)/dynamic/%.o:	%.cc
142	$(ECHO) Compiling: $@
143	$(VERB) mkdir -p $(dir $@)
144	$(VERB) $(CXX) $(MINISAT_CXXFLAGS) $(CXXFLAGS) -c -o $@ $< -MMD -MF $(BUILD_DIR)/dynamic/$*.d
145
146## Linking rule
147$(BUILD_DIR)/release/bin/$(MINISAT) $(BUILD_DIR)/debug/bin/$(MINISAT) $(BUILD_DIR)/profile/bin/$(MINISAT) $(BUILD_DIR)/dynamic/bin/$(MINISAT)\
148$(BUILD_DIR)/release/bin/$(MINISAT_CORE) $(BUILD_DIR)/debug/bin/$(MINISAT_CORE) $(BUILD_DIR)/profile/bin/$(MINISAT_CORE) $(BUILD_DIR)/dynamic/bin/$(MINISAT_CORE):
149	$(ECHO) Linking Binary: $@
150	$(VERB) mkdir -p $(dir $@)
151	$(VERB) $(CXX) $^ $(MINISAT_LDFLAGS) $(LDFLAGS) -o $@
152
153## Static Library rule
154%/lib/$(MINISAT_SLIB):
155	$(ECHO) Linking Static Library: $@
156	$(VERB) mkdir -p $(dir $@)
157	$(VERB) $(AR) -rcs $@ $^
158
159## Shared Library rule
160$(BUILD_DIR)/dynamic/lib/$(MINISAT_DLIB).$(SOMAJOR).$(SOMINOR)$(SORELEASE)\
161 $(BUILD_DIR)/dynamic/lib/$(MINISAT_DLIB).$(SOMAJOR)\
162 $(BUILD_DIR)/dynamic/lib/$(MINISAT_DLIB):
163	$(ECHO) Linking Shared Library: $@
164	$(VERB) mkdir -p $(dir $@)
165	$(VERB) $(CXX) $(MINISAT_LDFLAGS) $(LDFLAGS) -o $@ -shared -Wl,-soname,$(MINISAT_DLIB).$(SOMAJOR) $^
166	$(VERB) ln -sf $(MINISAT_DLIB).$(SOMAJOR).$(SOMINOR)$(SORELEASE) $(BUILD_DIR)/dynamic/lib/$(MINISAT_DLIB).$(SOMAJOR)
167	$(VERB) ln -sf $(MINISAT_DLIB).$(SOMAJOR) $(BUILD_DIR)/dynamic/lib/$(MINISAT_DLIB)
168
169install:	install-headers install-lib install-bin
170install-debug:	install-headers install-lib-debug
171
172install-headers:
173#       Create directories
174	$(INSTALL) -d $(DESTDIR)$(includedir)/minisat
175	for dir in mtl utils core simp; do \
176	  $(INSTALL) -d $(DESTDIR)$(includedir)/minisat/$$dir ; \
177	done
178#       Install headers
179	for h in $(HDRS) ; do \
180	  $(INSTALL) -m 644 $$h $(DESTDIR)$(includedir)/$$h ; \
181	done
182
183install-lib-debug: $(BUILD_DIR)/debug/lib/$(MINISAT_SLIB)
184	$(INSTALL) -d $(DESTDIR)$(libdir)
185	$(INSTALL) -m 644 $(BUILD_DIR)/debug/lib/$(MINISAT_SLIB) $(DESTDIR)$(libdir)
186
187install-lib: $(BUILD_DIR)/release/lib/$(MINISAT_SLIB) $(BUILD_DIR)/dynamic/lib/$(MINISAT_DLIB).$(SOMAJOR).$(SOMINOR)$(SORELEASE)
188	$(INSTALL) -d $(DESTDIR)$(libdir)
189	$(INSTALL) -m 644 $(BUILD_DIR)/dynamic/lib/$(MINISAT_DLIB).$(SOMAJOR).$(SOMINOR)$(SORELEASE) $(DESTDIR)$(libdir)
190	ln -sf $(MINISAT_DLIB).$(SOMAJOR).$(SOMINOR)$(SORELEASE) $(DESTDIR)$(libdir)/$(MINISAT_DLIB).$(SOMAJOR)
191	ln -sf $(MINISAT_DLIB).$(SOMAJOR) $(DESTDIR)$(libdir)/$(MINISAT_DLIB)
192	$(INSTALL) -m 644 $(BUILD_DIR)/release/lib/$(MINISAT_SLIB) $(DESTDIR)$(libdir)
193
194install-bin: $(BUILD_DIR)/dynamic/bin/$(MINISAT)
195	$(INSTALL) -d $(DESTDIR)$(bindir)
196	$(INSTALL) -m 755 $(BUILD_DIR)/dynamic/bin/$(MINISAT) $(DESTDIR)$(bindir)
197
198clean:
199	rm -f $(foreach t, release debug profile dynamic, $(foreach o, $(SRCS:.cc=.o), $(BUILD_DIR)/$t/$o)) \
200          $(foreach t, release debug profile dynamic, $(foreach d, $(SRCS:.cc=.d), $(BUILD_DIR)/$t/$d)) \
201	  $(foreach t, release debug profile dynamic, $(BUILD_DIR)/$t/bin/$(MINISAT_CORE) $(BUILD_DIR)/$t/bin/$(MINISAT)) \
202	  $(foreach t, release debug profile, $(BUILD_DIR)/$t/lib/$(MINISAT_SLIB)) \
203	  $(BUILD_DIR)/dynamic/lib/$(MINISAT_DLIB).$(SOMAJOR).$(SOMINOR)$(SORELEASE)\
204	  $(BUILD_DIR)/dynamic/lib/$(MINISAT_DLIB).$(SOMAJOR)\
205	  $(BUILD_DIR)/dynamic/lib/$(MINISAT_DLIB)
206
207distclean:	clean
208	rm -f config.mk
209
210## Include generated dependencies
211-include $(foreach s, $(SRCS:.cc=.d), $(BUILD_DIR)/release/$s)
212-include $(foreach s, $(SRCS:.cc=.d), $(BUILD_DIR)/debug/$s)
213-include $(foreach s, $(SRCS:.cc=.d), $(BUILD_DIR)/profile/$s)
214-include $(foreach s, $(SRCS:.cc=.d), $(BUILD_DIR)/dynamic/$s)
215