com.facebook.buck.go.GoBinary.java Source code

Java tutorial

Introduction

Here is the source code for com.facebook.buck.go.GoBinary.java

Source

/*
 * 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;
    }

}