在进行源外构建和Java时,如何减少makefile样板?

时间:2010-10-25 20:58:29

标签: java jar makefile

我有一个快速而肮脏的小make文件,它为一个相对较小的java项目进行了源外构建:

default: bin/classes/EntryPoint.class bin/classes/manifest
    jar cvfm ./bin/output.jar ./bin/classes/manifest -C ./bin/classes EntryPoint.class

bin/classes/EntryPoint.class: ./src/EntryPoint.java bin
    javac -sourcepath ./src -d ./bin/classes ./src/EntryPoint.java

bin/classes/manifest: src/manifest
    cp bin/classes/manifest src/manifest

bin:
    mkdir ./bin; mkdir ./bin/classes;

clean:
    rm -rf bin

这里的缺点是,如果我想添加一个新的java文件,我需要为它添加一个目标,并将依赖项添加到jar包装步骤,以及jar包装步骤命令行的路径。在3个地方添加相同的东西将导致超过4-5个文件的不可维护的混乱。

我想要做的只是添加一个"SOURCEFILES= files here"定义并列出文件,而不必乱用命令等。可以这样做吗?

注意:我知道可能有更好的工具(例如ant),但这是我作为家庭作业转变的东西,我不能要求平地机除了jdk之外什么都没有amd make已安装。

2 个答案:

答案 0 :(得分:1)

外卡人物有帮助吗?

javac ./blah/*.java  

已更新:要通过子目录进行递归,请添加

**/*.java  

示例:

javac -sourcepath src src/**/*.java -d classes -verbose  

答案 1 :(得分:1)

如果你能期待GNUMake:

SOURCES := $(wildcard src/**/*.java)
CLASSES := $(patsubst src/%.java,bin/classes/%.class,$(SOURCES))

default: $(CLASSES) bin/classes/manifest
    jar cvfm ./bin/output.jar ./bin/classes/manifest -C ./bin/classes EntryPoint.class

bin/classes/%.class: src/%.java bin/.dirstamp
    javac -sourcepath ./src -d ./bin/classes $<

bin/classes/manifest: src/manifest
    cp bin/classes/manifest src/manifest

clean:
    rm -rf bin

bin/.dirstamp
    mkdir -p bin/classes
    touch $@

我在this answer中解释为什么最好为目录使用戳记文件而不是依赖于目录本身。

请注意,如果您有相互依赖的类,则无法使用此Makefile进行编译。要编译它们,如果我没记错的话,必须同时给javac两个源文件。