blob: 71007853b280d9b9973af50aef12e0720e9ea2d2 [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 \
Otavio Pontes4ce56692016-07-08 09:42:51 -030029 src/cborparser_dup_string.c \
Thiago Macieira12b89602015-09-15 18:33:22 -070030 src/cborpretty.c \
Thiago Macieira2b1800c2015-09-05 20:25:20 -050031 src/cbortojson.c \
Thiago Macieira2a5fb792015-09-18 11:34:11 -070032 $(if $(open_memstream-pass),,src/open_memstream.c) \
Thiago Macieira12b89602015-09-15 18:33:22 -070033#
34CBORDUMP_SOURCES = tools/cbordump/cbordump.c
35
36INSTALL_TARGETS += $(bindir)/cbordump
37INSTALL_TARGETS += $(libdir)/libtinycbor.a
38INSTALL_TARGETS += $(pkgconfigdir)/tinycbor.pc
39INSTALL_TARGETS += $(TINYCBOR_HEADERS:src/%=$(includedir)/tinycbor/%)
40
41# setup VPATH
42MAKEFILE := $(lastword $(MAKEFILE_LIST))
43SRCDIR := $(dir $(MAKEFILE))
44VPATH = $(SRCDIR):$(SRCDIR)/src
45
46# Our version
Thiago Macieira43e3ac92015-10-17 13:47:16 -070047GIT_DIR := $(strip $(shell git -C $(SRCDIR). rev-parse --git-dir 2> /dev/null))
Thiago Macieira12b89602015-09-15 18:33:22 -070048ifeq ($(GIT_DIR),)
49 VERSION = $(shell cat $(SRCDIR)VERSION)
50 DIRTYSRC :=
51else
Thiago Macieira43e3ac92015-10-17 13:47:16 -070052 VERSION := $(shell git -C $(SRCDIR). describe --tags | cut -c2-)
Thiago Macieira12b89602015-09-15 18:33:22 -070053 DIRTYSRC := $(shell \
Thiago Macieira43e3ac92015-10-17 13:47:16 -070054 test -n "`git -C $(SRCDIR). diff --name-only HEAD`" && \
Thiago Macieira12b89602015-09-15 18:33:22 -070055 echo +)
56endif
57PACKAGE = tinycbor-$(VERSION)
58
59# Check that QMAKE is Qt 5
60ifeq ($(origin QMAKE),file)
61 check_qmake = $(strip $(shell $(1) -query QT_VERSION 2>/dev/null | cut -b1))
62 ifneq ($(call check_qmake,$(QMAKE)),5)
63 QMAKE := qmake -qt5
64 ifneq ($(call check_qmake,$(QMAKE)),5)
65 QMAKE := qmake-qt5
66 ifneq ($(call check_qmake,$(QMAKE)),5)
67 QMAKE := @echo >&2 $(MAKEFILE): Cannot find a Qt 5 qmake; false
68 endif
69 endif
70 endif
71endif
72
Thiago Macieira2a5fb792015-09-18 11:34:11 -070073-include .config
74
Thiago Macieirad4c9ecb2015-09-26 00:21:06 -070075# json2cbor depends on an external library (cJSON)
76ifneq ($(cjson-pass)$(system-cjson-pass),)
77 JSON2CBOR_SOURCES = tools/json2cbor/json2cbor.c
78 INSTALL_TARGETS += $(bindir)/json2cbor
79 ifeq ($(system-cjson-pass),1)
80 LDFLAGS_CJSON = -lcJSON
81 else
82 JSON2CBOR_SOURCES += src/cjson/cJSON.c
83 json2cbor_CCFLAGS = -I$(SRCDIR)src/cjson
84 endif
85endif
86
Thiago Macieira12b89602015-09-15 18:33:22 -070087# Rules
Thiago Macieira2a5fb792015-09-18 11:34:11 -070088all: .config lib/libtinycbor.a bin/cbordump tinycbor.pc
Thiago Macieirad4c9ecb2015-09-26 00:21:06 -070089all: $(if $(JSON2CBOR_SOURCES),bin/json2cbor)
Thiago Macieira12b89602015-09-15 18:33:22 -070090check: tests/Makefile | lib/libtinycbor.a
91 $(MAKE) -C tests check
92silentcheck: | lib/libtinycbor.a
93 TESTARGS=-silent $(MAKE) -f $(MAKEFILE) -s check
Thiago Macieira2a5fb792015-09-18 11:34:11 -070094configure: .config
95.config: Makefile.configure
Fabrice Fontainec88913e2016-07-21 15:19:38 +020096 $(MAKE) -f $(SRCDIR)Makefile.configure OUT='>&9' configure 9> $@
Thiago Macieira12b89602015-09-15 18:33:22 -070097
98lib bin:
99 $(MKDIR) $@
100
101lib/libtinycbor.a: $(TINYCBOR_SOURCES:.c=.o) | lib
102 $(AR) cqs $@ $^
103
104bin/cbordump: $(CBORDUMP_SOURCES:.c=.o) lib/libtinycbor.a | bin
Thiago Macieira57bcf4f2015-09-17 00:14:30 -0700105 $(CC) -o $@ $(LDFLAGS) $^ $(LDLIBS) -lm
Thiago Macieira12b89602015-09-15 18:33:22 -0700106
Thiago Macieirad4c9ecb2015-09-26 00:21:06 -0700107bin/json2cbor: $(JSON2CBOR_SOURCES:.c=.o) lib/libtinycbor.a | bin
108 $(CC) -o $@ $(LDFLAGS) $(LDFLAGS_CJSON) $^ $(LDLIBS) -lm
109
Thiago Macieira12b89602015-09-15 18:33:22 -0700110tinycbor.pc: tinycbor.pc.in
111 $(SED) > $@ < $< \
112 -e 's,@prefix@,$(prefix),' \
113 -e 's,@exec_prefix@,$(exec_prefix),' \
114 -e 's,@libdir@,$(libdir),' \
115 -e 's,@includedir@,$(includedir),' \
116 -e 's,@version@,$(VERSION),'
117
118tests/Makefile: tests/tests.pro
Thiago Macieira43e3ac92015-10-17 13:47:16 -0700119 $(QMAKE) $(QMAKEFLAGS) -o $@ $<
Thiago Macieira12b89602015-09-15 18:33:22 -0700120
121$(PACKAGE).tar.gz: | .git
122 GIT_DIR=$(SRCDIR).git $(GIT_ARCHIVE) --format=tar.gz -o "$(PACKAGE).tar.gz" HEAD
123$(PACKAGE).zip: | .git
124 GIT_DIR=$(SRCDIR).git $(GIT_ARCHIVE) --format=zip -o "$(PACKAGE).zip" HEAD
125
126$(DESTDIR)%/:
127 $(INSTALL) -d $@
128$(DESTDIR)$(libdir)/%: lib/% | $(DESTDIR)$(libdir)/
129 $(INSTALL_DATA) $< $@
130$(DESTDIR)$(bindir)/%: bin/% | $(DESTDIR)$(bindir)/
131 $(INSTALL_PROGRAM) $< $@
132$(DESTDIR)$(pkgconfigdir)/%: % | $(DESTDIR)$(pkgconfigdir)/
133 $(INSTALL_DATA) $< $@
134$(DESTDIR)$(includedir)/tinycbor/%: src/% | $(DESTDIR)$(includedir)/tinycbor/
135 $(INSTALL_DATA) $< $@
136
137install-strip:
138 $(MAKE) -f $(MAKEFILE) INSTALL_PROGRAM='$(INSTALL_PROGRAM) -s' install
139
140install: $(INSTALL_TARGETS:%=$(DESTDIR)%)
141uninstall:
142 $(RM) $(INSTALL_TARGETS:%=$(DESTDIR)%)
143
144mostlyclean:
145 $(RM) $(TINYCBOR_SOURCES:.c=.o)
146 $(RM) $(CBORDUMP_SOURCES:.c=.o)
147
148clean: mostlyclean
149 $(RM) bin/cbordump
Thiago Macieirad4c9ecb2015-09-26 00:21:06 -0700150 $(RM) bin/json2cbor
Thiago Macieira12b89602015-09-15 18:33:22 -0700151 $(RM) lib/libtinycbor.a
152 $(RM) tinycbor.pc
153 test -e tests/Makefile && $(MAKE) -C tests clean || :
154
155distclean: clean
156 test -e tests/Makefile && $(MAKE) -C tests distclean || :
157
Thiago Macieira46a818e2015-10-08 15:13:05 +0200158docs:
159 cd $(SRCDIR)src && VERSION=$(VERSION) doxygen $(SRCDIR)/../Doxyfile
160
Thiago Macieira12b89602015-09-15 18:33:22 -0700161dist: $(PACKAGE).tar.gz $(PACKAGE).zip
162distcheck: .git
Thiago Macieira1735f9c2016-07-30 23:00:00 -0700163 -$(RM) -r $${TMPDIR-/tmp}/tinycbor-distcheck
164 GIT_DIR=$(SRCDIR).git git archive --prefix=tinycbor-distcheck/ --format=tar HEAD | tar -xf - -C $${TMPDIR-/tmp}
165 cd $${TMPDIR-/tmp}/tinycbor-distcheck && $(MAKE) silentcheck
166 $(RM) -r $${TMPDIR-/tmp}/tinycbor-distcheck
Thiago Macieira12b89602015-09-15 18:33:22 -0700167
Thiago Macieira07716ef2015-09-15 22:50:52 -0700168release: .git
169 $(MAKE) -f $(MAKEFILE) distcheck
Thiago Macieira43e3ac92015-10-17 13:47:16 -0700170 git -C $(SRCDIR). show HEAD:VERSION | \
Thiago Macieira07716ef2015-09-15 22:50:52 -0700171 perl -l -n -e '@_ = split /\./; print "$$_[0]." . ($$_[1] + 1)' > $(SRCDIR)VERSION
Thiago Macieira43e3ac92015-10-17 13:47:16 -0700172 git -C $(SRCDIR). commit -s -m "Update version number" VERSION
Thiago Macieiradb9904f2015-09-30 11:47:38 -0700173 { echo "TinyCBOR release `cat $(SRCDIR)VERSION`"; \
174 echo; \
175 echo '# Write something nice about this release here'; \
Thiago Macieira43e3ac92015-10-17 13:47:16 -0700176 tmpl=`git -C $(SRCDIR). config --get commit.template` && \
Thiago Macieiradb9904f2015-09-30 11:47:38 -0700177 cat "$$tmpl"; \
178 echo '# Commit log:'; \
Thiago Macieira43e3ac92015-10-17 13:47:16 -0700179 git -C $(SRCDIR). shortlog -e --no-merges HEAD --not `git -C $(SRCDIR). tag` | sed 's,^,# ,'; \
Thiago Macieiradb9904f2015-09-30 11:47:38 -0700180 echo '# Header diff:'; \
Thiago Macieira43e3ac92015-10-17 13:47:16 -0700181 git -C $(SRCDIR). diff HEAD --not `git -C $(SRCDIR). tag` -- 'src/*.h' ':!*_p.h' | sed 's,^,# ,'; \
Thiago Macieiradb9904f2015-09-30 11:47:38 -0700182 } > $(SRCDIR).git/TAG_EDITMSG
Thiago Macieira43e3ac92015-10-17 13:47:16 -0700183 @`git -C $(SRCDIR). var GIT_EDITOR` $(SRCDIR).git/TAG_EDITMSG
184 git -C $(SRCDIR). tag -a -F $(SRCDIR).git/TAG_EDITMSG $(GITTAGFLAGS) v`cat $(SRCDIR)VERSION`
Thiago Macieira07716ef2015-09-15 22:50:52 -0700185 $(MAKE) -f $(MAKEFILE) dist
186
Thiago Macieira2a5fb792015-09-18 11:34:11 -0700187.PHONY: all check silentcheck configure install uninstall
Thiago Macieira12b89602015-09-15 18:33:22 -0700188.PHONY: mostlyclean clean distclean
Thiago Macieira46a818e2015-10-08 15:13:05 +0200189.PHONY: docs dist distcheck release
Thiago Macieira12b89602015-09-15 18:33:22 -0700190.SECONDARY:
191
192cflags := $(CPPFLAGS) -I$(SRCDIR)src
193cflags += -DTINYCBOR_VERSION=\"$(VERSION)$(DIRTYSRC)\"
194cflags += -std=c99 $(CFLAGS)
195%.o: %.c
196 @test -d $(@D) || $(MKDIR) $(@D)
Thiago Macieirad4c9ecb2015-09-26 00:21:06 -0700197 $(CC) $(cflags) $($(basename $(notdir $@))_CCFLAGS) -c -o $@ $<
Thiago Macieira2a5fb792015-09-18 11:34:11 -0700198