1 #!/bin/sh
   2 #
   3 # Copyright (c) 2009, 2014, Oracle and/or its affiliates. All rights reserved.
   4 # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   5 #
   6 # This code is free software; you can redistribute it and/or modify it
   7 # under the terms of the GNU General Public License version 2 only, as
   8 # published by the Free Software Foundation.
   9 #
  10 # This code is distributed in the hope that it will be useful, but WITHOUT
  11 # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  12 # FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  13 # version 2 for more details (a copy is included in the LICENSE file that
  14 # accompanied this code).
  15 #
  16 # You should have received a copy of the GNU General Public License version
  17 # 2 along with this work; if not, write to the Free Software Foundation,
  18 # Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  19 #
  20 # Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  21 # or visit www.oracle.com if you need additional information or have any
  22 # questions.
  23 #
  24 
  25 # Shell script for generating an IDEA project from a given list of modules
  26 
  27 usage() {
  28       echo "usage: $0 [-h|--help] [-v|--verbose] [-o|--output <path>] [modules]+" 
  29       exit 1
  30 }
  31 
  32 SCRIPT_DIR=`dirname $0`
  33 PWD=`pwd`
  34 cd $SCRIPT_DIR; SCRIPT_DIR=`pwd`
  35 cd ../../; TOP=`pwd`; cd $PWD
  36 
  37 IDEA_OUTPUT=$TOP/.idea
  38 VERBOSE="false"
  39 while [ $# -gt 0 ]
  40 do
  41   case $1 in
  42     -h | --help )
  43       usage
  44       ;;
  45 
  46     -v | --vebose )
  47       VERBOSE="true"
  48       ;;
  49 
  50     -o | --output )
  51       IDEA_OUTPUT=$2
  52       shift
  53       ;;
  54 
  55     -*)  # bad option
  56       usage
  57       ;;
  58 
  59      * )  # non option
  60       break
  61       ;;
  62   esac
  63   shift
  64 done
  65 
  66 mkdir $IDEA_OUTPUT || exit 1
  67 cd $IDEA_OUTPUT; IDEA_OUTPUT=`pwd`
  68 
  69 IDEA_MAKE="$TOP/make/idea"
  70 IDEA_TEMPLATE="$IDEA_MAKE/template"
  71 IML_TEMPLATE="$IDEA_TEMPLATE/jdk.iml"
  72 ANT_TEMPLATE="$IDEA_TEMPLATE/ant.xml"
  73 IDEA_IML="$IDEA_OUTPUT/jdk.iml"
  74 IDEA_ANT="$IDEA_OUTPUT/ant.xml"
  75 
  76 if [ "$VERBOSE" = "true" ] ; then
  77   echo "output dir: $IDEA_OUTPUT"
  78   echo "idea template dir: $IDEA_TEMPLATE"
  79 fi
  80 
  81 if [ ! -f "$IML_TEMPLATE" ] ; then
  82   echo "FATAL: cannot find $IML_TEMPLATE" >&2; exit 1
  83 fi
  84 
  85 if [ ! -f "$ANT_TEMPLATE" ] ; then
  86   echo "FATAL: cannot find $ANT_TEMPLATE" >&2; exit 1
  87 fi
  88 
  89 cp -r "$IDEA_TEMPLATE"/* "$IDEA_OUTPUT"
  90 cd $TOP ; make -f "$IDEA_MAKE/idea.gmk" -I make/common idea MAKEOVERRIDES= OUT=$IDEA_OUTPUT/env.cfg MODULES="$*" || exit 1
  91 cd $SCRIPT_DIR
  92 
  93 . $IDEA_OUTPUT/env.cfg
  94 
  95 # Expect MODULE_ROOTS, MODULE_NAMES, BOOT_JDK & SPEC to be set
  96 if [ "x$MODULE_ROOTS" = "x" ] ; then
  97   echo "FATAL: MODULE_ROOTS is empty" >&2; exit 1
  98 fi
  99 
 100 if [ "x$MODULE_NAMES" = "x" ] ; then
 101   echo "FATAL: MODULE_NAMES is empty" >&2; exit 1
 102 fi
 103 
 104 if [ "x$BOOT_JDK" = "x" ] ; then
 105   echo "FATAL: BOOT_JDK is empty" >&2; exit 1
 106 fi
 107 
 108 if [ "x$SPEC" = "x" ] ; then
 109   echo "FATAL: SPEC is empty" >&2; exit 1
 110 fi
 111 
 112 SOURCE_FOLDER="      <sourceFolder url=\"file://\$MODULE_DIR\$/####\" isTestSource=\"false\" />"
 113 SOURCE_FOLDERS_DONE="false"
 114 
 115 addSourceFolder() {
 116   root=$@
 117   relativePath="`echo "$root" | sed -e s@"$TOP/\(.*$\)"@"\1"@`"
 118   folder="`echo "$SOURCE_FOLDER" | sed -e s@"\(.*/\)####\(.*\)"@"\1$relativePath\2"@`"
 119   printf "%s\n" "$folder" >> $IDEA_IML
 120 }
 121 
 122 ### Generate project iml
 123 RELATIVE_BUILD_DIR="`dirname $SPEC | sed -e s@"$TOP/\(.*$\)"@"\1"@`"
 124 rm -f $IDEA_IML
 125 while IFS= read -r line
 126 do
 127   if echo "$line" | egrep "^ .* <sourceFolder.*####" > /dev/null ; then
 128     if [ "$SOURCE_FOLDERS_DONE" = "false" ] ; then 
 129       SOURCE_FOLDERS_DONE="true"
 130       for root in $MODULE_ROOTS; do
 131          addSourceFolder $root
 132       done
 133     fi
 134   elif echo "$line" | egrep "^ .* <excludeFolder.*####" > /dev/null ; then
 135     ul="`echo "$line" | sed -e s@"\(.*/\)####\(.*\)"@"\1$RELATIVE_BUILD_DIR\2"@`"
 136     printf "%s\n" "$ul" >> $IDEA_IML 
 137   else
 138     printf "%s\n" "$line" >> $IDEA_IML
 139   fi
 140 done < "$IML_TEMPLATE"
 141 
 142 
 143 MODULE_NAME="        <property name=\"module.name\" value=\"####\" />"
 144 
 145 addModuleName() {
 146   mn="`echo "$MODULE_NAME" | sed -e s@"\(.*\)####\(.*\)"@"\1$MODULE_NAMES\2"@`"
 147   printf "%s\n" "$mn" >> $IDEA_ANT
 148 }
 149 
 150 BUILD_DIR="        <property name=\"build.target.dir\" value=\"####\" />"
 151 
 152 addBuildDir() {
 153   DIR=`dirname $SPEC`
 154   mn="`echo "$BUILD_DIR" | sed -e s@"\(.*\)####\(.*\)"@"\1$DIR\2"@`"
 155   printf "%s\n" "$mn" >> $IDEA_ANT
 156 }
 157 
 158 ### Generate ant.xml
 159 
 160 rm -f $IDEA_ANT
 161 while IFS= read -r line
 162 do
 163   if echo "$line" | egrep "^ .* <property name=\"module.name\"" > /dev/null ; then
 164     addModuleName
 165   elif echo "$line" | egrep "^ .* <property name=\"build.target.dir\"" > /dev/null ; then
 166     addBuildDir
 167   else
 168     printf "%s\n" "$line" >> $IDEA_ANT
 169   fi
 170 done < "$ANT_TEMPLATE"
 171 
 172 ### Compile the custom Logger
 173 
 174 CLASSES=$IDEA_OUTPUT/classes
 175 
 176 if [ "x$ANT_HOME" = "x" ] ; then
 177    # try some common locations, before giving up
 178    if [ -f "/usr/share/ant/lib/ant.jar" ] ; then
 179      ANT_HOME="/usr/share/ant"
 180    elif [ -f "/usr/local/Cellar/ant/1.9.4/libexec/lib/ant.jar" ] ; then
 181      ANT_HOME="/usr/local/Cellar/ant/1.9.4/libexec"
 182    else
 183      echo "FATAL: cannot find ant. Try setting ANT_HOME." >&2; exit 1
 184    fi
 185 fi
 186 CP=$ANT_HOME/lib/ant.jar
 187 rm -rf $CLASSES; mkdir $CLASSES
 188 
 189 if [ "x$CYGPATH" = "x" ] ; then ## CYGPATH may be set in env.cfg
 190   JAVAC_SOURCE_FILE=$IDEA_OUTPUT/src/idea/JdkIdeaAntLogger.java
 191   JAVAC_CLASSES=$CLASSES
 192   JAVAC_CP=$CP
 193 else
 194   JAVAC_SOURCE_FILE=`cygpath -am $IDEA_OUTPUT/src/idea/JdkIdeaAntLogger.java`
 195   JAVAC_CLASSES=`cygpath -am $CLASSES`
 196   JAVAC_CP=`cygpath -am $CP`
 197 fi
 198 
 199 $BOOT_JDK/bin/javac -d $JAVAC_CLASSES -cp $JAVAC_CP $JAVAC_SOURCE_FILE