Java tutorial
/* * 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.AbstractBuildRuleWithResolver; 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.BuildTargetSourcePath; import com.facebook.buck.rules.BuildableContext; import com.facebook.buck.rules.BuildableProperties; import com.facebook.buck.rules.CommandTool; import com.facebook.buck.rules.SourcePathResolver; 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 AbstractBuildRuleWithResolver 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, SourcePathResolver resolver, Optional<Linker> cxxLinker, SymlinkTree linkTree, GoCompile mainObject, Tool linker, ImmutableList<String> linkerFlags, GoPlatform platform) { super(params, resolver); 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(new SourcePathArg(getResolver(), new BuildTargetSourcePath(getBuildTarget()))).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()); cxxLinkerCommand = cxxLinker.get().getCommandPrefix(getResolver()); } environment.putAll(linker.getEnvironment()); return ImmutableList.of(new MkdirStep(getProjectFilesystem(), output.getParent()), new GoLinkStep(getProjectFilesystem().getRootPath(), environment.build(), cxxLinkerCommand, linker.getCommandPrefix(getResolver()), linkerFlags, ImmutableList.of(linkTree.getRoot()), platform, mainObject.getPathToOutput(), GoLinkStep.LinkMode.EXECUTABLE, output)); } @Override public Path getPathToOutput() { return output; } }