• 使用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)
  • 相关阅读:
    从Python编程小白到大神?你可能还差这几步!
    网红游戏主播靠几行代码轻松“吃鸡”年赚百万!竟然是依靠Python
    爬虫凶猛:爬支付宝、爬微信、窃取数据/编程实战(2):爬虫架构
    轻松入门学网络爬虫编程实战(1):音乐歌单篇
    Centos System Info
    iOS xcodebuild 打包app
    Xcode部分插件无法使用识别的问题
    ios get airplay name
    Re-enable Alcatraz on Xcode 6.3.2 or newer
    Apple LLVM 6.0 Warning: profile data may be out of date
  • 原文地址:https://www.cnblogs.com/super119/p/1902249.html
Copyright © 2020-2023  润新知