我有一个快速而肮脏的小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
已安装。
答案 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
两个源文件。