diff --git a/bin/idea.sh b/bin/idea.sh index 1a8ecef05871..2914966a6951 100644 --- a/bin/idea.sh +++ b/bin/idea.sh @@ -25,7 +25,26 @@ # Shell script for generating an IDEA project from a given list of modules usage() { - echo "usage: $0 [-h|--help] [-v|--verbose] [-o|--output ] [-c|--conf ] [modules]+" + echo "Usage: $0 [-h|--help] [-q|--quiet] [-a|--absolute-paths] [-r|--root ] [-o|--output ] [-c|--conf ] [modules...]" + echo " -h | --help" + echo " -q | --quiet + No stdout output" + echo " -a | --absolute-paths + Use absolute paths to this jdk, so that generated .idea + project files can be moved independently of jdk sources" + echo " -r | --root + Project content root + Default: $TOPLEVEL_DIR" + echo " -o | --output + Where .idea directory with project files will be generated + (e.g. using '-o .' will place project files in './.idea') + Default: same as --root" + echo " -c | --conf + make configuration (release, slowdebug etc)" + echo " [modules...] + Generate project modules for specific java modules + (e.g. 'java.base java.desktop') + Default: all existing modules (java.* and jdk.*)" exit 1 } @@ -33,10 +52,13 @@ SCRIPT_DIR=`dirname $0` #assume TOP is the dir from which the script has been called TOP=`pwd` cd $SCRIPT_DIR; SCRIPT_DIR=`pwd` +if [ "x$TOPLEVEL_DIR" = "x" ] ; then + cd .. ; TOPLEVEL_DIR=`pwd` +fi cd $TOP; -IDEA_OUTPUT=$TOP/.idea -VERBOSE="false" +VERBOSE=true +ABSOLUTE_PATHS=false CONF_ARG= while [ $# -gt 0 ] do @@ -45,14 +67,24 @@ do usage ;; - -v | --vebose ) - VERBOSE="true" + -q | --quiet ) + VERBOSE=false + ;; + + -a | --absolute-paths ) + ABSOLUTE_PATHS=true + ;; + + -r | --root ) + TOPLEVEL_DIR="$2" + shift ;; -o | --output ) - IDEA_OUTPUT=$2/.idea + IDEA_OUTPUT="$2/.idea" shift ;; + -c | --conf ) CONF_ARG="CONF_NAME=$2" shift @@ -69,23 +101,19 @@ do shift done -if [ -e $IDEA_OUTPUT ] ; then - rm -r $IDEA_OUTPUT +if [ "x$IDEA_OUTPUT" = "x" ] ; then + IDEA_OUTPUT="$TOPLEVEL_DIR/.idea" fi + mkdir -p $IDEA_OUTPUT || exit 1 -cd $IDEA_OUTPUT; IDEA_OUTPUT=`pwd` +cd "$TOP" ; cd $TOPLEVEL_DIR; TOPLEVEL_DIR=`pwd` +cd "$TOP" ; cd $IDEA_OUTPUT; IDEA_OUTPUT=`pwd` +cd ..; IDEA_OUTPUT_PARENT=`pwd` +cd "$SCRIPT_DIR/.." ; OPENJDK_DIR=`pwd` -if [ "x$TOPLEVEL_DIR" = "x" ] ; then - cd $SCRIPT_DIR/.. - TOPLEVEL_DIR=`pwd` - cd $IDEA_OUTPUT -fi - -MAKE_DIR="$SCRIPT_DIR/../make" -IDEA_MAKE="$MAKE_DIR/ide/idea/jdk" +IDEA_MAKE="$OPENJDK_DIR/make/ide/idea/jdk" IDEA_TEMPLATE="$IDEA_MAKE/template" -cp -r "$TOPLEVEL_DIR/jb/project/idea-project-files"/* "$IDEA_OUTPUT" cp -r "$IDEA_TEMPLATE"/* "$IDEA_OUTPUT" #override template @@ -95,31 +123,31 @@ if [ -d "$TEMPLATES_OVERRIDE" ] ; then done fi -if [ "$VERBOSE" = "true" ] ; then - echo "output dir: $IDEA_OUTPUT" - echo "idea template dir: $IDEA_TEMPLATE" +if [ "$VERBOSE" = true ] ; then + echo "Will generate IDEA project files in \"$IDEA_OUTPUT\" for project \"$TOPLEVEL_DIR\"" fi -cd $TOP ; make idea-gen-config ALLOW=IDEA_OUTPUT,MODULES IDEA_OUTPUT=$IDEA_OUTPUT MODULES="$*" $CONF_ARG || exit 1 +cd $TOP ; make idea-gen-config ALLOW=TOPLEVEL_DIR,IDEA_OUTPUT_PARENT,IDEA_OUTPUT,MODULES TOPLEVEL_DIR="$TOPLEVEL_DIR" \ + IDEA_OUTPUT_PARENT="$IDEA_OUTPUT_PARENT" IDEA_OUTPUT="$IDEA_OUTPUT" MODULES="$*" $CONF_ARG || exit 1 cd $SCRIPT_DIR . $IDEA_OUTPUT/env.cfg -# Expect MODULE_ROOTS, MODULE_NAMES, BOOT_JDK & SPEC to be set -if [ "x$MODULE_ROOTS" = "x" ] ; then - echo "FATAL: MODULE_ROOTS is empty" >&2; exit 1 +# Expect MODULES, MODULE_NAMES, RELATIVE_PROJECT_DIR, RELATIVE_BUILD_DIR to be set +if [ "xMODULES" = "x" ] ; then + echo "FATAL: MODULES is empty" >&2; exit 1 fi if [ "x$MODULE_NAMES" = "x" ] ; then echo "FATAL: MODULE_NAMES is empty" >&2; exit 1 fi -if [ "x$BOOT_JDK" = "x" ] ; then - echo "FATAL: BOOT_JDK is empty" >&2; exit 1 +if [ "x$RELATIVE_PROJECT_DIR" = "x" ] ; then + echo "FATAL: RELATIVE_PROJECT_DIR is empty" >&2; exit 1 fi -if [ "x$SPEC" = "x" ] ; then - echo "FATAL: SPEC is empty" >&2; exit 1 +if [ "x$RELATIVE_BUILD_DIR" = "x" ] ; then + echo "FATAL: RELATIVE_BUILD_DIR is empty" >&2; exit 1 fi if [ -d "$TOPLEVEL_DIR/.hg" ] ; then @@ -131,6 +159,39 @@ if [ -d "$TOPLEVEL_DIR/.git" -o -f "$TOPLEVEL_DIR/.git" ] ; then VCS_TYPE="Git" fi +if [ "$ABSOLUTE_PATHS" = true ] ; then + if [ "x$PATHTOOL" != "x" ]; then + PROJECT_DIR="`$PATHTOOL -am $OPENJDK_DIR`" + TOPLEVEL_PROJECT_DIR="`$PATHTOOL -am $TOPLEVEL_DIR`" + else + PROJECT_DIR="$OPENJDK_DIR" + TOPLEVEL_PROJECT_DIR="$TOPLEVEL_DIR" + fi + MODULE_DIR="$PROJECT_DIR" + TOPLEVEL_MODULE_DIR="$TOPLEVEL_PROJECT_DIR" + cd "$IDEA_OUTPUT_PARENT" && cd "$RELATIVE_BUILD_DIR" && BUILD_DIR="`pwd`" +else + if [ "$RELATIVE_PROJECT_DIR" = "." ] ; then + PROJECT_DIR="" + else + PROJECT_DIR="/$RELATIVE_PROJECT_DIR" + fi + if [ "$RELATIVE_TOPLEVEL_PROJECT_DIR" = "." ] ; then + TOPLEVEL_PROJECT_DIR="" + else + TOPLEVEL_PROJECT_DIR="/$RELATIVE_TOPLEVEL_PROJECT_DIR" + fi + MODULE_DIR="\$MODULE_DIR\$$PROJECT_DIR" + PROJECT_DIR="\$PROJECT_DIR\$$PROJECT_DIR" + TOPLEVEL_MODULE_DIR="\$MODULE_DIR\$$TOPLEVEL_PROJECT_DIR" + TOPLEVEL_PROJECT_DIR="\$PROJECT_DIR\$$TOPLEVEL_PROJECT_DIR" + BUILD_DIR="\$PROJECT_DIR\$/$RELATIVE_BUILD_DIR" +fi +if [ "$VERBOSE" = true ] ; then + echo "Project root: $PROJECT_DIR" + echo "Generating IDEA project files..." +fi + ### Replace template variables NUM_REPLACEMENTS=0 @@ -154,116 +215,90 @@ add_replacement() { eval TO$NUM_REPLACEMENTS='$2' } +add_replacement "###PROJECT_DIR###" "$PROJECT_DIR" +add_replacement "###MODULE_DIR###" "$MODULE_DIR" +add_replacement "###TOPLEVEL_PROJECT_DIR###" "$TOPLEVEL_PROJECT_DIR" +add_replacement "###TOPLEVEL_MODULE_DIR###" "$TOPLEVEL_MODULE_DIR" add_replacement "###MODULE_NAMES###" "$MODULE_NAMES" add_replacement "###VCS_TYPE###" "$VCS_TYPE" -SPEC_DIR=`dirname $SPEC` -if [ "x$CYGPATH" != "x" ]; then - add_replacement "###BUILD_DIR###" "`$CYGPATH -am $SPEC_DIR`" - add_replacement "###IMAGES_DIR###" "`$CYGPATH -am $SPEC_DIR`/images/jdk" - add_replacement "###ROOT_DIR###" "`$CYGPATH -am $TOPLEVEL_DIR`" - add_replacement "###IDEA_DIR###" "`$CYGPATH -am $IDEA_OUTPUT`" +add_replacement "###BUILD_DIR###" "$BUILD_DIR" +if [ "x$PATHTOOL" != "x" ]; then + add_replacement "###BASH_RUNNER_PREFIX###" "\$PROJECT_DIR\$/.idea/bash.bat" +else + add_replacement "###BASH_RUNNER_PREFIX###" "" +fi +if [ "x$PATHTOOL" != "x" ]; then if [ "x$JT_HOME" = "x" ]; then add_replacement "###JTREG_HOME###" "" else - add_replacement "###JTREG_HOME###" "`$CYGPATH -am $JT_HOME`" - fi -elif [ "x$WSL_DISTRO_NAME" != "x" ]; then - add_replacement "###BUILD_DIR###" "`wslpath -am $SPEC_DIR`" - add_replacement "###IMAGES_DIR###" "`wslpath -am $SPEC_DIR`/images/jdk" - add_replacement "###ROOT_DIR###" "`wslpath -am $TOPLEVEL_DIR`" - add_replacement "###IDEA_DIR###" "`wslpath -am $IDEA_OUTPUT`" - if [ "x$JT_HOME" = "x" ]; then - add_replacement "###JTREG_HOME###" "" - else - add_replacement "###JTREG_HOME###" "`wslpath -am $JT_HOME`" + add_replacement "###JTREG_HOME###" "`$PATHTOOL -am $JT_HOME`" fi else - add_replacement "###BUILD_DIR###" "$SPEC_DIR" add_replacement "###JTREG_HOME###" "$JT_HOME" - add_replacement "###IMAGES_DIR###" "$SPEC_DIR/images/jdk" - add_replacement "###ROOT_DIR###" "$TOPLEVEL_DIR" - add_replacement "###IDEA_DIR###" "$IDEA_OUTPUT" fi -SOURCE_PREFIX="" - -for root in $MODULE_ROOTS; do - if [ "x$CYGPATH" != "x" ]; then - root=`$CYGPATH -am $root` - elif [ "x$WSL_DISTRO_NAME" != "x" ]; then - root=`wslpath -am $root` - fi - - SOURCES=$SOURCES" $SOURCE_PREFIX""$root""$SOURCE_POSTFIX" +MODULE_IMLS="" +TEST_MODULE_DEPENDENCIES="" +for module in $MODULE_NAMES; do + MODULE_IMLS="$MODULE_IMLS " + TEST_MODULE_DEPENDENCIES="$TEST_MODULE_DEPENDENCIES " done - -add_replacement "###SOURCE_ROOTS###" "$SOURCES" +add_replacement "###MODULE_IMLS###" "$MODULE_IMLS" +add_replacement "###TEST_MODULE_DEPENDENCIES###" "$TEST_MODULE_DEPENDENCIES" replace_template_dir "$IDEA_OUTPUT" -### Compile the custom Logger +### Generate module project files -CLASSES=$IDEA_OUTPUT/classes +if [ "$VERBOSE" = true ] ; then + echo "Generating project modules:" + fi +( +DEFAULT_IFS="$IFS" +IFS='#' +for value in $MODULES; do + ( + eval "$value" + if [ "$VERBOSE" = true ] ; then + echo " $module" + fi + MAIN_SOURCE_DIRS="" + CONTENT_ROOTS="" + IFS=' ' + for dir in $moduleSrcDirs; do + case $dir in + "src/"*) MAIN_SOURCE_DIRS="$MAIN_SOURCE_DIRS " ;; + *"/support/gensrc/$module") ;; # Exclude generated sources to avoid module-info conflicts, see https://youtrack.jetbrains.com/issue/IDEA-185108 + *) CONTENT_ROOTS="$CONTENT_ROOTS \ + " ;; + esac + done + if [ "x$MAIN_SOURCE_DIRS" != "x" ] ; then + CONTENT_ROOTS="$MAIN_SOURCE_DIRS$CONTENT_ROOTS" + fi + add_replacement "###MODULE_CONTENT_ROOTS###" "$CONTENT_ROOTS" + DEPENDENCIES="" + for dep in $moduleDependencies; do + case $MODULE_NAMES in # Exclude skipped modules from dependencies + *"$dep"*) DEPENDENCIES="$DEPENDENCIES " + esac + done + add_replacement "###DEPENDENCIES###" "$DEPENDENCIES" + cp "$IDEA_OUTPUT/module.iml" "$IDEA_OUTPUT/$module.iml" + IFS="$DEFAULT_IFS" + replace_template_file "$IDEA_OUTPUT/$module.iml" + ) +done +) +rm "$IDEA_OUTPUT/module.iml" -if [ "x$ANT_HOME" = "x" ] ; then - # try some common locations - if [ -f "/usr/share/ant/lib/ant.jar" ] ; then - ANT_HOME="/usr/share/ant" +### Create shell script runner for Windows + +if [ "x$PATHTOOL" != "x" ]; then + echo "@echo off" > "$IDEA_OUTPUT/bash.bat" + if [ "x$WSL_DISTRO_NAME" != "x" ] ; then + echo "wsl -d $WSL_DISTRO_NAME --cd \"%cd%\" -e %*" >> "$IDEA_OUTPUT/bash.bat" else - try_ant=$(ls /opt/homebrew/Cellar/ant/*/libexec/lib/ant.jar 2> /dev/null | sort -r | head -n 1) - if [ "x$try_ant" != "x" ] ; then - ANT_HOME=$(cd $(dirname $try_ant)/.. && pwd) - else - try_ant=$(ls /usr/local/Cellar/ant/*/libexec/lib/ant.jar 2> /dev/null | sort -r | head -n 1) - if [ "x$try_ant" != "x" ] ; then - ANT_HOME=$(cd $(dirname $try_ant)/.. && pwd) - fi - fi - fi -else - if [ ! -f "$ANT_HOME/lib/ant.jar" ] ; then - echo "FATAL: ANT_HOME is incorrect. Try removing it and use autodetection, or fix the value" >&2; exit 1 + echo "$WINENV_ROOT\bin\bash.exe -l -c \"cd %CD:\=/%/ && %*\"" >> "$IDEA_OUTPUT/bash.bat" fi fi - -if [ "x$ANT_HOME" = "x" ] ; then - echo "FATAL: cannot find ant. Try setting ANT_HOME." >&2; exit 1 -fi -CP=$ANT_HOME/lib/ant.jar -rm -rf $CLASSES; mkdir $CLASSES - -# If we have a Windows boot JDK, we need a .exe suffix -if [ -e "$BOOT_JDK/bin/java.exe" ] ; then - JAVAC=javac.exe -else - JAVAC=javac -fi - -# If we are on WSL, the boot JDK might be either Windows or Linux, -# and we need to use realpath instead of CYGPATH to make javac work on both. -# We need to handle this case first since CYGPATH might be set on WSL. -if [ "x$WSL_DISTRO_NAME" != "x" ]; then - JAVAC_SOURCE_FILE=`realpath --relative-to=./ $IDEA_OUTPUT/src/idea/IdeaLoggerWrapper.java` - JAVAC_SOURCE_PATH=`realpath --relative-to=./ $IDEA_OUTPUT/src` - JAVAC_CLASSES=`realpath --relative-to=./ $CLASSES` - ANT_TEMP=`mktemp -d -p ./` - cp $ANT_HOME/lib/ant.jar $ANT_TEMP/ant.jar - JAVAC_CP=$ANT_TEMP/ant.jar -elif [ "x$CYGPATH" != "x" ] ; then ## CYGPATH may be set in env.cfg - JAVAC_SOURCE_FILE=`$CYGPATH -am $IDEA_OUTPUT/src/idea/IdeaLoggerWrapper.java` - JAVAC_SOURCE_PATH=`$CYGPATH -am $IDEA_OUTPUT/src` - JAVAC_CLASSES=`$CYGPATH -am $CLASSES` - JAVAC_CP=`$CYGPATH -am $CP` -else - JAVAC_SOURCE_FILE=$IDEA_OUTPUT/src/idea/IdeaLoggerWrapper.java - JAVAC_SOURCE_PATH=$IDEA_OUTPUT/src - JAVAC_CLASSES=$CLASSES - JAVAC_CP=$CP -fi - -$BOOT_JDK/bin/$JAVAC -d $JAVAC_CLASSES -sourcepath $JAVAC_SOURCE_PATH -cp $JAVAC_CP $JAVAC_SOURCE_FILE - -if [ "x$WSL_DISTRO_NAME" != "x" ]; then - rm -rf $ANT_TEMP -fi diff --git a/make/Main.gmk b/make/Main.gmk index 1ec48c54f85e..4f66f9c33357 100644 --- a/make/Main.gmk +++ b/make/Main.gmk @@ -358,7 +358,7 @@ $(eval $(call SetupTarget, vscode-project-ccls, \ $(eval $(call SetupTarget, idea-gen-config, \ MAKEFILE := ide/idea/jdk/IdeaGenConfig, \ - ARGS := IDEA_OUTPUT="$(IDEA_OUTPUT)" MODULES="$(MODULES)", \ + ARGS := IDEA_OUTPUT="$(IDEA_OUTPUT)" MODULES="$(MODULES)" TOPLEVEL_DIR="$(TOPLEVEL_DIR)" IDEA_OUTPUT_PARENT="$(IDEA_OUTPUT_PARENT)", \ )) ################################################################################ diff --git a/make/ide/idea/jdk/IdeaGenConfig.gmk b/make/ide/idea/jdk/IdeaGenConfig.gmk index 5f8afc471174..661164180528 100644 --- a/make/ide/idea/jdk/IdeaGenConfig.gmk +++ b/make/ide/idea/jdk/IdeaGenConfig.gmk @@ -41,15 +41,21 @@ endif OUT := $(IDEA_OUTPUT)/env.cfg idea: - $(RM) $(OUT) + $(ECHO) "MODULES=\"$(foreach mod, $(MODULES), \ + module='$(mod)' \ + moduleSrcDirs='$(foreach m,$(call FindModuleSrcDirs,$(mod)),$(call RelativePath,$m,$(TOPDIR)))' \ + moduleDependencies='$(call FindTransitiveDepsForModule,$(mod))' \ + #)\"" > $(OUT) $(ECHO) "SUPPORT=$(SUPPORT_OUTPUTDIR)" >> $(OUT) $(ECHO) "MODULE_ROOTS=\"$(foreach mod, $(MODULES), $(call FindModuleSrcDirs, $(mod)))\"" >> $(OUT) $(ECHO) "MODULE_NAMES=\"$(strip $(foreach mod, $(MODULES), $(mod)))\"" >> $(OUT) - $(ECHO) "SEL_MODULES=\"$(MODULES)\"" >> $(OUT) - $(ECHO) "BOOT_JDK=\"$(BOOT_JDK)\"" >> $(OUT) - $(ECHO) "CYGPATH=\"$(PATHTOOL)\"" >> $(OUT) - $(ECHO) "SPEC=\"$(SPEC)\"" >> $(OUT) + $(ECHO) "RELATIVE_TOPLEVEL_PROJECT_DIR=\"$(call RelativePath,$(TOPLEVEL_DIR),$(IDEA_OUTPUT_PARENT))\"" >> $(OUT) + $(ECHO) "RELATIVE_PROJECT_DIR=\"$(call RelativePath,$(TOPLEVEL_DIR),$(IDEA_OUTPUT_PARENT))\"" >> $(OUT) +# $(ECHO) "RELATIVE_PROJECT_DIR=\"$(call RelativePath,$(TOPDIR),$(IDEA_OUTPUT_PARENT))\"" >> $(OUT) + $(ECHO) "RELATIVE_BUILD_DIR=\"$(call RelativePath,$(OUTPUTDIR),$(IDEA_OUTPUT_PARENT))\"" >> $(OUT) + $(ECHO) "PATHTOOL=\"$(PATHTOOL)\"" >> $(OUT) $(ECHO) "JT_HOME=\"$(JT_HOME)\"" >> $(OUT) + $(ECHO) "WINENV_ROOT=\"$(WINENV_ROOT)\"" >> $(OUT) all: idea diff --git a/make/ide/idea/jdk/build.xml b/make/ide/idea/jdk/build.xml deleted file mode 100644 index 0292f0f5d359..000000000000 --- a/make/ide/idea/jdk/build.xml +++ /dev/null @@ -1,42 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/make/ide/idea/jdk/template/ant.xml b/make/ide/idea/jdk/template/ant.xml deleted file mode 100644 index 9cb90246ea04..000000000000 --- a/make/ide/idea/jdk/template/ant.xml +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - - - - - - - diff --git a/make/ide/idea/jdk/template/compiler.xml b/make/ide/idea/jdk/template/compiler.xml index eef129e7b871..9281fa10db72 100644 --- a/make/ide/idea/jdk/template/compiler.xml +++ b/make/ide/idea/jdk/template/compiler.xml @@ -3,10 +3,10 @@ - + diff --git a/make/ide/idea/jdk/template/workspace.xml b/make/ide/idea/jdk/template/workspace.xml index f1270d4fb5d2..54f29e47608f 100644 --- a/make/ide/idea/jdk/template/workspace.xml +++ b/make/ide/idea/jdk/template/workspace.xml @@ -2,63 +2,62 @@ - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + +