From 29eaecb57bf3b72730397eb2b6a2ca1e8c60393b Mon Sep 17 00:00:00 2001 From: "Michael D. Lowis" Date: Tue, 14 Dec 2021 23:30:07 -0500 Subject: [PATCH] added auto rule generation --- Makefile | 10 +-- bin/rules.mk | 3 + config.mk | 10 ++- genrules.sh | 30 ++++---- rules.mk | 190 --------------------------------------------------- 5 files changed, 32 insertions(+), 211 deletions(-) create mode 100644 bin/rules.mk delete mode 100644 rules.mk diff --git a/Makefile b/Makefile index 58addd3..5c64912 100644 --- a/Makefile +++ b/Makefile @@ -1,14 +1,16 @@ -.PHONY: all libs bins clean rules +.PHONY: all libs bins clean all: libs bins clean: find build/ -type f -delete - -rules: - ./genrules.sh + rm -r build/ rules.mk bins: libs include config.mk + +rules.mk: + ./genrules.sh $(OUTDIR) include rules.mk +include bin/rules.mk diff --git a/bin/rules.mk b/bin/rules.mk new file mode 100644 index 0000000..a4af44e --- /dev/null +++ b/bin/rules.mk @@ -0,0 +1,3 @@ +$(BINDIR)/dial: LIBS += -lnet +$(BINDIR)/listen: LIBS += -lnet +$(BINDIR)/screenlock: LIBS += -lnet -lui -lX11 -lXft -lfontconfig diff --git a/config.mk b/config.mk index 9f5b5a5..cf179ab 100644 --- a/config.mk +++ b/config.mk @@ -1,4 +1,6 @@ -MAKEFLAGS = -j8 +MAKEFLAGS = -j +OUTDIR = build +BINDIR = $(OUTDIR)/bin CC = cc CFLAGS = -g -Wall -Wextra -Werror @@ -7,8 +9,10 @@ CPPFLAGS = -Iinc/ -I/usr/include/freetype2 AR = ar ARFLAGS = rs -LDFLAGS = -Lbuild/lib/ -la -lnet -lui -lX11 -lXft -lfontconfig +LDFLAGS = -Lbuild/lib/ $(LIBS) +LIBS = -la +#LIBS = -la -lnet -lui -lX11 -lXft -lfontconfig ARCHIVE = $(AR) $(ARFLAGS) $@ $^ BINARY = $(CC) $(CFLAGS) $(CPPFLAGS) -o $@ $< $(LDFLAGS) -OBJECT = $(CC) $(CFLAGS) $(CPPFLAGS) -MMD -c -o $@ $< +OBJECT = $(CC) $(CFLAGS) $(CPPFLAGS) -MMD -c -o $@ $< diff --git a/genrules.sh b/genrules.sh index 28e91f6..6a58c6d 100755 --- a/genrules.sh +++ b/genrules.sh @@ -1,35 +1,37 @@ #!/bin/sh -rm -rf build/ +OUTDIR="$1" + printf "" > rules.mk libs="" { + mkdir -p "$OUTDIR/bin/" + mkdir -p "$OUTDIR/lib/" + # Generate rules for all libraries for lib in lib/*; do libdir="$(dirname "$lib")" libname="$(basename "$lib")" - libs="$libs build/$libdir/lib$libname.a" + libs="$libs \$(OUTDIR)/$libdir/lib$libname.a" + mkdir -p "$OUTDIR/$lib/" for f in "$lib"/*; do - mkdir -p "build/$(dirname "$f")" - printf "%s\n" "build/${f%.c}.o: $f config.mk" + printf "%s\n" "\$(OUTDIR)/${f%.c}.o: $f config.mk" printf "\t\$(OBJECT)\n" - printf "%s\n" "build/$libdir/lib$libname.a: build/${f%.c}.o" - printf "%sinclude %s\n" '-' "build/${f%.c}.d" + printf "%s\n" "\$(OUTDIR)/$libdir/lib$libname.a: \$(OUTDIR)/${f%.c}.o" + printf "%sinclude %s\n" '-' "\$(OUTDIR)/${f%.c}.d" done - printf "%s\n" "build/$libdir/lib$libname.a:" + printf "%s\n" "\$(OUTDIR)/$libdir/lib$libname.a:" printf "\t\$(ARCHIVE)\n" - printf "%s\n" "libs: build/$libdir/lib$libname.a" - mkdir -p "build/$libdir/" + printf "%s\n" "libs: \$(OUTDIR)/$libdir/lib$libname.a" done - printf "libs = %s\n" "$libs" + printf "libs = %s\n" "$libs" # Generate rules for simple binaries for bin in bin/*.c; do - mkdir -p "build/bin/" - printf "%s\n" "build/${bin%.c}.o: $bin" + printf "%s\n" "\$(OUTDIR)/${bin%.c}.o: $bin" printf "\t\$(OBJECT)\n" - printf "%s\n" "build/${bin%.c}: build/${bin%.c}.o \$(libs)" + printf "%s\n" "\$(OUTDIR)/${bin%.c}: \$(OUTDIR)/${bin%.c}.o \$(libs)" printf "\t\$(BINARY)\n" - printf "%s\n" "bins: build/${bin%.c}" + printf "%s\n" "bins: \$(OUTDIR)/${bin%.c}" done } >> rules.mk diff --git a/rules.mk b/rules.mk deleted file mode 100644 index d8c04e8..0000000 --- a/rules.mk +++ /dev/null @@ -1,190 +0,0 @@ -build/lib/a/argv0.o: lib/a/argv0.c config.mk - $(OBJECT) -build/lib/liba.a: build/lib/a/argv0.o --include build/lib/a/argv0.d -build/lib/a/ecalloc.o: lib/a/ecalloc.c config.mk - $(OBJECT) -build/lib/liba.a: build/lib/a/ecalloc.o --include build/lib/a/ecalloc.d -build/lib/a/efopen.o: lib/a/efopen.c config.mk - $(OBJECT) -build/lib/liba.a: build/lib/a/efopen.o --include build/lib/a/efopen.d -build/lib/a/efreadline.o: lib/a/efreadline.c config.mk - $(OBJECT) -build/lib/liba.a: build/lib/a/efreadline.o --include build/lib/a/efreadline.d -build/lib/a/emalloc.o: lib/a/emalloc.c config.mk - $(OBJECT) -build/lib/liba.a: build/lib/a/emalloc.o --include build/lib/a/emalloc.d -build/lib/a/eraise.o: lib/a/eraise.c config.mk - $(OBJECT) -build/lib/liba.a: build/lib/a/eraise.o --include build/lib/a/eraise.d -build/lib/a/erealloc.o: lib/a/erealloc.c config.mk - $(OBJECT) -build/lib/liba.a: build/lib/a/erealloc.o --include build/lib/a/erealloc.d -build/lib/a/esignal.o: lib/a/esignal.c config.mk - $(OBJECT) -build/lib/liba.a: build/lib/a/esignal.o --include build/lib/a/esignal.d -build/lib/a/estrdup.o: lib/a/estrdup.c config.mk - $(OBJECT) -build/lib/liba.a: build/lib/a/estrdup.o --include build/lib/a/estrdup.d -build/lib/a/fatal.o: lib/a/fatal.c config.mk - $(OBJECT) -build/lib/liba.a: build/lib/a/fatal.o --include build/lib/a/fatal.d -build/lib/a/forkexec.o: lib/a/forkexec.c config.mk - $(OBJECT) -build/lib/liba.a: build/lib/a/forkexec.o --include build/lib/a/forkexec.d -build/lib/a/gc.o: lib/a/gc.c config.mk - $(OBJECT) -build/lib/liba.a: build/lib/a/gc.o --include build/lib/a/gc.d -build/lib/a/options.o: lib/a/options.c config.mk - $(OBJECT) -build/lib/liba.a: build/lib/a/options.o --include build/lib/a/options.d -build/lib/a/opts_parse.o: lib/a/opts_parse.c config.mk - $(OBJECT) -build/lib/liba.a: build/lib/a/opts_parse.o --include build/lib/a/opts_parse.d -build/lib/a/opts_parsespec.o: lib/a/opts_parsespec.c config.mk - $(OBJECT) -build/lib/liba.a: build/lib/a/opts_parsespec.o --include build/lib/a/opts_parsespec.d -build/lib/a/opts_printhelp.o: lib/a/opts_printhelp.c config.mk - $(OBJECT) -build/lib/liba.a: build/lib/a/opts_printhelp.o --include build/lib/a/opts_printhelp.d -build/lib/a/set_option.o: lib/a/set_option.c config.mk - $(OBJECT) -build/lib/liba.a: build/lib/a/set_option.o --include build/lib/a/set_option.d -build/lib/a/smprintf.o: lib/a/smprintf.c config.mk - $(OBJECT) -build/lib/liba.a: build/lib/a/smprintf.o --include build/lib/a/smprintf.d -build/lib/a/strmcat.o: lib/a/strmcat.c config.mk - $(OBJECT) -build/lib/liba.a: build/lib/a/strmcat.o --include build/lib/a/strmcat.d -build/lib/a/usage.o: lib/a/usage.c config.mk - $(OBJECT) -build/lib/liba.a: build/lib/a/usage.o --include build/lib/a/usage.d -build/lib/a/warn.o: lib/a/warn.c config.mk - $(OBJECT) -build/lib/liba.a: build/lib/a/warn.o --include build/lib/a/warn.d -build/lib/liba.a: - $(ARCHIVE) -libs: build/lib/liba.a -build/lib/net/netaccept.o: lib/net/netaccept.c config.mk - $(OBJECT) -build/lib/libnet.a: build/lib/net/netaccept.o --include build/lib/net/netaccept.d -build/lib/net/netannounce.o: lib/net/netannounce.c config.mk - $(OBJECT) -build/lib/libnet.a: build/lib/net/netannounce.o --include build/lib/net/netannounce.d -build/lib/net/netdial.o: lib/net/netdial.c config.mk - $(OBJECT) -build/lib/libnet.a: build/lib/net/netdial.o --include build/lib/net/netdial.d -build/lib/net/netlisten.o: lib/net/netlisten.c config.mk - $(OBJECT) -build/lib/libnet.a: build/lib/net/netlisten.o --include build/lib/net/netlisten.d -build/lib/net/netresolve.o: lib/net/netresolve.c config.mk - $(OBJECT) -build/lib/libnet.a: build/lib/net/netresolve.o --include build/lib/net/netresolve.d -build/lib/net/netsocket.o: lib/net/netsocket.c config.mk - $(OBJECT) -build/lib/libnet.a: build/lib/net/netsocket.o --include build/lib/net/netsocket.d -build/lib/libnet.a: - $(ARCHIVE) -libs: build/lib/libnet.a -build/lib/ui/font_close.o: lib/ui/font_close.c config.mk - $(OBJECT) -build/lib/libui.a: build/lib/ui/font_close.o --include build/lib/ui/font_close.d -build/lib/ui/font_load.o: lib/ui/font_load.c config.mk - $(OBJECT) -build/lib/libui.a: build/lib/ui/font_load.o --include build/lib/ui/font_load.d -build/lib/ui/ui_begin.o: lib/ui/ui_begin.c config.mk - $(OBJECT) -build/lib/libui.a: build/lib/ui/ui_begin.o --include build/lib/ui/ui_begin.d -build/lib/ui/ui_end.o: lib/ui/ui_end.c config.mk - $(OBJECT) -build/lib/libui.a: build/lib/ui/ui_end.o --include build/lib/ui/ui_end.d -build/lib/ui/window_create.o: lib/ui/window_create.c config.mk - $(OBJECT) -build/lib/libui.a: build/lib/ui/window_create.o --include build/lib/ui/window_create.d -build/lib/ui/window_delete.o: lib/ui/window_delete.c config.mk - $(OBJECT) -build/lib/libui.a: build/lib/ui/window_delete.o --include build/lib/ui/window_delete.d -build/lib/ui/window_hide.o: lib/ui/window_hide.c config.mk - $(OBJECT) -build/lib/libui.a: build/lib/ui/window_hide.o --include build/lib/ui/window_hide.d -build/lib/ui/window_show.o: lib/ui/window_show.c config.mk - $(OBJECT) -build/lib/libui.a: build/lib/ui/window_show.o --include build/lib/ui/window_show.d -build/lib/libui.a: - $(ARCHIVE) -libs: build/lib/libui.a -libs = build/lib/liba.a build/lib/libnet.a build/lib/libui.a -build/bin/dial.o: bin/dial.c - $(OBJECT) -build/bin/dial: build/bin/dial.o $(libs) - $(BINARY) -bins: build/bin/dial -build/bin/edit.o: bin/edit.c - $(OBJECT) -build/bin/edit: build/bin/edit.o $(libs) - $(BINARY) -bins: build/bin/edit -build/bin/init.o: bin/init.c - $(OBJECT) -build/bin/init: build/bin/init.o $(libs) - $(BINARY) -bins: build/bin/init -build/bin/listen.o: bin/listen.c - $(OBJECT) -build/bin/listen: build/bin/listen.o $(libs) - $(BINARY) -bins: build/bin/listen -build/bin/pick.o: bin/pick.c - $(OBJECT) -build/bin/pick: build/bin/pick.o $(libs) - $(BINARY) -bins: build/bin/pick -build/bin/screenlock.o: bin/screenlock.c - $(OBJECT) -build/bin/screenlock: build/bin/screenlock.o $(libs) - $(BINARY) -bins: build/bin/screenlock -build/bin/shell.o: bin/shell.c - $(OBJECT) -build/bin/shell: build/bin/shell.o $(libs) - $(BINARY) -bins: build/bin/shell -build/bin/winmgr.o: bin/winmgr.c - $(OBJECT) -build/bin/winmgr: build/bin/winmgr.o $(libs) - $(BINARY) -bins: build/bin/winmgr -- 2.52.0