blob: e4cd355b5895c6b655c9af64b629c7b6ae416950 [file] [log] [blame]
/*
* Copyright (C) 2013 The Android Open Source Project
*
* 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.
*/
package com.android.tools.idea.gradle.compiler;
import com.android.tools.idea.gradle.invoker.GradleInvoker;
import com.android.tools.idea.gradle.project.BuildSettings;
import com.android.tools.idea.gradle.util.BuildMode;
import com.android.tools.idea.sdk.IdeSdks;
import com.google.common.annotations.VisibleForTesting;
import com.google.common.collect.Lists;
import com.intellij.compiler.server.BuildProcessParametersProvider;
import com.intellij.execution.configurations.CommandLineTokenizer;
import com.intellij.openapi.module.Module;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.KeyValue;
import com.intellij.util.net.HttpConfigurable;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.plugins.gradle.settings.GradleExecutionSettings;
import org.jetbrains.plugins.gradle.settings.GradleSettings;
import java.io.File;
import java.util.Collections;
import java.util.List;
import static com.android.tools.idea.gradle.compiler.BuildProcessJvmArgs.*;
import static com.android.tools.idea.gradle.util.AndroidGradleSettings.createJvmArg;
import static com.android.tools.idea.gradle.util.BuildMode.ASSEMBLE;
import static com.android.tools.idea.gradle.util.BuildMode.ASSEMBLE_TRANSLATE;
import static com.android.tools.idea.gradle.util.GradleBuilds.ASSEMBLE_TRANSLATE_TASK_NAME;
import static com.android.tools.idea.gradle.util.GradleBuilds.DEFAULT_ASSEMBLE_TASK_NAME;
import static com.android.tools.idea.gradle.util.GradleUtil.getGradleExecutionSettings;
import static com.android.tools.idea.gradle.util.Projects.*;
import static com.android.tools.idea.startup.AndroidStudioSpecificInitializer.isAndroidStudio;
import static com.intellij.openapi.util.io.FileUtil.toSystemDependentName;
/**
* Adds extra Android-Gradle related configuration options.
*/
public class AndroidGradleBuildProcessParametersProvider extends BuildProcessParametersProvider {
@NotNull private final Project myProject;
public AndroidGradleBuildProcessParametersProvider(@NotNull Project project) {
myProject = project;
}
@Override
@NotNull
public List<String> getVMArguments() {
if (!isBuildWithGradle(myProject)) {
return Collections.emptyList();
}
List<String> jvmArgs = Lists.newArrayList();
AndroidGradleBuildConfiguration buildConfiguration = AndroidGradleBuildConfiguration.getInstance(myProject);
populateJvmArgs(buildConfiguration, jvmArgs, myProject);
GradleExecutionSettings executionSettings = getGradleExecutionSettings(myProject);
if (executionSettings != null) {
populateJvmArgs(executionSettings, jvmArgs);
}
populateJvmArgs(BuildSettings.getInstance(myProject), jvmArgs);
if (!isAndroidStudio()) {
// See https://code.google.com/p/android/issues/detail?id=169743
addHttpProxySettings(jvmArgs);
}
return jvmArgs;
}
@VisibleForTesting
static void populateJvmArgs(@NotNull AndroidGradleBuildConfiguration buildConfiguration,
@NotNull List<String> jvmArgs,
@NotNull Project project) {
// Indicate whether build is in "offline" mode.
jvmArgs.add(createJvmArg(GRADLE_OFFLINE_BUILD_MODE, GradleSettings.getInstance(project).isOfflineWork()));
// Indicate whether "configuration on demand" is enabled.
jvmArgs.add(createJvmArg(GRADLE_CONFIGURATION_ON_DEMAND, buildConfiguration.USE_CONFIGURATION_ON_DEMAND));
// Add command-line options.
String[] commandLineOptions = buildConfiguration.getCommandLineOptions();
int optionCount = 0;
for (String option : commandLineOptions) {
String name = GRADLE_DAEMON_COMMAND_LINE_OPTION_PREFIX + optionCount++;
jvmArgs.add(createJvmArg(name, option));
}
}
@VisibleForTesting
void populateJvmArgs(@NotNull GradleExecutionSettings executionSettings, @NotNull List<String> jvmArgs) {
String gradleHome = executionSettings.getGradleHome();
if (gradleHome != null && !gradleHome.isEmpty()) {
gradleHome = toSystemDependentName(gradleHome);
jvmArgs.add(createJvmArg(GRADLE_HOME_DIR_PATH, gradleHome));
}
String serviceDirectory = executionSettings.getServiceDirectory();
if (serviceDirectory != null && !serviceDirectory.isEmpty()) {
serviceDirectory = toSystemDependentName(serviceDirectory);
jvmArgs.add(createJvmArg(GRADLE_SERVICE_DIR_PATH, serviceDirectory));
}
File javaHome = IdeSdks.getJdkPath();
if (javaHome != null) {
jvmArgs.add(createJvmArg(GRADLE_JAVA_HOME_DIR_PATH, javaHome.getPath()));
}
jvmArgs.add(createJvmArg(PROJECT_DIR_PATH, getBaseDirPath(myProject).getPath()));
boolean verboseProcessing = executionSettings.isVerboseProcessing();
jvmArgs.add(createJvmArg(USE_GRADLE_VERBOSE_LOGGING, verboseProcessing));
if (!isAndroidStudio()) {
// See https://code.google.com/p/android/issues/detail?id=169743
String jvmOptions = executionSettings.getDaemonVmOptions();
int jvmOptionCount = 0;
if (jvmOptions != null && !jvmOptions.isEmpty()) {
CommandLineTokenizer tokenizer = new CommandLineTokenizer(jvmOptions);
while(tokenizer.hasMoreTokens()) {
String name = GRADLE_DAEMON_JVM_OPTION_PREFIX + jvmOptionCount++;
jvmArgs.add(createJvmArg(name, tokenizer.nextToken()));
}
}
}
}
private static void addHttpProxySettings(@NotNull List<String> jvmArgs) {
List<KeyValue<String, String>> proxyProperties = HttpConfigurable.getJvmPropertiesList(false, null);
populateHttpProxyProperties(jvmArgs, proxyProperties);
}
@VisibleForTesting
static void populateHttpProxyProperties(List<String> jvmArgs, List<KeyValue<String, String>> properties) {
int propertyCount = properties.size();
for (int i = 0; i < propertyCount; i++) {
KeyValue<String, String> property = properties.get(i);
String name = HTTP_PROXY_PROPERTY_PREFIX + i;
String value = property.getKey() + HTTP_PROXY_PROPERTY_SEPARATOR + property.getValue();
jvmArgs.add(createJvmArg(name, value));
}
}
private void populateJvmArgs(@NotNull BuildSettings buildSettings, @NotNull List<String> jvmArgs) {
BuildMode buildMode = buildSettings.getBuildMode();
if (buildMode == null) {
buildMode = BuildMode.DEFAULT_BUILD_MODE;
}
jvmArgs.add(createJvmArg(BUILD_MODE, buildMode.toString()));
populateGradleTasksToInvoke(buildMode, jvmArgs);
}
@VisibleForTesting
void populateGradleTasksToInvoke(@NotNull BuildMode buildMode, @NotNull List<String> jvmArgs) {
if (buildMode == ASSEMBLE_TRANSLATE) {
jvmArgs.add(createJvmArg(GRADLE_TASKS_TO_INVOKE_PROPERTY_PREFIX + 0, ASSEMBLE_TRANSLATE_TASK_NAME));
return;
}
BuildSettings buildSettings = BuildSettings.getInstance(myProject);
Module[] modulesToBuild = buildSettings.getModulesToBuild();
if (modulesToBuild == null || (buildMode == ASSEMBLE && lastGradleSyncFailed(myProject))) {
jvmArgs.add(createJvmArg(GRADLE_TASKS_TO_INVOKE_PROPERTY_PREFIX + 0, DEFAULT_ASSEMBLE_TASK_NAME));
return;
}
GradleInvoker.TestCompileType testCompileType = GradleInvoker.getTestCompileType(buildSettings.getRunConfigurationTypeId());
List<String> tasks = GradleInvoker.findTasksToExecute(modulesToBuild, buildMode, testCompileType);
int taskCount = tasks.size();
for (int i = 0; i < taskCount; i++) {
String name = GRADLE_TASKS_TO_INVOKE_PROPERTY_PREFIX + i;
jvmArgs.add(createJvmArg(name, tasks.get(i)));
}
}
@Override
public boolean isProcessPreloadingEnabled() {
return !isBuildWithGradle(myProject);
}
}