makefile:不重新编译未更新的文件(单独的目录)

gmxoilav  于 2021-07-03  发布在  Java
关注(0)|答案(2)|浏览(476)

我想知道一个makefile怎么可能只编译带有更改的类(java,scala)。
我的 .scala 你在房间里吗 src 目录。当我编译时,输出( .class )转到 bin 目录。
在一个项目中,当您有~50个类时,每次编译所有类都太长了。
你知道怎么解决我的问题吗?
我试过maven,但似乎也有同样的问题。
我的makefile(用于scala):

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*"`
am46iovg

am46iovg1#

您可以使用 VPATH 变量。对于您的情况,您可以指定 VPATH=bin 其中make比较bin文件夹下文件的时间戳。
例子:

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

输出:

sagar@CPU-117:~/learning/makefiles/VPATH$ ls
Makefile  obj
sagar@CPU-117:~/learning/makefiles/VPATH$ make
Making - hello
touch obj/hello
Makeing - all
touch all
sagar@CPU-117:~/learning/makefiles/VPATH$ ls
all  Makefile  obj
sagar@CPU-117:~/learning/makefiles/VPATH$ make
make: 'all' is up to date.
sagar@CPU-117:~/learning/makefiles/VPATH$ touch obj/hello 
sagar@CPU-117:~/learning/makefiles/VPATH$ make
Makeing - all
touch all
sagar@CPU-117:~/learning/makefiles/VPATH$
kb5ga3dv

kb5ga3dv2#

我找到了解决办法https://gist.github.com/dnomyar/d01d886731ccc88d3c63 这有点难看,但似乎管用。

相关问题