blob: cd4a19bf04ea487ecf85211f61eb57a3be73d014 [file] [log] [blame]
#!/bin/bash
# Copyright 2015 The Bazel Authors. All rights reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
# Generates an IntelliJ project in Bazel.
set -o errexit
cd $(dirname "$0")
cd ..
mkdir -p .idea/
cp -R scripts/resources/idea/*.* .idea/
source scripts/get_all_bazel_paths.sh
readonly compiler_file=.idea/compiler.xml
cat >$compiler_file <<'EOH'
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="CompilerConfiguration">
<excludeFromCompile>
EOH
for android_file in $ANDROID_IMPORTING_FILES; do
echo " <file url=\"\$PROJECT_DIR\$/${android_file}\" />" >> $compiler_file
done
cat >>$compiler_file <<'EOF'
</excludeFromCompile>
<resourceExtensions />
<wildcardResourcePatterns>
<entry name="!?*.java" />
<entry name="!?*.form" />
<entry name="!?*.class" />
<entry name="!?*.groovy" />
<entry name="!?*.scala" />
<entry name="!?*.flex" />
<entry name="!?*.kt" />
<entry name="!?*.clj" />
<entry name="!?*.aj" />
</wildcardResourcePatterns>
<annotationProcessing>
<profile default="true" name="Default" enabled="true">
<processor name="com.google.auto.value.processor.AutoValueProcessor" />
<processorPath useClasspath="true" />
</profile>
</annotationProcessing>
</component>
</project>
EOF
readonly iml_file=bazel.iml
# Code generated by AutoValue is put in $MODULE_DIR/out/generated; adding it as a Source Root
# allows IntelliJ to find it while editing. (that is, generated classes won't be marked as unknown.)
cat > $iml_file <<EOH
<?xml version="1.0" encoding="UTF-8"?>
<module type="JAVA_MODULE" version="4">
<component name="NewModuleRootManager">
<output url="file://\$MODULE_DIR\$/out" />
<content url="file://\$MODULE_DIR$/out/generated">
<sourceFolder url="file://\$MODULE_DIR$/out/generated" isTestSource="false" generated="true" />
</content>
<content url="file://\$MODULE_DIR\$/src">
EOH
for source in ${JAVA_PATHS}; do
if [[ $source == *"javatests" ]]; then
is_test_source="true"
elif [[ $source == *"test/java" ]]; then
is_test_source="true"
else
is_test_source="false"
fi
echo ' <sourceFolder url="file://$MODULE_DIR$/'"${source}\" isTestSource=\"${is_test_source}\" />" >> $iml_file
done
cat >> $iml_file <<'EOF'
</content>
<content url="file://$MODULE_DIR$/third_party/java">
EOF
THIRD_PARTY_JAVA_PATHS="$(ls third_party/java | sort -u | sed -e 's%$%/java%')"
for third_party_java_path in ${THIRD_PARTY_JAVA_PATHS}; do
echo ' <sourceFolder url="file://$MODULE_DIR$/third_party/java/'${third_party_java_path}'" isTestSource="false" />' >> $iml_file
done
cat >> $iml_file <<'EOF'
</content>
<orderEntry type="sourceFolder" forTests="false" />
EOF
# Write a module-library entry, usually a jar file but occasionally a directory.
function write_jar_entry() {
local root_file=$1
if [[ $# > 1 ]]; then
local source_path=$2
else
local source_path=""
fi
local protocol="file"
local file_end=""
if [[ $root_file == *.jar ]]; then
protocol="jar"
file_end="!"
fi
local readonly basename=${root_file##*/}
cat >> $iml_file <<EOF
<orderEntry type="module-library">
<library name="${basename}">
<CLASSES>
<root url="${protocol}://\$MODULE_DIR\$/${root_file}${file_end}/" />
</CLASSES>
<JAVADOC />
EOF
if [[ -z "${source_path}" ]]; then
echo " <SOURCES />" >> $iml_file
else
cat >> $iml_file <<EOF
<SOURCES>
<root url="jar:/\$MODULE_DIR\$/${source_path}!/" />
</SOURCES>
EOF
fi
if [[ $protocol == "file" ]]; then
cat >> $iml_file <<EOF
<jarDirectory url="file://\$MODULE_DIR\$/${root_file}" recursive="false" />
EOF
fi
cat >> $iml_file <<'EOF'
</library>
</orderEntry>
EOF
}
# Slight hack to make sure (1) our langtools is picked up before the SDK
# default, but that (2) SDK is picked up before auto-value, because that
# apparently causes problems for auto-value otherwise.
readonly javac_jar="third_party/java/jdk/langtools/javac.jar"
write_jar_entry "$javac_jar"
cat >> $iml_file <<'EOF'
<orderEntry type="inheritedJdk" />
EOF
for jar in ${THIRD_PARTY_JAR_PATHS}; do
if [[ jar != "$javac_jar" ]]; then
write_jar_entry $jar
fi
done
for path_pair in ${GENERATED_PATHS}; do
write_jar_entry ${path_pair//:/ }
done
write_jar_entry "bazel-bin/src/main/protobuf"
cat >> $iml_file <<'EOF'
</component>
</module>
EOF
echo
echo Done. Project file: $iml_file