maker

This is a simple tool for generating java project Makefile.
Although it is designed for java, you can also use it with some changes for other target like java, such as scala.

maker

It is just a shell script, so you can run it with bash.

configure

  1. create a new file named ‘maker’(or anything you like) script in any directory included by $PATH

    1
    $ vim maker
  2. edit maker

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    #!/bin/bash
    #Author: persist
    #Abstract: generate java Makefile

    #source directory path (-s)
    SRC=src
    #lib directory path (-l)
    LIB=lib
    #extra libs (-e)
    EXT_LIBS=
    #directory path which *.class files will be put into (-c)
    CLASSES=classes
    #main class
    MAIN_CLASS=Main
    #final *.jar file path (-f)
    JAR_FILE=Main.jar

    #key words to search main class files
    MAIN_KEY="public static void main"
    #output file path (-o)
    OUTPUT=/dev/stdout

    #parse option
    while getopts "hs:l:e:c:m:f:o:k:" opt
    do
    case $opt in
    h)
    echo "usage: maker [option]"
    echo "options and arguments"
    echo "-s src : source directory path; default value is src"
    echo "-l lib : lib directory path; default value is lib"
    echo "-e ext_lib : extra libs,format: a.jar,b.jar; default value is (empty)"
    echo "-c classes : directory path which *.class files will be put into; default value is classes"
    echo "-m main_class: main class to be executed; default value is Main"
    echo "-f jar_file : final *.jar file path; default value is Main.jar"
    echo "-o output : output file path; default value is stdout"
    echo "-k key_words: key words to search main class files; default value is \"public static void main\""
    exit
    ;;
    s)
    SRC=$OPTARG
    ;;
    l)
    LIB=$OPTARG
    ;;
    e)
    EXT_LIBS=$OPTARG
    ;;
    c)
    CLASSES=$OPTARG
    ;;
    m)
    MAIN_CLASS=$OPTARG
    ;;
    f)
    JAR_FILE=$OPTARG
    ;;
    o)
    OUTPUT=$OPTARG
    ;;
    k)
    MAIN_KEY=$OPTARG
    ;;
    \?)
    echo "usage: maker [option]"
    echo "options and arguments"
    echo "-s src : source directory path; default value is src"
    echo "-l lib : lib directory path; default value is lib"
    echo "-e ext_lib : extra libs,format: a.jar,b.jar; default value is (empty)"
    echo "-c classes : directory path which *.class files will be put into; default value is classes"
    echo "-m main : main class to execute, such as com.persist.Main"
    echo "-f jar_file : final *.jar file path; default value is Main.jar"
    echo "-k key : key words to search main files"
    echo "-o output : output file path; default value is stdout"
    exit
    ;;
    esac
    done

    #parse EXT_LIBS
    EXT_LIBS=${EXT_LIBS/,/ }
    #parse MAIN_FILES
    cd $SRC
    MAIN_INFO=$(grep -rn "$MAIN_KEY" | awk '{print $1}')
    MAIN_INFO=${MAIN_INFO//:/ }
    MAIN_FILES=${MAIN_INFO//[0-9]/ }
    MAIN_FILES=$(echo $MAIN_FILES)
    cd $OLDPWD

    #generate Makefile
    echo "#Makefile" > $OUTPUT
    echo "JAVAC=javac" >> $OUTPUT
    echo "JAVA=java" >> $OUTPUT
    echo "JAR=jar" >> $OUTPUT
    echo "" >> $OUTPUT
    echo "" >> $OUTPUT
    echo "SRC=$SRC" >> $OUTPUT
    echo "" >> $OUTPUT
    echo "LIB=$LIB" >> $OUTPUT
    echo "" >> $OUTPUT
    echo "EXT_LIBS=$EXT_LIBS" >> $OUTPUT
    echo "" >> $OUTPUT
    echo "CLASSES=$CLASSES" >> $OUTPUT
    echo "" >> $OUTPUT
    echo "MAIN_FILES=$MAIN_FILES" >> $OUTPUT
    echo "" >> $OUTPUT
    echo "MAIN_CLASS=$MAIN_CLASS" >> $OUTPUT
    echo "" >> $OUTPUT
    echo "JAR_FILE=$JAR_FILE" >> $OUTPUT
    echo "" >> $OUTPUT
    echo "" >> $OUTPUT
    echo "#parse main files" >> $OUTPUT
    echo "FULL_MAIN_FILES=\$(addprefix \$(SRC)/,\$(MAIN_FILES))" >> $OUTPUT
    echo "#parse jar dirs" >> $OUTPUT
    echo "JAR_DIRS=\$(wildcard \$(CLASSES)/*)" >> $OUTPUT
    echo "#parse dependencies" >> $OUTPUT
    echo "JARS=\$(wildcard \$(LIB)/*.jar)" >> $OUTPUT
    echo "JARS+=\$(EXT_LIBS)" >> $OUTPUT
    echo "noop=" >> $OUTPUT
    echo "space=\$(noop) \$(noop)" >> $OUTPUT
    echo "DEPENDENCIES=\$(subst \$(space),:,\$(JARS))" >> $OUTPUT
    echo "" >> $OUTPUT
    echo "" >> $OUTPUT
    echo "all: " >> $OUTPUT
    echo " mkdir -p \$(CLASSES)" >> $OUTPUT
    echo " \$(JAVAC) -classpath \$(DEPENDENCIES) -sourcepath \$(SRC) \$(FULL_MAIN_FILES) -d \$(CLASSES)" >> $OUTPUT
    echo "" >> $OUTPUT
    echo "jar: " >> $OUTPUT
    echo " \$(JAR) cvf \$(JAR_FILE) \$(JAR_DIRS)" >> $OUTPUT
    echo "" >> $OUTPUT
    echo "run: " >> $OUTPUT
    echo " \$(JAVA) -Djava.ext.dirs=\$(LIB) -classpath \$(CLASSES) \$(MAIN_CLASS)">> $OUTPUT
    echo "" >> $OUTPUT
    echo "clean: " >> $OUTPUT
    echo " rm -rf \$(CLASSES) \$(JAR_FILE)" >> $OUTPUT
    echo ".PHONY: all jar run clean" >> $OUTPUT
  3. run maker, you can use -h for help

    1
    $ maker [option]