使用GNU Make来管理Java项目,IDE神马都是浮云

# Super's Java project Makefile
VERSION_NUMBER := 1.0
MAKE_VERSION   
:= $(shell make -v|head -1)
# Location of trees.
SOURCE_DIR     := src
OUT_CLASS_DIR  
:= classes
OUT_JAR_DIR    
:= dist
OUT_DOC_DIR    
:= doc
PROJLIB_DIR    
:= lib
# Linux tools
AWK          := awk
FIND         
:= /usr/bin/find
MKDIR        := mkdir -p
RM           
:= rm -rf
SHELL        
:= /bin/bash
SED          
:= sed
HEAD         
:= head
MKTEMP       
:= mktemp
MV           
:= mv
# Path to support tools
# Use "?=" to set the variable a value if this variable hasn't been set
# Mostly, all these variables will be set in environment variables

JAVA_HOME    ?= /opt/jdk1.6.0_20
TOMCAT_HOME  
?= /opt/jakarta-tomcat-5.0.18
# Java tools
JAVA         := $(JAVA_HOME)/bin/java
JAVAC        
:= $(JAVA_HOME)/bin/javac
JFLAGS       
:= -sourcepath $(SOURCE_DIR) -d $(OUT_CLASS_DIR) -source 1.5
# Enable assert and perform strict class checking
JVMFLAGS     := -ea -esa -Xfuture
JVM          
:= $(JAVA) $(JVMFLAGS)
JAR          
:= $(JAVA_HOME)/bin/jar
JARFLAGS     
:= cvf
JAVADOC      
:= $(JAVA_HOME)/bin/javadoc
# javadoc compling options
JDFLAGS      := -sourcepath $(SOURCE_DIR) -d $(OUT_DOC_DIR) -link http://java.sun.com/j2se/1.5.0/docs/api

# Jars
LOG4J_JARS   := $(PROJLIB_DIR)/log4j-1.2.16.jar

# Set the Java classpath
class_path := OUT_CLASS_DIR LOG4J_JARS

# space - A blank space
space := $(empty) $(empty)

# Build classpath functions
# $(call build-classpath, variable-list)

define build-classpath
 $(strip                                                  
\
   $(patsubst 
:%,%,                                       \
     $(subst 
: ,:,                                        \
       $(strip                                            
\
          $(
foreach j,$1,$(call get-file,$j):)))))
endef
# $(call get-file, variable-name)
define get-file
   $(strip                                                
\
     $($
1)                                                \
     $(
if $(call file-exists-eval,$1),,                   \
       $(warning The file referenced by variable          
\
                  
'$1' ($($1)) cannot be found)))
endef
# $(call file-exists-eval, variable-name)
define file-exists-eval
   $(strip                                                
\
     $(
if $($1),,$(warning '$1' has no value))            \
     $(wildcard $($
1)))
endef

# Check whether file exists
# $(call file-exists, wildcard-pattern)

file-exists = $(wildcard $1)
# $(call check-file, file-list)
define check-file
   $(
foreach f, $1,                                       \
     $(
if $(call file-exists, $($f)),,                    \
       $(warning 
$f ($($f)) is missing)))
endef

# Jar MANIFEST file operations
# MANIFEST_TEMPLATE: We should use this template to customize our manifest file
# Pay attention NOT to use these PATTERN keywords because these keywords are replaced when making
# Manifest-Version: 1.0
# Built-By: PATTERN-BUILTBY
# Tool: PATTERN-TOOL
# Bundle-Name: PATTERN-BUNDLENAME
# Bundle-Vendor: PATTERN-BUNDLEVENDOR
# Bundle-Version: PATTERN-BUNDLEVERSION
# Name: PATTERN-NAME
# Implementation-Vendor: PATTERN-IMPLVENDOR
# Implementation-Title: PATTERN-IMPLTITLE
# Implementation-Version: PATTERN-IMPLVERSION

MANIFEST_TEMPLATE  := src/manifest/manifest.mf
TMP_JAR_DIR        
:= $(shell $(MKTEMP) --t make.XXXXXXXXXX)
TMP_MANIFEST       
:= $(TMP_JAR_DIR)/manifest.mf

# $(call add-manifest, bundlename, packagename, jarfile)
define add-manifest
    $(
MKDIR) $(TMP_JAR_DIR)
    $(SED)  
-"s/PATTERN-BUILTBY/Super.Zhang/g"               \
        
-"s/PATTERN-TOOL/$(MAKE_VERSION)/g"              \
        
-"s/PATTERN-BUNDLENAME/$1/g"                     \
        
-"s/PATTERN-BUNDLEVENDOR/Super.Zhang/g"          \
        
-"s/PATTERN-BUNDLEVERSION/$(VERSION_NUMBER)/g"   \
        
-"s/PATTERN-NAME/$2/g"                           \
        
-"s/PATTERN-IMPLVENDOR/Super.Zhang/g"            \
        
-"s/PATTERN-IMPLTITLE/$1/g"                      \
        
-"s/PATTERN-IMPLVERSION/$(VERSION_NUMBER)/g"     \
    $(MANIFEST_TEMPLATE) 
> $(TMP_MANIFEST)
    $(JAR) 
-ufm $3 $(TMP_MANIFEST)
    $(RM) $(TMP_JAR_DIR)
endef

# $(call make-jar,jar-variable-prefix)
# Be careful, "cd" will not change current working directory because Make start saparate
# processes for every command. So, just like next, if we wanna cd to a directory and do something,
# we should connect "cd" & corrosponding commands. And, next we don't need to "cd" back to orignal dir.

define make-jar
    
.PHONY: $1 $($1_file)
    $
1: $($1_file)
    $($1_file)
:
    $(
MKDIR) $(OUT_JAR_DIR)
    cd $(OUT_CLASS_DIR); $(JAR) $(JARFLAGS) $(notdir $@) $($1_packages)
    $(MV) $(OUT_CLASS_DIR)
/$(notdir $@) $(OUT_JAR_DIR)
    $(call add
-manifest, $($1_bundlename), $($1_packagename), $@)
endef

# Set the CLASSPATH. GNU Make's export command can bring this variable into environment variables
export CLASSPATH := $(call build-classpath, $(class_path))

# help - The default goal
.PHONY: help
help
:
    
@echo 'Help: make targets: all(compile, jars, javadoc), clean, classpath, check-config'

# all - Perform all tasks for a complete build
.PHONY: all
all
: compile jars javadoc
# all_javas - Temp file for holding source file list
all_javas := $(OUT_CLASS_DIR)/all.javas
# compile - Compile the source
.PHONY: compile
compile
: $(all_javas)
    $(JAVAC) $(JFLAGS) 
@mce_markerlt;
# all_javas - Gather source file list.
.INTERMEDIATE: $(all_javas)
$(all_javas)
:
    $(
MKDIR) $(OUT_CLASS_DIR)
    $(FIND) $(SOURCE_DIR) 
-name '*.java' > $@

# jar_list - List of all jars to create
jar_list := testcodes_jar
# file, bundlename, packagename, packages are mandatory
testcodes_jar_file        := $(OUT_JAR_DIR)/testcodes.jar
testcodes_jar_bundlename  
:= JDK5 TestCodes
testcodes_jar_packagename 
:= testcodes
testcodes_jar_packages    
:= testcodes
# jars - Create all jars
.PHONY: jars
jars
: $(jar_list)
# Create jars
$(foreach j, $(jar_list), $(eval $(call make-jar,$j)))

# javadoc - Generate the Java doc from sources
.PHONY: javadoc
javadoc
: $(all_javas)
    $(
MKDIR) $(OUT_DOC_DIR)
    $(JAVADOC) $(JDFLAGS) 
@mce_markerlt;

.PHONY: clean
clean
:
    $(RM) $(OUT_CLASS_DIR) $(OUT_DOC_DIR) $(OUT_JAR_DIR)

.PHONY: classpath
classpath
:
    
@echo CLASSPATH=$(strip $(CLASSPATH))

.PHONY: check-config
check
-config:
    
@echo Checking configuration...
    $(call check
-file, $(class_path) JAVA_HOME)
原文地址:https://www.cnblogs.com/super119/p/1902249.html