Makefile 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190
  1. SRCS = mongoose.c test/unit_test.c test/packed_fs.c
  2. HDRS = $(wildcard src/*.h) $(wildcard src/drivers/*.h)
  3. DEFS ?= -DMG_MAX_HTTP_HEADERS=7 -DMG_ENABLE_LINES -DMG_ENABLE_PACKED_FS=1 -DMG_ENABLE_SSI=1 -DMG_ENABLE_ASSERT=1
  4. WARN ?= -pedantic -W -Wall -Werror -Wshadow -Wdouble-promotion -fno-common -Wconversion -Wundef
  5. OPTS ?= -O3 -g3
  6. INCS ?= -Isrc -I.
  7. SSL ?=
  8. CWD ?= $(realpath $(CURDIR))
  9. ENV ?= -e Tmp=. -e WINEDEBUG=-all
  10. DOCKER_BIN ?= docker
  11. DOCKER ?= $(DOCKER_BIN) run --platform linux/amd64 --rm $(ENV) -v $(CWD):$(CWD) -w $(CWD)
  12. VCFLAGS = /nologo /W3 /O2 /MD /I. $(DEFS) $(TFLAGS)
  13. IPV6 ?= 1
  14. ASAN ?= -fsanitize=address,undefined,alignment -fno-sanitize-recover=all -fno-omit-frame-pointer -fno-common
  15. ASAN_OPTIONS ?= detect_leaks=1
  16. EXAMPLES := $(dir $(wildcard examples/*/Makefile))
  17. EXAMPLES_MAC := $(filter-out examples/mip-pcap/ examples/mip-tap/ examples/micropython/, $(EXAMPLES))
  18. EXAMPLES_WIN := $(dir $(wildcard examples/device-dashboard/Makefile) $(wildcard examples/file-*/Makefile) $(wildcard examples/http-*/Makefile) $(wildcard examples/mqtt-*/Makefile) $(wildcard examples/websocket-*/Makefile) $(wildcard examples/webui-*/Makefile))
  19. EXAMPLES_EMBEDDED := $(filter-out $(wildcard examples/zephyr/*/), $(dir $(wildcard examples/*/*/Makefile)))
  20. PREFIX ?= /usr/local
  21. LIBDIR ?= $(PREFIX)/lib
  22. INCLUDEDIR ?= $(PREFIX)/include
  23. VERSION ?= $(shell cut -d'"' -f2 src/version.h)
  24. COMMON_CFLAGS ?= $(C_WARN) $(WARN) $(INCS) $(DEFS) -DMG_ENABLE_IPV6=$(IPV6) $(TFLAGS) -pthread
  25. CFLAGS ?= $(OPTS) $(ASAN) $(COMMON_CFLAGS)
  26. VALGRIND_CFLAGS ?= $(OPTS) $(COMMON_CFLAGS)
  27. VALGRIND_RUN ?= valgrind --tool=memcheck --gen-suppressions=all --leak-check=full --show-leak-kinds=all --leak-resolution=high --track-origins=yes --error-exitcode=1 --exit-on-first-error=yes --fair-sched=yes
  28. .PHONY: clean_examples examples mip_test test valgrind
  29. ifeq "$(findstring ++,$(CC))" ""
  30. # $(CC) does not end with ++, i.e. we're using C. Apply C flags
  31. C_WARN ?= -Wmissing-prototypes -Wstrict-prototypes
  32. else
  33. # $(CC) ends with ++, i.e. we're using C++. Apply C++ flags
  34. C_WARN ?= -Wno-deprecated
  35. endif
  36. ifeq "$(SSL)" "MBEDTLS"
  37. MBEDTLS ?= /usr/local
  38. CFLAGS += -DMG_TLS=MG_TLS_MBED -I$(MBEDTLS)/include -I/usr/include
  39. LDFLAGS += -L$(MBEDTLS)/lib -lmbedtls -lmbedcrypto -lmbedx509
  40. endif
  41. ifeq "$(SSL)" "OPENSSL"
  42. OPENSSL ?= /usr/local
  43. CFLAGS += -DMG_TLS=MG_TLS_OPENSSL -I$(OPENSSL)/include
  44. LDFLAGS += -L$(OPENSSL)/lib -lssl -lcrypto
  45. endif
  46. all:
  47. $(MAKE) -C examples/http-server
  48. tall: mg_prefix unamalgamated test mip_test arm examples vc98 vc17 vc22 mingw mingw++ fuzz
  49. mip_test: test/mip_test.c mongoose.c mongoose.h Makefile mip_tap_test
  50. $(CC) test/mip_test.c $(INCS) $(WARN) $(OPTS) $(C_WARN) $(ASAN) -o $@
  51. ASAN_OPTIONS=$(ASAN_OPTIONS) $(RUN) ./$@
  52. mip_tap_test: test/mip_tap_test.c mongoose.c mongoose.h Makefile
  53. $(CC) test/mip_tap_test.c $(INCS) $(WARN) $(OPTS) $(C_WARN) $(ASAN) -o $@
  54. ASAN_OPTIONS=$(ASAN_OPTIONS) $(RUN) ./$@
  55. examples:
  56. @for X in $(EXAMPLES); do test -f $$X/Makefile || continue; $(MAKE) -C $$X example || exit 1; done
  57. clean_examples:
  58. for X in $(EXAMPLES); do test -f $$X/Makefile || continue; $(MAKE) -C $$X clean || exit 1; done
  59. examples_mac:
  60. for X in $(EXAMPLES_MAC); do test -f $$X/Makefile || continue; $(MAKE) -C $$X example || exit 1; done
  61. clean_examples_mac:
  62. for X in $(EXAMPLES_MAC); do test -f $$X/Makefile || continue; $(MAKE) -C $$X clean || exit 1; done
  63. examples_win:
  64. $(foreach X, $(EXAMPLES_WIN), $(MAKE) -C $(X) example &)
  65. clean_examples_win:
  66. $(foreach X, $(EXAMPLES_WIN), $(MAKE) -C $(X) clean &)
  67. test/packed_fs.c: Makefile src/ssi.h test/fuzz.c test/data/a.txt test/data/ca.pem
  68. $(CC) $(CFLAGS) test/pack.c -o pack
  69. $(RUN) ./pack Makefile src/ssi.h test/fuzz.c test/data/a.txt test/data/range.txt test/data/ca.pem > $@
  70. # Check that all external (exported) symbols have "mg_" prefix
  71. mg_prefix: mongoose.c mongoose.h
  72. $(CC) mongoose.c $(CFLAGS) -c -o /tmp/x.o && nm /tmp/x.o | grep ' T ' | grep -v 'mg_' ; test $$? = 1
  73. musl: test
  74. musl: ASAN =
  75. musl: WARN += -Wno-sign-conversion
  76. musl: CC = $(DOCKER) mdashnet/cc1 gcc
  77. musl: RUN = $(DOCKER) mdashnet/cc1
  78. # Make sure we can build from unamalgamated sources.
  79. unamalgamated: CFLAGS += -DMG_ENABLE_MD5=1
  80. unamalgamated: $(HDRS) Makefile test/packed_fs.c
  81. $(CC) src/*.c test/packed_fs.c test/unit_test.c $(CFLAGS) $(LDFLAGS) -g -o unit_test
  82. fuzz: ASAN = -fsanitize=fuzzer,signed-integer-overflow,address,undefined
  83. fuzz: mongoose.c mongoose.h Makefile test/fuzz.c
  84. $(CC) test/fuzz.c $(OPTS) $(WARN) $(INCS) $(TFLAGS) $(ASAN) -o fuzzer
  85. $(RUN) ./fuzzer
  86. FUZZDATA ?= /tmp/fuzzdata
  87. fuzz2: mongoose.c mongoose.h Makefile test/fuzz.c
  88. $(CC) test/fuzz.c -DMAIN $(OPTS) $(WARN) $(ASAN) $(INCS) -o fuzzer
  89. $(RUN) ./fuzzer $(FUZZDATA)
  90. test: Makefile mongoose.h $(SRCS)
  91. $(CC) $(SRCS) $(CFLAGS) $(LDFLAGS) -o unit_test
  92. ASAN_OPTIONS=$(ASAN_OPTIONS) $(RUN) ./unit_test
  93. coverage: CFLAGS += -coverage
  94. coverage: test
  95. gcov -l -n *.gcno | sed '/^$$/d' | sed 'N;s/\n/ /'
  96. gcov -t mongoose.c > mongoose.gcov
  97. upload-coverage: coverage
  98. curl -s https://codecov.io/bash | /bin/bash
  99. valgrind: Makefile mongoose.h mongoose.c
  100. $(CC) $(SRCS) $(VALGRIND_CFLAGS) $(LDFLAGS) -g -o unit_test
  101. $(VALGRIND_RUN) ./unit_test
  102. armhf: ASAN=
  103. armhf: IPV6=0
  104. armhf: CC = $(DOCKER) mdashnet/armhf cc
  105. armhf: RUN = $(DOCKER) mdashnet/armhf
  106. armhf: test
  107. s390: ASAN=
  108. s390: IPV6=0
  109. s390: CC = $(DOCKER) mdashnet/s390 cc
  110. s390: RUN = $(DOCKER) mdashnet/s390
  111. s390: test
  112. arm: DEFS += -DMG_ENABLE_FILE=0 -DMG_ENABLE_TCPIP=1 -DMG_ARCH=MG_ARCH_NEWLIB
  113. arm: mongoose.h $(SRCS)
  114. $(DOCKER) mdashnet/armgcc arm-none-eabi-gcc -mcpu=cortex-m3 -mthumb $(SRCS) $(OPTS) $(WARN) $(INCS) $(DEFS) $(TFLAGS) -o unit_test -nostartfiles --specs nosys.specs -e 0
  115. riscv: DEFS += -DMG_ENABLE_FILE=0 -DMG_ENABLE_TCPIP=1 -DMG_ARCH=MG_ARCH_NEWLIB
  116. riscv: mongoose.h $(SRCS)
  117. $(DOCKER) mdashnet/riscv riscv-none-elf-gcc -march=rv32imc -mabi=ilp32 $(SRCS) $(OPTS) $(WARN) $(INCS) $(DEFS) $(TFLAGS) -o unit_test
  118. vc98: Makefile mongoose.h $(SRCS)
  119. $(DOCKER) mdashnet/vc98 wine cl $(SRCS) $(VCFLAGS) ws2_32.lib /Fe$@.exe
  120. $(DOCKER) mdashnet/vc98 wine $@.exe
  121. vc17: Makefile mongoose.h $(SRCS)
  122. $(DOCKER) mdashnet/vc17 wine64 cl $(SRCS) $(VCFLAGS) ws2_32.lib /Fe$@.exe
  123. $(DOCKER) mdashnet/vc17 wine64 $@.exe
  124. vc22: Makefile mongoose.h $(SRCS)
  125. $(DOCKER) mdashnet/vc22 wine64 cl $(SRCS) $(VCFLAGS) ws2_32.lib /Fe$@.exe
  126. $(DOCKER) mdashnet/vc22 wine64 $@.exe
  127. mingw: Makefile mongoose.h $(SRCS)
  128. $(DOCKER) mdashnet/mingw x86_64-w64-mingw32-gcc $(SRCS) -W -Wall -Werror -I. $(DEFS) -lwsock32 -o $@.exe
  129. $(DOCKER) mdashnet/mingw wine64 $@.exe
  130. mingw++: Makefile mongoose.h $(SRCS)
  131. $(DOCKER) mdashnet/mingw x86_64-w64-mingw32-g++ $(SRCS) -W -Wall -Werror -I. $(DEFS) -lwsock32 -o $@.exe
  132. linux-libs: CFLAGS += -fPIC
  133. linux-libs: LDFLAGS += -Wl,-soname,libmongoose.so.$(VERSION)
  134. linux-libs: mongoose.o
  135. $(CC) mongoose.o $(LDFLAGS) -shared -o libmongoose.so.$(VERSION)
  136. $(AR) rcs libmongoose.a mongoose.o
  137. install: linux-libs
  138. install -Dm644 libmongoose.a libmongoose.so.$(VERSION) $(DESTDIR)$(LIBDIR)
  139. ln -s libmongoose.so.$(VERSION) $(DESTDIR)$(LIBDIR)/libmongoose.so
  140. install -Dm644 mongoose.h $(DESTDIR)$(INCLUDEDIR)/mongoose.h
  141. uninstall:
  142. rm -rf $(DESTDIR)$(LIBDIR)/libmongoose.a $(DESTDIR)$(LIBDIR)/libmongoose.so.$(VERSION) $(DESTDIR)$(INCLUDEDIR)/mongoose.h $(DESTDIR)$(LIBDIR)/libmongoose.so
  143. mongoose.c: Makefile $(wildcard src/*.c) $(wildcard src/drivers/*.c)
  144. (cat src/license.h; echo; echo '#include "mongoose.h"' ; (for F in src/*.c src/drivers/*.c ; do echo; echo '#ifdef MG_ENABLE_LINES'; echo "#line 1 \"$$F\""; echo '#endif'; cat $$F | sed -e 's,#include ".*,,'; done))> $@
  145. mongoose.h: $(HDRS) Makefile
  146. (cat src/license.h; echo; echo '#ifndef MONGOOSE_H'; echo '#define MONGOOSE_H'; echo; cat src/version.h ; echo; echo '#ifdef __cplusplus'; echo 'extern "C" {'; echo '#endif'; cat src/arch.h src/arch_*.h src/net_ft.h src/net_lwip.h src/net_rl.h src/config.h src/str.h src/queue.h src/fmt.h src/printf.h src/log.h src/timer.h src/fs.h src/util.h src/url.h src/iobuf.h src/base64.h src/md5.h src/sha1.h src/sha256.h src/tls_aes128.h src/tls_uecc.h src/event.h src/net.h src/http.h src/ssi.h src/tls.h src/tls_mbed.h src/tls_openssl.h src/ws.h src/sntp.h src/mqtt.h src/dns.h src/json.h src/rpc.h src/ota.h src/device.h src/net_builtin.h src/profile.h src/drivers/*.h | sed -e '/keep/! s,#include ".*,,' -e 's,^#pragma once,,'; echo; echo '#ifdef __cplusplus'; echo '}'; echo '#endif'; echo '#endif // MONGOOSE_H')> $@
  147. clean: clean_examples clean_embedded
  148. rm -rf $(PROG) *.exe *.o *.dSYM *_test* ut fuzzer *.gcov *.gcno *.gcda *.obj *.exe *.ilk *.pdb slow-unit* _CL_* infer-out data.txt crash-* test/packed_fs.c pack
  149. #find examples -maxdepth 3 -name zephyr -prune -o -name Makefile -print | xargs dirname | xargs -n1 make clean -C
  150. clean_embedded:
  151. for X in $(EXAMPLES_EMBEDDED); do test -f $$X/Makefile || continue; $(MAKE) -C $$X clean || exit 1; done