1 #!/bin/sh
   2 #
   3 # Copyright (c) 2009, 2020, 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 #assume TOP is the dir from which the script has been called
  34 TOP=`pwd`
  35 cd $SCRIPT_DIR; SCRIPT_DIR=`pwd`
  36 cd $TOP;
  37 
  38 IDEA_OUTPUT=$TOP/.idea
  39 VERBOSE="false"
  40 while [ $# -gt 0 ]
  41 do
  42   case $1 in
  43     -h | --help )
  44       usage
  45       ;;
  46 
  47     -v | --vebose )
  48       VERBOSE="true"
  49       ;;
  50 
  51     -o | --output )
  52       IDEA_OUTPUT=$2/.idea
  53       shift
  54       ;;
  55 
  56     -*)  # bad option
  57       usage
  58       ;;
  59 
  60      * )  # non option
  61       break
  62       ;;
  63   esac
  64   shift
  65 done
  66 
  67 mkdir -p $IDEA_OUTPUT || exit 1
  68 cd $IDEA_OUTPUT; IDEA_OUTPUT=`pwd`
  69 
  70 if [ "x$TOPLEVEL_DIR" = "x" ] ; then
  71     cd $SCRIPT_DIR/..
  72     TOPLEVEL_DIR=`pwd`
  73     cd $IDEA_OUTPUT
  74 fi
  75 
  76 MAKE_DIR="$SCRIPT_DIR/../make"
  77 IDEA_MAKE="$MAKE_DIR/ide/idea/jdk"
  78 IDEA_TEMPLATE="$IDEA_MAKE/template"
  79 
  80 cp -r "$IDEA_TEMPLATE"/* "$IDEA_OUTPUT"
  81 
  82 #override template
  83 if [ -d "$TEMPLATES_OVERRIDE" ] ; then
  84     for file in `ls -p "$TEMPLATES_OVERRIDE" | grep -v /`; do
  85         cp "$TEMPLATES_OVERRIDE"/$file "$IDEA_OUTPUT"/
  86     done
  87 fi
  88 
  89 if [ "$VERBOSE" = "true" ] ; then
  90   echo "output dir: $IDEA_OUTPUT"
  91   echo "idea template dir: $IDEA_TEMPLATE"
  92 fi
  93 
  94 cd $TOP ; make -f "$IDEA_MAKE/idea.gmk" -I $MAKE_DIR/.. idea MAKEOVERRIDES= OUT=$IDEA_OUTPUT/env.cfg MODULES="$*" || exit 1
  95 cd $SCRIPT_DIR
  96 
  97 . $IDEA_OUTPUT/env.cfg
  98 
  99 # Expect MODULE_ROOTS, MODULE_NAMES, BOOT_JDK & SPEC to be set
 100 if [ "x$MODULE_ROOTS" = "x" ] ; then
 101   echo "FATAL: MODULE_ROOTS is empty" >&2; exit 1
 102 fi
 103 
 104 if [ "x$MODULE_NAMES" = "x" ] ; then
 105   echo "FATAL: MODULE_NAMES is empty" >&2; exit 1
 106 fi
 107 
 108 if [ "x$BOOT_JDK" = "x" ] ; then
 109   echo "FATAL: BOOT_JDK is empty" >&2; exit 1
 110 fi
 111 
 112 if [ "x$SPEC" = "x" ] ; then
 113   echo "FATAL: SPEC is empty" >&2; exit 1
 114 fi
 115 
 116 if [ -d "$TOPLEVEL_DIR/.hg" ] ; then
 117     VCS_TYPE="hg4idea"
 118 fi
 119 
 120 if [ -d "$TOPLEVEL_DIR/.git" ] ; then
 121     VCS_TYPE="Git"
 122 fi
 123 
 124 ### Replace template variables
 125 
 126 NUM_REPLACEMENTS=0
 127 
 128 replace_template_file() {
 129     for i in $(seq 1 $NUM_REPLACEMENTS); do
 130       eval "sed \"s|\${FROM${i}}|\${TO${i}}|g\" $1 > $1.tmp"
 131       mv $1.tmp $1
 132     done
 133 }
 134 
 135 replace_template_dir() {
 136     for f in `find $1 -type f` ; do
 137         replace_template_file $f
 138     done
 139 }
 140 
 141 add_replacement() {
 142     NUM_REPLACEMENTS=`expr $NUM_REPLACEMENTS + 1`
 143     eval FROM$NUM_REPLACEMENTS='$1'
 144     eval TO$NUM_REPLACEMENTS='$2'
 145 }
 146 
 147 add_replacement "###MODULE_NAMES###" "$MODULE_NAMES"
 148 add_replacement "###VCS_TYPE###" "$VCS_TYPE"
 149 SPEC_DIR=`dirname $SPEC`
 150 if [ "x$CYGPATH" = "x" ]; then
 151     add_replacement "###BUILD_DIR###" "$SPEC_DIR"
 152     add_replacement "###JTREG_HOME###" "$JT_HOME"
 153     add_replacement "###IMAGES_DIR###" "$SPEC_DIR/images/jdk"
 154     add_replacement "###ROOT_DIR###" "$TOPLEVEL_DIR"
 155     add_replacement "###IDEA_DIR###" "$IDEA_OUTPUT"
 156 else
 157     add_replacement "###BUILD_DIR###" "`cygpath -am $SPEC_DIR`"
 158     add_replacement "###IMAGES_DIR###" "`cygpath -am $SPEC_DIR`/images/jdk"
 159     add_replacement "###ROOT_DIR###" "`cygpath -am $TOPLEVEL_DIR`"
 160     add_replacement "###IDEA_DIR###" "`cygpath -am $IDEA_OUTPUT`"
 161     if [ "x$JT_HOME" = "x" ]; then
 162       add_replacement "###JTREG_HOME###" ""
 163     else
 164       add_replacement "###JTREG_HOME###" "`cygpath -am $JT_HOME`"
 165     fi
 166 fi
 167 
 168 SOURCE_PREFIX="<sourceFolder url=\"file://"
 169 SOURCE_POSTFIX="\" isTestSource=\"false\" />"
 170 
 171 for root in $MODULE_ROOTS; do
 172     if [ "x$CYGPATH" != "x" ]; then
 173         root=`cygpath -am $root`
 174     fi
 175     SOURCES=$SOURCES" $SOURCE_PREFIX""$root""$SOURCE_POSTFIX"
 176 done
 177 
 178 add_replacement "###SOURCE_ROOTS###" "$SOURCES"
 179 
 180 replace_template_dir "$IDEA_OUTPUT"
 181 
 182 ### Compile the custom Logger
 183 
 184 CLASSES=$IDEA_OUTPUT/classes
 185 
 186 if [ "x$ANT_HOME" = "x" ] ; then
 187    # try some common locations, before giving up
 188    if [ -f "/usr/share/ant/lib/ant.jar" ] ; then
 189      ANT_HOME="/usr/share/ant"
 190    elif [ -f "/usr/local/Cellar/ant/1.9.4/libexec/lib/ant.jar" ] ; then
 191      ANT_HOME="/usr/local/Cellar/ant/1.9.4/libexec"
 192    else
 193      echo "FATAL: cannot find ant. Try setting ANT_HOME." >&2; exit 1
 194    fi
 195 fi
 196 CP=$ANT_HOME/lib/ant.jar
 197 rm -rf $CLASSES; mkdir $CLASSES
 198 
 199 if [ "x$CYGPATH" = "x" ] ; then ## CYGPATH may be set in env.cfg
 200   JAVAC_SOURCE_FILE=$IDEA_OUTPUT/src/idea/IdeaLoggerWrapper.java
 201   JAVAC_SOURCE_PATH=$IDEA_OUTPUT/src
 202   JAVAC_CLASSES=$CLASSES
 203   JAVAC_CP=$CP
 204 else
 205   JAVAC_SOURCE_FILE=`cygpath -am $IDEA_OUTPUT/src/idea/IdeaLoggerWrapper.java`
 206   JAVAC_SOURCE_PATH=`cygpath -am $IDEA_OUTPUT/src`
 207   JAVAC_CLASSES=`cygpath -am $CLASSES`
 208   JAVAC_CP=`cygpath -am $CP`
 209 fi
 210 
 211 $BOOT_JDK/bin/javac -d $JAVAC_CLASSES -sourcepath $JAVAC_SOURCE_PATH -cp $JAVAC_CP $JAVAC_SOURCE_FILE