Makefile同时编译C和Java程序

时间:2010-05-17 04:42:13

标签: java c makefile compilation

我有三个需要同时编译的程序,2个用C编写,1个用java编写。当他们在C中时,我让所有三个人都使用Makefile,但是后来在java中重写了其中一个...有没有办法用同一个makefile一次编译所有3个?

这是我当前的Makefile:

CC=gcc 
JC=javac 
JFLAGS= -g
CFLAGS= -Wall -g -std=c99
LDFLAGS= -lm
.SUFFIXES: .java .class
.java.class:
 $(JC) $(JFLAGS) $*.java

CLASSES = kasiski.java kentry.java

ALL= ic ftable kasiski

all: $(ALL)

ic: ic.o

kasiski: $(CLASSES:.java=.class)

ftable: ftable.o

ic.o: ic.c ic.h

ftable.o: ftable.c ftable.h

.PHONY: clean

clean:
 rm -rf core* *.class *.o *.gch $(ALL)

1 个答案:

答案 0 :(得分:3)

是的,你可以一次编译它们。如果你的“所有”目标取决于所有三个应用程序,那么“make all”应该构建所有这些应用程序。您可以使用三个单独的线程和/或进程来引入“-j3”进行实际编译(不清楚“一次”是什么意思)。此外,还有一些批评:

       
  • 不要定义“CC”,“CFLAGS”或“LDFLAGS”。您永远不应该定义“CC”,因为它会自动为您定义系统上的默认C编译器,您只需根据需要附加到“CFLAGS”和“LDFLAGS”(使用+ =)而不是简单地将它们删除,就像它们一样分配给它们会使你的Makefile不灵活(因为它们不能在外部被覆盖或扩充)。
  •    
  • 使用CLASSES来引用“.java”文件令人困惑......你应该将变量重命名为JAVA_SRCS,并定义JAVA_CLASSES = $ {JAVA_SRCS:.java = .class}。

有关详细说明,请参阅我的Makefile tutorial。也就是说,您可能需要考虑更现代的构建系统,例如BazelGradle。这些系统的设计使用起来更简单,更不易出错,更便携(因为它们可以更容易地进行便携式操作),而且速度更快。