blob: db1a7d5683ead8eaf7e91cdc141c5678a3ae697b [file] [log] [blame]
Thiago Macieira12b89602015-09-15 18:33:22 -07001# Variables:
2prefix = /usr/local
3exec_prefix = $(prefix)
4bindir = $(exec_prefix)/bin
5libdir = $(exec_prefix)/lib
6includedir = $(prefix)/include
7pkgconfigdir = $(libdir)/pkgconfig
8
9CFLAGS = -Wall -Wextra
10LDFLAGS = -Wl,--gc-sections
11
12GIT_ARCHIVE = git archive --prefix="$(PACKAGE)/" -9
13INSTALL = install
14INSTALL_DATA = $(INSTALL) -m 644
15INSTALL_PROGRAM = $(INSTALL) -m 755
16QMAKE = qmake
17MKDIR = mkdir -p
18RMDIR = rmdir
19SED = sed
20
21# Our sources
22TINYCBOR_HEADERS = src/cbor.h src/cborjson.h
23TINYCBOR_SOURCES = \
24 src/cborerrorstrings.c \
25 src/cborencoder.c \
26 src/cborparser.c \
27 src/cborpretty.c \
28 src/cbortojson.c \
29#
30CBORDUMP_SOURCES = tools/cbordump/cbordump.c
31
32INSTALL_TARGETS += $(bindir)/cbordump
33INSTALL_TARGETS += $(libdir)/libtinycbor.a
34INSTALL_TARGETS += $(pkgconfigdir)/tinycbor.pc
35INSTALL_TARGETS += $(TINYCBOR_HEADERS:src/%=$(includedir)/tinycbor/%)
36
37# setup VPATH
38MAKEFILE := $(lastword $(MAKEFILE_LIST))
39SRCDIR := $(dir $(MAKEFILE))
40VPATH = $(SRCDIR):$(SRCDIR)/src
41
42# Our version
43GIT_DIR := $(strip $(shell git -C $(SRCDIR) rev-parse --git-dir 2> /dev/null))
44ifeq ($(GIT_DIR),)
45 VERSION = $(shell cat $(SRCDIR)VERSION)
46 DIRTYSRC :=
47else
48 VERSION := $(shell git -C $(SRCDIR) describe --tags | cut -c2-)
49 DIRTYSRC := $(shell \
50 test -n `git -C $(SRCDIR) diff --name-only HEAD` && \
51 echo +)
52endif
53PACKAGE = tinycbor-$(VERSION)
54
55# Check that QMAKE is Qt 5
56ifeq ($(origin QMAKE),file)
57 check_qmake = $(strip $(shell $(1) -query QT_VERSION 2>/dev/null | cut -b1))
58 ifneq ($(call check_qmake,$(QMAKE)),5)
59 QMAKE := qmake -qt5
60 ifneq ($(call check_qmake,$(QMAKE)),5)
61 QMAKE := qmake-qt5
62 ifneq ($(call check_qmake,$(QMAKE)),5)
63 QMAKE := @echo >&2 $(MAKEFILE): Cannot find a Qt 5 qmake; false
64 endif
65 endif
66 endif
67endif
68
69# Rules
70all: lib/libtinycbor.a bin/cbordump tinycbor.pc
71check: tests/Makefile | lib/libtinycbor.a
72 $(MAKE) -C tests check
73silentcheck: | lib/libtinycbor.a
74 TESTARGS=-silent $(MAKE) -f $(MAKEFILE) -s check
75
76lib bin:
77 $(MKDIR) $@
78
79lib/libtinycbor.a: $(TINYCBOR_SOURCES:.c=.o) | lib
80 $(AR) cqs $@ $^
81
82bin/cbordump: $(CBORDUMP_SOURCES:.c=.o) lib/libtinycbor.a | bin
83 $(CC) -o $@ $(LDFLAGS) $^ $(LDLIBS)
84
85tinycbor.pc: tinycbor.pc.in
86 $(SED) > $@ < $< \
87 -e 's,@prefix@,$(prefix),' \
88 -e 's,@exec_prefix@,$(exec_prefix),' \
89 -e 's,@libdir@,$(libdir),' \
90 -e 's,@includedir@,$(includedir),' \
91 -e 's,@version@,$(VERSION),'
92
93tests/Makefile: tests/tests.pro
94 $(QMAKE) -o $@ $<
95
96$(PACKAGE).tar.gz: | .git
97 GIT_DIR=$(SRCDIR).git $(GIT_ARCHIVE) --format=tar.gz -o "$(PACKAGE).tar.gz" HEAD
98$(PACKAGE).zip: | .git
99 GIT_DIR=$(SRCDIR).git $(GIT_ARCHIVE) --format=zip -o "$(PACKAGE).zip" HEAD
100
101$(DESTDIR)%/:
102 $(INSTALL) -d $@
103$(DESTDIR)$(libdir)/%: lib/% | $(DESTDIR)$(libdir)/
104 $(INSTALL_DATA) $< $@
105$(DESTDIR)$(bindir)/%: bin/% | $(DESTDIR)$(bindir)/
106 $(INSTALL_PROGRAM) $< $@
107$(DESTDIR)$(pkgconfigdir)/%: % | $(DESTDIR)$(pkgconfigdir)/
108 $(INSTALL_DATA) $< $@
109$(DESTDIR)$(includedir)/tinycbor/%: src/% | $(DESTDIR)$(includedir)/tinycbor/
110 $(INSTALL_DATA) $< $@
111
112install-strip:
113 $(MAKE) -f $(MAKEFILE) INSTALL_PROGRAM='$(INSTALL_PROGRAM) -s' install
114
115install: $(INSTALL_TARGETS:%=$(DESTDIR)%)
116uninstall:
117 $(RM) $(INSTALL_TARGETS:%=$(DESTDIR)%)
118
119mostlyclean:
120 $(RM) $(TINYCBOR_SOURCES:.c=.o)
121 $(RM) $(CBORDUMP_SOURCES:.c=.o)
122
123clean: mostlyclean
124 $(RM) bin/cbordump
125 $(RM) lib/libtinycbor.a
126 $(RM) tinycbor.pc
127 test -e tests/Makefile && $(MAKE) -C tests clean || :
128
129distclean: clean
130 test -e tests/Makefile && $(MAKE) -C tests distclean || :
131
132dist: $(PACKAGE).tar.gz $(PACKAGE).zip
133distcheck: .git
134 -$(RM) -r $$TMPDIR/tinycbor-distcheck
135 GIT_DIR=$(SRCDIR).git git archive --prefix=tinycbor-distcheck/ --format=tar HEAD | tar -xf - -C $$TMPDIR
136 cd $$TMPDIR/tinycbor-distcheck && $(MAKE) silentcheck
137 $(RM) -r $$TMPDIR/tinycbor-distcheck
138
139.PHONY: all check silentcheck install uninstall
140.PHONY: mostlyclean clean distclean
141.PHONY: dist distcheck
142.SECONDARY:
143
144cflags := $(CPPFLAGS) -I$(SRCDIR)src
145cflags += -DTINYCBOR_VERSION=\"$(VERSION)$(DIRTYSRC)\"
146cflags += -std=c99 $(CFLAGS)
147%.o: %.c
148 @test -d $(@D) || $(MKDIR) $(@D)
149 $(CC) $(cflags) -c -o $@ $<