/*
* Copyright 2017-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.rust;
import com.facebook.buck.rules.BuildRule;
import com.facebook.buck.rules.RuleKeyObjectSink;
import com.facebook.buck.rules.SourcePath;
import com.facebook.buck.rules.SourcePathResolver;
import com.facebook.buck.rules.SourcePathRuleFinder;
import com.facebook.buck.rules.args.Arg;
import com.facebook.buck.rules.args.HasSourcePath;
import com.google.common.collect.ImmutableCollection;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.ImmutableSortedSet;
import java.nio.file.Path;
/** Generate linker command line for Rust library when used as a dependency. */
public class RustLibraryArg implements Arg, HasSourcePath {
private final SourcePathResolver resolver;
private final String crate;
private final ImmutableSortedSet<BuildRule> deps;
private final SourcePath rlib;
private final boolean direct;
public RustLibraryArg(
SourcePathResolver resolver,
String crate,
SourcePath rlib,
boolean direct,
ImmutableSortedSet<BuildRule> deps) {
this.resolver = resolver;
this.crate = crate;
this.rlib = rlib;
this.direct = direct;
this.deps = deps;
}
@Override
public ImmutableCollection<BuildRule> getDeps(SourcePathRuleFinder ruleFinder) {
ImmutableSet.Builder<BuildRule> deps = ImmutableSet.builder();
deps.addAll(ruleFinder.filterBuildRuleInputs(getInputs()));
deps.addAll(this.deps);
return deps.build();
}
@Override
public ImmutableList<SourcePath> getInputs() {
return ImmutableList.of(rlib);
}
@Override
public void appendToCommandLine(
ImmutableCollection.Builder<String> builder, SourcePathResolver pathResolver) {
Path path = resolver.getRelativePath(rlib);
// NOTE: each of these logical args must be put on the command line as a single parameter
// (otherwise dedup might just remove one piece of it)
if (direct) {
builder.add(String.format("--extern=%s=%s", crate, path));
} else {
builder.add(String.format("-Ldependency=%s", path.getParent()));
}
}
@Override
public String toString() {
return crate;
}
@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (o == null || getClass() != o.getClass()) {
return false;
}
RustLibraryArg that = (RustLibraryArg) o;
if (direct != that.direct) {
return false;
}
if (!resolver.equals(that.resolver)) {
return false;
}
if (!crate.equals(that.crate)) {
return false;
}
if (!deps.equals(that.deps)) {
return false;
}
return rlib.equals(that.rlib);
}
@Override
public int hashCode() {
int result = resolver.hashCode();
result = 31 * result + crate.hashCode();
result = 31 * result + deps.hashCode();
result = 31 * result + rlib.hashCode();
result = 31 * result + (direct ? 1 : 0);
return result;
}
@Override
public void appendToRuleKey(RuleKeyObjectSink sink) {
sink.setReflectively("crate", crate);
sink.setReflectively("rlib", rlib);
}
@Override
public SourcePath getPath() {
return rlib;
}
}