2f5bf5c79effae9e801b878adf01bb873c2c5f03
[idea/community.git] / build / groovy / org / jetbrains / intellij / build / BuildTasks.groovy
1 /*
2  * Copyright 2000-2016 JetBrains s.r.o.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 package org.jetbrains.intellij.build
17
18 import groovy.transform.CompileDynamic
19 import groovy.transform.CompileStatic
20 import org.codehaus.gant.GantBinding
21 import org.jetbrains.intellij.build.impl.BuildTasksImpl
22 import org.jetbrains.intellij.build.impl.BuildUtils
23 import org.jetbrains.jps.gant.JpsGantTool
24 import org.jetbrains.jps.idea.IdeaProjectLoader
25
26 /**
27  * @author nik
28  */
29 @CompileStatic
30 abstract class BuildTasks {
31   /**
32    * Builds sources.zip archive containing the project source files keeping the original layout
33    */
34   abstract void zipProjectSources()
35
36   /**
37    * Builds archive containing production source roots of the project modules
38    */
39   abstract void zipSourcesOfModules(Collection<String> modules, String targetFilePath)
40
41   /**
42    * Updates search/searchableOptions.xml file in {@code targetModuleName} module output directory
43    * <br>
44    * todo[nik] this is temporary solution until code from layouts.gant files moved to the new builders. After that this method will
45    * be called inside {@link #buildDistributions()}
46    */
47   abstract void buildSearchableOptions(String targetModuleName, List<String> modulesToIndex, List<String> pathsToLicenses)
48
49   /**
50    * Creates a copy of *ApplicationInfo.xml file with substituted __BUILD_NUMBER__ and __BUILD_DATE__ placeholders
51    * <br>
52    * todo[nik] this is temporary solution until code from layouts.gant files moved to the new builders. After that this method will
53    * be called inside {@link #buildDistributions()}
54    * @return path to the copied file
55    */
56   abstract File patchApplicationInfo()
57
58   /**
59    * Creates distribution for all operating systems from JAR files located at {@link BuildPaths#distAll}
60    */
61   abstract void buildDistributions()
62
63   /**
64    * Produces distributions for all operating systems from sources. This includes compiling required modules, packing their output into JAR
65    * files accordingly to {@link ProductProperties#productLayout}, and creating distributions and installers for all OS.
66    */
67   abstract void compileModulesAndBuildDistributions()
68
69   abstract void compileProjectAndTests(List<String> includingTestsInModules)
70
71   abstract void compileModules(List<String> moduleNames, List<String> includingTestsInModules = [])
72
73   abstract void buildUpdaterJar()
74
75   abstract void buildUnpackedDistribution(String targetDirectory)
76
77   static BuildTasks create(BuildContext context) {
78     return new BuildTasksImpl(context)
79   }
80
81   /**
82    * Produces distributions for all operating systems. This method must be invoked from a gant script.
83    * @param productPropertiesClassName qualified name of a Groovy class which extends {@link ProductProperties} and describes the product.
84    * The class must have single constructor with single {@code projectHome} parameter of type {@code String}.
85    * @param groovyRootRelativePaths paths to root folders containing {@code productPropertiesClassName} and required classes, relative to project home
86    * @param communityHomeRelativePath path to a directory containing sources from idea/community Git repository relative to project home
87    */
88   @CompileDynamic
89   static void buildProduct(String productPropertiesClassName, List<String> groovyRootRelativePaths, String communityHomeRelativePath, Script gantScript,
90                            ProprietaryBuildTools proprietaryBuildTools = ProprietaryBuildTools.DUMMY) {
91     String projectHome = IdeaProjectLoader.guessHome(gantScript)
92     GantBinding binding = (GantBinding)gantScript.binding
93     groovyRootRelativePaths.each {
94       BuildUtils.addToClassPath("$projectHome/$it", binding.ant)
95     }
96     binding.includeTool << JpsGantTool
97     ProductProperties productProperties = (ProductProperties) Class.forName(productPropertiesClassName).constructors[0].newInstance(projectHome)
98     def context = BuildContext.createContext(binding.ant, binding.projectBuilder, binding.project, binding.global,
99                                              "$projectHome/$communityHomeRelativePath", projectHome, productProperties, proprietaryBuildTools)
100     create(context).compileModulesAndBuildDistributions()
101   }
102 }