// Copyright 2018 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.

package com.google.devtools.build.lib.bazel.rules.cpp;

import com.google.devtools.build.lib.actions.Artifact;
import com.google.devtools.build.lib.analysis.skylark.SkylarkRuleContext;
import com.google.devtools.build.lib.events.Location;
import com.google.devtools.build.lib.rules.cpp.CcCompilationContext;
import com.google.devtools.build.lib.rules.cpp.CcCompilationHelper.CompilationInfo;
import com.google.devtools.build.lib.rules.cpp.CcCompilationOutputs;
import com.google.devtools.build.lib.rules.cpp.CcLinkingHelper.LinkingInfo;
import com.google.devtools.build.lib.rules.cpp.CcModule;
import com.google.devtools.build.lib.rules.cpp.CcToolchainConfigInfo;
import com.google.devtools.build.lib.rules.cpp.CcToolchainFeatures.FeatureConfiguration;
import com.google.devtools.build.lib.rules.cpp.CcToolchainProvider;
import com.google.devtools.build.lib.rules.cpp.CcToolchainVariables;
import com.google.devtools.build.lib.rules.cpp.LibraryToLinkWrapper;
import com.google.devtools.build.lib.rules.cpp.LibraryToLinkWrapper.CcLinkingContext;
import com.google.devtools.build.lib.skylarkbuildapi.cpp.BazelCcModuleApi;
import com.google.devtools.build.lib.syntax.EvalException;
import com.google.devtools.build.lib.syntax.Runtime;
import com.google.devtools.build.lib.syntax.SkylarkList;

/**
 * A module that contains Skylark utilities for C++ support.
 *
 * <p>This is a work in progress. The API is guarded behind
 * --experimental_cc_skylark_api_enabled_packages. The API is under development and unstable.
 */
public class BazelCcModule extends CcModule
    implements BazelCcModuleApi<
        Artifact,
        SkylarkRuleContext,
        CcToolchainProvider,
        FeatureConfiguration,
        CompilationInfo,
        CcCompilationContext,
        CcCompilationOutputs,
        LinkingInfo,
        CcLinkingContext,
        LibraryToLinkWrapper,
        CcToolchainVariables,
        CcToolchainConfigInfo> {

  @Override
  public CompilationInfo compile(
      SkylarkRuleContext skylarkRuleContext,
      FeatureConfiguration skylarkFeatureConfiguration,
      CcToolchainProvider skylarkCcToolchainProvider,
      SkylarkList<Artifact> sources,
      SkylarkList<Artifact> headers,
      Object skylarkIncludes,
      Object skylarkCopts,
      SkylarkList<CcCompilationContext> ccCompilationContexts,
      Location location)
      throws EvalException, InterruptedException {
    return BazelCcModule.compile(
        BazelCppSemantics.INSTANCE,
        skylarkRuleContext,
        skylarkFeatureConfiguration,
        skylarkCcToolchainProvider,
        sources,
        headers,
        skylarkIncludes,
        skylarkCopts,
        /* generateNoPicOutputs= */ "conditionally",
        /* generatePicOutputs= */ "conditionally",
        /* skylarkAdditionalCompilationInputs= */ Runtime.NONE,
        /* skylarkAdditionalIncludeScanningRoots= */ Runtime.NONE,
        ccCompilationContexts,
        /* purpose= */ Runtime.NONE,
        location);
  }

  @Override
  public LinkingInfo link(
      SkylarkRuleContext skylarkRuleContext,
      FeatureConfiguration skylarkFeatureConfiguration,
      CcToolchainProvider skylarkCcToolchainProvider,
      CcCompilationOutputs ccCompilationOutputs,
      Object skylarkLinkopts,
      Object dynamicLibrary,
      SkylarkList<CcLinkingContext> skylarkCcLinkingContexts,
      boolean neverLink)
      throws InterruptedException, EvalException {
    return BazelCcModule.link(
        BazelCppSemantics.INSTANCE,
        skylarkRuleContext,
        skylarkFeatureConfiguration,
        skylarkCcToolchainProvider,
        ccCompilationOutputs,
        skylarkLinkopts,
        /* shouldCreateStaticLibraries= */ true,
        dynamicLibrary,
        skylarkCcLinkingContexts,
        neverLink);
  }
}
