-INCLUDE = ../include
-CC = gcc
-CFLAGS = -g -Wall -I $(INCLUDE)
-WORDOBJ = word.o
-HASHOBJ = hash.o
-CMEMOBJ = cmem.o
-CERROBJ = cerr.o
-COMMONOBJ = $(WORDOBJ) $(HASHOBJ) $(CMEMOBJ) $(CERROBJ) struct.o cmd.o
-ASOBJ = assemble.o token.o label.o macro.o
-EXECOBJ = exec.o dump.o
-COMMONHEAD = $(INCLUDE)/casl2.h $(INCLUDE)/word.h $(INCLUDE)/hash.h $(INCLUDE)/cmem.h $(INCLUDE)/cerr.h
-ASHEAD = $(INCLUDE)/assemble.h
-EXECHEAD = $(INCLUDE)/exec.h
-
-.PHONY: all clean
-
-all: ../casl2 ../comet2 ../dumpword
-
-../casl2: casl2.o $(COMMONOBJ) $(ASOBJ) $(EXECOBJ)
+CC ?= gcc
+CFLAGS ?= -g -Wall -Wextra -I $(INCLUDE)
+RMF ?= rm -f
+WHICH ?= which
+CTAGS ?= ctags
+ETAGS ?= etags
+SED ?= sed
+
+INCLUDE := ../include
+
+COMMONSRC := word.c cmem.c cerr.c
+CASL2SRC := struct.c hash.c
+ASSRC := assemble.c token.c label.c
+EXECSRC := exec.c dump.c
+
+.PHONY: all version clean
+
+all: version ../casl2 ../comet2 ../dumpword ctags etags
+
+version:
+ $(MAKE) -C .. version
+
+../casl2: casl2.o $(subst .c,.o,$(COMMONSRC) $(CASL2SRC) $(ASSRC) $(EXECSRC))