include config.mk CXXSRC := $(shell find cxx -type f -name '*.cxx') CSRC += $(shell find c -type f -name '*.c') ifeq ($(TCP_SERVER), 1) CSRC += servers/tcp.c endif ifeq ($(FCGI_SERVER), 1) CSRC += servers/fcgi.c endif CXXOBJ := $(CXXSRC:.cxx=.o) COBJ := $(CSRC:.c=.o) #target C and C++ libraries all: librapida.a librapida.so librapidaxx.a librapidaxx.so #target Distribution dist: all mkdir -p rapida-$(VERSION)/lib cp -rf README.md COPYING include rapida-$(VERSION) mv librapida.so librapida.so.$(VERSION) mv librapidaxx.so librapidaxx.so.$(VERSION) cp -f *.a *.so* rapida-$(VERSION)/lib tar cf rapida-$(VERSION).tar rapida-$(VERSION) gzip rapida-$(VERSION).tar rm -rf rapida-$(VERSION) install: all mv librapida.so librapida.so.$(VERSION) mv librapidaxx.so librapidaxx.so.$(VERSION) install librapida.a $(PREFIX)/lib install librapidaxx.a $(PREFIX)/lib install librapida.so.$(VERSION) $(PREFIX)/lib install librapidaxx.so.$(VERSION) $(PREFIX)/lib ln -s $(PREFIX)/lib/librapida.so.$(VERSION) $(PREFIX)/lib/librapida.so ln -s $(PREFIX)/lib/librapidaxx.so.$(VERSION) $(PREFIX)/lib/librapidaxx.so mkdir -p $(PREFIX)/include/rapida cp -rf include/* $(PREFIX)/include/rapida uninstall: rm -f $(PREFIX)/lib/librapida.a rm -f $(PREFIX)/lib/librapidaxx.a rm -f $(PREFIX)/lib/librapida.so* rm -f $(PREFIX)/lib/librapidaxx.so* rm -rf $(PREFIX)/include/rapida #target Examples examples: all cd $@ && make #target Shared C library librapida.so: $(COBJ) $(CC) -shared $^ -o $@ $(LDFLAGS) #target Shared C++ library librapidaxx.so: $(COBJ) $(CXXOBJ) $(CXX) -shared $^ -o $@ $(LDFLAGS) #target Static C library librapida.a: $(COBJ) ar rvs $@ $^ #target Static C++ library librapidaxx.a: $(COBJ) $(CXXOBJ) ar rvs $@ $^ servers/%.o: servers/%.c $(CC) $(CFLAGS) -fPIC $< -c -o $@ c/%.o: c/%.c $(CC) $(CFLAGS) -fPIC $< -c -o $@ cxx/%.o: cxx/%.cxx $(CXX) $(CXXFLAGS) $(CXXSTD) -fPIC $< -c -o $@ #target Tests runner run_tests: tests/*.cxx librapidaxx.a $(CXX) $(CXXFLAGS) -std=c++17 `pkg-config --cflags catch2` $^ -o $@ $(LDFLAGS) #target Clear project from generated files clean: rm -f **/*.o *.a *.so* run_tests #target Clear project from generated and distribution files distclean: clean rm -f *.tar* #target Generate documentation docs: cd $@ && VERSION=$(VERSION) doxygen #target Format code format: clang-format -Werror -i **/*.c* **/*.h* #target Show this help help: @echo "$$(tput bold)Usage:$$(tput sgr0)\nmake [flags...] [args...]\n" @echo "$$(tput bold)Targets:$$(tput sgr0)";echo;sed -ne"/^#target /{h;s/.*//;:d" -e"H;n;s/^#target //;td" -e"s/:.*//;G;s/\\n#target /---/;s/\\n/ /g;p;}" ${MAKEFILE_LIST}|awk -F --- -v n=$$(tput cols) -v i=29 -v a="$$(tput setaf 6)" -v z="$$(tput sgr0)" '{printf"%s%*s%s ",a,-i,$$1,z;m=split($$2,w," ");l=n-i;for(j=1;j<=m;j++){l-=length(w[j])+1;if(l<= 0){l=n-i-length(w[j])-1;printf"\n%*s ",-i," ";}printf"%s ",w[j];}printf"\n";}' @echo "\n$$(tput bold)Flags (All values other than '0' are true):$$(tput sgr0)";echo;sed -ne"/^#flag /{h;s/.*//;:d" -e"H;n;s/^#flag //;td" -e"s/:.*//;G;s/\\n#flag /---/;s/\\n/ /g;p;}" ${MAKEFILE_LIST}|awk -F --- -v n=$$(tput cols) -v i=29 -v a="$$(tput setaf 6)" -v z="$$(tput sgr0)" '{printf"%s%*s%s ",a,-i,$$1,z;m=split($$2,w," ");l=n-i;for(j=1;j<=m;j++){l-=length(w[j])+1;if(l<= 0){l=n-i-length(w[j])-1;printf"\n%*s ",-i," ";}printf"%s ",w[j];}printf"\n";}' @echo "\n$$(tput bold)Arguments:$$(tput sgr0)";echo;sed -ne"/^#arg /{h;s/.*//;:d" -e"H;n;s/^#arg //;td" -e"s/:.*//;G;s/\\n#arg /---/;s/\\n/ /g;p;}" ${MAKEFILE_LIST}|awk -F --- -v n=$$(tput cols) -v i=29 -v a="$$(tput setaf 6)" -v z="$$(tput sgr0)" '{printf"%s%*s%s ",a,-i,$$1,z;m=split($$2,w," ");l=n-i;for(j=1;j<=m;j++){l-=length(w[j])+1;if(l<= 0){l=n-i-length(w[j])-1;printf"\n%*s ",-i," ";}printf"%s ",w[j];}printf"\n";}' .PHONY: help clean distclean docs format