2015-01-15 42 views
0

我想知道如何使用makefile编译仅包含具有更改的类(Java,Scala)。Makefile:请勿重新编译未更新的文件(单独的目录)

我的.scala位于src目录中。当我编译时,输出(.class)转到bin目录。

在一个项目中,当你有50个类时,每次编译所有类都太长了。

你知道如何解决我的问题吗?

我试过maven,但它似乎有同样的问题。

我的makefile(斯卡拉):

SRC = src 
SOURCES = $(shell find . -name *.scala) 
S = scala 
SC = scalac 
TARGET = bin 
CP = bin 

run: compile 
    @echo ":: Executing..." 
    @$(S) -cp $(CP) -encoding utf8 App -feature 


compile: $(SOURCES:.scala=.class) 

%.class: %.scala 
    clear 
    @echo ":: Compiling..." 
    @echo "Compiling $*.scala.." 
    @$(SC) -sourcepath $(SRC) -cp $(CP) -d $(TARGET) -encoding utf8 $*.scala 

编辑:我已经找到了解决办法:建立比较的.java和.bin文件的日期。这是我的makefile:https://gist.github.com/Dnomyar/d01d886731ccc88d3c63

SRC = src 
SOURCES = $(shell find ./src/ -name *.java) 
S = java 
SC = javac 
TARGET = bin 
CP = bin 
VPATH=bin 

run: compile 
@echo ":: Executing..." 
@$(S) -cp $(CP) App 

compile: $(SOURCES:.%.java=.%.class) 

%.class: %.java 
clear 
@echo ":: Compiling..." 
@echo "Compiling $*.java.." 
@if [ $(shell stat -c %Y $*.java) -lt $(shell stat -c %Y $(shell echo "$*.class" | sed 's/src/bin/g')) ]; then echo ; else $(SC) -sourcepath $(SRC) -cp $(CP) -d $(TARGET) -encoding utf-8 $*.java; fi 




clean: 
@rm -R bin/* 

# Pour supprimer les fichier .fuse* créés par sublime text 
fuse: 
@rm `find -name "*fuse*"` 
+3

总之:不要使用Makefiles for Java或Scala。您将永远无法正确处理您的依赖项:.scala可能会有多个.class。 .class可能依赖于其他的.class文件。使用Maven或SBT。 –

+0

感谢您的回答。你知道Maren的清晰教程吗?在Apache网站上,目前尚不清楚。他们没有解释如何运行一个项目。 – Dnomyar

回答

0

你可以指定化妆到搜索使用VPATH变量的相关性。对于您的情况,您可以指定VPATH=bin,其中make比较bin文件夹下文件的时间戳。

例子:

VPATH= obj 
all: hello 
     @echo "Makeing - all" 
     touch all 
hello: 
     @echo "Making - hello" 
     touch obj/hello 

输出:

[email protected]:~/learning/makefiles/VPATH$ ls 
Makefile obj 
[email protected]:~/learning/makefiles/VPATH$ make 
Making - hello 
touch obj/hello 
Makeing - all 
touch all 
[email protected]:~/learning/makefiles/VPATH$ ls 
all Makefile obj 
[email protected]:~/learning/makefiles/VPATH$ make 
make: 'all' is up to date. 
[email protected]:~/learning/makefiles/VPATH$ touch obj/hello 
[email protected]:~/learning/makefiles/VPATH$ make 
Makeing - all 
touch all 
[email protected]:~/learning/makefiles/VPATH$ 
+0

它不适用于我的makefile,但我找到了另一种解决方案。谢谢。 – Dnomyar

+0

发布您的答案并接受它,它会帮助他人 –

相关问题