public void generateBuildConfiguration(@NotNull final CompileContext context) {

    if (shouldBeBuiltByExternalSystem(myProject)) return;

    if (!hasGradleModules(context)) return;

    final BuildManager buildManager = BuildManager.getInstance();
    final File projectSystemDir = buildManager.getProjectSystemDirectory(myProject);
    if (projectSystemDir == null) return;

    final File gradleConfigFile =
        new File(projectSystemDir, GradleProjectConfiguration.CONFIGURATION_FILE_RELATIVE_PATH);

    final Map<String, GradleModuleResourceConfiguration> affectedGradleModuleConfigurations =
        generateAffectedGradleModulesConfiguration(context);

    if (affectedGradleModuleConfigurations.isEmpty()) return;

    boolean configurationUpdateRequired = context.isRebuild() || !gradleConfigFile.exists();

    final Map<String, Integer> affectedConfigurationHash = new THashMap<String, Integer>();
    for (Map.Entry<String, GradleModuleResourceConfiguration> entry :
        affectedGradleModuleConfigurations.entrySet()) {
      Integer moduleLastConfigurationHash = myModulesConfigurationHash.get(entry.getKey());
      int moduleCurrentConfigurationHash = entry.getValue().computeConfigurationHash();
      if (moduleLastConfigurationHash == null
          || moduleLastConfigurationHash.intValue() != moduleCurrentConfigurationHash) {
        configurationUpdateRequired = true;
      }
      affectedConfigurationHash.put(entry.getKey(), moduleCurrentConfigurationHash);
    }

    final GradleProjectConfiguration projectConfig = loadLastConfiguration(gradleConfigFile);

    // update with newly generated configuration
    projectConfig.moduleConfigurations.putAll(affectedGradleModuleConfigurations);

    final Document document = new Document(new Element("gradle-project-configuration"));
    XmlSerializer.serializeInto(projectConfig, document.getRootElement());
    final boolean finalConfigurationUpdateRequired = configurationUpdateRequired;
    buildManager.runCommand(
        new Runnable() {
          @Override
          public void run() {
            if (finalConfigurationUpdateRequired) {
              buildManager.clearState(myProject);
            }
            FileUtil.createIfDoesntExist(gradleConfigFile);
            try {
              JDOMUtil.writeDocument(document, gradleConfigFile, "\n");
              myModulesConfigurationHash.putAll(affectedConfigurationHash);
            } catch (IOException e) {
              throw new RuntimeException(e);
            }
          }
        });
  }
  // in case of external build this path is returned by
  // FlexCommonUtils.getPathToFlexUnitTempDirectory()
  public static String getPathToFlexUnitTempDirectory(final Project project) {
    final BuildManager buildManager = BuildManager.getInstance();
    final File projectSystemDir = buildManager.getProjectSystemDirectory(project);
    if (projectSystemDir == null) {
      Logger.getInstance(FlexUnitPrecompileTask.class.getName()).error(project);
      return "";
    }

    return FileUtil.toSystemIndependentName(projectSystemDir.getPath()) + "/tmp";
  }