Automating Compilation with make

Problem

You get tired of typing javac and java commands.

Solution

Use the make utility to direct your compilations.

Discussion

The Unix operating system has long had to deal with automating large or repetitive compilations. The most enduring tool for this purpose is make, invented by Stu Feldman at Bell Laboratories in the mid-1970s and still widely used. There have been literally dozens of make -like programs over the years. The X Window System has imake, which is really a front-end to make. Linux and GNU enthusiasts have gmake, and BSD systems feature BSD make; one or another will be installed under the name make. The cygwin32 project features its own make, a version of gmake. make consults a file called Makefile (or makefile ) in the current directory to figure out what you want done and how to do it. A makefile to build one Java program could be as simple as this:

all:
    javac HelloWorld.java

Makefiles can be much more involved. One common feature is to parameterize a makefile so that if you need to port the code to a new platform or you distribute your source code to others to port, all the necessary makefile changes are in one place. For example, to use make variables to let the user compile with either javac or Jikes, and to add a rule to remove the *.class files after a round of debugging, the makefile might grow somewhat, as shown here. Note that lines beginning with the pound sign (#) are comments for the reader and are ignored by make :

# Makefile for Acme FlutterBox program.
# Uncomment one of these compiler definitions:
#JAVAC=   javac
JAVAC=    jikes +E
 
compile:
        $(JAVAC)  *.java
 
clean:
        @rm -f *.class

All modern Unix systems and most MS-Windows IDEs ship with some version of make. Java became popular after the current fragmentation of Unix into multiple systems maintained by different groups, so many current make programs do not come preconfigured with “convenience” rules for Java; they all come with rules for C and other older languages. Thus you may want to provide a “default” rule for compiling from FILE.java into FILE.class. The way you do this will vary from one version of make to another, so please see your system’s documentation. For one such rule, see the file jmake.rules in the source distribution. For some slightly more involved, but still relatively simple, examples of using make, consult the files named Makefile in the source distribution.[7]

See Also

The sidebar Make Versus Ant.

Also, you may want to refer to the book Using Make and Imake (O’Reilly).



[7] The one bit of make syntax that isn’t explained is VARIABLE?=VALUE, which sets VARIABLE to VALUE only if it is not set. This is often used in make to pass a variable down and allow it to have a default value in the sub-makefile, but be overridden from the “main” makefile.

Get Java Cookbook now with the O’Reilly learning platform.

O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.