diff --git a/Makefile b/Makefile
index 0f104d0..39d6972 100644
--- a/Makefile
+++ b/Makefile
@@ -1,7 +1,22 @@
+TARGET =	hikari
+
+DESTDIR	?=
+
+prefix ?=	/usr/local
+exec_prefix ?=	$(prefix)
+bindir ?=	$(exec_prefix)/bin
+sysconfdir ?=	$(prefix)/etc
+
+PKG_CONFIG ?=	pkg-config
+
+VERSION ?=	"CURRENT"
+
+### Upstream variables
+PREFIX ?=	$(DESTDIR)$(prefix)
+ETC_PREFIX ?=	$(DESTDIR)$(sysconfdir)
+
 OS != uname
-VERSION ?= "CURRENT"
-PREFIX ?= /usr/local
-ETC_PREFIX ?= ${PREFIX}
+INSTALL_GROUP != id -gn
 
 OBJS = \
 	action.o \
@@ -29,7 +44,6 @@ OBJS = \
 	layout.o \
 	layout_config.o \
 	layout_select_mode.o \
-	main.o \
 	mark.o \
 	mark_assign_mode.o \
 	mark_select_mode.o \
@@ -56,116 +70,127 @@ OBJS = \
 	xwayland_unmanaged_view.o \
 	xwayland_view.o
 
-WAYLAND_PROTOCOLS != pkg-config --variable pkgdatadir wayland-protocols
-
-.PHONY: distclean clean clean-doc doc dist install uninstall
-.PATH: src
+WAYLAND_PROTOCOLS != $(PKG_CONFIG) --variable pkgdatadir wayland-protocols
 
 # Allow specification of /extra/ CFLAGS and LDFLAGS
-CFLAGS += ${CFLAGS_EXTRA}
-LDFLAGS += ${LDFLAGS_EXTRA}
+CFLAGS += $(CFLAGS_EXTRA)
+LDFLAGS += $(LDFLAGS_EXTRA)
 
-.ifdef DEBUG
+ifdef DEBUG
 CFLAGS += -g -O0 -fsanitize=address
-.else
+else
 CFLAGS += -DNDEBUG
-.endif
+endif
 
-.ifdef WITH_POSIX_C_SOURCE
+ifdef WITH_POSIX_C_SOURCE
 CFLAGS += -D_POSIX_C_SOURCE=200809L
-.endif
+endif
 
-.ifdef WITH_XWAYLAND
+ifdef WITH_XWAYLAND
 CFLAGS += -DHAVE_XWAYLAND=1
-.endif
+endif
 
-.ifdef WITH_GAMMACONTROL
+ifdef WITH_GAMMACONTROL
 CFLAGS += -DHAVE_GAMMACONTROL=1
-.endif
+endif
 
-.ifdef WITH_SCREENCOPY
+ifdef WITH_SCREENCOPY
 CFLAGS += -DHAVE_SCREENCOPY=1
-.endif
+endif
 
-.ifdef WITH_LAYERSHELL
+ifdef WITH_LAYERSHELL
 CFLAGS += -DHAVE_LAYERSHELL=1
-.endif
+endif
 
-.ifdef WITHOUT_SUID
+ifdef WITHOUT_SUID
 PERMS = 555
-.else
+else
 PERMS = 4555
-.endif
+endif
 
-CFLAGS += -Wall -I. -Iinclude -DHIKARI_ETC_PREFIX=${ETC_PREFIX}
+CFLAGS += -Wall -I. -Iinclude -DHIKARI_ETC_PREFIX=$(ETC_PREFIX)
 
-WLROOTS_CFLAGS != pkg-config --cflags wlroots
-WLROOTS_LIBS != pkg-config --libs wlroots
+WLROOTS_CFLAGS != $(PKG_CONFIG) --cflags wlroots
+WLROOTS_LIBS != $(PKG_CONFIG) --libs wlroots
 
 WLROOTS_CFLAGS += -DWLR_USE_UNSTABLE=1
 
-PANGO_CFLAGS != pkg-config --cflags pangocairo
-PANGO_LIBS != pkg-config --libs pangocairo
+PANGO_CFLAGS != $(PKG_CONFIG) --cflags pangocairo
+PANGO_LIBS != $(PKG_CONFIG) --libs pangocairo
 
-CAIRO_CFLAGS != pkg-config --cflags cairo
-CAIRO_LIBS != pkg-config --libs cairo
+CAIRO_CFLAGS != $(PKG_CONFIG) --cflags cairo
+CAIRO_LIBS != $(PKG_CONFIG) --libs cairo
 
-GLIB_CFLAGS != pkg-config --cflags glib-2.0
-GLIB_LIBS != pkg-config --libs glib-2.0
+GLIB_CFLAGS != $(PKG_CONFIG) --cflags glib-2.0
+GLIB_LIBS != $(PKG_CONFIG) --libs glib-2.0
 
-PIXMAN_CFLAGS != pkg-config --cflags pixman-1
-PIXMAN_LIBS != pkg-config --libs pixman-1
+PIXMAN_CFLAGS != $(PKG_CONFIG) --cflags pixman-1
+PIXMAN_LIBS != $(PKG_CONFIG) --libs pixman-1
 
-XKBCOMMON_CFLAGS != pkg-config --cflags xkbcommon
-XKBCOMMON_LIBS != pkg-config --libs xkbcommon
+XKBCOMMON_CFLAGS != $(PKG_CONFIG) --cflags xkbcommon
+XKBCOMMON_LIBS != $(PKG_CONFIG) --libs xkbcommon
 
-WAYLAND_CFLAGS != pkg-config --cflags wayland-server
-WAYLAND_LIBS != pkg-config --libs wayland-server
+WAYLAND_CFLAGS != $(PKG_CONFIG) --cflags wayland-server
+WAYLAND_LIBS != $(PKG_CONFIG) --libs wayland-server
 
-LIBINPUT_CFLAGS != pkg-config --cflags libinput
-LIBINPUT_LIBS != pkg-config --libs libinput
+LIBINPUT_CFLAGS != $(PKG_CONFIG) --cflags libinput
+LIBINPUT_LIBS != $(PKG_CONFIG) --libs libinput
 
-UCL_CFLAGS != pkg-config --cflags libucl
-UCL_LIBS != pkg-config --libs libucl
+UCL_CFLAGS != $(PKG_CONFIG) --cflags libucl
+UCL_LIBS != $(PKG_CONFIG) --libs libucl
 
 CFLAGS += \
-	${WLROOTS_CFLAGS} \
-	${PANGO_CFLAGS} \
-	${CAIRO_CFLAGS} \
-	${GLIB_CFLAGS} \
-	${PIXMAN_CFLAGS} \
-	${XKBCOMMON_CFLAGS} \
-	${WAYLAND_CFLAGS} \
-	${LIBINPUT_CFLAGS} \
-	${UCL_CFLAGS}
+	$(WLROOTS_CFLAGS) \
+	$(PANGO_CFLAGS) \
+	$(CAIRO_CFLAGS) \
+	$(GLIB_CFLAGS) \
+	$(PIXMAN_CFLAGS) \
+	$(XKBCOMMON_CFLAGS) \
+	$(WAYLAND_CFLAGS) \
+	$(LIBINPUT_CFLAGS) \
+	$(UCL_CFLAGS)
 
 LIBS = \
-	${WLROOTS_LIBS} \
-	${PANGO_LIBS} \
-	${CAIRO_LIBS} \
-	${GLIB_LIBS} \
-	${PIXMAN_LIBS} \
-	${XKBCOMMON_LIBS} \
-	${WAYLAND_LIBS} \
-	${LIBINPUT_LIBS} \
-	${UCL_LIBS}
+	$(WLROOTS_LIBS) \
+	$(PANGO_LIBS) \
+	$(CAIRO_LIBS) \
+	$(GLIB_LIBS) \
+	$(PIXMAN_LIBS) \
+	$(XKBCOMMON_LIBS) \
+	$(WAYLAND_LIBS) \
+	$(LIBINPUT_LIBS) \
+	$(UCL_LIBS)
 
-all: hikari hikari-unlocker
+.PHONY: distclean clean clean-doc doc dist install uninstall
 
 version.h:
-	echo "#define HIKARI_VERSION \"${VERSION}\"" >> version.h
+	echo "#define HIKARI_VERSION \"$(VERSION)\"" >> version.h
 
-hikari: version.h xdg-shell-protocol.h wlr-layer-shell-unstable-v1-protocol.h ${OBJS}
-	${CC} ${LDFLAGS} ${CFLAGS} ${INCLUDES} -o ${.TARGET} ${OBJS} ${LIBS}
+$(OBJS): %.o: src/%.c
+	$(CC) $(CFLAGS) $(INCLUDES) -c $< -o $@
+
+main.o:
+	$(CC) $(CFLAGS) $(INCLUDES) -c main.c -o main.o
 
 xdg-shell-protocol.h:
-	wayland-scanner server-header ${WAYLAND_PROTOCOLS}/stable/xdg-shell/xdg-shell.xml ${.TARGET}
+	wayland-scanner server-header $(WAYLAND_PROTOCOLS)/stable/xdg-shell/xdg-shell.xml xdg-shell-protocol.h
 
 wlr-layer-shell-unstable-v1-protocol.h:
-	wayland-scanner server-header protocol/wlr-layer-shell-unstable-v1.xml ${.TARGET}
+	wayland-scanner server-header protocol/wlr-layer-shell-unstable-v1.xml wlr-layer-shell-unstable-v1-protocol.h
+
+hikari: version.h xdg-shell-protocol.h wlr-layer-shell-unstable-v1-protocol.h $(OBJS) main.o
+	$(CC) $(LDFLAGS) $(CFLAGS) $(INCLUDES) $(OBJS) main.o $(LIBS) -o $(TARGET)
 
 hikari-unlocker: hikari_unlocker.c
-	${CC} ${CFLAGS_EXTRA} ${LDFLAGS_EXTRA} -o hikari-unlocker hikari_unlocker.c -lpam
+	$(CC) $(LDFLAGS) $(CFLAGS) $(INCLUDES) hikari_unlocker.c -lpam $(LIBS) -o hikari-unlocker
+
+share/man/man1/hikari.1:
+	pandoc -M title:"HIKARI(1) $(VERSION) | hikari - Wayland Compositor" -s \
+		--to man -o share/man/man1/hikari.1 share/man/man1/hikari.md
+
+doc: share/man/man1/hikari.1
+
+all: hikari hikari-unlocker
 
 clean-doc:
 	@test -e _darcs && echo "cleaning manpage" ||:
@@ -177,66 +202,37 @@ clean: clean-doc
 	@rm xdg-shell-protocol.h 2> /dev/null ||:
 	@rm wlr-layer-shell-unstable-v1-protocol.h 2> /dev/null ||:
 	@echo "cleaning object files"
-	@rm ${OBJS} 2> /dev/null ||:
+	@rm $(OBJS) 2> /dev/null ||:
+	@rm main.o 2> /dev/null ||:
 	@echo "cleaning executables"
 	@rm hikari 2> /dev/null ||:
 	@rm hikari-unlocker 2> /dev/null ||:
 
-share/man/man1/hikari.1:
-	pandoc -M title:"HIKARI(1) ${VERSION} | hikari - Wayland Compositor" -s \
-		--to man -o share/man/man1/hikari.1 share/man/man1/hikari.md
-
-doc: share/man/man1/hikari.1
-
-hikari-${VERSION}.tar.gz: version.h share/man/man1/hikari.1
-	@darcs revert
-	@tar -s "#^#hikari-${VERSION}/#" -czf hikari-${VERSION}.tar.gz \
-		version.h \
-		main.c \
-		hikari_unlocker.c \
-		include/hikari/*.h \
-		src/*.c \
-		protocol/*.xml \
-		Makefile \
-		LICENSE \
-		README.md \
-		CHANGELOG.md \
-		share/man/man1/hikari.md \
-		share/man/man1/hikari.1 \
-		share/backgrounds/hikari/hikari_wallpaper.png \
-		share/wayland-sessions/hikari.desktop \
-		etc/hikari/hikari.conf \
-		etc/pam.d/hikari-unlocker.*
-
-distclean: clean-doc
-	@test -e _darcs && echo "cleaning version.h" ||:
-	@test -e _darcs && rm version.h ||:
-
-dist: distclean hikari-${VERSION}.tar.gz
-
-install: hikari hikari-unlocker share/man/man1/hikari.1
-	mkdir -p ${DESTDIR}/${PREFIX}/bin
-	mkdir -p ${DESTDIR}/${PREFIX}/share/man/man1
-	mkdir -p ${DESTDIR}/${PREFIX}/share/backgrounds/hikari
-	mkdir -p ${DESTDIR}/${PREFIX}/share/wayland-sessions
-	mkdir -p ${DESTDIR}/${ETC_PREFIX}/etc/hikari
-	mkdir -p ${DESTDIR}/${ETC_PREFIX}/etc/pam.d
-	sed "s,PREFIX,${PREFIX}," etc/hikari/hikari.conf > ${DESTDIR}/${ETC_PREFIX}/etc/hikari/hikari.conf
-	chmod 644 ${DESTDIR}/${ETC_PREFIX}/etc/hikari/hikari.conf
-	install -m ${PERMS} hikari ${DESTDIR}/${PREFIX}/bin
-	install -m 4555 hikari-unlocker ${DESTDIR}/${PREFIX}/bin
-	install -m 644 share/man/man1/hikari.1 ${DESTDIR}/${PREFIX}/share/man/man1
-	install -m 644 share/backgrounds/hikari/hikari_wallpaper.png ${DESTDIR}/${PREFIX}/share/backgrounds/hikari/hikari_wallpaper.png
-	install -m 644 share/wayland-sessions/hikari.desktop ${DESTDIR}/${PREFIX}/share/wayland-sessions/hikari.desktop
-	install -m 644 etc/pam.d/hikari-unlocker.${OS} ${DESTDIR}/${ETC_PREFIX}/etc/pam.d/hikari-unlocker
+install-doc:
+	install -m 644 share/man/man1/hikari.1 $(PREFIX)/share/man/man1
+
+install:
+	mkdir -p $(PREFIX)/bin
+	mkdir -p $(PREFIX)/share/man/man1
+	mkdir -p $(PREFIX)/share/backgrounds/hikari
+	mkdir -p $(PREFIX)/share/wayland-sessions
+	mkdir -p $(ETC_PREFIX)/etc/hikari
+	mkdir -p $(ETC_PREFIX)/etc/pam.d
+	sed "s,PREFIX,$(PREFIX)," etc/hikari/hikari.conf > $(ETC_PREFIX)/etc/hikari/hikari.conf
+	chmod 644 $(ETC_PREFIX)/etc/hikari/hikari.conf
+	install -m $(PERMS) hikari $(PREFIX)/bin
+	install -m 4555 hikari-unlocker $(PREFIX)/bin
+	install -m 644 share/backgrounds/hikari/hikari_wallpaper.png $(PREFIX)/share/backgrounds/hikari/hikari_wallpaper.png
+	install -m 644 share/wayland-sessions/hikari.desktop $(PREFIX)/share/wayland-sessions/hikari.desktop
+	install -m 644 etc/pam.d/hikari-unlocker.$(OS) $(ETC_PREFIX)/etc/pam.d/hikari-unlocker
 
 uninstall:
-	-rm ${DESTDIR}/${PREFIX}/bin/hikari
-	-rm ${DESTDIR}/${PREFIX}/bin/hikari-unlocker
-	-rm ${DESTDIR}/${PREFIX}/share/man/man1/hikari.1
-	-rm ${DESTDIR}/${PREFIX}/share/backgrounds/hikari/hikari_wallpaper.png
-	-rm ${DESTDIR}/${PREFIX}/share/wayland-sessions/hikari.desktop
-	-rm ${DESTDIR}/${ETC_PREFIX}/etc/pam.d/hikari-unlocker
-	-rm ${DESTDIR}/${ETC_PREFIX}/etc/hikari/hikari.conf
-	-rmdir ${DESTDIR}/${ETC_PREFIX}/etc/hikari
-	-rmdir ${DESTDIR}/${PREFIX}/share/backgrounds/hikari
+	-rm $(PREFIX)/bin/hikari
+	-rm $(PREFIX)/bin/hikari-unlocker
+	-rm $(PREFIX)/share/man/man1/hikari.1
+	-rm $(PREFIX)/share/backgrounds/hikari/hikari_wallpaper.png
+	-rm $(PREFIX)/share/wayland-sessions/hikari.desktop
+	-rm $(ETC_PREFIX)/etc/pam.d/hikari-unlocker
+	-rm $(ETC_PREFIX)/etc/hikari/hikari.conf
+	-rmdir $(ETC_PREFIX)/etc/hikari
+	-rmdir $(PREFIX)/share/backgrounds/hikari
