blob: cbeafd2e72d23899f905ec80a54449221ae9af82 [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
Thiago Macieiraf2b75b82017-12-26 19:28:10 -020024TINYCBOR_FREESTANDING_SOURCES = \
Thiago Macieira12b89602015-09-15 18:33:22 -070025 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 Macieiraf2b75b82017-12-26 19:28:10 -020030#
31TINYCBOR_SOURCES = \
32 $(TINYCBOR_FREESTANDING_SOURCES) \
33 src/cborparser_dup_string.c \
Thiago Macieiraf39dcb82017-12-22 14:03:51 -020034 src/cborpretty_stdio.c \
Thiago Macieira2b1800c2015-09-05 20:25:20 -050035 src/cbortojson.c \
Thiago Macieiraaddf8042017-02-26 11:37:06 -080036 src/cborvalidation.c \
Thiago Macieira12b89602015-09-15 18:33:22 -070037#
38CBORDUMP_SOURCES = tools/cbordump/cbordump.c
39
Thiago Macieiraaa692b72017-11-13 20:13:30 -080040BUILD_SHARED = $(shell file -L /bin/sh 2>/dev/null | grep -q ELF && echo 1)
Fabrice Fontaine19b26bd2017-12-07 19:18:46 +010041BUILD_STATIC = 1
42
43ifneq ($(BUILD_STATIC),1)
44ifneq ($(BUILD_SHARED),1)
45 $(error error: BUILD_STATIC and BUILD_SHARED can not be both disabled)
46endif
47endif
Thiago Macieiraaa692b72017-11-13 20:13:30 -080048
Thiago Macieira12b89602015-09-15 18:33:22 -070049INSTALL_TARGETS += $(bindir)/cbordump
Thiago Macieiraaa692b72017-11-13 20:13:30 -080050ifeq ($(BUILD_SHARED),1)
Fabrice Fontaine19b26bd2017-12-07 19:18:46 +010051BINLIBRARY=lib/libtinycbor.so
Bertrand Roussel47914e02017-07-26 19:09:00 +020052INSTALL_TARGETS += $(libdir)/libtinycbor.so
Thiago Macieira301e2632018-01-30 13:44:06 -080053INSTALL_TARGETS += $(libdir)/libtinycbor.so.$(SOVERSION)
Bertrand Roussel47914e02017-07-26 19:09:00 +020054INSTALL_TARGETS += $(libdir)/libtinycbor.so.$(VERSION)
Thiago Macieira15dfacf2017-10-07 15:41:25 -040055endif
Fabrice Fontaine19b26bd2017-12-07 19:18:46 +010056ifeq ($(BUILD_STATIC),1)
57BINLIBRARY=lib/libtinycbor.a
58INSTALL_TARGETS += $(libdir)/libtinycbor.a
59endif
Thiago Macieira12b89602015-09-15 18:33:22 -070060INSTALL_TARGETS += $(pkgconfigdir)/tinycbor.pc
61INSTALL_TARGETS += $(TINYCBOR_HEADERS:src/%=$(includedir)/tinycbor/%)
62
63# setup VPATH
64MAKEFILE := $(lastword $(MAKEFILE_LIST))
65SRCDIR := $(dir $(MAKEFILE))
66VPATH = $(SRCDIR):$(SRCDIR)/src
67
68# Our version
Thiago Macieira43e3ac92015-10-17 13:47:16 -070069GIT_DIR := $(strip $(shell git -C $(SRCDIR). rev-parse --git-dir 2> /dev/null))
Thiago Macieira301e2632018-01-30 13:44:06 -080070VERSION = $(shell cat $(SRCDIR)VERSION)
71SOVERSION = $(shell cut -f1-2 -d. $(SRCDIR)VERSION)
Thiago Macieira12b89602015-09-15 18:33:22 -070072PACKAGE = tinycbor-$(VERSION)
73
74# Check that QMAKE is Qt 5
75ifeq ($(origin QMAKE),file)
76 check_qmake = $(strip $(shell $(1) -query QT_VERSION 2>/dev/null | cut -b1))
77 ifneq ($(call check_qmake,$(QMAKE)),5)
78 QMAKE := qmake -qt5
79 ifneq ($(call check_qmake,$(QMAKE)),5)
80 QMAKE := qmake-qt5
81 ifneq ($(call check_qmake,$(QMAKE)),5)
82 QMAKE := @echo >&2 $(MAKEFILE): Cannot find a Qt 5 qmake; false
83 endif
84 endif
85 endif
86endif
87
Thiago Macieira2a5fb792015-09-18 11:34:11 -070088-include .config
89
Fabrice Fontaine04ada582016-08-30 10:51:14 +020090# if open_memstream is unavailable on the system, try to implement our own
91# version using funopen or fopencookie
92ifeq ($(open_memstream-pass),)
93 ifeq ($(funopen-pass)$(fopencookie-pass),)
94 CFLAGS += -DWITHOUT_OPEN_MEMSTREAM
95 $(warning warning: funopen and fopencookie unavailable, open_memstream can not be implemented and conversion to JSON will not work properly!)
96 else
97 TINYCBOR_SOURCES += src/open_memstream.c
98 endif
99endif
100
Fabrice Fontaine8ba8e202016-11-13 15:43:40 +0100101# json2cbor depends on an external library (cjson)
Thiago Macieirad4c9ecb2015-09-26 00:21:06 -0700102ifneq ($(cjson-pass)$(system-cjson-pass),)
103 JSON2CBOR_SOURCES = tools/json2cbor/json2cbor.c
104 INSTALL_TARGETS += $(bindir)/json2cbor
105 ifeq ($(system-cjson-pass),1)
Fabrice Fontaine8ba8e202016-11-13 15:43:40 +0100106 LDFLAGS_CJSON = -lcjson
Thiago Macieirad4c9ecb2015-09-26 00:21:06 -0700107 else
108 JSON2CBOR_SOURCES += src/cjson/cJSON.c
109 json2cbor_CCFLAGS = -I$(SRCDIR)src/cjson
110 endif
111endif
112
Thiago Macieira12b89602015-09-15 18:33:22 -0700113# Rules
Fabrice Fontaine19b26bd2017-12-07 19:18:46 +0100114all: .config \
115 $(if $(subst 0,,$(BUILD_STATIC)),lib/libtinycbor.a) \
Thiago Macieiraaa692b72017-11-13 20:13:30 -0800116 $(if $(subst 0,,$(BUILD_SHARED)),lib/libtinycbor.so) \
117 bin/cbordump tinycbor.pc
Thiago Macieirad4c9ecb2015-09-26 00:21:06 -0700118all: $(if $(JSON2CBOR_SOURCES),bin/json2cbor)
Fabrice Fontaine19b26bd2017-12-07 19:18:46 +0100119check: tests/Makefile | $(BINLIBRARY)
Thiago Macieira12b89602015-09-15 18:33:22 -0700120 $(MAKE) -C tests check
Fabrice Fontaine19b26bd2017-12-07 19:18:46 +0100121silentcheck: | $(BINLIBRARY)
Thiago Macieira12b89602015-09-15 18:33:22 -0700122 TESTARGS=-silent $(MAKE) -f $(MAKEFILE) -s check
Thiago Macieira2a5fb792015-09-18 11:34:11 -0700123configure: .config
124.config: Makefile.configure
Fabrice Fontainec88913e2016-07-21 15:19:38 +0200125 $(MAKE) -f $(SRCDIR)Makefile.configure OUT='>&9' configure 9> $@
Thiago Macieira12b89602015-09-15 18:33:22 -0700126
Thiago Macieiraf2b75b82017-12-26 19:28:10 -0200127lib/libtinycbor-freestanding.a: $(TINYCBOR_FREESTANDING_SOURCES:.c=.o)
128 @$(MKDIR) -p lib
129 $(AR) cqs $@ $^
130
Thiago Macieira80d76e72016-11-30 12:49:20 -0800131lib/libtinycbor.a: $(TINYCBOR_SOURCES:.c=.o)
132 @$(MKDIR) -p lib
Thiago Macieira12b89602015-09-15 18:33:22 -0700133 $(AR) cqs $@ $^
134
Bertrand Roussel47914e02017-07-26 19:09:00 +0200135lib/libtinycbor.so: $(TINYCBOR_SOURCES:.c=.pic.o)
Fabrice Fontaine19b26bd2017-12-07 19:18:46 +0100136 @$(MKDIR) -p lib
Thiago Macieira301e2632018-01-30 13:44:06 -0800137 $(CC) -shared -Wl,-soname,libtinycbor.so.$(SOVERSION) -o lib/libtinycbor.so.$(VERSION) $(LDFLAGS) $^
138 cd lib ; ln -sf libtinycbor.so.$(VERSION) libtinycbor.so ; ln -sf libtinycbor.so.$(VERSION) libtinycbor.so.$(SOVERSION)
Bertrand Roussel47914e02017-07-26 19:09:00 +0200139
Fabrice Fontaine19b26bd2017-12-07 19:18:46 +0100140bin/cbordump: $(CBORDUMP_SOURCES:.c=.o) $(BINLIBRARY)
Thiago Macieira80d76e72016-11-30 12:49:20 -0800141 @$(MKDIR) -p bin
Thiago Macieira57bcf4f2015-09-17 00:14:30 -0700142 $(CC) -o $@ $(LDFLAGS) $^ $(LDLIBS) -lm
Thiago Macieira12b89602015-09-15 18:33:22 -0700143
Fabrice Fontaine19b26bd2017-12-07 19:18:46 +0100144bin/json2cbor: $(JSON2CBOR_SOURCES:.c=.o) $(BINLIBRARY)
Thiago Macieira80d76e72016-11-30 12:49:20 -0800145 @$(MKDIR) -p bin
Fabrice Fontaineae608ea2017-03-06 18:59:22 +0100146 $(CC) -o $@ $(LDFLAGS) $^ $(LDFLAGS_CJSON) $(LDLIBS) -lm
Thiago Macieirad4c9ecb2015-09-26 00:21:06 -0700147
Thiago Macieira12b89602015-09-15 18:33:22 -0700148tinycbor.pc: tinycbor.pc.in
149 $(SED) > $@ < $< \
150 -e 's,@prefix@,$(prefix),' \
151 -e 's,@exec_prefix@,$(exec_prefix),' \
152 -e 's,@libdir@,$(libdir),' \
153 -e 's,@includedir@,$(includedir),' \
154 -e 's,@version@,$(VERSION),'
155
156tests/Makefile: tests/tests.pro
Thiago Macieira43e3ac92015-10-17 13:47:16 -0700157 $(QMAKE) $(QMAKEFLAGS) -o $@ $<
Thiago Macieira12b89602015-09-15 18:33:22 -0700158
159$(PACKAGE).tar.gz: | .git
160 GIT_DIR=$(SRCDIR).git $(GIT_ARCHIVE) --format=tar.gz -o "$(PACKAGE).tar.gz" HEAD
161$(PACKAGE).zip: | .git
162 GIT_DIR=$(SRCDIR).git $(GIT_ARCHIVE) --format=zip -o "$(PACKAGE).zip" HEAD
163
Thomas Petazzoni31c7f812016-07-30 18:42:53 +0200164$(DESTDIR)$(libdir)/%: lib/%
165 $(INSTALL) -d $(@D)
Thiago Macieira12b89602015-09-15 18:33:22 -0700166 $(INSTALL_DATA) $< $@
Thomas Petazzoni31c7f812016-07-30 18:42:53 +0200167$(DESTDIR)$(bindir)/%: bin/%
168 $(INSTALL) -d $(@D)
Thiago Macieira12b89602015-09-15 18:33:22 -0700169 $(INSTALL_PROGRAM) $< $@
Thomas Petazzoni31c7f812016-07-30 18:42:53 +0200170$(DESTDIR)$(pkgconfigdir)/%: %
171 $(INSTALL) -d $(@D)
Thiago Macieira12b89602015-09-15 18:33:22 -0700172 $(INSTALL_DATA) $< $@
Thomas Petazzoni31c7f812016-07-30 18:42:53 +0200173$(DESTDIR)$(includedir)/tinycbor/%: src/%
174 $(INSTALL) -d $(@D)
Thiago Macieira12b89602015-09-15 18:33:22 -0700175 $(INSTALL_DATA) $< $@
176
177install-strip:
178 $(MAKE) -f $(MAKEFILE) INSTALL_PROGRAM='$(INSTALL_PROGRAM) -s' install
179
180install: $(INSTALL_TARGETS:%=$(DESTDIR)%)
181uninstall:
182 $(RM) $(INSTALL_TARGETS:%=$(DESTDIR)%)
183
184mostlyclean:
185 $(RM) $(TINYCBOR_SOURCES:.c=.o)
Thiago Macieiradf440a02017-11-13 11:20:59 -0800186 $(RM) $(TINYCBOR_SOURCES:.c=.pic.o)
Thiago Macieira12b89602015-09-15 18:33:22 -0700187 $(RM) $(CBORDUMP_SOURCES:.c=.o)
188
189clean: mostlyclean
190 $(RM) bin/cbordump
Thiago Macieirad4c9ecb2015-09-26 00:21:06 -0700191 $(RM) bin/json2cbor
Thiago Macieira12b89602015-09-15 18:33:22 -0700192 $(RM) lib/libtinycbor.a
Thiago Macieiraf2b75b82017-12-26 19:28:10 -0200193 $(RM) lib/libtinycbor-freestanding.a
Thiago Macieira12b89602015-09-15 18:33:22 -0700194 $(RM) tinycbor.pc
Bertrand Roussel47914e02017-07-26 19:09:00 +0200195 $(RM) lib/libtinycbor.so*
Thiago Macieira12b89602015-09-15 18:33:22 -0700196 test -e tests/Makefile && $(MAKE) -C tests clean || :
197
198distclean: clean
199 test -e tests/Makefile && $(MAKE) -C tests distclean || :
200
Thiago Macieira46a818e2015-10-08 15:13:05 +0200201docs:
202 cd $(SRCDIR)src && VERSION=$(VERSION) doxygen $(SRCDIR)/../Doxyfile
203
Thiago Macieira12b89602015-09-15 18:33:22 -0700204dist: $(PACKAGE).tar.gz $(PACKAGE).zip
205distcheck: .git
Thiago Macieira1735f9c2016-07-30 23:00:00 -0700206 -$(RM) -r $${TMPDIR-/tmp}/tinycbor-distcheck
207 GIT_DIR=$(SRCDIR).git git archive --prefix=tinycbor-distcheck/ --format=tar HEAD | tar -xf - -C $${TMPDIR-/tmp}
208 cd $${TMPDIR-/tmp}/tinycbor-distcheck && $(MAKE) silentcheck
209 $(RM) -r $${TMPDIR-/tmp}/tinycbor-distcheck
Thiago Macieira12b89602015-09-15 18:33:22 -0700210
Thiago Macieira29212402016-11-10 11:50:22 +0800211tag: distcheck
Thiago Macieira3cdb9c82017-12-27 23:29:33 -0200212 @cd $(SRCDIR). && perl scripts/maketag.pl
Thiago Macieira07716ef2015-09-15 22:50:52 -0700213
Thiago Macieira2a5fb792015-09-18 11:34:11 -0700214.PHONY: all check silentcheck configure install uninstall
Thiago Macieira12b89602015-09-15 18:33:22 -0700215.PHONY: mostlyclean clean distclean
Thiago Macieira46a818e2015-10-08 15:13:05 +0200216.PHONY: docs dist distcheck release
Thiago Macieira12b89602015-09-15 18:33:22 -0700217.SECONDARY:
218
219cflags := $(CPPFLAGS) -I$(SRCDIR)src
Thiago Macieira12b89602015-09-15 18:33:22 -0700220cflags += -std=c99 $(CFLAGS)
221%.o: %.c
222 @test -d $(@D) || $(MKDIR) $(@D)
Thiago Macieirad4c9ecb2015-09-26 00:21:06 -0700223 $(CC) $(cflags) $($(basename $(notdir $@))_CCFLAGS) -c -o $@ $<
Bertrand Roussel47914e02017-07-26 19:09:00 +0200224%.pic.o: %.c
225 @test -d $(@D) || $(MKDIR) $(@D)
226 $(CC) $(cflags) -fPIC $($(basename $(notdir $@))_CCFLAGS) -c -o $@ $<
Thiago Macieira2a5fb792015-09-18 11:34:11 -0700227
Thiago Macieira588948d2016-11-30 12:58:46 -0800228-include src/*.d