robturtle
10/7/2015 - 10:45 PM

Makefile for java files

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) $<