best makefile
authorLaurent Mazet <mazet@softndesign.org>
Sat, 30 Dec 2023 06:42:55 +0000 (07:42 +0100)
committerLaurent Mazet <mazet@softndesign.org>
Sat, 30 Dec 2023 06:42:55 +0000 (07:42 +0100)
makefile

index abcb7b0fe1a1b7523b9df1fffa9cff44c0297481..3b508f671c44b9a297a8fd384b8515b1b4300d8f 100644 (file)
--- a/makefile
+++ b/makefile
@@ -12,8 +12,13 @@ OFLAGS  = -O4 -Os
 #OFLAGS += -malign-double
 CFLAGS += -W -Wall -Wextra -g
 #CFLAGS += -std=c99 -D_XOPEN_SOURCE=500
-CFLAGS += $(OFLAGS) $(INCLUDES) $(GCOV)
-LDFLAGS += -g $(GCOV)
+CFLAGS += $(OFLAGS) $(INCLUDES) $(OPTIONS)
+LDFLAGS += -g $(OPTIONS)
+
+ifeq ($(OS),Windows_NT)
+#LDLIBS += -lws2_32
+endif
+
 
 # Targets
 
@@ -50,7 +55,7 @@ count:
 clean:
        $(call TITLE, "Cleaning")
        touch clean
-       rm -f clean $(wildcard *.d *.ld *.log *.o *.test *~ .exec_*)
+       rm -f clean $(wildcard *.d *.ld *.log *.o *.test *~ .exec_* gmon.out)
        $(call PASS, SUCCESS)
 
 depends: $(patsubst %.c, %.d, $(wildcard *.c)) $(patsubst %, %.ld, $(ALLEXE))
@@ -58,6 +63,9 @@ depends: $(patsubst %.c, %.d, $(wildcard *.c)) $(patsubst %, %.ld, $(ALLEXE))
 gcovs:
        $(MAKE) $(addprefix gcov_,$(ALLEXE))
 
+gprofs:
+       $(MAKE) $(addprefix gprof_,$(ALLEXE))
+
 purge: clean
        $(call TITLE, "Purging")
        touch purge
@@ -70,7 +78,7 @@ valgrinds: all
 wipe: purge
        $(call TITLE, "Wiping")
        touch wipe
-       rm -f wipe $(wildcard *.gcda *.gcno *.gcov)
+       rm -f wipe $(wildcard *.gcda *.gcno *.gcov *.glog)
        $(call PASS, SUCCESS)
 
 tests: all
@@ -83,7 +91,7 @@ include $(wildcard *.ld)
 
 gcov_%:
        $(MAKE) purge
-       GCOV="-coverage -O0" $(MAKE)
+       OPTIONS="-coverage -O0" $(MAKE)
        $(MAKE) test_$(@:gcov_%=%)
        gcov `sed -e 's/\.exe:/.c/;s/\.o/.c/g' $(@:gcov_%=%.ld)`
        touch gcov
@@ -91,6 +99,25 @@ gcov_%:
        $(MAKE) purge
        grep '#####' *.c.gcov || true
 
+gprof_%:
+       $(MAKE) purge
+       $(MAKE) depends
+       OPTIONS="-pg" $(MAKE) ${@:gprof_%=%}.exe
+       $(MAKE) ${@:gprof_%=%}.test
+       IFS=$$'\n'; id=1; \
+               for test in `cat ${@:gprof_%=%}.test | sed 's,${@:gprof_%=%}.exe,./${@:gprof_%=%}.exe,g'`; do \
+               log=${@:gprof_%=%}.prof-$$id.glog; \
+               $(call TITLE, test: $$test); \
+               echo $$test > $$log; \
+               eval $$test >> $$log; \
+               [ $$? -eq 0 ] \
+                       && echo -e "\033[1;32mSUCCESS\033[0;0m" \
+                       || echo -e "\033[1;31mFAILED\033[0;0m"; \
+               [ -f gmon.out ] && { gprof ${@:gprof_%=%}.exe gmon.out >> $$log; rm gmon.out; }; \
+               let id++; \
+       done;
+       $(MAKE) purge
+
 %.test: %.c
        $(call TITLE, "Building $@")
 #      awk '/\/\* *test:.*\*\// { sub(/^.*\/\* *test: */, ""); sub(/ *\*\/.*$$/, ""); print }' $< > $@
@@ -132,7 +159,7 @@ valgrind_%: %.exe
 
 %.exe: %.o %.d
        $(call TITLE, "Building $@")
-       $(CC) $(LDFLAGS) $< $(shell perl -- getcomments.pl -p='linker:\s' -f='%' ${<:.o=.c}) -o $@
+       $(CC) $(LDFLAGS) $< $(shell perl -- getcomments.pl -p='linker:\s' -f='%' ${<:.o=.c}) $(LDLIBS) -o $@
        $(call PASS, SUCCESS)
 
 ## Phony