[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: java Makefile



>>> "Matt Fair" <matt@netasol.com> 17-Jun-01 4:43:06 AM >>>

   Is there a good way to create a good Makefile 
   for JAVA projects? Right now all I am doing is in 
   my Makefile I have: javac $(find . -name \*.java)

I do something similar to Per. Below is the text of a makefile I use
which can be adapted to different projects; simply update the
SOURCEFILES variable.

I've not found a situation where this doesn't do what I want. More
importantly it's quicker than caclulating dependancies all the time,
though it does take some understanding on the part of the developer
about what has changed.


Nic Ferrier



# JCD Makefile
# (c) Nic Ferrier - Tapsell-Ferrier Limited 2001
#
# You are free to redistribute this file. NO WARRANTY or fitness 
# for purpose is implied by this notice.
#
# What goes on here?
# The SOURCEFILES should be a list of all the sources in your
project.
# The CC-CLASSPATH should be the compilation classpath for your
project.
# 
#   make compile
#
# Causes the classes that need to be compiled (because of changes
against
# the relevant .class file) to be compiled.
#
#   make recompile
#
# Causes all the source files within the project to be compiled.
#

##set by configure

SRCDIR = .
SOURCEDIR=$(SRCDIR)/source

#the source files belonging to the project
#These can be altered by Emacs JCD mode.
SOURCEFILES = 	$(SOURCEDIR)/filename1.java \
		$(SOURCEDIR)/filename2.java

#the desination directory for compilations
CC-DESTDIR =	bin

#add extra directories or jar files here
CC-CLASSPATH =  $(CC-DESTDIR)

#a mangling of the SOURCEFILES list above
CLASSESLIST=$(subst .java,.class,$(subst
$(SOURCEDIR)/,$(CC-DESTDIR)/,$(foreach dir,$(SOURCEFILES),$(dir))))


##variables which define some usefull constants
newline:=\\n
empty:=
space:=$(empty) $(empty)

#The default is to associate "all" with "compile"
all: compile

##rules predefined by the Makefile.
##These should be flexible enough for any project as long
##as the project conforms to the structure required above.

#the compilation target
#This is intended for developers who are constantly compiling stuff
#
#NOTE: this has to use a shell if test because the GNU-Make
$(wildcard) 
#doesn't work properly. If it did we could do this:
#
#  compile: $(CLASSLIST)
#  ifeq "$(wildcard filelist.mak)" "filelist.mak"
#	javac -classpath  $(subst $(space),:,$(CC-CLASSPATH)) -d
$(CC-DESTDIR) @filelist.mak
#	@rm filelist.mak
#  else
#	@echo Nothing to be done for compile.
#  endif
#
#I think that would be a lot better and have reported the fault with
#the $(wildcard) function to bug-make@gnu.org.
#The problem is that it does not recognise the existance of files
created
#within commands caused by pre-requisites.
compile: $(CLASSESLIST)
	@if [ -e filelist.mak ] ; then \
	  echo javac -classpath  $(subst $(space),:,$(CC-CLASSPATH))
-d $(CC-DESTDIR) @filelist.mak ; \
	  javac -classpath  $(subst $(space),:,$(CC-CLASSPATH)) -d
$(CC-DESTDIR) @filelist.mak  ; \
	  rm filelist.mak ; \
	else echo Nothing to be done for compile ; \
	fi

#recompile all the source files
.PHONY: recompile
recompile: clean-filelist all-source-files
	javac -classpath  $(subst $(space),:,$(CC-CLASSPATH)) -d
$(CC-DESTDIR) @filelist.mak
	@rm filelist.mak


#make the source file list be the list of all files
.PHONY: all-source-files

all-source-files:
	$(foreach sourcefile,$(SOURCEFILES),$(shell echo $(sourcefile)
>> filelist.mak))


#ensures that the filelist is fresh each time
#This simply removes the file list (after ensuring that it exists)
.PHONY: clean-filelist

clean-filelist: 
	@echo done > filelist.mak
	@rm filelist.mak

#target matching class files to source files
$(CC-DESTDIR)/%.class: $(SOURCEDIR)/%.java
	@echo $? >> filelist.mak


##End Makefile




Reply to: