blob: 886d4f62c5397cbbf78967aa51b949debeb434dc [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
Thiago Macieira2a5fb792015-09-18 11:34:11 -070010LDFLAGS_GCSECTIONS = -Wl,--gc-sections
11LDFLAGS = $(if $(gc_sections-pass),$(LDFLAGS_GCSECTIONS))
Thiago Macieira12b89602015-09-15 18:33:22 -070012
13GIT_ARCHIVE = git archive --prefix="$(PACKAGE)/" -9
14INSTALL = install
15INSTALL_DATA = $(INSTALL) -m 644
16INSTALL_PROGRAM = $(INSTALL) -m 755
17QMAKE = qmake
18MKDIR = mkdir -p
19RMDIR = rmdir
20SED = sed
21
22# Our sources
23TINYCBOR_HEADERS = src/cbor.h src/cborjson.h
24TINYCBOR_SOURCES = \
25 src/cborerrorstrings.c \
26 src/cborencoder.c \
Thiago Macieira4e9626c2015-09-21 14:57:17 -070027 src/cborencoder_close_container_checked.c \
Thiago Macieira12b89602015-09-15 18:33:22 -070028 src/cborparser.c \
29 src/cborpretty.c \
Thiago Macieira2b1800c2015-09-05 20:25:20 -050030 src/cbortojson.c \
Thiago Macieira2a5fb792015-09-18 11:34:11 -070031 $(if $(open_memstream-pass),,src/open_memstream.c) \
Thiago Macieira12b89602015-09-15 18:33:22 -070032#
33CBORDUMP_SOURCES = tools/cbordump/cbordump.c
34
35INSTALL_TARGETS += $(bindir)/cbordump
36INSTALL_TARGETS += $(libdir)/libtinycbor.a
37INSTALL_TARGETS += $(pkgconfigdir)/tinycbor.pc
38INSTALL_TARGETS += $(TINYCBOR_HEADERS:src/%=$(includedir)/tinycbor/%)
39
40# setup VPATH
41MAKEFILE := $(lastword $(MAKEFILE_LIST))
42SRCDIR := $(dir $(MAKEFILE))
43VPATH = $(SRCDIR):$(SRCDIR)/src
44
45# Our version
46GIT_DIR := $(strip $(shell git -C $(SRCDIR) rev-parse --git-dir 2> /dev/null))
47ifeq ($(GIT_DIR),)
48 VERSION = $(shell cat $(SRCDIR)VERSION)
49 DIRTYSRC :=
50else
51 VERSION := $(shell git -C $(SRCDIR) describe --tags | cut -c2-)
52 DIRTYSRC := $(shell \
Thiago Macieira4b916b42015-09-17 00:42:48 -070053 test -n "`git -C $(SRCDIR) diff --name-only HEAD`" && \
Thiago Macieira12b89602015-09-15 18:33:22 -070054 echo +)
55endif
56PACKAGE = tinycbor-$(VERSION)
57
58# Check that QMAKE is Qt 5
59ifeq ($(origin QMAKE),file)
60 check_qmake = $(strip $(shell $(1) -query QT_VERSION 2>/dev/null | cut -b1))
61 ifneq ($(call check_qmake,$(QMAKE)),5)
62 QMAKE := qmake -qt5
63 ifneq ($(call check_qmake,$(QMAKE)),5)
64 QMAKE := qmake-qt5
65 ifneq ($(call check_qmake,$(QMAKE)),5)
66 QMAKE := @echo >&2 $(MAKEFILE): Cannot find a Qt 5 qmake; false
67 endif
68 endif
69 endif
70endif
71
Thiago Macieira2a5fb792015-09-18 11:34:11 -070072-include .config
73
Thiago Macieirad4c9ecb2015-09-26 00:21:06 -070074# json2cbor depends on an external library (cJSON)
75ifneq ($(cjson-pass)$(system-cjson-pass),)
76 JSON2CBOR_SOURCES = tools/json2cbor/json2cbor.c
77 INSTALL_TARGETS += $(bindir)/json2cbor
78 ifeq ($(system-cjson-pass),1)
79 LDFLAGS_CJSON = -lcJSON
80 else
81 JSON2CBOR_SOURCES += src/cjson/cJSON.c
82 json2cbor_CCFLAGS = -I$(SRCDIR)src/cjson
83 endif
84endif
85
Thiago Macieira12b89602015-09-15 18:33:22 -070086# Rules
Thiago Macieira2a5fb792015-09-18 11:34:11 -070087all: .config lib/libtinycbor.a bin/cbordump tinycbor.pc
Thiago Macieirad4c9ecb2015-09-26 00:21:06 -070088all: $(if $(JSON2CBOR_SOURCES),bin/json2cbor)
Thiago Macieira12b89602015-09-15 18:33:22 -070089check: tests/Makefile | lib/libtinycbor.a
90 $(MAKE) -C tests check
91silentcheck: | lib/libtinycbor.a
92 TESTARGS=-silent $(MAKE) -f $(MAKEFILE) -s check
Thiago Macieira2a5fb792015-09-18 11:34:11 -070093configure: .config
94.config: Makefile.configure
95 $(MAKE) -f $(SRCDIR)Makefile.configure OUT='>&10' configure 10> $@
Thiago Macieira12b89602015-09-15 18:33:22 -070096
97lib bin:
98 $(MKDIR) $@
99
100lib/libtinycbor.a: $(TINYCBOR_SOURCES:.c=.o) | lib
101 $(AR) cqs $@ $^
102
103bin/cbordump: $(CBORDUMP_SOURCES:.c=.o) lib/libtinycbor.a | bin
Thiago Macieira57bcf4f2015-09-17 00:14:30 -0700104 $(CC) -o $@ $(LDFLAGS) $^ $(LDLIBS) -lm
Thiago Macieira12b89602015-09-15 18:33:22 -0700105
Thiago Macieirad4c9ecb2015-09-26 00:21:06 -0700106bin/json2cbor: $(JSON2CBOR_SOURCES:.c=.o) lib/libtinycbor.a | bin
107 $(CC) -o $@ $(LDFLAGS) $(LDFLAGS_CJSON) $^ $(LDLIBS) -lm
108
Thiago Macieira12b89602015-09-15 18:33:22 -0700109tinycbor.pc: tinycbor.pc.in
110 $(SED) > $@ < $< \
111 -e 's,@prefix@,$(prefix),' \
112 -e 's,@exec_prefix@,$(exec_prefix),' \
113 -e 's,@libdir@,$(libdir),' \
114 -e 's,@includedir@,$(includedir),' \
115 -e 's,@version@,$(VERSION),'
116
117tests/Makefile: tests/tests.pro
118 $(QMAKE) -o $@ $<
119
120$(PACKAGE).tar.gz: | .git
121 GIT_DIR=$(SRCDIR).git $(GIT_ARCHIVE) --format=tar.gz -o "$(PACKAGE).tar.gz" HEAD
122$(PACKAGE).zip: | .git
123 GIT_DIR=$(SRCDIR).git $(GIT_ARCHIVE) --format=zip -o "$(PACKAGE).zip" HEAD
124
125$(DESTDIR)%/:
126 $(INSTALL) -d $@
127$(DESTDIR)$(libdir)/%: lib/% | $(DESTDIR)$(libdir)/
128 $(INSTALL_DATA) $< $@
129$(DESTDIR)$(bindir)/%: bin/% | $(DESTDIR)$(bindir)/
130 $(INSTALL_PROGRAM) $< $@
131$(DESTDIR)$(pkgconfigdir)/%: % | $(DESTDIR)$(pkgconfigdir)/
132 $(INSTALL_DATA) $< $@
133$(DESTDIR)$(includedir)/tinycbor/%: src/% | $(DESTDIR)$(includedir)/tinycbor/
134 $(INSTALL_DATA) $< $@
135
136install-strip:
137 $(MAKE) -f $(MAKEFILE) INSTALL_PROGRAM='$(INSTALL_PROGRAM) -s' install
138
139install: $(INSTALL_TARGETS:%=$(DESTDIR)%)
140uninstall:
141 $(RM) $(INSTALL_TARGETS:%=$(DESTDIR)%)
142
143mostlyclean:
144 $(RM) $(TINYCBOR_SOURCES:.c=.o)
145 $(RM) $(CBORDUMP_SOURCES:.c=.o)
146
147clean: mostlyclean
148 $(RM) bin/cbordump
Thiago Macieirad4c9ecb2015-09-26 00:21:06 -0700149 $(RM) bin/json2cbor
Thiago Macieira12b89602015-09-15 18:33:22 -0700150 $(RM) lib/libtinycbor.a
151 $(RM) tinycbor.pc
152 test -e tests/Makefile && $(MAKE) -C tests clean || :
153
154distclean: clean
155 test -e tests/Makefile && $(MAKE) -C tests distclean || :
156
157dist: $(PACKAGE).tar.gz $(PACKAGE).zip
158distcheck: .git
159 -$(RM) -r $$TMPDIR/tinycbor-distcheck
160 GIT_DIR=$(SRCDIR).git git archive --prefix=tinycbor-distcheck/ --format=tar HEAD | tar -xf - -C $$TMPDIR
161 cd $$TMPDIR/tinycbor-distcheck && $(MAKE) silentcheck
162 $(RM) -r $$TMPDIR/tinycbor-distcheck
163
Thiago Macieira07716ef2015-09-15 22:50:52 -0700164release: .git
165 $(MAKE) -f $(MAKEFILE) distcheck
166 git -C $(SRCDIR) show HEAD:VERSION | \
167 perl -l -n -e '@_ = split /\./; print "$$_[0]." . ($$_[1] + 1)' > $(SRCDIR)VERSION
168 git -C $(SRCDIR) commit -s -m "Update version number" VERSION
169 v=v`cat $(SRCDIR)VERSION` && git -C $(SRCDIR) tag -a -m "TinyCBOR release $$v" $(GITTAGFLAGS) $$v
170 $(MAKE) -f $(MAKEFILE) dist
171
Thiago Macieira2a5fb792015-09-18 11:34:11 -0700172.PHONY: all check silentcheck configure install uninstall
Thiago Macieira12b89602015-09-15 18:33:22 -0700173.PHONY: mostlyclean clean distclean
Thiago Macieira07716ef2015-09-15 22:50:52 -0700174.PHONY: dist distcheck release
Thiago Macieira12b89602015-09-15 18:33:22 -0700175.SECONDARY:
176
177cflags := $(CPPFLAGS) -I$(SRCDIR)src
178cflags += -DTINYCBOR_VERSION=\"$(VERSION)$(DIRTYSRC)\"
179cflags += -std=c99 $(CFLAGS)
180%.o: %.c
181 @test -d $(@D) || $(MKDIR) $(@D)
Thiago Macieirad4c9ecb2015-09-26 00:21:06 -0700182 $(CC) $(cflags) $($(basename $(notdir $@))_CCFLAGS) -c -o $@ $<
Thiago Macieira2a5fb792015-09-18 11:34:11 -0700183