blob: f3ff00b38b39dd5b98220e8c3c7c33aef1aa0b5d [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
Thiago Macieira4d156392018-07-17 20:37:25 -070011LDFLAGS += $(if $(gc_sections-pass),$(LDFLAGS_GCSECTIONS))
Thiago Macieira88943662018-07-17 21:12:43 -070012LDLIBS = -lm
Thiago Macieira12b89602015-09-15 18:33:22 -070013
14GIT_ARCHIVE = git archive --prefix="$(PACKAGE)/" -9
15INSTALL = install
16INSTALL_DATA = $(INSTALL) -m 644
17INSTALL_PROGRAM = $(INSTALL) -m 755
18QMAKE = qmake
19MKDIR = mkdir -p
20RMDIR = rmdir
21SED = sed
22
23# Our sources
Thiago Macieirad94ca092018-09-08 22:33:57 -070024TINYCBOR_HEADERS = src/cbor.h src/cborjson.h src/tinycbor-version.h
Thiago Macieiraf2b75b82017-12-26 19:28:10 -020025TINYCBOR_FREESTANDING_SOURCES = \
Thiago Macieira12b89602015-09-15 18:33:22 -070026 src/cborerrorstrings.c \
27 src/cborencoder.c \
Thiago Macieira4e9626c2015-09-21 14:57:17 -070028 src/cborencoder_close_container_checked.c \
Thiago Macieira12b89602015-09-15 18:33:22 -070029 src/cborparser.c \
30 src/cborpretty.c \
Thiago Macieiraf2b75b82017-12-26 19:28:10 -020031#
Thiago Macieira12b89602015-09-15 18:33:22 -070032CBORDUMP_SOURCES = tools/cbordump/cbordump.c
33
Thiago Macieiraaa692b72017-11-13 20:13:30 -080034BUILD_SHARED = $(shell file -L /bin/sh 2>/dev/null | grep -q ELF && echo 1)
Fabrice Fontaine19b26bd2017-12-07 19:18:46 +010035BUILD_STATIC = 1
36
37ifneq ($(BUILD_STATIC),1)
38ifneq ($(BUILD_SHARED),1)
39 $(error error: BUILD_STATIC and BUILD_SHARED can not be both disabled)
40endif
41endif
Thiago Macieiraaa692b72017-11-13 20:13:30 -080042
Thiago Macieira12b89602015-09-15 18:33:22 -070043INSTALL_TARGETS += $(bindir)/cbordump
Thiago Macieiraaa692b72017-11-13 20:13:30 -080044ifeq ($(BUILD_SHARED),1)
Fabrice Fontaine19b26bd2017-12-07 19:18:46 +010045BINLIBRARY=lib/libtinycbor.so
Bertrand Roussel47914e02017-07-26 19:09:00 +020046INSTALL_TARGETS += $(libdir)/libtinycbor.so.$(VERSION)
Thiago Macieira15dfacf2017-10-07 15:41:25 -040047endif
Fabrice Fontaine19b26bd2017-12-07 19:18:46 +010048ifeq ($(BUILD_STATIC),1)
49BINLIBRARY=lib/libtinycbor.a
50INSTALL_TARGETS += $(libdir)/libtinycbor.a
51endif
Thiago Macieira12b89602015-09-15 18:33:22 -070052INSTALL_TARGETS += $(pkgconfigdir)/tinycbor.pc
53INSTALL_TARGETS += $(TINYCBOR_HEADERS:src/%=$(includedir)/tinycbor/%)
54
55# setup VPATH
56MAKEFILE := $(lastword $(MAKEFILE_LIST))
57SRCDIR := $(dir $(MAKEFILE))
58VPATH = $(SRCDIR):$(SRCDIR)/src
59
60# Our version
Thiago Macieira43e3ac92015-10-17 13:47:16 -070061GIT_DIR := $(strip $(shell git -C $(SRCDIR). rev-parse --git-dir 2> /dev/null))
Thiago Macieira301e2632018-01-30 13:44:06 -080062VERSION = $(shell cat $(SRCDIR)VERSION)
63SOVERSION = $(shell cut -f1-2 -d. $(SRCDIR)VERSION)
Thiago Macieira12b89602015-09-15 18:33:22 -070064PACKAGE = tinycbor-$(VERSION)
65
66# Check that QMAKE is Qt 5
67ifeq ($(origin QMAKE),file)
68 check_qmake = $(strip $(shell $(1) -query QT_VERSION 2>/dev/null | cut -b1))
69 ifneq ($(call check_qmake,$(QMAKE)),5)
70 QMAKE := qmake -qt5
71 ifneq ($(call check_qmake,$(QMAKE)),5)
72 QMAKE := qmake-qt5
73 ifneq ($(call check_qmake,$(QMAKE)),5)
74 QMAKE := @echo >&2 $(MAKEFILE): Cannot find a Qt 5 qmake; false
75 endif
76 endif
77 endif
78endif
79
Thiago Macieira2a5fb792015-09-18 11:34:11 -070080-include .config
81
phirsove9c6ebe2018-12-03 21:28:09 +030082ifeq ($(wildcard .config),)
83 $(info .config file not yet created)
84endif
85
Thiago Macieira4d156392018-07-17 20:37:25 -070086ifeq ($(freestanding-pass),1)
87TINYCBOR_SOURCES = $(TINYCBOR_FREESTANDING_SOURCES)
88else
89TINYCBOR_SOURCES = \
90 $(TINYCBOR_FREESTANDING_SOURCES) \
91 src/cborparser_dup_string.c \
92 src/cborpretty_stdio.c \
93 src/cbortojson.c \
94 src/cborvalidation.c \
95#
Fabrice Fontaine04ada582016-08-30 10:51:14 +020096# if open_memstream is unavailable on the system, try to implement our own
97# version using funopen or fopencookie
98ifeq ($(open_memstream-pass),)
99 ifeq ($(funopen-pass)$(fopencookie-pass),)
100 CFLAGS += -DWITHOUT_OPEN_MEMSTREAM
phirsove9c6ebe2018-12-03 21:28:09 +0300101 ifeq ($(wildcard .config),.config)
102 $(warning warning: funopen and fopencookie unavailable, open_memstream can not be implemented and conversion to JSON will not work properly!)
103 endif
Fabrice Fontaine04ada582016-08-30 10:51:14 +0200104 else
105 TINYCBOR_SOURCES += src/open_memstream.c
106 endif
107endif
Thiago Macieira4d156392018-07-17 20:37:25 -0700108endif
Fabrice Fontaine04ada582016-08-30 10:51:14 +0200109
Fabrice Fontaine8ba8e202016-11-13 15:43:40 +0100110# json2cbor depends on an external library (cjson)
Thiago Macieirad4c9ecb2015-09-26 00:21:06 -0700111ifneq ($(cjson-pass)$(system-cjson-pass),)
112 JSON2CBOR_SOURCES = tools/json2cbor/json2cbor.c
113 INSTALL_TARGETS += $(bindir)/json2cbor
114 ifeq ($(system-cjson-pass),1)
Fabrice Fontaine8ba8e202016-11-13 15:43:40 +0100115 LDFLAGS_CJSON = -lcjson
Thiago Macieirad4c9ecb2015-09-26 00:21:06 -0700116 else
117 JSON2CBOR_SOURCES += src/cjson/cJSON.c
118 json2cbor_CCFLAGS = -I$(SRCDIR)src/cjson
119 endif
120endif
121
Thiago Macieira12b89602015-09-15 18:33:22 -0700122# Rules
Fabrice Fontaine19b26bd2017-12-07 19:18:46 +0100123all: .config \
124 $(if $(subst 0,,$(BUILD_STATIC)),lib/libtinycbor.a) \
Thiago Macieiraaa692b72017-11-13 20:13:30 -0800125 $(if $(subst 0,,$(BUILD_SHARED)),lib/libtinycbor.so) \
Thiago Macieira4d156392018-07-17 20:37:25 -0700126 $(if $(freestanding-pass),,bin/cbordump) \
127 tinycbor.pc
Thiago Macieirad4c9ecb2015-09-26 00:21:06 -0700128all: $(if $(JSON2CBOR_SOURCES),bin/json2cbor)
Fabrice Fontaine19b26bd2017-12-07 19:18:46 +0100129check: tests/Makefile | $(BINLIBRARY)
Thiago Macieira12b89602015-09-15 18:33:22 -0700130 $(MAKE) -C tests check
Fabrice Fontaine19b26bd2017-12-07 19:18:46 +0100131silentcheck: | $(BINLIBRARY)
Thiago Macieira12b89602015-09-15 18:33:22 -0700132 TESTARGS=-silent $(MAKE) -f $(MAKEFILE) -s check
Thiago Macieira2a5fb792015-09-18 11:34:11 -0700133configure: .config
134.config: Makefile.configure
Fabrice Fontainec88913e2016-07-21 15:19:38 +0200135 $(MAKE) -f $(SRCDIR)Makefile.configure OUT='>&9' configure 9> $@
Thiago Macieira12b89602015-09-15 18:33:22 -0700136
Thiago Macieiraf2b75b82017-12-26 19:28:10 -0200137lib/libtinycbor-freestanding.a: $(TINYCBOR_FREESTANDING_SOURCES:.c=.o)
138 @$(MKDIR) -p lib
139 $(AR) cqs $@ $^
140
Thiago Macieira80d76e72016-11-30 12:49:20 -0800141lib/libtinycbor.a: $(TINYCBOR_SOURCES:.c=.o)
142 @$(MKDIR) -p lib
Thiago Macieira12b89602015-09-15 18:33:22 -0700143 $(AR) cqs $@ $^
144
Bertrand Roussel47914e02017-07-26 19:09:00 +0200145lib/libtinycbor.so: $(TINYCBOR_SOURCES:.c=.pic.o)
Fabrice Fontaine19b26bd2017-12-07 19:18:46 +0100146 @$(MKDIR) -p lib
Thiago Macieira88943662018-07-17 21:12:43 -0700147 $(CC) -shared -Wl,-soname,libtinycbor.so.$(SOVERSION) -o lib/libtinycbor.so.$(VERSION) $(LDFLAGS) $^ $(LDLIBS)
Thiago Macieira301e2632018-01-30 13:44:06 -0800148 cd lib ; ln -sf libtinycbor.so.$(VERSION) libtinycbor.so ; ln -sf libtinycbor.so.$(VERSION) libtinycbor.so.$(SOVERSION)
Bertrand Roussel47914e02017-07-26 19:09:00 +0200149
Fabrice Fontaine19b26bd2017-12-07 19:18:46 +0100150bin/cbordump: $(CBORDUMP_SOURCES:.c=.o) $(BINLIBRARY)
Thiago Macieira80d76e72016-11-30 12:49:20 -0800151 @$(MKDIR) -p bin
Thiago Macieira88943662018-07-17 21:12:43 -0700152 $(CC) -o $@ $(LDFLAGS) $^ $(LDLIBS)
Thiago Macieira12b89602015-09-15 18:33:22 -0700153
Fabrice Fontaine19b26bd2017-12-07 19:18:46 +0100154bin/json2cbor: $(JSON2CBOR_SOURCES:.c=.o) $(BINLIBRARY)
Thiago Macieira80d76e72016-11-30 12:49:20 -0800155 @$(MKDIR) -p bin
Thiago Macieira88943662018-07-17 21:12:43 -0700156 $(CC) -o $@ $(LDFLAGS) $^ $(LDFLAGS_CJSON) $(LDLIBS)
Thiago Macieirad4c9ecb2015-09-26 00:21:06 -0700157
Thiago Macieira12b89602015-09-15 18:33:22 -0700158tinycbor.pc: tinycbor.pc.in
159 $(SED) > $@ < $< \
160 -e 's,@prefix@,$(prefix),' \
161 -e 's,@exec_prefix@,$(exec_prefix),' \
162 -e 's,@libdir@,$(libdir),' \
163 -e 's,@includedir@,$(includedir),' \
164 -e 's,@version@,$(VERSION),'
165
166tests/Makefile: tests/tests.pro
Thiago Macieira43e3ac92015-10-17 13:47:16 -0700167 $(QMAKE) $(QMAKEFLAGS) -o $@ $<
Thiago Macieira12b89602015-09-15 18:33:22 -0700168
169$(PACKAGE).tar.gz: | .git
170 GIT_DIR=$(SRCDIR).git $(GIT_ARCHIVE) --format=tar.gz -o "$(PACKAGE).tar.gz" HEAD
171$(PACKAGE).zip: | .git
172 GIT_DIR=$(SRCDIR).git $(GIT_ARCHIVE) --format=zip -o "$(PACKAGE).zip" HEAD
173
Thomas Petazzoni31c7f812016-07-30 18:42:53 +0200174$(DESTDIR)$(libdir)/%: lib/%
175 $(INSTALL) -d $(@D)
Thiago Macieira12b89602015-09-15 18:33:22 -0700176 $(INSTALL_DATA) $< $@
Thomas Petazzoni31c7f812016-07-30 18:42:53 +0200177$(DESTDIR)$(bindir)/%: bin/%
178 $(INSTALL) -d $(@D)
Thiago Macieira12b89602015-09-15 18:33:22 -0700179 $(INSTALL_PROGRAM) $< $@
Thomas Petazzoni31c7f812016-07-30 18:42:53 +0200180$(DESTDIR)$(pkgconfigdir)/%: %
181 $(INSTALL) -d $(@D)
Thiago Macieira12b89602015-09-15 18:33:22 -0700182 $(INSTALL_DATA) $< $@
Thomas Petazzoni31c7f812016-07-30 18:42:53 +0200183$(DESTDIR)$(includedir)/tinycbor/%: src/%
184 $(INSTALL) -d $(@D)
Thiago Macieira12b89602015-09-15 18:33:22 -0700185 $(INSTALL_DATA) $< $@
186
187install-strip:
188 $(MAKE) -f $(MAKEFILE) INSTALL_PROGRAM='$(INSTALL_PROGRAM) -s' install
189
190install: $(INSTALL_TARGETS:%=$(DESTDIR)%)
Dan Churchfc42a042020-10-21 16:07:46 -0500191ifeq ($(BUILD_SHARED),1)
192 ln -sf libtinycbor.so.$(VERSION) $(DESTDIR)$(libdir)/libtinycbor.so
193 ln -sf libtinycbor.so.$(VERSION) $(DESTDIR)$(libdir)/libtinycbor.so.$(SOVERSION)
194endif
195
Thiago Macieira12b89602015-09-15 18:33:22 -0700196uninstall:
197 $(RM) $(INSTALL_TARGETS:%=$(DESTDIR)%)
Dan Churchfc42a042020-10-21 16:07:46 -0500198 $(RM) $(DESTDIR)$(libdir)/libtinycbor.so
199 $(RM) $(DESTDIR)$(libdir)/libtinycbor.so.$(SOVERSION)
Thiago Macieira12b89602015-09-15 18:33:22 -0700200
201mostlyclean:
202 $(RM) $(TINYCBOR_SOURCES:.c=.o)
Thiago Macieiradf440a02017-11-13 11:20:59 -0800203 $(RM) $(TINYCBOR_SOURCES:.c=.pic.o)
Thiago Macieira12b89602015-09-15 18:33:22 -0700204 $(RM) $(CBORDUMP_SOURCES:.c=.o)
205
206clean: mostlyclean
207 $(RM) bin/cbordump
Thiago Macieirad4c9ecb2015-09-26 00:21:06 -0700208 $(RM) bin/json2cbor
Thiago Macieira12b89602015-09-15 18:33:22 -0700209 $(RM) lib/libtinycbor.a
Thiago Macieiraf2b75b82017-12-26 19:28:10 -0200210 $(RM) lib/libtinycbor-freestanding.a
Thiago Macieira12b89602015-09-15 18:33:22 -0700211 $(RM) tinycbor.pc
Bertrand Roussel47914e02017-07-26 19:09:00 +0200212 $(RM) lib/libtinycbor.so*
Thiago Macieira12b89602015-09-15 18:33:22 -0700213 test -e tests/Makefile && $(MAKE) -C tests clean || :
214
215distclean: clean
216 test -e tests/Makefile && $(MAKE) -C tests distclean || :
217
Thiago Macieira46a818e2015-10-08 15:13:05 +0200218docs:
219 cd $(SRCDIR)src && VERSION=$(VERSION) doxygen $(SRCDIR)/../Doxyfile
220
Thiago Macieira12b89602015-09-15 18:33:22 -0700221dist: $(PACKAGE).tar.gz $(PACKAGE).zip
222distcheck: .git
Thiago Macieira1735f9c2016-07-30 23:00:00 -0700223 -$(RM) -r $${TMPDIR-/tmp}/tinycbor-distcheck
224 GIT_DIR=$(SRCDIR).git git archive --prefix=tinycbor-distcheck/ --format=tar HEAD | tar -xf - -C $${TMPDIR-/tmp}
225 cd $${TMPDIR-/tmp}/tinycbor-distcheck && $(MAKE) silentcheck
226 $(RM) -r $${TMPDIR-/tmp}/tinycbor-distcheck
Thiago Macieira12b89602015-09-15 18:33:22 -0700227
Thiago Macieira29212402016-11-10 11:50:22 +0800228tag: distcheck
Thiago Macieira3cdb9c82017-12-27 23:29:33 -0200229 @cd $(SRCDIR). && perl scripts/maketag.pl
Thiago Macieira07716ef2015-09-15 22:50:52 -0700230
Thiago Macieira2a5fb792015-09-18 11:34:11 -0700231.PHONY: all check silentcheck configure install uninstall
Thiago Macieira12b89602015-09-15 18:33:22 -0700232.PHONY: mostlyclean clean distclean
Thiago Macieira46a818e2015-10-08 15:13:05 +0200233.PHONY: docs dist distcheck release
Thiago Macieira12b89602015-09-15 18:33:22 -0700234.SECONDARY:
235
236cflags := $(CPPFLAGS) -I$(SRCDIR)src
Konstantin Yegupov86066112018-03-18 19:11:51 +0000237cflags += -std=gnu99 $(CFLAGS)
Thiago Macieira12b89602015-09-15 18:33:22 -0700238%.o: %.c
239 @test -d $(@D) || $(MKDIR) $(@D)
Thiago Macieirad4c9ecb2015-09-26 00:21:06 -0700240 $(CC) $(cflags) $($(basename $(notdir $@))_CCFLAGS) -c -o $@ $<
Bertrand Roussel47914e02017-07-26 19:09:00 +0200241%.pic.o: %.c
242 @test -d $(@D) || $(MKDIR) $(@D)
243 $(CC) $(cflags) -fPIC $($(basename $(notdir $@))_CCFLAGS) -c -o $@ $<
Thiago Macieira2a5fb792015-09-18 11:34:11 -0700244
Thiago Macieira588948d2016-11-30 12:58:46 -0800245-include src/*.d