Makefile :不重新编译未更新的文件(单独的目录)
Makefile : do not recompile files not updated (separate directories)
我想知道 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 的创建日期。这是我的生成文件: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*"`
您可以使用 VPATH
变量指定 make 到哪里搜索依赖项。对于您的情况,您可以分配 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$
我找到了解决方案https://gist.github.com/Dnomyar/d01d886731ccc88d3c63
有点难看,不过好像还行。
我想知道 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 的创建日期。这是我的生成文件: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*"`
您可以使用 VPATH
变量指定 make 到哪里搜索依赖项。对于您的情况,您可以分配 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$
我找到了解决方案https://gist.github.com/Dnomyar/d01d886731ccc88d3c63 有点难看,不过好像还行。