blob: 239dde8b5fc0b2a078d1e72ce67e323a26885f9f [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
Thiago Macieira301e2632018-01-30 13:44:06 -080047INSTALL_TARGETS += $(libdir)/libtinycbor.so.$(SOVERSION)
Bertrand Roussel47914e02017-07-26 19:09:00 +020048INSTALL_TARGETS += $(libdir)/libtinycbor.so.$(VERSION)
Thiago Macieira15dfacf2017-10-07 15:41:25 -040049endif
Fabrice Fontaine19b26bd2017-12-07 19:18:46 +010050ifeq ($(BUILD_STATIC),1)
51BINLIBRARY=lib/libtinycbor.a
52INSTALL_TARGETS += $(libdir)/libtinycbor.a
53endif
Thiago Macieira12b89602015-09-15 18:33:22 -070054INSTALL_TARGETS += $(pkgconfigdir)/tinycbor.pc
55INSTALL_TARGETS += $(TINYCBOR_HEADERS:src/%=$(includedir)/tinycbor/%)
56
57# setup VPATH
58MAKEFILE := $(lastword $(MAKEFILE_LIST))
59SRCDIR := $(dir $(MAKEFILE))
60VPATH = $(SRCDIR):$(SRCDIR)/src
61
62# Our version
Thiago Macieira43e3ac92015-10-17 13:47:16 -070063GIT_DIR := $(strip $(shell git -C $(SRCDIR). rev-parse --git-dir 2> /dev/null))
Thiago Macieira301e2632018-01-30 13:44:06 -080064VERSION = $(shell cat $(SRCDIR)VERSION)
65SOVERSION = $(shell cut -f1-2 -d. $(SRCDIR)VERSION)
Thiago Macieira12b89602015-09-15 18:33:22 -070066PACKAGE = tinycbor-$(VERSION)
67
68# Check that QMAKE is Qt 5
69ifeq ($(origin QMAKE),file)
70 check_qmake = $(strip $(shell $(1) -query QT_VERSION 2>/dev/null | cut -b1))
71 ifneq ($(call check_qmake,$(QMAKE)),5)
72 QMAKE := qmake -qt5
73 ifneq ($(call check_qmake,$(QMAKE)),5)
74 QMAKE := qmake-qt5
75 ifneq ($(call check_qmake,$(QMAKE)),5)
76 QMAKE := @echo >&2 $(MAKEFILE): Cannot find a Qt 5 qmake; false
77 endif
78 endif
79 endif
80endif
81
Thiago Macieira2a5fb792015-09-18 11:34:11 -070082-include .config
83
phirsove9c6ebe2018-12-03 21:28:09 +030084ifeq ($(wildcard .config),)
85 $(info .config file not yet created)
86endif
87
Thiago Macieira4d156392018-07-17 20:37:25 -070088ifeq ($(freestanding-pass),1)
89TINYCBOR_SOURCES = $(TINYCBOR_FREESTANDING_SOURCES)
90else
91TINYCBOR_SOURCES = \
92 $(TINYCBOR_FREESTANDING_SOURCES) \
93 src/cborparser_dup_string.c \
94 src/cborpretty_stdio.c \
95 src/cbortojson.c \
96 src/cborvalidation.c \
97#
Fabrice Fontaine04ada582016-08-30 10:51:14 +020098# if open_memstream is unavailable on the system, try to implement our own
99# version using funopen or fopencookie
100ifeq ($(open_memstream-pass),)
101 ifeq ($(funopen-pass)$(fopencookie-pass),)
102 CFLAGS += -DWITHOUT_OPEN_MEMSTREAM
phirsove9c6ebe2018-12-03 21:28:09 +0300103 ifeq ($(wildcard .config),.config)
104 $(warning warning: funopen and fopencookie unavailable, open_memstream can not be implemented and conversion to JSON will not work properly!)
105 endif
Fabrice Fontaine04ada582016-08-30 10:51:14 +0200106 else
107 TINYCBOR_SOURCES += src/open_memstream.c
108 endif
109endif
Thiago Macieira4d156392018-07-17 20:37:25 -0700110endif
Fabrice Fontaine04ada582016-08-30 10:51:14 +0200111
Fabrice Fontaine8ba8e202016-11-13 15:43:40 +0100112# json2cbor depends on an external library (cjson)
Thiago Macieirad4c9ecb2015-09-26 00:21:06 -0700113ifneq ($(cjson-pass)$(system-cjson-pass),)
114 JSON2CBOR_SOURCES = tools/json2cbor/json2cbor.c
115 INSTALL_TARGETS += $(bindir)/json2cbor
116 ifeq ($(system-cjson-pass),1)
Fabrice Fontaine8ba8e202016-11-13 15:43:40 +0100117 LDFLAGS_CJSON = -lcjson
Thiago Macieirad4c9ecb2015-09-26 00:21:06 -0700118 else
119 JSON2CBOR_SOURCES += src/cjson/cJSON.c
120 json2cbor_CCFLAGS = -I$(SRCDIR)src/cjson
121 endif
122endif
123
Thiago Macieira12b89602015-09-15 18:33:22 -0700124# Rules
Fabrice Fontaine19b26bd2017-12-07 19:18:46 +0100125all: .config \
126 $(if $(subst 0,,$(BUILD_STATIC)),lib/libtinycbor.a) \
Thiago Macieiraaa692b72017-11-13 20:13:30 -0800127 $(if $(subst 0,,$(BUILD_SHARED)),lib/libtinycbor.so) \
Thiago Macieira4d156392018-07-17 20:37:25 -0700128 $(if $(freestanding-pass),,bin/cbordump) \
129 tinycbor.pc
Thiago Macieirad4c9ecb2015-09-26 00:21:06 -0700130all: $(if $(JSON2CBOR_SOURCES),bin/json2cbor)
Fabrice Fontaine19b26bd2017-12-07 19:18:46 +0100131check: tests/Makefile | $(BINLIBRARY)
Thiago Macieira12b89602015-09-15 18:33:22 -0700132 $(MAKE) -C tests check
Fabrice Fontaine19b26bd2017-12-07 19:18:46 +0100133silentcheck: | $(BINLIBRARY)
Thiago Macieira12b89602015-09-15 18:33:22 -0700134 TESTARGS=-silent $(MAKE) -f $(MAKEFILE) -s check
Thiago Macieira2a5fb792015-09-18 11:34:11 -0700135configure: .config
136.config: Makefile.configure
Fabrice Fontainec88913e2016-07-21 15:19:38 +0200137 $(MAKE) -f $(SRCDIR)Makefile.configure OUT='>&9' configure 9> $@
Thiago Macieira12b89602015-09-15 18:33:22 -0700138
Thiago Macieiraf2b75b82017-12-26 19:28:10 -0200139lib/libtinycbor-freestanding.a: $(TINYCBOR_FREESTANDING_SOURCES:.c=.o)
140 @$(MKDIR) -p lib
141 $(AR) cqs $@ $^
142
Thiago Macieira80d76e72016-11-30 12:49:20 -0800143lib/libtinycbor.a: $(TINYCBOR_SOURCES:.c=.o)
144 @$(MKDIR) -p lib
Thiago Macieira12b89602015-09-15 18:33:22 -0700145 $(AR) cqs $@ $^
146
Bertrand Roussel47914e02017-07-26 19:09:00 +0200147lib/libtinycbor.so: $(TINYCBOR_SOURCES:.c=.pic.o)
Fabrice Fontaine19b26bd2017-12-07 19:18:46 +0100148 @$(MKDIR) -p lib
Thiago Macieira88943662018-07-17 21:12:43 -0700149 $(CC) -shared -Wl,-soname,libtinycbor.so.$(SOVERSION) -o lib/libtinycbor.so.$(VERSION) $(LDFLAGS) $^ $(LDLIBS)
Thiago Macieira301e2632018-01-30 13:44:06 -0800150 cd lib ; ln -sf libtinycbor.so.$(VERSION) libtinycbor.so ; ln -sf libtinycbor.so.$(VERSION) libtinycbor.so.$(SOVERSION)
Bertrand Roussel47914e02017-07-26 19:09:00 +0200151
Fabrice Fontaine19b26bd2017-12-07 19:18:46 +0100152bin/cbordump: $(CBORDUMP_SOURCES:.c=.o) $(BINLIBRARY)
Thiago Macieira80d76e72016-11-30 12:49:20 -0800153 @$(MKDIR) -p bin
Thiago Macieira88943662018-07-17 21:12:43 -0700154 $(CC) -o $@ $(LDFLAGS) $^ $(LDLIBS)
Thiago Macieira12b89602015-09-15 18:33:22 -0700155
Fabrice Fontaine19b26bd2017-12-07 19:18:46 +0100156bin/json2cbor: $(JSON2CBOR_SOURCES:.c=.o) $(BINLIBRARY)
Thiago Macieira80d76e72016-11-30 12:49:20 -0800157 @$(MKDIR) -p bin
Thiago Macieira88943662018-07-17 21:12:43 -0700158 $(CC) -o $@ $(LDFLAGS) $^ $(LDFLAGS_CJSON) $(LDLIBS)
Thiago Macieirad4c9ecb2015-09-26 00:21:06 -0700159
Thiago Macieira12b89602015-09-15 18:33:22 -0700160tinycbor.pc: tinycbor.pc.in
161 $(SED) > $@ < $< \
162 -e 's,@prefix@,$(prefix),' \
163 -e 's,@exec_prefix@,$(exec_prefix),' \
164 -e 's,@libdir@,$(libdir),' \
165 -e 's,@includedir@,$(includedir),' \
166 -e 's,@version@,$(VERSION),'
167
168tests/Makefile: tests/tests.pro
Thiago Macieira43e3ac92015-10-17 13:47:16 -0700169 $(QMAKE) $(QMAKEFLAGS) -o $@ $<
Thiago Macieira12b89602015-09-15 18:33:22 -0700170
171$(PACKAGE).tar.gz: | .git
172 GIT_DIR=$(SRCDIR).git $(GIT_ARCHIVE) --format=tar.gz -o "$(PACKAGE).tar.gz" HEAD
173$(PACKAGE).zip: | .git
174 GIT_DIR=$(SRCDIR).git $(GIT_ARCHIVE) --format=zip -o "$(PACKAGE).zip" HEAD
175
Thomas Petazzoni31c7f812016-07-30 18:42:53 +0200176$(DESTDIR)$(libdir)/%: lib/%
177 $(INSTALL) -d $(@D)
Thiago Macieira12b89602015-09-15 18:33:22 -0700178 $(INSTALL_DATA) $< $@
Thomas Petazzoni31c7f812016-07-30 18:42:53 +0200179$(DESTDIR)$(bindir)/%: bin/%
180 $(INSTALL) -d $(@D)
Thiago Macieira12b89602015-09-15 18:33:22 -0700181 $(INSTALL_PROGRAM) $< $@
Thomas Petazzoni31c7f812016-07-30 18:42:53 +0200182$(DESTDIR)$(pkgconfigdir)/%: %
183 $(INSTALL) -d $(@D)
Thiago Macieira12b89602015-09-15 18:33:22 -0700184 $(INSTALL_DATA) $< $@
Thomas Petazzoni31c7f812016-07-30 18:42:53 +0200185$(DESTDIR)$(includedir)/tinycbor/%: src/%
186 $(INSTALL) -d $(@D)
Thiago Macieira12b89602015-09-15 18:33:22 -0700187 $(INSTALL_DATA) $< $@
188
189install-strip:
190 $(MAKE) -f $(MAKEFILE) INSTALL_PROGRAM='$(INSTALL_PROGRAM) -s' install
191
192install: $(INSTALL_TARGETS:%=$(DESTDIR)%)
193uninstall:
194 $(RM) $(INSTALL_TARGETS:%=$(DESTDIR)%)
195
196mostlyclean:
197 $(RM) $(TINYCBOR_SOURCES:.c=.o)
Thiago Macieiradf440a02017-11-13 11:20:59 -0800198 $(RM) $(TINYCBOR_SOURCES:.c=.pic.o)
Thiago Macieira12b89602015-09-15 18:33:22 -0700199 $(RM) $(CBORDUMP_SOURCES:.c=.o)
200
201clean: mostlyclean
202 $(RM) bin/cbordump
Thiago Macieirad4c9ecb2015-09-26 00:21:06 -0700203 $(RM) bin/json2cbor
Thiago Macieira12b89602015-09-15 18:33:22 -0700204 $(RM) lib/libtinycbor.a
Thiago Macieiraf2b75b82017-12-26 19:28:10 -0200205 $(RM) lib/libtinycbor-freestanding.a
Thiago Macieira12b89602015-09-15 18:33:22 -0700206 $(RM) tinycbor.pc
Bertrand Roussel47914e02017-07-26 19:09:00 +0200207 $(RM) lib/libtinycbor.so*
Thiago Macieira12b89602015-09-15 18:33:22 -0700208 test -e tests/Makefile && $(MAKE) -C tests clean || :
209
210distclean: clean
211 test -e tests/Makefile && $(MAKE) -C tests distclean || :
212
Thiago Macieira46a818e2015-10-08 15:13:05 +0200213docs:
214 cd $(SRCDIR)src && VERSION=$(VERSION) doxygen $(SRCDIR)/../Doxyfile
215
Thiago Macieira12b89602015-09-15 18:33:22 -0700216dist: $(PACKAGE).tar.gz $(PACKAGE).zip
217distcheck: .git
Thiago Macieira1735f9c2016-07-30 23:00:00 -0700218 -$(RM) -r $${TMPDIR-/tmp}/tinycbor-distcheck
219 GIT_DIR=$(SRCDIR).git git archive --prefix=tinycbor-distcheck/ --format=tar HEAD | tar -xf - -C $${TMPDIR-/tmp}
220 cd $${TMPDIR-/tmp}/tinycbor-distcheck && $(MAKE) silentcheck
221 $(RM) -r $${TMPDIR-/tmp}/tinycbor-distcheck
Thiago Macieira12b89602015-09-15 18:33:22 -0700222
Thiago Macieira29212402016-11-10 11:50:22 +0800223tag: distcheck
Thiago Macieira3cdb9c82017-12-27 23:29:33 -0200224 @cd $(SRCDIR). && perl scripts/maketag.pl
Thiago Macieira07716ef2015-09-15 22:50:52 -0700225
Thiago Macieira2a5fb792015-09-18 11:34:11 -0700226.PHONY: all check silentcheck configure install uninstall
Thiago Macieira12b89602015-09-15 18:33:22 -0700227.PHONY: mostlyclean clean distclean
Thiago Macieira46a818e2015-10-08 15:13:05 +0200228.PHONY: docs dist distcheck release
Thiago Macieira12b89602015-09-15 18:33:22 -0700229.SECONDARY:
230
231cflags := $(CPPFLAGS) -I$(SRCDIR)src
Konstantin Yegupov86066112018-03-18 19:11:51 +0000232cflags += -std=gnu99 $(CFLAGS)
Thiago Macieira12b89602015-09-15 18:33:22 -0700233%.o: %.c
234 @test -d $(@D) || $(MKDIR) $(@D)
Thiago Macieirad4c9ecb2015-09-26 00:21:06 -0700235 $(CC) $(cflags) $($(basename $(notdir $@))_CCFLAGS) -c -o $@ $<
Bertrand Roussel47914e02017-07-26 19:09:00 +0200236%.pic.o: %.c
237 @test -d $(@D) || $(MKDIR) $(@D)
238 $(CC) $(cflags) -fPIC $($(basename $(notdir $@))_CCFLAGS) -c -o $@ $<
Thiago Macieira2a5fb792015-09-18 11:34:11 -0700239
Thiago Macieira588948d2016-11-30 12:58:46 -0800240-include src/*.d