about summary refs log tree commit diff stats
path: root/wrapperhelper/Makefile
diff options
context:
space:
mode:
authorrajdakin <rajdakin@gmail.com>2024-09-06 15:07:38 +0200
committerGitHub <noreply@github.com>2024-09-06 15:07:38 +0200
commit6044feb7fd58ff69f63f5418f516b1f3ded346e9 (patch)
tree9935288f145df5b80f6d118c8a487b0a10afb1e8 /wrapperhelper/Makefile
parent7dc59ac342d315dbb352becbeabc4e7057992de0 (diff)
downloadbox64-6044feb7fd58ff69f63f5418f516b1f3ded346e9.tar.gz
box64-6044feb7fd58ff69f63f5418f516b1f3ded346e9.zip
Wrapper helper (#1799)
* [WRAPPERHELPER] Added wrapperhelper v0.1, tested on libc

* [WRAPPED] Removed updates to libc from this branch

* [WRAPPERHELPER] Removed GPL header and added modified LGPL header, added notes about licensing issues
Diffstat (limited to 'wrapperhelper/Makefile')
-rwxr-xr-xwrapperhelper/Makefile299
1 files changed, 299 insertions, 0 deletions
diff --git a/wrapperhelper/Makefile b/wrapperhelper/Makefile
new file mode 100755
index 00000000..9f1a6c5f
--- /dev/null
+++ b/wrapperhelper/Makefile
@@ -0,0 +1,299 @@
+all:
+.PHONY: all
+
+OPTIM?=2
+DEBUG?=1
+# FORCE_COLOR: set to non-empty, non 0 to force colorized output
+# ECHO: set to non-empty, non 0 to echo commands out
+
+help:
+	@echo 'Targets:'
+	@echo '  help (current target)'
+	@echo '  all (default target)'
+	@echo '  [EXE] - wrapperhelper'
+	@printf ' $(foreach obj,$(OBJLIST_wrapperhelper), [OBJ] - $(obj)\n)'
+	@printf ' $(foreach test,$(TESTS), [TST] - $(test)\n)'
+	@echo '  clean'
+	@echo '  distclean'
+	@echo ''
+	@echo 'Options:'
+	@echo '  OPTIM: GCC optimization level (-O is prepended) [default: 2]'
+	@echo '  DEBUG: set to 0 for release build, set to non-0 for debug build [default: 1]'
+	@echo '  FORCE_COLOR: set to non-0 to force colorized output'
+	@echo '  ECHO: set to non-0 to echo out commands executed'
+	@echo ''
+	@echo 'Current flags:'
+	@echo '  CPPFLAGS = $(CPPFLAGS)'
+	@echo '  CFLAGS   = $(CFLAGS)'
+#	@echo '  CXXFLAGS = $(CXXFLAGS)' unused
+	@echo '  LDFLAGS  = $(LDFLAGS)'
+	@echo '  LDLIBS  = $(LDLIBS)'
+	@echo ''
+	@echo 'Sanitizers:'
+	@echo "  address ------------ `[ $(ASAN_ON) -eq 1 ] && printf '\033[92mON\033[m' || printf '\033[91mOFF\033[m'`"
+	@echo "  leak --------------- `[ $(LSAN_ON) -eq 1 ] && printf '\033[92mON\033[m' || printf '\033[91mOFF\033[m'`"
+	@echo "  undefined behavior - `[ $(USAN_ON) -eq 1 ] && printf '\033[92mON\033[m' || printf '\033[91mOFF\033[m'`"
+.PHONY: help
+
+ifeq ($(ECHO:0=),)
+SILENCER:=@
+else
+SILENCER:=
+endif
+
+ifneq ($(strip $(DEBUG)),0)
+CPPFLAGS+= -DDEBUG -D_NRELEASE
+CFLAGS+= -g
+CXXFLAGS+= -g
+LDFLAGS+= -g
+OBJDIR?=debug
+else
+CPPFLAGS+= -DRELEASE -D_NDEBUG
+OBJDIR?=release
+endif
+
+COMMON_WARNINGS:=-Wfatal-errors -fanalyzer -Wall -Wextra
+COMMON_WARNINGS+= -Walloc-zero -Wcast-align=strict -Wcast-qual -Wconversion -Wdate-time
+COMMON_WARNINGS+= -Wdisabled-optimization -Wduplicated-branches -Wfloat-equal -Wformat-truncation=2
+COMMON_WARNINGS+= -Wimplicit-fallthrough=3 -Wlogical-op -Wmissing-format-attribute -Wmissing-include-dirs
+COMMON_WARNINGS+= -Wmissing-noreturn -Wnull-dereference -Wredundant-decls -Wundef -Wunreachable-code -Wshift-overflow=2
+COMMON_WARNINGS+= -Wstringop-overflow=4
+#COMMON_WARNINGS+= -Wstringop-overflow=4 -Wsuggest-attribute=cold -Wsuggest-attribute=const -Wsuggest-attribute=format
+#COMMON_WARNINGS+= -Wsuggest-attribute=malloc -Wsuggest-attribute=noreturn -Wsuggest-attribute=pure
+COMMON_WARNINGS+= -Wunknown-pragmas -Wunused-macros -Wwrite-strings
+COMMON_WARNINGS+= -Werror=attribute-alias=2 -Werror=duplicated-cond -Werror=format=2 -Werror=format-overflow=2
+COMMON_WARNINGS+= -Werror=format-signedness -Werror=pointer-arith
+COMMON_WARNINGS+= -Werror=return-type -Werror=shadow -Werror=strict-overflow -Werror=switch-enum
+CFLAGS_WARNINGS:=-Werror=implicit-function-declaration -Werror=jump-misses-init -Werror=strict-prototypes
+CXXFLAGS_WARNINGS:=-Werror=overloaded-virtual -fdiagnostics-show-template-tree -Wno-analyzer-use-of-uninitialized-value
+
+CPPFLAGS+=
+CFLAGS:=$(COMMON_WARNINGS) $(CFLAGS_WARNINGS) $(CFLAGS) -std=gnu18 -O$(OPTIM)
+CXXFLAGS:=$(COMMON_WARNINGS) $(CXXFLAGS_WARNINGS) $(CXXFLAGS) -std=c++20 -O$(OPTIM)
+LDFLAGS+= -O$(OPTIM)
+
+#CPPFLAGS+= -I/usr/include/SDL2 -D_REENTRANT -pthread
+#CFLAGS+= -pthread
+#CXXFLAGS+= -pthread
+#LDLIBS+= -pthread -lSDL2
+
+ifeq (,$(wildcard $(CURDIR)/sanaddress))
+ASAN_ON:=0
+else
+ASAN_ON:=1
+CFLAGS+= -fsanitize=address
+CXXFLAGS+= -fsanitize=address
+LDFLAGS+= -fsanitize=address
+endif
+ifeq (,$(wildcard $(CURDIR)/sanleak))
+LSAN_ON:=0
+else
+LSAN_ON:=1
+CFLAGS+= -fsanitize=leak
+CXXFLAGS+= -fsanitize=leak
+LDFLAGS+= -fsanitize=leak
+endif
+ifeq (,$(wildcard $(CURDIR)/sanundefined))
+USAN_ON:=0
+else
+USAN_ON:=1
+CFLAGS+= -fsanitize=undefined
+CXXFLAGS+= -fsanitize=undefined
+LDFLAGS+= -fsanitize=undefined
+endif
+
+# Default
+# .SUFFIXES: .out .a .ln .o .c .cc .C .cpp .p .f .F .m .r .y .l .ym .yl .s .S .mod
+# .sym .def .h .info .dvi .tex .texinfo .texi .txinfo .w .ch .web .sh .elc .el
+SUFFIXES =
+.SUFFIXES:
+.SECONDEXPANSION:
+
+ifneq ($(MAKECMDGOALS:distclean=clean),clean)
+.: ;
+bin obj: ; $(SILENCER)test -d $@ || mkdir $@
+# $(eval $(call reproduce_tree,<base>))
+define reproduce_tree =
+$(1) $(1)/parser: | $$$$(@D) ; $(SILENCER)test -d $$@ || mkdir $$@
+endef
+$(eval $(call reproduce_tree,obj/$(OBJDIR)))
+$(eval $(call reproduce_tree,obj/$(OBJDIR)/tests))
+$(eval $(call reproduce_tree,makedir))
+$(eval $(call reproduce_tree,makedir/tests))
+$(eval $(call reproduce_tree,tests))
+endif
+
+# Colors:
+# -------
+#   +--------+-----+
+#   |   3    |  9  |
+# +-+--------+-----+
+# |0|        |     | Black
+# |1|        | RM  | Red
+# |2|        |[MSG]| Green
+# |3|Creating|     | Yellow
+# |4|        | CP  | Blue
+# |5|        | LD  | Purple
+# |6|  C++   |     | Cyan
+# |7|        |     | Gray/white
+# +-+--------+-----+
+
+# $(call colorize,<br_color>,<br_text>,<text_color>,<text>)
+ifdef $(if $(FORCE_COLOR:0=),FORCE_COLOR,MAKE_TERMOUT)
+CFLAGS:=$(CFLAGS) -fdiagnostics-color
+CXXFLAGS:=$(CFLAGS) -fdiagnostics-color
+colorize=@printf "\033[$(1)m[$(2)]\033[m \033[$(3)m$(4)\033[m\n"
+else
+ifeq ($(SILENCER),)
+colorize=
+else
+colorize=@echo "[$(2)] $(4)"
+endif
+endif
+
+define newline :=
+
+
+endef
+
+# $(call remove,<list of file names to remove>)
+define remove =
+$(call colorize,1;91,RM ,91,Removing $(1))
+$(SILENCER)$(RM) -r $(1)
+endef
+
+# $(eval $(call add_deptree,<compiler with flags>,<output_filename_noext>,<input_filename_withoutsrc>))
+ifeq ($(MAKECMDGOALS),distclean)
+add_deptree=
+else
+define add_deptree =
+makedir/$(2).mk: | $$$$(@D)
+	$(call colorize,95,DEP,33,Creating $(3) dependancies)
+	$(SILENCER)set -e; $(1) -MM src/$(3) \
+	 | sed 's,\($$(notdir $$(basename $(3)))\)\.o[ :]*,$$(dir obj/$(OBJDIR)/$(3))\1.o: $$@'"\n"'$$(dir obj/$(OBJDIR)/$(3))\1.o $$@: ,g' >$$@
+include makedir/$(2).mk
+endef
+endif
+
+OBJLIST=$(OBJLIST_wrapperhelper) $(foreach test,$(TESTS),$(call test_o,$(test)))
+OBJLIST_wrapperhelper:=
+TESTS:=
+
+# $(call wrapperhelper_o,<base_dir>,<source_filename>,<output_filename>)
+wrapperhelper_o=obj/$(OBJDIR)/$(1)$(3).o
+# $(eval $(call compile_wrapperhelper_c,<base_dir>,<source_filename>,<output_filename>))
+define compile_wrapperhelper_c =
+$$(eval $$(call add_deptree,$$(CC) $$(CPPFLAGS) $$(CFLAGS),$(1)$(3),$(1)$(2).c))
+OBJLIST_wrapperhelper+= $(call wrapperhelper_o,$(1),$(2),$(3))
+$(call wrapperhelper_o,$(1),$(2),$(3)): src/$(1)$(2).c | $$$$(@D)
+	$(call colorize,36, C ,92,Compiling $$@)
+	$(SILENCER)$$(CC) $$(CPPFLAGS) $$(CFLAGS) -c src/$(1)$(2).c -o $$@
+endef
+# $(eval $(call compile_wrapperhelper_cxx,<base_dir>,<source_filename>,<output_filename>))
+define compile_wrapperhelper_cxx =
+$$(eval $$(call add_deptree,$$(CXX) $$(CPPFLAGS) $$(CXXFLAGS),$(1)$(3),$(1)$(2).cpp))
+OBJLIST_wrapperhelper+= $(call wrapperhelper_o,$(1),$(2),$(3))
+$(call wrapperhelper_o,$(1),$(2),$(3)): src/$(1)$(2).cpp | $$$$(@D)
+	$(call colorize,36,C++,92,Compiling $$@)
+	$(SILENCER)$$(CXX) $$(CPPFLAGS) $$(CXXFLAGS) -c src/$(1)$(2).cpp -o $$@
+endef
+
+# $(eval $(call compile_test_c,<test_dir/name>))
+define compile_test_c =
+$$(eval $$(call add_deptree,$$(CC) $$(CPPFLAGS) -Isrc/tests -Isrc $$(CFLAGS),tests/$(1),tests/$(1).c))
+TESTS+= $(1)
+tests/$(1): obj/$(OBJDIR)/tests/$(1).o | $$$$(@D)
+	$(call colorize,95,LD ,92,Linking $$@)
+	$(SILENCER)$$(CC) $$(LDFLAGS) -o $$@ obj/$(OBJDIR)/tests/$(1).o $$(LDLIBS)
+
+obj/$(OBJDIR)/tests/$(1).o: src/tests/$(1).c | $$$$(@D)
+	$(call colorize,36,C++,92,Compiling $$@)
+	$(SILENCER)$$(CC) $$(CPPFLAGS) -Isrc/tests -Isrc $$(CFLAGS) -c src/tests/$(1).c -o $$@
+endef
+# $(eval $(call compile_test_cxx,<test_dir/name>))
+define compile_test_cxx =
+$$(eval $$(call add_deptree,$$(CXX) $$(CPPFLAGS) -Isrc/tests -Isrc $$(CXXFLAGS),tests/$(1),tests/$(1).cpp))
+TESTS+= $(1)
+tests/$(1): obj/$(OBJDIR)/tests/$(1).o | $$$$(@D)
+	$(call colorize,95,LD ,92,Linking $$@)
+	$(SILENCER)$$(CXX) $$(LDFLAGS) -o $$@ obj/$(OBJDIR)/tests/$(1).o $$(LDLIBS)
+
+obj/$(OBJDIR)/tests/$(1).o: src/tests/$(1).cpp | $$$$(@D)
+	$(call colorize,36,C++,92,Compiling $$@)
+	$(SILENCER)$$(CXX) $$(CPPFLAGS) -Isrc/tests -Isrc $$(CXXFLAGS) -c src/tests/$(1).cpp -o $$@
+endef
+
+$(eval $(call compile_wrapperhelper_c,,cstring,cstring))
+$(eval $(call compile_wrapperhelper_c,,generator,generator))
+$(eval $(call compile_wrapperhelper_c,,lang,lang))
+$(eval $(call compile_wrapperhelper_c,,main,main))
+$(eval $(call compile_wrapperhelper_c,,parse,parse))
+$(eval $(call compile_wrapperhelper_c,,prepare,prepare))
+$(eval $(call compile_wrapperhelper_c,,preproc,preproc))
+$(eval $(call compile_wrapperhelper_c,,vector,vector))
+$(call wrapperhelper_o,,preproc,preproc): CFLAGS+= -fno-analyzer
+$(call wrapperhelper_o,,parse,parse): CFLAGS+= -fno-analyzer
+
+#$(eval $(call compile_test_cxx,core/number))
+
+bin/wrapperhelper: $$(OBJLIST_wrapperhelper) | $$(@D)
+	$(call colorize,95,LD ,92,Linking $@)
+	$(SILENCER)$(CXX) $(LDFLAGS) -o $@ $(OBJLIST_wrapperhelper) $(LDLIBS)
+
+wrapperhelper: bin/wrapperhelper
+alltests: $(TESTS:%=tests/%)
+.PHONY: wrapperhelper alltests
+
+all: wrapperhelper alltests
+
+clean:
+	$(call remove,$(OBJLIST))
+	$(call remove,bin/wrapperhelper)
+	$(call remove,$(TESTS:%=obj/$(OBJDIR)/tests/%.o))
+	$(call remove,$(TESTS:%=tests/%))
+.PHONY: clean
+distclean:
+	$(call remove,makedir)
+	$(call remove,obj)
+	$(call remove,bin tests)
+.PHONY: distclean
+
+sanitize/help:
+	@echo "Sanitizers:"
+	@echo "- address (removes leak)"
+	@echo "- leak (removes address)"
+	@echo "- undefined behavior"
+	@echo ""
+	@echo "Currently active options:"
+	@[ $(ASAN_ON) -eq 0 ] || echo "- address"
+	@[ $(LSAN_ON) -eq 0 ] || echo "- leak"
+	@[ $(USAN_ON) -eq 0 ] || echo "- undefined behavior"
+sanitize/address:
+	@[ $(ASAN_ON) -eq 0 ] && echo "Not sanitizing address" || echo "Sanitizing address"
+sanitize/leak:
+	@[ $(LSAN_ON) -eq 0 ] && echo "Not sanitizing leak" || echo "Sanitizing leak"
+sanitize/undefined:
+	@[ $(USAN_ON) -eq 0 ] && echo "Not sanitizing undefined behavior" || echo "Sanitizing undefined behavior"
+sanitize/address/on:
+	$(SILENCER)touch sanaddress
+	$(SILENCER)$(RM) sanleak
+sanitize/leak/on:
+	$(SILENCER)touch sanleak
+	$(SILENCER)$(RM) sanaddress
+sanitize/undefined/on:
+	$(SILENCER)touch sanundefined
+sanitize/address/off:
+	$(SILENCER)$(RM) sanaddress
+sanitize/leak/off:
+	$(SILENCER)$(RM) sanleak
+sanitize/undefined/off:
+	$(SILENCER)$(RM) sanundefined
+.PHONY: sanitize/address     sanitize/leak     sanitize/undefined
+.PHONY: sanitize/address/on  sanitize/leak/on  sanitize/undefined/on
+.PHONY: sanitize/address/off sanitize/leak/off sanitize/undefined/off
+
+tree:
+	@tree src
+.PHONY: tree
+
+.DELETE_ON_ERROR: