CC=@CC@
CFLAGS=@CFLAGS@

all: @TARGETS@

clean:
	rm -f picosat picomcs picomus picogcnf
	rm -f *.exe *.s *.o *.a *.so *.plist
	rm -f makefile config.h
	rm -f gmon.out *~ 
	rm -f *.so.1.0.0 picomus

analyze:
	clang --analyze $(CFLAGS) *.c *.h

picosat: libpicosat.a app.o main.o
	$(CC) $(CFLAGS) $(CPPFLAGS) -o $@ main.o app.o -L. -lpicosat $(LDFLAGS)

picomcs: libpicosat.a picomcs.o
	$(CC) $(CFLAGS) $(CPPFLAGS) -o $@ picomcs.o -L. -lpicosat $(LDFLAGS)

picomus: libpicosat.a picomus.o
	$(CC) $(CFLAGS) $(CPPFLAGS) -o $@ picomus.o -L. -lpicosat $(LDFLAGS)

picogcnf: libpicosat.a picogcnf.o
	$(CC) $(CFLAGS) $(CPPFLAGS) -o $@ picogcnf.o -L. -lpicosat $(LDFLAGS)

app.o: app.c picosat.h makefile
	$(CC) $(CFLAGS) $(CPPFLAGS) -c $<

picomcs.o: picomcs.c picosat.h makefile
	$(CC) $(CFLAGS) $(CPPFLAGS) -c $<

picomus.o: picomus.c picosat.h makefile
	$(CC) $(CFLAGS) $(CPPFLAGS) -c $<

picogcnf.o: picogcnf.c picosat.h makefile
	$(CC) $(CFLAGS) $(CPPFLAGS) -c $<

main.o: main.c picosat.h makefile
	$(CC) $(CFLAGS) $(CPPFLAGS) -c $<

picosat.o: picosat.c picosat.h makefile
	$(CC) $(CFLAGS) $(CPPFLAGS) -c $<

version.o: version.c config.h makefile
	$(CC) $(CFLAGS) $(CPPFLAGS) -c $<

config.h: makefile VERSION mkconfig.sh # and actually picosat.c
	rm -f $@; ./mkconfig.sh > $@

libpicosat.a: picosat.o version.o
	ar rc $@ picosat.o version.o
	ranlib $@

%.pic.o: %.o
	mv $< $*.nopic.o
	$(MAKE) CFLAGS="$(CFLAGS) -fPIC" $<
	mv $< $@
	mv $*.nopic.o $<

SONAME=-Xlinker -soname -Xlinker libpicosat.so.1
libpicosat.so: picosat.pic.o version.pic.o
	$(CC) $(CFLAGS) $(CPPFLAGS) -shared -o libpicosat.so.1.0.0 $^ -lc $(SONAME) $(LDFLAGS)

libpicosat-trace.so: picosat.pic.o version.pic.o
	$(CC) $(CFLAGS) $(CPPFLAGS) -shared -o libpicosat-trace.so.1.0.0 $^ -lc -Wl,-soname,libpicosat-trace.so.1 $(LDFLAGS)

.PHONY: all clean
