/*
* Copyright 2015-present Facebook, Inc.
*
* 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.facebook.buck.go;
import com.facebook.buck.cxx.Linker;
import com.facebook.buck.model.BuildTargets;
import com.facebook.buck.rules.AbstractBuildRule;
import com.facebook.buck.rules.AddToRuleKey;
import com.facebook.buck.rules.BinaryBuildRule;
import com.facebook.buck.rules.BuildContext;
import com.facebook.buck.rules.BuildRuleParams;
import com.facebook.buck.rules.BuildableContext;
import com.facebook.buck.rules.BuildableProperties;
import com.facebook.buck.rules.CommandTool;
import com.facebook.buck.rules.ExplicitBuildTargetSourcePath;
import com.facebook.buck.rules.SourcePath;
import com.facebook.buck.rules.SymlinkTree;
import com.facebook.buck.rules.Tool;
import com.facebook.buck.rules.args.SourcePathArg;
import com.facebook.buck.step.Step;
import com.facebook.buck.step.fs.MkdirStep;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
import java.nio.file.Path;
import java.util.Optional;
public class GoBinary extends AbstractBuildRule implements BinaryBuildRule {
@AddToRuleKey private final Tool linker;
@AddToRuleKey private final ImmutableList<String> linkerFlags;
@AddToRuleKey private final Optional<Linker> cxxLinker;
@AddToRuleKey private final GoPlatform platform;
private final GoCompile mainObject;
private final SymlinkTree linkTree;
private final Path output;
public GoBinary(
BuildRuleParams params,
Optional<Linker> cxxLinker,
SymlinkTree linkTree,
GoCompile mainObject,
Tool linker,
ImmutableList<String> linkerFlags,
GoPlatform platform) {
super(params);
this.cxxLinker = cxxLinker;
this.linker = linker;
this.linkTree = linkTree;
this.mainObject = mainObject;
this.platform = platform;
this.output =
BuildTargets.getGenPath(
getProjectFilesystem(),
params.getBuildTarget(),
"%s/" + params.getBuildTarget().getShortName());
this.linkerFlags = linkerFlags;
}
@Override
public Tool getExecutableCommand() {
return new CommandTool.Builder().addArg(SourcePathArg.of(getSourcePathToOutput())).build();
}
@Override
public BuildableProperties getProperties() {
return new BuildableProperties(BuildableProperties.Kind.PACKAGING);
}
@Override
public ImmutableList<Step> getBuildSteps(
BuildContext context, BuildableContext buildableContext) {
buildableContext.recordArtifact(output);
// There is no way to specify real-ld environment variables to the go linker - just hope
// that the two sets don't collide.
ImmutableList<String> cxxLinkerCommand = ImmutableList.of();
ImmutableMap.Builder<String, String> environment = ImmutableMap.builder();
if (cxxLinker.isPresent()) {
environment.putAll(cxxLinker.get().getEnvironment(context.getSourcePathResolver()));
cxxLinkerCommand = cxxLinker.get().getCommandPrefix(context.getSourcePathResolver());
}
environment.putAll(linker.getEnvironment(context.getSourcePathResolver()));
return ImmutableList.of(
MkdirStep.of(getProjectFilesystem(), output.getParent()),
new GoLinkStep(
getProjectFilesystem().getRootPath(),
environment.build(),
cxxLinkerCommand,
linker.getCommandPrefix(context.getSourcePathResolver()),
linkerFlags,
ImmutableList.of(linkTree.getRoot()),
platform,
context.getSourcePathResolver().getRelativePath(mainObject.getSourcePathToOutput()),
GoLinkStep.LinkMode.EXECUTABLE,
output));
}
@Override
public SourcePath getSourcePathToOutput() {
return new ExplicitBuildTargetSourcePath(getBuildTarget(), output);
}
}