mumble

A Lisp written in C, following the *Build Your Own Lisp* book
Log | Files | Refs | README

Makefile (2673B)


      1 PROJ = mpc
      2 CC ?= gcc
      3 STD ?= -ansi
      4 DIST = build
      5 MKDIR  ?= mkdir -p
      6 PREFIX ?= /usr/local
      7 CFLAGS ?= $(STD) -pedantic -O3 -g -Wall -Werror -Wextra -Wformat=2 -Wshadow \
      8   -Wno-long-long -Wno-overlength-strings -Wno-format-nonliteral -Wcast-align \
      9   -Wwrite-strings -Wstrict-prototypes -Wold-style-definition -Wredundant-decls \
     10   -Wnested-externs -Wmissing-include-dirs -Wswitch-default
     11 
     12 TESTS = $(wildcard tests/*.c)
     13 EXAMPLES = $(wildcard examples/*.c)
     14 EXAMPLESEXE = $(EXAMPLES:.c=)
     15 
     16 .PHONY: all check clean libs $(DIST)/$(PROJ).pc
     17 
     18 all: $(EXAMPLESEXE) check libs $(DIST)/$(PROJ).pc
     19 
     20 $(DIST):
     21 	$(MKDIR) $(DIST)
     22 	$(MKDIR) $(DIST)/examples
     23 
     24 check: $(DIST) $(DIST)/test-file $(DIST)/test-static $(DIST)/test-dynamic
     25 	./$(DIST)/test-file
     26 	./$(DIST)/test-static
     27 	LD_LIBRARY_PATH=$(DIST) ./$(DIST)/test-dynamic
     28 
     29 $(DIST)/test-file: $(TESTS) $(PROJ).c $(PROJ).h tests/ptest.h
     30 	$(CC) $(filter-out -Werror, $(CFLAGS)) $(TESTS) $(PROJ).c -lm -o $(DIST)/test-file
     31 
     32 $(DIST)/test-dynamic: $(TESTS) $(DIST)/lib$(PROJ).so $(PROJ).h tests/ptest.h
     33 	$(CC) $(filter-out -Werror, $(CFLAGS)) $(TESTS) -lm -L$(DIST) -l$(PROJ) -o $(DIST)/test-dynamic
     34 
     35 $(DIST)/test-static: $(TESTS) $(DIST)/lib$(PROJ).a $(PROJ).h tests/ptest.h
     36 	$(CC) $(filter-out -Werror, $(CFLAGS)) $(TESTS) -lm -L$(DIST) -l$(PROJ) -static -o $(DIST)/test-static
     37 
     38 examples/%: $(DIST) examples/%.c $(PROJ).c $(PROJ).h
     39 	$(CC) $(CFLAGS) $(filter-out $(DIST) $(PROJ).h, $^) -lm -o $(DIST)/$@
     40 
     41 $(DIST)/lib$(PROJ).so: $(DIST) $(PROJ).c $(PROJ).h
     42 ifneq ($(OS),Windows_NT)
     43 	$(CC) $(CFLAGS) -fPIC -shared $(PROJ).c -o $(DIST)/lib$(PROJ).so
     44 else
     45 	$(CC) $(CFLAGS) -shared $(PROJ).c -o $(DIST)/lib$(PROJ).so
     46 endif
     47 
     48 $(DIST)/lib$(PROJ).a: $(DIST) $(PROJ).c $(PROJ).h
     49 	$(CC) $(CFLAGS) -c $(PROJ).c -o $(DIST)/$(PROJ).o
     50 	$(AR) rcs $(DIST)/lib$(PROJ).a $(DIST)/$(PROJ).o
     51 
     52 libs: $(DIST)/lib$(PROJ).so $(DIST)/lib$(PROJ).a
     53 
     54 $(DIST)/$(PROJ).pc: $(DIST) $(PROJ).pc
     55 	cp $(PROJ).pc $(DIST)/$(PROJ).pc
     56 	sed -i '1i\prefix=$(PREFIX)/' $(DIST)/$(PROJ).pc
     57 
     58 clean:
     59 	rm -rf -- $(DIST)
     60 
     61 install: all
     62 	install -d -m644 $(DESTDIR)$(PREFIX)/include
     63 	install -d -m644 $(DESTDIR)$(PREFIX)/lib/pkgconfig
     64 	install -d -m644 $(DESTDIR)$(PREFIX)/share/$(PROJ)
     65 	install -m755 -t $(DESTDIR)$(PREFIX)/lib $(DIST)/lib*
     66 	install -m644 -t $(DESTDIR)$(PREFIX)/share/$(PROJ) $(PROJ).c $(PROJ).h
     67 	install -m644 $(PROJ).h $(DESTDIR)$(PREFIX)/include/$(PROJ).h
     68 	install -m644 $(DIST)/$(PROJ).pc \
     69 	  $(DESTDIR)$(PREFIX)/lib/pkgconfig/$(PROJ).pc
     70 
     71 uninstall:
     72 	rm -rf -- \
     73 		$(DESTDIR)$(PREFIX)/include/$(PROJ).h \
     74 		$(DESTDIR)$(PREFIX)/share/$(PROJ)/$(PROJ).{c,h} \
     75 		$(DESTDIR)$(PREFIX)/lib/lib$(PROJ).{so,a}