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}