Makefile for java files
# 在这里设置项目特有的信息
SP = src/main/java
PKG = edu.nyu.cs9053.homework5
SUB_PKG = $(PKG).memory
# 设置class应存放于哪个文件夹
DEST = out
# 可以在这里修改需要添加的选项, 比如 JCC = javac -Xlint:all
JAVA = java -ea
JCC = javac
# 以下是自动推导的变量
PKG_PATH = $(shell echo "$(PKG)" | sed 's^\.^/^g')
SUB_PKG_PATH = $(shell echo "$(SUB_PKG)" | sed 's^\.^/^g')
SRC = $(shell ls $(SP)/$(PKG_PATH)/*.java $(SP)/$(SUB_PKG_PATH)/*.java)
BIN = $(shell echo $(SRC) | sed 's^$(SP)^$(DEST)^g' | sed 's^\.java^\.class^g')
.PHONY: mad faucet clean
# 命令 make: 编译所有源文件
all: $(DEST) $(BIN)
@echo '-- DONE --'
# 如果不存在 out 文件夹,则创建它
$(DEST):
@[[ -d $(DEST) ]] || mkdir $(DEST)
# 命令 make mad: java 执行 MadScientist
mad: $(BIN)
$(JAVA) -cp out edu.nyu.cs9053.homework5.MadScientist >log 2>err &
# 命令 make faucet: java 执行 Faucet
faucet: $(BIN)
$(JAVA) -cp out edu.nyu.cs9053.homework5.memory.Faucet
# 命令 make clean: 删除所有class 文件
clean:
@rm $(BIN)
@echo -- CLEANED --
# 以下是java文件与class文件的模式匹配,每个包应有一个对应的模式
# 模式 #1: out/edu/cs9053/homework5/*.class 对应的源文件为 src/main/java/edu/cs9053/homework5/*.java
$(DEST)/$(PKG_PATH)/%.class : $(SP)/$(PKG_PATH)/%.java
$(JCC) -d $(DEST) -sourcepath $(SP) $<
# 模式 #2:
$(DEST)/$(SUB_PKG_PATH)/%.class : $(SP)/$(SUB_PKG_PATH)/%.java
$(JCC) -d $(DEST) -sourcepath $(SP) $<