JAVAC = javac
SOURCES = ClassD.java ClassC.java ClassB.java ClassA.java 
CLASSES = $(SOURCES:.java=.class)

all: $(CLASSES)

# Separated compilation does not work generally:
# 1. If SOURCES = ClassA.java ClassB.java ClassC.java ClassD.java (dependencies are listed in order of dependent classes)
#    - Everything works as javac resolves internal dependencies within the same package automatically
# 2. If SOURCES = ClassD.java ClassC.java ClassB.java ClassA.java (dependencies are not listed in order of dependency),
#    - May not work
#    - Example: ClassC is modified - e.g., renaming messageC() to messageCX(), make will recompile ClassC,
#      but ClassB (which depends on ClassC) will NOT be recompiled causing errors

# %.class: %.java
#	$(JAVAC) $< 

# Using multi-file target works, but build is not incremental
# - the target $(CLASSES) (all .class files) depends on all the .java files in $(SOURCES)

$(CLASSES): %.class: %.java
	$(JAVAC) $(SOURCES)

clean:
	rm -f $(CLASSES)