blob: fccf0c228d5859dc0c9afbf652b1004c69c96127 [file] [log] [blame]
/*
* Copyright 2000-2014 JetBrains s.r.o.
*
* 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.intellij.compiler.ant;
import com.intellij.compiler.CompilerWorkspaceConfiguration;
import com.intellij.compiler.ant.taskdefs.*;
import com.intellij.compiler.impl.javaCompiler.javac.JavacConfiguration;
import com.intellij.openapi.compiler.CompilerBundle;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.project.ex.ProjectEx;
import com.intellij.openapi.projectRoots.JavaSdkType;
import com.intellij.openapi.projectRoots.Sdk;
import com.intellij.openapi.projectRoots.SdkTypeId;
import com.intellij.openapi.roots.OrderRootType;
import com.intellij.openapi.roots.ProjectRootManager;
import com.intellij.openapi.roots.libraries.LibraryTable;
import com.intellij.openapi.roots.libraries.LibraryTablesRegistrar;
import com.intellij.openapi.util.Couple;
import com.intellij.openapi.util.io.FileUtil;
import com.intellij.openapi.vfs.VfsUtil;
import com.intellij.openapi.vfs.VirtualFileManager;
import org.jetbrains.jps.model.java.compiler.JpsJavaCompilerOptions;
import java.io.File;
import java.io.IOException;
/**
* @author Eugene Zhuravlev
* Date: Mar 16, 2004
*/
// todo: move path variables properties and jdk home properties into te generated property file
public class BuildPropertiesImpl extends BuildProperties {
public BuildPropertiesImpl(Project project, final GenerationOptions genOptions) {
add(new Property(genOptions.getPropertiesFileName()));
//noinspection HardCodedStringLiteral
add(new Comment(CompilerBundle.message("generated.ant.build.disable.tests.property.comment"),
new Property(PROPERTY_SKIP_TESTS, "true")));
final JpsJavaCompilerOptions javacSettings = JavacConfiguration.getOptions(project, JavacConfiguration.class);
add(new Comment(CompilerBundle.message("generated.ant.build.compiler.options.comment")), 1);
//noinspection HardCodedStringLiteral
add(new Property(PROPERTY_COMPILER_GENERATE_DEBUG_INFO, javacSettings.DEBUGGING_INFO ? "on" : "off"), 1);
//noinspection HardCodedStringLiteral
add(new Property(PROPERTY_COMPILER_GENERATE_NO_WARNINGS, javacSettings.GENERATE_NO_WARNINGS ? "on" : "off"));
add(new Property(PROPERTY_COMPILER_ADDITIONAL_ARGS, javacSettings.ADDITIONAL_OPTIONS_STRING));
//noinspection HardCodedStringLiteral
final int heapSize = CompilerWorkspaceConfiguration.getInstance(project).getProcessHeapSize(javacSettings.MAXIMUM_HEAP_SIZE);
add(new Property(PROPERTY_COMPILER_MAX_MEMORY, Integer.toString(heapSize) + "m"));
add(new IgnoredFiles());
if (CompilerExcludes.isAvailable(project)) {
add(new CompilerExcludes(project, genOptions));
}
if (!genOptions.expandJarDirectories) {
add(new LibraryPatterns(project, genOptions));
}
add(new CompilerResourcePatterns(project));
if (genOptions.forceTargetJdk) {
createJdkGenerators(project);
}
LibraryDefinitionsGeneratorFactory factory = new LibraryDefinitionsGeneratorFactory((ProjectEx)project, genOptions);
final LibraryTablesRegistrar registrar = LibraryTablesRegistrar.getInstance();
final Generator projectLibs = factory.create(registrar.getLibraryTable(project), getProjectBaseDir(project),
CompilerBundle.message("generated.ant.build.project.libraries.comment"));
if (projectLibs != null) {
add(projectLibs);
}
final Generator globalLibs =
factory.create(registrar.getLibraryTable(), null, CompilerBundle.message("generated.ant.build.global.libraries.comment"));
if (globalLibs != null) {
add(globalLibs);
}
for (final LibraryTable table : registrar.getCustomLibraryTables()) {
if (table.getLibraries().length != 0) {
final Generator appServerLibs = factory.create(table, null, table.getPresentation().getDisplayName(true));
if (appServerLibs != null) {
add(appServerLibs);
}
}
}
final ChunkCustomCompilerExtension[] customCompilers = genOptions.getCustomCompilers();
if (genOptions.enableFormCompiler || customCompilers.length > 0) {
add(new Comment(CompilerBundle.message("generated.ant.build.custom.compilers.comment")));
Target register = new Target(TARGET_REGISTER_CUSTOM_COMPILERS, null, null, null);
if (genOptions.enableFormCompiler) {
//noinspection HardCodedStringLiteral
add(new Property(PROPERTY_JAVAC2_HOME, propertyRelativePath(PROPERTY_IDEA_HOME, "lib")));
Path javac2 = new Path(PROPERTY_JAVAC2_CLASSPATH_ID);
javac2.add(new PathElement(propertyRelativePath(PROPERTY_JAVAC2_HOME, "javac2.jar")));
javac2.add(new PathElement(propertyRelativePath(PROPERTY_JAVAC2_HOME, "jdom.jar")));
javac2.add(new PathElement(propertyRelativePath(PROPERTY_JAVAC2_HOME, "asm4-all.jar")));
javac2.add(new PathElement(propertyRelativePath(PROPERTY_JAVAC2_HOME, "jgoodies-forms.jar")));
add(javac2);
//noinspection HardCodedStringLiteral
register.add(new Tag("taskdef", Couple.of("name", "javac2"), Couple.of("classname", "com.intellij.ant.Javac2"),
Couple.of("classpathref", PROPERTY_JAVAC2_CLASSPATH_ID)));
register.add(new Tag("taskdef", Couple.of("name", "instrumentIdeaExtensions"),
Couple.of("classname", "com.intellij.ant.InstrumentIdeaExtensions"),
Couple.of("classpathref", PROPERTY_JAVAC2_CLASSPATH_ID)));
}
if (customCompilers.length > 0) {
for (ChunkCustomCompilerExtension ext : customCompilers) {
ext.generateCustomCompilerTaskRegistration(project, genOptions, register);
}
}
add(register);
}
}
protected void createJdkGenerators(final Project project) {
final Sdk[] jdks = getUsedJdks(project);
if (jdks.length > 0) {
add(new Comment(CompilerBundle.message("generated.ant.build.jdk.definitions.comment")), 1);
for (final Sdk jdk : jdks) {
if (jdk.getHomeDirectory() == null) {
continue;
}
final SdkTypeId sdkType = jdk.getSdkType();
if (!(sdkType instanceof JavaSdkType) || ((JavaSdkType)sdkType).getBinPath(jdk) == null) {
continue;
}
final File home = VfsUtil.virtualToIoFile(jdk.getHomeDirectory());
File homeDir;
try {
// use canonical path in order to resolve symlinks
homeDir = home.getCanonicalFile();
}
catch (IOException e) {
homeDir = home;
}
final String jdkName = jdk.getName();
final String jdkHomeProperty = getJdkHomeProperty(jdkName);
final FileSet fileSet = new FileSet(propertyRef(jdkHomeProperty));
final String[] urls = jdk.getRootProvider().getUrls(OrderRootType.CLASSES);
for (String url : urls) {
final String path = GenerationUtils.trimJarSeparator(VirtualFileManager.extractPath(url));
final File pathElement = new File(path);
final String relativePath = FileUtil.getRelativePath(homeDir, pathElement);
if (relativePath != null) {
fileSet.add(new Include(relativePath.replace(File.separatorChar, '/')));
}
}
final File binPath = toCanonicalFile(new File(((JavaSdkType)sdkType).getBinPath(jdk)));
final String relativePath = FileUtil.getRelativePath(homeDir, binPath);
if (relativePath != null) {
add(new Property(BuildProperties.getJdkBinProperty(jdkName),
propertyRef(jdkHomeProperty) + "/" + FileUtil.toSystemIndependentName(relativePath)), 1);
}
else {
add(new Property(BuildProperties.getJdkBinProperty(jdkName), FileUtil.toSystemIndependentName(binPath.getPath())), 1);
}
final Path jdkPath = new Path(getJdkPathId(jdkName));
jdkPath.add(fileSet);
add(jdkPath);
}
}
final Sdk projectJdk = ProjectRootManager.getInstance(project).getProjectSdk();
add(new Property(PROPERTY_PROJECT_JDK_HOME, projectJdk != null ? propertyRef(getJdkHomeProperty(projectJdk.getName())) : ""), 1);
add(new Property(PROPERTY_PROJECT_JDK_BIN, projectJdk != null ? propertyRef(getJdkBinProperty(projectJdk.getName())) : ""));
add(new Property(PROPERTY_PROJECT_JDK_CLASSPATH, projectJdk != null ? getJdkPathId(projectJdk.getName()) : ""));
}
}