On Fri, Mar 8, 2024 at 9:32 AM DSB <ya...@boyski.com> wrote: > Is there a scripted way to > reliably build make at each bisection point (assuming 4.3 as the minimum)?
There is definitely a scripted way to do this. i use this small makefile (see in the attachment) instead of the automake generated one. This makefile builds make from all .c files located in src/ and lib/. Keep your src/ and lib/ free of stray .c files. This makefile also correctly handles removals of header files and all other known .d file necessities. To use it 1. Create a subdirectory in your make source code directory. Step to this newly created subdirectory. 2. Run ../configure. This needs to be done once to generate config.h. 3. Run make -f ../test.mk. 4. Checkout another commit and run make -f ../test.mk. No need to run configure or bootstrap again. Here is a sample bash session. dgoncharov@opti:~/src/gmake/make $ mkdir t64 dgoncharov@opti:~/src/gmake/make $ cd t64 dgoncharov@opti:~/src/gmake/make/t64 $ ../configure --without-guile 'CFLAGS=-Wall -Wextra -ggdb -O0 -DMAKE_MAINTAINER_MODE=1 -m64 -fsanitize=leak -fsanitize=undefined -fsanitize-address-use-after-scope -fsanitize=address -fsanitize=pointer-compare -fsanitize=pointer-subtract' LDFLAGS=-m64 > /dev/null dgoncharov@opti:~/src/gmake/make/t64 $ make -f ../test.mk cc -I../src -I../lib -Isrc -DLOCALEDIR=\"/usr/local/share/locale\" -DLIBDIR=\"/usr/local/lib\" -Wall -Wextra -Wno-error -ggdb -O0 -m64 -fno-omit-frame-pointer -fno-common -fsanitize=address -fsanitize=pointer-compare -fsanitize=undefined -fsanitize=pointer-subtract -fsanitize=leak -MMD -MF ar.td -o ar.o -c ../src/ar.c || exit 1 read obj src headers <ar.td; echo "$headers" >ar.d || exit 1 touch -c ar.o cc -I../src -I../lib -Isrc -DLOCALEDIR=\"/usr/local/share/locale\" -DLIBDIR=\"/usr/local/lib\" -Wall -Wextra -Wno-error -ggdb -O0 -m64 -fno-omit-frame-pointer -fno-common -fsanitize=address -fsanitize=pointer-compare -fsanitize=undefined -fsanitize=pointer-subtract -fsanitize=leak -MMD -MF arscan.td -o arscan.o -c ../src/arscan.c || exit 1 read obj src headers <arscan.td; echo "$headers" >arscan.d || exit 1 touch -c arscan.o cc -I../src -I../lib -Isrc -DLOCALEDIR=\"/usr/local/share/locale\" -DLIBDIR=\"/usr/local/lib\" -Wall -Wextra -Wno-error -ggdb -O0 -m64 -fno-omit-frame-pointer -fno-common -fsanitize=address -fsanitize=pointer-compare -fsanitize=undefined -fsanitize=pointer-subtract -fsanitize=leak -MMD -MF commands.td -o commands.o -c ../src/commands.c || exit 1 read obj src headers <commands.td; echo "$headers" >commands.d || exit 1 touch -c commands.o cc -I../src -I../lib -Isrc -DLOCALEDIR=\"/usr/local/share/locale\" -DLIBDIR=\"/usr/local/lib\" -Wall -Wextra -Wno-error -ggdb -O0 -m64 -fno-omit-frame-pointer -fno-common -fsanitize=address -fsanitize=pointer-compare -fsanitize=undefined -fsanitize=pointer-subtract -fsanitize=leak -MMD -MF default.td -o default.o -c ../src/default.c || exit 1 read obj src headers <default.td; echo "$headers" >default.d || exit 1 touch -c default.o cc -I../src -I../lib -Isrc -DLOCALEDIR=\"/usr/local/share/locale\" -DLIBDIR=\"/usr/local/lib\" -Wall -Wextra -Wno-error -ggdb -O0 -m64 -fno-omit-frame-pointer -fno-common -fsanitize=address -fsanitize=pointer-compare -fsanitize=undefined -fsanitize=pointer-subtract -fsanitize=leak -MMD -MF dir.td -o dir.o -c ../src/dir.c || exit 1 read obj src headers <dir.td; echo "$headers" >dir.d || exit 1 touch -c dir.o cc -I../src -I../lib -Isrc -DLOCALEDIR=\"/usr/local/share/locale\" -DLIBDIR=\"/usr/local/lib\" -Wall -Wextra -Wno-error -ggdb -O0 -m64 -fno-omit-frame-pointer -fno-common -fsanitize=address -fsanitize=pointer-compare -fsanitize=undefined -fsanitize=pointer-subtract -fsanitize=leak -MMD -MF expand.td -o expand.o -c ../src/expand.c || exit 1 read obj src headers <expand.td; echo "$headers" >expand.d || exit 1 touch -c expand.o cc -I../src -I../lib -Isrc -DLOCALEDIR=\"/usr/local/share/locale\" -DLIBDIR=\"/usr/local/lib\" -Wall -Wextra -Wno-error -ggdb -O0 -m64 -fno-omit-frame-pointer -fno-common -fsanitize=address -fsanitize=pointer-compare -fsanitize=undefined -fsanitize=pointer-subtract -fsanitize=leak -MMD -MF file.td -o file.o -c ../src/file.c || exit 1 read obj src headers <file.td; echo "$headers" >file.d || exit 1 touch -c file.o cc -I../src -I../lib -Isrc -DLOCALEDIR=\"/usr/local/share/locale\" -DLIBDIR=\"/usr/local/lib\" -Wall -Wextra -Wno-error -ggdb -O0 -m64 -fno-omit-frame-pointer -fno-common -fsanitize=address -fsanitize=pointer-compare -fsanitize=undefined -fsanitize=pointer-subtract -fsanitize=leak -MMD -MF function.td -o function.o -c ../src/function.c || exit 1 read obj src headers <function.td; echo "$headers" >function.d || exit 1 touch -c function.o cc -I../src -I../lib -Isrc -DLOCALEDIR=\"/usr/local/share/locale\" -DLIBDIR=\"/usr/local/lib\" -Wall -Wextra -Wno-error -ggdb -O0 -m64 -fno-omit-frame-pointer -fno-common -fsanitize=address -fsanitize=pointer-compare -fsanitize=undefined -fsanitize=pointer-subtract -fsanitize=leak -MMD -MF getopt.td -o getopt.o -c ../src/getopt.c || exit 1 read obj src headers <getopt.td; echo "$headers" >getopt.d || exit 1 touch -c getopt.o cc -I../src -I../lib -Isrc -DLOCALEDIR=\"/usr/local/share/locale\" -DLIBDIR=\"/usr/local/lib\" -Wall -Wextra -Wno-error -ggdb -O0 -m64 -fno-omit-frame-pointer -fno-common -fsanitize=address -fsanitize=pointer-compare -fsanitize=undefined -fsanitize=pointer-subtract -fsanitize=leak -MMD -MF getopt1.td -o getopt1.o -c ../src/getopt1.c || exit 1 read obj src headers <getopt1.td; echo "$headers" >getopt1.d || exit 1 touch -c getopt1.o cc -I../src -I../lib -Isrc -DLOCALEDIR=\"/usr/local/share/locale\" -DLIBDIR=\"/usr/local/lib\" -Wall -Wextra -Wno-error -ggdb -O0 -m64 -fno-omit-frame-pointer -fno-common -fsanitize=address -fsanitize=pointer-compare -fsanitize=undefined -fsanitize=pointer-subtract -fsanitize=leak -MMD -MF guile.td -o guile.o -c ../src/guile.c || exit 1 read obj src headers <guile.td; echo "$headers" >guile.d || exit 1 touch -c guile.o cc -I../src -I../lib -Isrc -DLOCALEDIR=\"/usr/local/share/locale\" -DLIBDIR=\"/usr/local/lib\" -Wall -Wextra -Wno-error -ggdb -O0 -m64 -fno-omit-frame-pointer -fno-common -fsanitize=address -fsanitize=pointer-compare -fsanitize=undefined -fsanitize=pointer-subtract -fsanitize=leak -MMD -MF hash.td -o hash.o -c ../src/hash.c || exit 1 read obj src headers <hash.td; echo "$headers" >hash.d || exit 1 touch -c hash.o cc -I../src -I../lib -Isrc -DLOCALEDIR=\"/usr/local/share/locale\" -DLIBDIR=\"/usr/local/lib\" -Wall -Wextra -Wno-error -ggdb -O0 -m64 -fno-omit-frame-pointer -fno-common -fsanitize=address -fsanitize=pointer-compare -fsanitize=undefined -fsanitize=pointer-subtract -fsanitize=leak -MMD -MF implicit.td -o implicit.o -c ../src/implicit.c || exit 1 read obj src headers <implicit.td; echo "$headers" >implicit.d || exit 1 touch -c implicit.o cc -I../src -I../lib -Isrc -DLOCALEDIR=\"/usr/local/share/locale\" -DLIBDIR=\"/usr/local/lib\" -Wall -Wextra -Wno-error -ggdb -O0 -m64 -fno-omit-frame-pointer -fno-common -fsanitize=address -fsanitize=pointer-compare -fsanitize=undefined -fsanitize=pointer-subtract -fsanitize=leak -MMD -MF job.td -o job.o -c ../src/job.c || exit 1 read obj src headers <job.td; echo "$headers" >job.d || exit 1 touch -c job.o cc -I../src -I../lib -Isrc -DLOCALEDIR=\"/usr/local/share/locale\" -DLIBDIR=\"/usr/local/lib\" -Wall -Wextra -Wno-error -ggdb -O0 -m64 -fno-omit-frame-pointer -fno-common -fsanitize=address -fsanitize=pointer-compare -fsanitize=undefined -fsanitize=pointer-subtract -fsanitize=leak -MMD -MF load.td -o load.o -c ../src/load.c || exit 1 read obj src headers <load.td; echo "$headers" >load.d || exit 1 touch -c load.o cc -I../src -I../lib -Isrc -DLOCALEDIR=\"/usr/local/share/locale\" -DLIBDIR=\"/usr/local/lib\" -Wall -Wextra -Wno-error -ggdb -O0 -m64 -fno-omit-frame-pointer -fno-common -fsanitize=address -fsanitize=pointer-compare -fsanitize=undefined -fsanitize=pointer-subtract -fsanitize=leak -MMD -MF loadapi.td -o loadapi.o -c ../src/loadapi.c || exit 1 read obj src headers <loadapi.td; echo "$headers" >loadapi.d || exit 1 touch -c loadapi.o cc -I../src -I../lib -Isrc -DLOCALEDIR=\"/usr/local/share/locale\" -DLIBDIR=\"/usr/local/lib\" -Wall -Wextra -Wno-error -ggdb -O0 -m64 -fno-omit-frame-pointer -fno-common -fsanitize=address -fsanitize=pointer-compare -fsanitize=undefined -fsanitize=pointer-subtract -fsanitize=leak -MMD -MF main.td -o main.o -c ../src/main.c || exit 1 read obj src headers <main.td; echo "$headers" >main.d || exit 1 touch -c main.o cc -I../src -I../lib -Isrc -DLOCALEDIR=\"/usr/local/share/locale\" -DLIBDIR=\"/usr/local/lib\" -Wall -Wextra -Wno-error -ggdb -O0 -m64 -fno-omit-frame-pointer -fno-common -fsanitize=address -fsanitize=pointer-compare -fsanitize=undefined -fsanitize=pointer-subtract -fsanitize=leak -MMD -MF misc.td -o misc.o -c ../src/misc.c || exit 1 read obj src headers <misc.td; echo "$headers" >misc.d || exit 1 touch -c misc.o cc -I../src -I../lib -Isrc -DLOCALEDIR=\"/usr/local/share/locale\" -DLIBDIR=\"/usr/local/lib\" -Wall -Wextra -Wno-error -ggdb -O0 -m64 -fno-omit-frame-pointer -fno-common -fsanitize=address -fsanitize=pointer-compare -fsanitize=undefined -fsanitize=pointer-subtract -fsanitize=leak -MMD -MF output.td -o output.o -c ../src/output.c || exit 1 read obj src headers <output.td; echo "$headers" >output.d || exit 1 touch -c output.o cc -I../src -I../lib -Isrc -DLOCALEDIR=\"/usr/local/share/locale\" -DLIBDIR=\"/usr/local/lib\" -Wall -Wextra -Wno-error -ggdb -O0 -m64 -fno-omit-frame-pointer -fno-common -fsanitize=address -fsanitize=pointer-compare -fsanitize=undefined -fsanitize=pointer-subtract -fsanitize=leak -MMD -MF posixos.td -o posixos.o -c ../src/posixos.c || exit 1 read obj src headers <posixos.td; echo "$headers" >posixos.d || exit 1 touch -c posixos.o cc -I../src -I../lib -Isrc -DLOCALEDIR=\"/usr/local/share/locale\" -DLIBDIR=\"/usr/local/lib\" -Wall -Wextra -Wno-error -ggdb -O0 -m64 -fno-omit-frame-pointer -fno-common -fsanitize=address -fsanitize=pointer-compare -fsanitize=undefined -fsanitize=pointer-subtract -fsanitize=leak -MMD -MF read.td -o read.o -c ../src/read.c || exit 1 read obj src headers <read.td; echo "$headers" >read.d || exit 1 touch -c read.o cc -I../src -I../lib -Isrc -DLOCALEDIR=\"/usr/local/share/locale\" -DLIBDIR=\"/usr/local/lib\" -Wall -Wextra -Wno-error -ggdb -O0 -m64 -fno-omit-frame-pointer -fno-common -fsanitize=address -fsanitize=pointer-compare -fsanitize=undefined -fsanitize=pointer-subtract -fsanitize=leak -MMD -MF remake.td -o remake.o -c ../src/remake.c || exit 1 read obj src headers <remake.td; echo "$headers" >remake.d || exit 1 touch -c remake.o cc -I../src -I../lib -Isrc -DLOCALEDIR=\"/usr/local/share/locale\" -DLIBDIR=\"/usr/local/lib\" -Wall -Wextra -Wno-error -ggdb -O0 -m64 -fno-omit-frame-pointer -fno-common -fsanitize=address -fsanitize=pointer-compare -fsanitize=undefined -fsanitize=pointer-subtract -fsanitize=leak -MMD -MF remote-stub.td -o remote-stub.o -c ../src/remote-stub.c || exit 1 read obj src headers <remote-stub.td; echo "$headers" >remote-stub.d || exit 1 touch -c remote-stub.o cc -I../src -I../lib -Isrc -DLOCALEDIR=\"/usr/local/share/locale\" -DLIBDIR=\"/usr/local/lib\" -Wall -Wextra -Wno-error -ggdb -O0 -m64 -fno-omit-frame-pointer -fno-common -fsanitize=address -fsanitize=pointer-compare -fsanitize=undefined -fsanitize=pointer-subtract -fsanitize=leak -MMD -MF rule.td -o rule.o -c ../src/rule.c || exit 1 read obj src headers <rule.td; echo "$headers" >rule.d || exit 1 touch -c rule.o cc -I../src -I../lib -Isrc -DLOCALEDIR=\"/usr/local/share/locale\" -DLIBDIR=\"/usr/local/lib\" -Wall -Wextra -Wno-error -ggdb -O0 -m64 -fno-omit-frame-pointer -fno-common -fsanitize=address -fsanitize=pointer-compare -fsanitize=undefined -fsanitize=pointer-subtract -fsanitize=leak -MMD -MF shuffle.td -o shuffle.o -c ../src/shuffle.c || exit 1 read obj src headers <shuffle.td; echo "$headers" >shuffle.d || exit 1 touch -c shuffle.o cc -I../src -I../lib -Isrc -DLOCALEDIR=\"/usr/local/share/locale\" -DLIBDIR=\"/usr/local/lib\" -Wall -Wextra -Wno-error -ggdb -O0 -m64 -fno-omit-frame-pointer -fno-common -fsanitize=address -fsanitize=pointer-compare -fsanitize=undefined -fsanitize=pointer-subtract -fsanitize=leak -MMD -MF signame.td -o signame.o -c ../src/signame.c || exit 1 read obj src headers <signame.td; echo "$headers" >signame.d || exit 1 touch -c signame.o cc -I../src -I../lib -Isrc -DLOCALEDIR=\"/usr/local/share/locale\" -DLIBDIR=\"/usr/local/lib\" -Wall -Wextra -Wno-error -ggdb -O0 -m64 -fno-omit-frame-pointer -fno-common -fsanitize=address -fsanitize=pointer-compare -fsanitize=undefined -fsanitize=pointer-subtract -fsanitize=leak -MMD -MF strcache.td -o strcache.o -c ../src/strcache.c || exit 1 read obj src headers <strcache.td; echo "$headers" >strcache.d || exit 1 touch -c strcache.o cc -I../src -I../lib -Isrc -DLOCALEDIR=\"/usr/local/share/locale\" -DLIBDIR=\"/usr/local/lib\" -Wall -Wextra -Wno-error -ggdb -O0 -m64 -fno-omit-frame-pointer -fno-common -fsanitize=address -fsanitize=pointer-compare -fsanitize=undefined -fsanitize=pointer-subtract -fsanitize=leak -MMD -MF variable.td -o variable.o -c ../src/variable.c || exit 1 read obj src headers <variable.td; echo "$headers" >variable.d || exit 1 touch -c variable.o cc -I../src -I../lib -Isrc -DLOCALEDIR=\"/usr/local/share/locale\" -DLIBDIR=\"/usr/local/lib\" -Wall -Wextra -Wno-error -ggdb -O0 -m64 -fno-omit-frame-pointer -fno-common -fsanitize=address -fsanitize=pointer-compare -fsanitize=undefined -fsanitize=pointer-subtract -fsanitize=leak -MMD -MF version.td -o version.o -c ../src/version.c || exit 1 read obj src headers <version.td; echo "$headers" >version.d || exit 1 touch -c version.o cc -I../src -I../lib -Isrc -DLOCALEDIR=\"/usr/local/share/locale\" -DLIBDIR=\"/usr/local/lib\" -Wall -Wextra -Wno-error -ggdb -O0 -m64 -fno-omit-frame-pointer -fno-common -fsanitize=address -fsanitize=pointer-compare -fsanitize=undefined -fsanitize=pointer-subtract -fsanitize=leak -MMD -MF vpath.td -o vpath.o -c ../src/vpath.c || exit 1 read obj src headers <vpath.td; echo "$headers" >vpath.d || exit 1 touch -c vpath.o cc -I../src -I../lib -Isrc -DLOCALEDIR=\"/usr/local/share/locale\" -DLIBDIR=\"/usr/local/lib\" -Wall -Wextra -Wno-error -ggdb -O0 -m64 -fno-omit-frame-pointer -fno-common -fsanitize=address -fsanitize=pointer-compare -fsanitize=undefined -fsanitize=pointer-subtract -fsanitize=leak -MMD -MF warning.td -o warning.o -c ../src/warning.c || exit 1 read obj src headers <warning.td; echo "$headers" >warning.d || exit 1 touch -c warning.o cc -I../src -I../lib -Isrc -DLOCALEDIR=\"/usr/local/share/locale\" -DLIBDIR=\"/usr/local/lib\" -Wall -Wextra -Wno-error -ggdb -O0 -m64 -fno-omit-frame-pointer -fno-common -fsanitize=address -fsanitize=pointer-compare -fsanitize=undefined -fsanitize=pointer-subtract -fsanitize=leak -MMD -MF alloca.td -o alloca.o -c ../lib/alloca.c || exit 1 read obj src headers <alloca.td; echo "$headers" >alloca.d || exit 1 touch -c alloca.o cc -I../src -I../lib -Isrc -DLOCALEDIR=\"/usr/local/share/locale\" -DLIBDIR=\"/usr/local/lib\" -Wall -Wextra -Wno-error -ggdb -O0 -m64 -fno-omit-frame-pointer -fno-common -fsanitize=address -fsanitize=pointer-compare -fsanitize=undefined -fsanitize=pointer-subtract -fsanitize=leak -MMD -MF concat-filename.td -o concat-filename.o -c ../lib/concat-filename.c || exit 1 read obj src headers <concat-filename.td; echo "$headers" >concat-filename.d || exit 1 touch -c concat-filename.o cc -I../src -I../lib -Isrc -DLOCALEDIR=\"/usr/local/share/locale\" -DLIBDIR=\"/usr/local/lib\" -Wall -Wextra -Wno-error -ggdb -O0 -m64 -fno-omit-frame-pointer -fno-common -fsanitize=address -fsanitize=pointer-compare -fsanitize=undefined -fsanitize=pointer-subtract -fsanitize=leak -MMD -MF findprog-in.td -o findprog-in.o -c ../lib/findprog-in.c || exit 1 read obj src headers <findprog-in.td; echo "$headers" >findprog-in.d || exit 1 touch -c findprog-in.o cc -I../src -I../lib -Isrc -DLOCALEDIR=\"/usr/local/share/locale\" -DLIBDIR=\"/usr/local/lib\" -Wall -Wextra -Wno-error -ggdb -O0 -m64 -fno-omit-frame-pointer -fno-common -fsanitize=address -fsanitize=pointer-compare -fsanitize=undefined -fsanitize=pointer-subtract -fsanitize=leak -MMD -MF fnmatch.td -o fnmatch.o -c ../lib/fnmatch.c || exit 1 read obj src headers <fnmatch.td; echo "$headers" >fnmatch.d || exit 1 touch -c fnmatch.o cc -I../src -I../lib -Isrc -DLOCALEDIR=\"/usr/local/share/locale\" -DLIBDIR=\"/usr/local/lib\" -Wall -Wextra -Wno-error -ggdb -O0 -m64 -fno-omit-frame-pointer -fno-common -fsanitize=address -fsanitize=pointer-compare -fsanitize=undefined -fsanitize=pointer-subtract -fsanitize=leak -MMD -MF getloadavg.td -o getloadavg.o -c ../lib/getloadavg.c || exit 1 read obj src headers <getloadavg.td; echo "$headers" >getloadavg.d || exit 1 touch -c getloadavg.o cc -I../src -I../lib -Isrc -DLOCALEDIR=\"/usr/local/share/locale\" -DLIBDIR=\"/usr/local/lib\" -Wall -Wextra -Wno-error -ggdb -O0 -m64 -fno-omit-frame-pointer -fno-common -fsanitize=address -fsanitize=pointer-compare -fsanitize=undefined -fsanitize=pointer-subtract -fsanitize=leak -MMD -MF glob.td -o glob.o -c ../lib/glob.c || exit 1 read obj src headers <glob.td; echo "$headers" >glob.d || exit 1 touch -c glob.o cc -I../src -I../lib -Isrc -DLOCALEDIR=\"/usr/local/share/locale\" -DLIBDIR=\"/usr/local/lib\" -Wall -Wextra -Wno-error -ggdb -O0 -m64 -fno-omit-frame-pointer -fno-common -fsanitize=address -fsanitize=pointer-compare -fsanitize=undefined -fsanitize=pointer-subtract -fsanitize=leak -MMD -MF strtol.td -o strtol.o -c ../lib/strtol.c || exit 1 read obj src headers <strtol.td; echo "$headers" >strtol.d || exit 1 touch -c strtol.o cc -o make ar.o arscan.o commands.o default.o dir.o expand.o file.o function.o getopt.o getopt1.o guile.o hash.o implicit.o job.o load.o loadapi.o main.o misc.o output.o posixos.o read.o remake.o remote-stub.o rule.o shuffle.o signame.o strcache.o variable.o version.o vpath.o warning.o alloca.o concat-filename.o findprog-in.o fnmatch.o getloadavg.o glob.o strtol.o -fsanitize=address -fsanitize=pointer-compare -fsanitize=undefined -fsanitize=pointer-subtract -fsanitize=leak dgoncharov@opti:~/src/gmake/make/t64 $ This makefile assumes the gcc depfiles format. See here https://github.com/dgoncharov/efficient-autodeps-with-gmake how to modify this makefile if your compiler generates depfiles of the other format. regards, Dmitry
MAKEFLAGS+=-r SHELL:=/bin/bash .ONESHELL: .SECONDEXPANSION: osname:=$(shell uname -s) # This makefile expects to find the sources in the parent directory. srcdir:=.. vpath %.c $(srcdir)/src vpath %.c $(srcdir)/lib target:=make src:=$(notdir $(wildcard $(srcdir)/src/*.c) $(wildcard $(srcdir)/lib/*.c)) src:=$(filter-out remote-cstms.c, $(src)) src:=$(filter-out vms%.c, $(src)) obj:=$(src:.c=.o) dfiles:=$(src:.c=.d) .SECONDARY: $(obj) asan_flags:=-fsanitize=address -fsanitize=pointer-compare\ -fsanitize=undefined -fsanitize=pointer-subtract #TODO: upgrade compiler on mac ifeq ($(osname), Linux) asan_flags+=-fsanitize=leak endif all_ldflags:=$(asan_flags) $(LDFLAGS) all: $(target) $(target): $(obj) $(CC) -o $@ $^ $(all_ldflags) # no-omit-frame-pointer to have proper backtrace. # no-common to let asan instrument global variables. # The options are gcc specific. # The expected format of the generated .d files is the one used by gcc. all_cppflags:=-I$(srcdir)/src -I$(srcdir)/lib -Isrc\ -DLOCALEDIR=\"/usr/local/share/locale\" -DLIBDIR=\"/usr/local/lib\" $(CPPFLAGS) all_cflags:=-Wall -Wextra -Wno-error -ggdb -O0 -m64\ -fno-omit-frame-pointer\ -fno-common\ $(asan_flags) $(CFLAGS) $(obj): %.o: %.c %.d $$(file <%.d) $(CC) $(all_cppflags) $(all_cflags) -MMD -MF $*.td -o $@ -c $< || exit 1 read obj src headers <$*.td; echo "$$headers" >$*.d || exit 1 touch -c $@ $(dfiles):; %.h:; asanopts:=detect_stack_use_after_return=0:detect_invalid_pointer_pairs=2:abort_on_error=1:disable_coredump=0:unmap_shadow_on_exit=1 check: ASAN_OPTIONS=$(asanopts) ./$(target) check clean: rm -f $(target) $(obj) $(dfiles) $(obj:.o=.td) print-%: force $(info $*=$($*)) .PHONY: all clean force check $(srcdir)/test.mk::;