summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBert Münnich <ber.t@posteo.de>2017-10-12 10:56:03 +0200
committerBert Münnich <ber.t@posteo.de>2017-10-12 11:00:24 +0200
commit5155d52ab18c06925046e2f56a87f2765bb515ba (patch)
tree7046c086fa843217fcba6d5b323853e8eeae37e7
parent6beb8b4d7114d1a918a3cd4d11dcc7e3e849aaca (diff)
downloadnsxiv-5155d52ab18c06925046e2f56a87f2765bb515ba.tar.zst
Much more portable Makefile
The config.mk file is now optional and only needs to be created if one wants to persistently overwrite default macro values. Features used in the Makefile that are not yet in the POSIX standard: - Advanced macro assignment operators '+=' and '?=' [1] - Special target .PHONY [2] - Pattern rules [3]; only needed when $srcdir != '.'. For every pattern rule there is an inference rule with the same effect. Hopefully, the inference rules get picked up by make programs not supporting pattern rules. - Silently including multiple possibly not exisiting files [4] [5] [1] http://austingroupbugs.net/view.php?id=330 [2] http://austingroupbugs.net/view.php?id=523 [3] http://austingroupbugs.net/view.php?id=513 [4] http://austingroupbugs.net/view.php?id=333 [5] http://austingroupbugs.net/view.php?id=518
-rw-r--r--Makefile87
-rw-r--r--config.mk18
2 files changed, 57 insertions, 48 deletions
diff --git a/Makefile b/Makefile
index 5d06439..914b72d 100644
--- a/Makefile
+++ b/Makefile
@@ -1,42 +1,72 @@
-# Requires GNU make 3.80 or later
+# Works best with GNU make 3.80 or later
-VERSION := git-20171006
+VERSION = git-20171012
-all: sxiv
+srcdir = .
-include config.mk
+PREFIX = /usr/local
+MANPREFIX = $(PREFIX)/share/man
-override CPPFLAGS += -I. -DVERSION=\"$(VERSION)\" -DHAVE_GIFLIB=$(HAVE_GIFLIB) -DHAVE_LIBEXIF=$(HAVE_LIBEXIF)
+CC ?= gcc
+CFLAGS += -std=c99 -Wall -pedantic
+CPPFLAGS += -I/usr/include/freetype2 -D_XOPEN_SOURCE=700
+DEPFLAGS = -MMD -MP
+LDFLAGS +=
-LDLIBS := -lImlib2 -lX11 -lXft
+# autoreload backend: inotify/nop
+AUTORELOAD = inotify
-ifneq ($(HAVE_GIFLIB),0)
- LDLIBS += -lgif
-endif
-ifneq ($(HAVE_LIBEXIF),0)
- LDLIBS += -lexif
-endif
+# enable features requiring giflib (-lgif)
+HAVE_GIFLIB = 1
-SRC := autoreload_$(AUTORELOAD).c commands.c image.c main.c options.c thumbs.c util.c window.c
-DEP := $(SRC:.c=.d)
-OBJ := $(SRC:.c=.o)
+# enable features requiring libexif (-lexif)
+HAVE_LIBEXIF = 1
-$(OBJ): config.h Makefile
+REQ_CPPFLAGS = -I. -DVERSION=\"$(VERSION)\" \
+ -DHAVE_GIFLIB=$(HAVE_GIFLIB) -DHAVE_LIBEXIF=$(HAVE_LIBEXIF)
+ALL_CPPFLAGS = $(REQ_CPPFLAGS) $(CPPFLAGS)
-%.o: %.c
- @echo "CC $@"
- $(CC) $(CFLAGS) $(CPPFLAGS) $(DEPFLAGS) -c -o $@ $<
+LIB_EXIF_0 =
+LIB_EXIF_1 = -lexif
+LIB_GIF_0 =
+LIB_GIF_1 = -lgif
+LDLIBS = -lImlib2 -lX11 -lXft \
+ $(LIB_EXIF_$(HAVE_LIBEXIF)) $(LIB_GIF_$(HAVE_GIFLIB))
-config.h: | config.def.h
- @echo "GEN $@"
- cp $| $@
+-include config.mk
+
+SRCS = autoreload_$(AUTORELOAD).c commands.c image.c main.c options.c \
+ thumbs.c util.c window.c
+OBJS = $(SRCS:.c=.o)
+DEPS = $(SRCS:.c=.d)
+
+all: sxiv
-sxiv: $(OBJ)
+.PHONY: all clean install uninstall
+.SUFFIXES:
+.SUFFIXES: .c .o
+$(V).SILENT:
+
+sxiv: $(OBJS)
@echo "LINK $@"
- $(CC) $(LDFLAGS) -o $@ $^ $(LDLIBS)
+ $(CC) $(LDFLAGS) -o $@ $(OBJS) $(LDLIBS)
+
+$(OBJS): config.h $(srcdir)/Makefile
+
+.c.o:
+ @echo "CC $@"
+ $(CC) $(ALL_CPPFLAGS) $(DEPFLAGS) $(CFLAGS) -c -o $@ $<
+
+%.o: $(srcdir)/%.c
+ @echo "CC $@"
+ $(CC) $(ALL_CPPFLAGS) $(DEPFLAGS) $(CFLAGS) -c -o $@ $(srcdir)/$(@:.o=.c)
+
+config.h:
+ @echo "GEN $@"
+ cp $(srcdir)/config.def.h $@
clean:
- rm -f $(OBJ) $(DEP) sxiv
+ rm -f $(OBJS) $(DEPS) sxiv
install: all
@echo "INSTALL bin/sxiv"
@@ -45,7 +75,8 @@ install: all
chmod 755 $(DESTDIR)$(PREFIX)/bin/sxiv
@echo "INSTALL sxiv.1"
mkdir -p $(DESTDIR)$(MANPREFIX)/man1
- sed "s!PREFIX!$(PREFIX)!g; s!VERSION!$(VERSION)!g" sxiv.1 > $(DESTDIR)$(MANPREFIX)/man1/sxiv.1
+ sed "s!PREFIX!$(PREFIX)!g; s!VERSION!$(VERSION)!g" sxiv.1 \
+ >$(DESTDIR)$(MANPREFIX)/man1/sxiv.1
chmod 644 $(DESTDIR)$(MANPREFIX)/man1/sxiv.1
@echo "INSTALL share/sxiv/"
mkdir -p $(DESTDIR)$(PREFIX)/share/sxiv/exec
@@ -60,9 +91,5 @@ uninstall:
@echo "REMOVE share/sxiv/"
rm -rf $(DESTDIR)$(PREFIX)/share/sxiv
-.PHONY: all clean install uninstall
-.SUFFIXES:
-$(V).SILENT:
-
-include $(DEP)
diff --git a/config.mk b/config.mk
deleted file mode 100644
index b083388..0000000
--- a/config.mk
+++ /dev/null
@@ -1,18 +0,0 @@
-PREFIX := /usr/local
-MANPREFIX := $(PREFIX)/share/man
-
-CC ?= gcc
-CFLAGS += -std=c99 -Wall -pedantic
-CPPFLAGS += -I/usr/include/freetype2 -D_XOPEN_SOURCE=700
-DEPFLAGS := -MMD -MP
-LDFLAGS +=
-
-# autoreload backend: inotify/nop
-AUTORELOAD := inotify
-
-# enable features requiring giflib (-lgif)
-HAVE_GIFLIB := 1
-
-# enable features requiring libexif (-lexif)
-HAVE_LIBEXIF := 1
-