blob: a8cb57c6f8cfb8276625824d41b189660a33e118 [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 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
Thiago Macieira43e3ac92015-10-17 13:47:16 -070046GIT_DIR := $(strip $(shell git -C $(SRCDIR). rev-parse --git-dir 2> /dev/null))
Thiago Macieira12b89602015-09-15 18:33:22 -070047ifeq ($(GIT_DIR),)
48 VERSION = $(shell cat $(SRCDIR)VERSION)
49 DIRTYSRC :=
50else
Thiago Macieira43e3ac92015-10-17 13:47:16 -070051 VERSION := $(shell git -C $(SRCDIR). describe --tags | cut -c2-)
Thiago Macieira12b89602015-09-15 18:33:22 -070052 DIRTYSRC := $(shell \
Thiago Macieira43e3ac92015-10-17 13:47:16 -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
Fabrice Fontaine04ada582016-08-30 10:51:14 +020074# if open_memstream is unavailable on the system, try to implement our own
75# version using funopen or fopencookie
76ifeq ($(open_memstream-pass),)
77 ifeq ($(funopen-pass)$(fopencookie-pass),)
78 CFLAGS += -DWITHOUT_OPEN_MEMSTREAM
79 $(warning warning: funopen and fopencookie unavailable, open_memstream can not be implemented and conversion to JSON will not work properly!)
80 else
81 TINYCBOR_SOURCES += src/open_memstream.c
82 endif
83endif
84
Fabrice Fontaine8ba8e202016-11-13 15:43:40 +010085# json2cbor depends on an external library (cjson)
Thiago Macieirad4c9ecb2015-09-26 00:21:06 -070086ifneq ($(cjson-pass)$(system-cjson-pass),)
87 JSON2CBOR_SOURCES = tools/json2cbor/json2cbor.c
88 INSTALL_TARGETS += $(bindir)/json2cbor
89 ifeq ($(system-cjson-pass),1)
Fabrice Fontaine8ba8e202016-11-13 15:43:40 +010090 LDFLAGS_CJSON = -lcjson
Thiago Macieirad4c9ecb2015-09-26 00:21:06 -070091 else
92 JSON2CBOR_SOURCES += src/cjson/cJSON.c
93 json2cbor_CCFLAGS = -I$(SRCDIR)src/cjson
94 endif
95endif
96
Thiago Macieira12b89602015-09-15 18:33:22 -070097# Rules
Thiago Macieira2a5fb792015-09-18 11:34:11 -070098all: .config lib/libtinycbor.a bin/cbordump tinycbor.pc
Thiago Macieirad4c9ecb2015-09-26 00:21:06 -070099all: $(if $(JSON2CBOR_SOURCES),bin/json2cbor)
Thiago Macieira12b89602015-09-15 18:33:22 -0700100check: tests/Makefile | lib/libtinycbor.a
101 $(MAKE) -C tests check
102silentcheck: | lib/libtinycbor.a
103 TESTARGS=-silent $(MAKE) -f $(MAKEFILE) -s check
Thiago Macieira2a5fb792015-09-18 11:34:11 -0700104configure: .config
105.config: Makefile.configure
Fabrice Fontainec88913e2016-07-21 15:19:38 +0200106 $(MAKE) -f $(SRCDIR)Makefile.configure OUT='>&9' configure 9> $@
Thiago Macieira12b89602015-09-15 18:33:22 -0700107
Thiago Macieira80d76e72016-11-30 12:49:20 -0800108lib/libtinycbor.a: $(TINYCBOR_SOURCES:.c=.o)
109 @$(MKDIR) -p lib
Thiago Macieira12b89602015-09-15 18:33:22 -0700110 $(AR) cqs $@ $^
111
Thiago Macieira80d76e72016-11-30 12:49:20 -0800112bin/cbordump: $(CBORDUMP_SOURCES:.c=.o) lib/libtinycbor.a
113 @$(MKDIR) -p bin
Thiago Macieira57bcf4f2015-09-17 00:14:30 -0700114 $(CC) -o $@ $(LDFLAGS) $^ $(LDLIBS) -lm
Thiago Macieira12b89602015-09-15 18:33:22 -0700115
Thiago Macieira80d76e72016-11-30 12:49:20 -0800116bin/json2cbor: $(JSON2CBOR_SOURCES:.c=.o) lib/libtinycbor.a
117 @$(MKDIR) -p bin
Fabrice Fontaineae608ea2017-03-06 18:59:22 +0100118 $(CC) -o $@ $(LDFLAGS) $^ $(LDFLAGS_CJSON) $(LDLIBS) -lm
Thiago Macieirad4c9ecb2015-09-26 00:21:06 -0700119
Thiago Macieira12b89602015-09-15 18:33:22 -0700120tinycbor.pc: tinycbor.pc.in
121 $(SED) > $@ < $< \
122 -e 's,@prefix@,$(prefix),' \
123 -e 's,@exec_prefix@,$(exec_prefix),' \
124 -e 's,@libdir@,$(libdir),' \
125 -e 's,@includedir@,$(includedir),' \
126 -e 's,@version@,$(VERSION),'
127
128tests/Makefile: tests/tests.pro
Thiago Macieira43e3ac92015-10-17 13:47:16 -0700129 $(QMAKE) $(QMAKEFLAGS) -o $@ $<
Thiago Macieira12b89602015-09-15 18:33:22 -0700130
131$(PACKAGE).tar.gz: | .git
132 GIT_DIR=$(SRCDIR).git $(GIT_ARCHIVE) --format=tar.gz -o "$(PACKAGE).tar.gz" HEAD
133$(PACKAGE).zip: | .git
134 GIT_DIR=$(SRCDIR).git $(GIT_ARCHIVE) --format=zip -o "$(PACKAGE).zip" HEAD
135
Thomas Petazzoni31c7f812016-07-30 18:42:53 +0200136$(DESTDIR)$(libdir)/%: lib/%
137 $(INSTALL) -d $(@D)
Thiago Macieira12b89602015-09-15 18:33:22 -0700138 $(INSTALL_DATA) $< $@
Thomas Petazzoni31c7f812016-07-30 18:42:53 +0200139$(DESTDIR)$(bindir)/%: bin/%
140 $(INSTALL) -d $(@D)
Thiago Macieira12b89602015-09-15 18:33:22 -0700141 $(INSTALL_PROGRAM) $< $@
Thomas Petazzoni31c7f812016-07-30 18:42:53 +0200142$(DESTDIR)$(pkgconfigdir)/%: %
143 $(INSTALL) -d $(@D)
Thiago Macieira12b89602015-09-15 18:33:22 -0700144 $(INSTALL_DATA) $< $@
Thomas Petazzoni31c7f812016-07-30 18:42:53 +0200145$(DESTDIR)$(includedir)/tinycbor/%: src/%
146 $(INSTALL) -d $(@D)
Thiago Macieira12b89602015-09-15 18:33:22 -0700147 $(INSTALL_DATA) $< $@
148
149install-strip:
150 $(MAKE) -f $(MAKEFILE) INSTALL_PROGRAM='$(INSTALL_PROGRAM) -s' install
151
152install: $(INSTALL_TARGETS:%=$(DESTDIR)%)
153uninstall:
154 $(RM) $(INSTALL_TARGETS:%=$(DESTDIR)%)
155
156mostlyclean:
157 $(RM) $(TINYCBOR_SOURCES:.c=.o)
158 $(RM) $(CBORDUMP_SOURCES:.c=.o)
159
160clean: mostlyclean
161 $(RM) bin/cbordump
Thiago Macieirad4c9ecb2015-09-26 00:21:06 -0700162 $(RM) bin/json2cbor
Thiago Macieira12b89602015-09-15 18:33:22 -0700163 $(RM) lib/libtinycbor.a
164 $(RM) tinycbor.pc
165 test -e tests/Makefile && $(MAKE) -C tests clean || :
166
167distclean: clean
168 test -e tests/Makefile && $(MAKE) -C tests distclean || :
169
Thiago Macieira46a818e2015-10-08 15:13:05 +0200170docs:
171 cd $(SRCDIR)src && VERSION=$(VERSION) doxygen $(SRCDIR)/../Doxyfile
172
Thiago Macieira12b89602015-09-15 18:33:22 -0700173dist: $(PACKAGE).tar.gz $(PACKAGE).zip
174distcheck: .git
Thiago Macieira1735f9c2016-07-30 23:00:00 -0700175 -$(RM) -r $${TMPDIR-/tmp}/tinycbor-distcheck
176 GIT_DIR=$(SRCDIR).git git archive --prefix=tinycbor-distcheck/ --format=tar HEAD | tar -xf - -C $${TMPDIR-/tmp}
177 cd $${TMPDIR-/tmp}/tinycbor-distcheck && $(MAKE) silentcheck
178 $(RM) -r $${TMPDIR-/tmp}/tinycbor-distcheck
Thiago Macieira12b89602015-09-15 18:33:22 -0700179
Thiago Macieira29212402016-11-10 11:50:22 +0800180tag: distcheck
181 @cd $(SRCDIR). && perl maketag.pl
Thiago Macieira07716ef2015-09-15 22:50:52 -0700182
Thiago Macieira2a5fb792015-09-18 11:34:11 -0700183.PHONY: all check silentcheck configure install uninstall
Thiago Macieira12b89602015-09-15 18:33:22 -0700184.PHONY: mostlyclean clean distclean
Thiago Macieira46a818e2015-10-08 15:13:05 +0200185.PHONY: docs dist distcheck release
Thiago Macieira12b89602015-09-15 18:33:22 -0700186.SECONDARY:
187
188cflags := $(CPPFLAGS) -I$(SRCDIR)src
Thiago Macieirac2242c52016-11-30 12:56:20 -0800189cflags += -DTINYCBOR_VERSION_SUFFIX=\"$(DIRTYSRC)\"
Thiago Macieira12b89602015-09-15 18:33:22 -0700190cflags += -std=c99 $(CFLAGS)
191%.o: %.c
192 @test -d $(@D) || $(MKDIR) $(@D)
Thiago Macieirad4c9ecb2015-09-26 00:21:06 -0700193 $(CC) $(cflags) $($(basename $(notdir $@))_CCFLAGS) -c -o $@ $<
Thiago Macieira2a5fb792015-09-18 11:34:11 -0700194