2525# Shell script for generating an IDEA project from a given list of modules
2626
2727usage () {
28- echo " usage: $0 [-h|--help] [-v|--verbose] [-o|--output <path>] [modules]+"
28+ echo " Usage: $0 [-h|--help] [-q|--quiet] [-a|--absolute-paths] [-o|--output <path>] [modules...]"
29+ echo " -h | --help"
30+ echo " -q | --quiet
31+ No stdout output"
32+ echo " -a | --absolute-paths
33+ Use absolute paths to this jdk, so that generated .idea
34+ project files can be moved independently of jdk sources"
35+ echo " -o | --output <path>
36+ Where .idea directory with project files will be generated
37+ (e.g. using '-o .' will place project files in './.idea')
38+ Default: $TOPLEVEL_DIR "
39+ echo " [modules...]
40+ Generate project modules for specific java modules
41+ (e.g. 'java.base java.desktop')
42+ Default: all existing modules (java.* and jdk.*)"
2943 exit 1
3044}
3145
3246SCRIPT_DIR=` dirname $0 `
3347# assume TOP is the dir from which the script has been called
3448TOP=` pwd`
3549cd $SCRIPT_DIR ; SCRIPT_DIR=` pwd`
50+ cd .. ; TOPLEVEL_DIR=` pwd`
3651cd $TOP ;
3752
38- IDEA_OUTPUT=$TOP /.idea
39- CUSTOM_IDEA_OUTPUT=false
40- VERBOSE= " false"
53+ IDEA_OUTPUT=$TOPLEVEL_DIR /.idea
54+ VERBOSE=true
55+ ABSOLUTE_PATHS= false
4156while [ $# -gt 0 ]
4257do
4358 case $1 in
4459 -h | --help )
4560 usage
4661 ;;
4762
48- -v | --vebose )
49- VERBOSE=" true"
63+ -q | --quiet )
64+ VERBOSE=false
65+ ;;
66+
67+ -a | --absolute-paths )
68+ ABSOLUTE_PATHS=true
5069 ;;
5170
5271 -o | --output )
5372 IDEA_OUTPUT=$2 /.idea
54- CUSTOM_IDEA_OUTPUT=true
5573 shift
5674 ;;
5775
6886
6987mkdir -p $IDEA_OUTPUT || exit 1
7088cd $IDEA_OUTPUT ; IDEA_OUTPUT=` pwd`
89+ cd ..; IDEA_OUTPUT_PARENT=` pwd`
7190
72- if [ " x$TOPLEVEL_DIR " = " x" ] ; then
73- cd $SCRIPT_DIR /..
74- TOPLEVEL_DIR=` pwd`
75- cd $IDEA_OUTPUT
76- fi
77-
78- MAKE_DIR=" $SCRIPT_DIR /../make"
91+ MAKE_DIR=" $TOPLEVEL_DIR /make"
7992IDEA_MAKE=" $MAKE_DIR /ide/idea/jdk"
8093IDEA_TEMPLATE=" $IDEA_MAKE /template"
8194
@@ -88,17 +101,17 @@ if [ -d "$TEMPLATES_OVERRIDE" ] ; then
88101 done
89102fi
90103
91- if [ " $VERBOSE " = " true" ] ; then
92- echo " output dir: $IDEA_OUTPUT "
93- echo " idea template dir: $IDEA_TEMPLATE "
104+ if [ " $VERBOSE " = true ] ; then
105+ echo " Will generate IDEA project files in \" $IDEA_OUTPUT \" for project \" $TOPLEVEL_DIR \" "
94106fi
95107
96- cd $TOP ; make -f " $IDEA_MAKE /idea.gmk" -I $MAKE_DIR /.. idea MAKEOVERRIDES= OUT=$IDEA_OUTPUT /env.cfg MODULES=" $* " || exit 1
108+ cd $TOP ; make -f " $IDEA_MAKE /idea.gmk" -I " $TOPLEVEL_DIR " idea \
109+ MAKEOVERRIDES= IDEA_OUTPUT_PARENT=" $IDEA_OUTPUT_PARENT " OUT=" $IDEA_OUTPUT /env.cfg" MODULES=" $* " || exit 1
97110cd $SCRIPT_DIR
98111
99112. $IDEA_OUTPUT /env.cfg
100113
101- # Expect MODULES, MODULE_NAMES, BOOT_JDK & SPEC to be set
114+ # Expect MODULES, MODULE_NAMES, RELATIVE_PROJECT_DIR, RELATIVE_BUILD_DIR to be set
102115if [ " xMODULES" = " x" ] ; then
103116 echo " FATAL: MODULES is empty" >&2 ; exit 1
104117fi
@@ -107,12 +120,12 @@ if [ "x$MODULE_NAMES" = "x" ] ; then
107120 echo " FATAL: MODULE_NAMES is empty" >&2 ; exit 1
108121fi
109122
110- if [ " x$BOOT_JDK " = " x" ] ; then
111- echo " FATAL: BOOT_JDK is empty" >&2 ; exit 1
123+ if [ " x$RELATIVE_PROJECT_DIR " = " x" ] ; then
124+ echo " FATAL: RELATIVE_PROJECT_DIR is empty" >&2 ; exit 1
112125fi
113126
114- if [ " x$SPEC " = " x" ] ; then
115- echo " FATAL: SPEC is empty" >&2 ; exit 1
127+ if [ " x$RELATIVE_BUILD_DIR " = " x" ] ; then
128+ echo " FATAL: RELATIVE_BUILD_DIR is empty" >&2 ; exit 1
116129fi
117130
118131if [ -d " $TOPLEVEL_DIR /.hg" ] ; then
@@ -123,6 +136,29 @@ if [ -d "$TOPLEVEL_DIR/.git" ] ; then
123136 VCS_TYPE=" Git"
124137fi
125138
139+ if [ " $ABSOLUTE_PATHS " = true ] ; then
140+ if [ " x$PATHTOOL " != " x" ]; then
141+ PROJECT_DIR=" ` $PATHTOOL -am $TOPLEVEL_DIR ` "
142+ else
143+ PROJECT_DIR=" $TOPLEVEL_DIR "
144+ fi
145+ MODULE_DIR=" $PROJECT_DIR "
146+ cd " $TOPLEVEL_DIR " && cd " $RELATIVE_BUILD_DIR " && BUILD_DIR=" ` pwd` "
147+ else
148+ if [ " $RELATIVE_PROJECT_DIR " = " ." ] ; then
149+ PROJECT_DIR=" "
150+ else
151+ PROJECT_DIR=" /$RELATIVE_PROJECT_DIR "
152+ fi
153+ MODULE_DIR=" \$ MODULE_DIR\$ $PROJECT_DIR "
154+ PROJECT_DIR=" \$ PROJECT_DIR\$ $PROJECT_DIR "
155+ BUILD_DIR=" \$ PROJECT_DIR\$ /$RELATIVE_BUILD_DIR "
156+ fi
157+ if [ " $VERBOSE " = true ] ; then
158+ echo " Project root: $PROJECT_DIR "
159+ echo " Generating IDEA project files..."
160+ fi
161+
126162# ## Replace template variables
127163
128164NUM_REPLACEMENTS=0
@@ -146,18 +182,13 @@ add_replacement() {
146182 eval TO$NUM_REPLACEMENTS =' $2'
147183}
148184
185+ add_replacement " ###PROJECT_DIR###" " $PROJECT_DIR "
186+ add_replacement " ###MODULE_DIR###" " $MODULE_DIR "
149187add_replacement " ###MODULE_NAMES###" " $MODULE_NAMES "
150188add_replacement " ###VCS_TYPE###" " $VCS_TYPE "
151- SPEC_DIR=` dirname $SPEC `
152- RELATIVE_SPEC_DIR=" ` realpath --relative-to=\" $TOPLEVEL_DIR \" \" $SPEC_DIR \" ` "
153- add_replacement " ###BUILD_DIR###" " $RELATIVE_SPEC_DIR "
154- add_replacement " ###IMAGES_DIR###" " $RELATIVE_SPEC_DIR /images/jdk"
189+ add_replacement " ###BUILD_DIR###" " $BUILD_DIR "
155190if [ " x$PATHTOOL " != " x" ]; then
156- if [ " $CUSTOM_IDEA_OUTPUT " = true ]; then
157- add_replacement " ###BASH_RUNNER_PREFIX###" " ` $PATHTOOL -am $IDEA_OUTPUT /.idea/bash.bat` "
158- else
159- add_replacement " ###BASH_RUNNER_PREFIX###" " .idea\\\\ bash.bat"
160- fi
191+ add_replacement " ###BASH_RUNNER_PREFIX###" " \$ PROJECT_DIR\$ /.idea/bash.bat"
161192else
162193 add_replacement " ###BASH_RUNNER_PREFIX###" " "
163194fi
@@ -184,37 +215,32 @@ replace_template_dir "$IDEA_OUTPUT"
184215
185216# ## Generate module project files
186217
218+ if [ " $VERBOSE " = true ] ; then
219+ echo " Generating project modules:"
220+ fi
187221(
188222DEFAULT_IFS=" $IFS "
189223IFS=' #'
190- if [ " x$PATHTOOL " != " x" ]; then
191- TOPDIR_FOR_RELATIVITY_CHECKS=" ` echo \" $TOPLEVEL_DIR \" | tr ' [:upper:]' ' [:lower:]' ` "
192- else
193- TOPDIR_FOR_RELATIVITY_CHECKS=" $TOPLEVEL_DIR "
194- fi
195224for value in $MODULES ; do
196225 (
197226 eval " $value "
198- if [ " $VERBOSE " = " true" ] ; then
199- echo " generating project module: $module "
227+ if [ " $VERBOSE " = true ] ; then
228+ echo " $module "
200229 fi
201- add_replacement " ###MODULE_DIR ###" " src/$module "
230+ add_replacement " ###MODULE_CONTENT ###" " src/$module "
202231 SOURCE_DIRS=" "
203232 IFS=' '
204233 for dir in $moduleSrcDirs ; do
205- if [ " x$PATHTOOL " != " x" ]; then
206- dir=" ` echo \" $dir \" | tr ' [:upper:]' ' [:lower:]' ` "
207- fi
208- dir=" ` realpath --relative-to=\" $TOPDIR_FOR_RELATIVITY_CHECKS \" \" $dir \" ` "
209234 case $dir in # Exclude generated sources to avoid module-info conflicts, see https://youtrack.jetbrains.com/issue/IDEA-185108
210- " $SPEC_DIR " * ) ;;
211- * ) SOURCE_DIRS=" $SOURCE_DIRS <sourceFolder url=\" file://\$ MODULE_DIR\$ /$dir \" isTestSource=\" false\" /> "
235+ " src/" * ) SOURCE_DIRS=" $SOURCE_DIRS <sourceFolder url=\" file://$MODULE_DIR /$dir \" isTestSource=\" false\" /> "
212236 esac
213237 done
214238 add_replacement " ###SOURCE_DIRS###" " $SOURCE_DIRS "
215239 DEPENDENCIES=" "
216240 for dep in $moduleDependencies ; do
217- DEPENDENCIES=" $DEPENDENCIES <orderEntry type=\" module\" module-name=\" $dep \" /> "
241+ case $MODULE_NAMES in # Exclude skipped modules from dependencies
242+ * " $dep " * ) DEPENDENCIES=" $DEPENDENCIES <orderEntry type=\" module\" module-name=\" $dep \" /> "
243+ esac
218244 done
219245 add_replacement " ###DEPENDENCIES###" " $DEPENDENCIES "
220246 cp " $IDEA_OUTPUT /module.iml" " $IDEA_OUTPUT /$module .iml"
0 commit comments