Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

go: introduce _go_sdk and _go_sdk_package target types for SDK analysis #17973

Merged
merged 5 commits into from
Jan 12, 2023
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions src/python/pants/backend/experimental/go/register.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,8 @@
GoModTarget,
GoPackageSourcesField,
GoPackageTarget,
GoSdkPackageTarget,
GoSdkTarget,
GoThirdPartyPackageTarget,
)
from pants.backend.go.util_rules import (
Expand Down Expand Up @@ -45,6 +47,8 @@ def target_types():
GoThirdPartyPackageTarget,
GoBinaryTarget,
*wrap_golang.target_types,
GoSdkTarget,
GoSdkPackageTarget,
]


Expand Down
4 changes: 2 additions & 2 deletions src/python/pants/backend/go/dependency_inference_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
from pants.backend.go import target_type_rules
from pants.backend.go.goals.test import GoTestFieldSet, GoTestRequest
from pants.backend.go.goals.test import rules as test_rules
from pants.backend.go.target_types import GoBinaryTarget, GoModTarget, GoPackageTarget
from pants.backend.go.target_types import GoBinaryTarget, GoModTarget, GoPackageTarget, GoSdkTarget
from pants.backend.go.util_rules import (
assembly,
build_pkg,
Expand Down Expand Up @@ -50,7 +50,7 @@ def rule_runner() -> RuleRunner:
QueryRule(TestResult, (GoTestRequest.Batch,)),
QueryRule(ProcessResult, (GoSdkProcess,)),
],
target_types=[GoModTarget, GoPackageTarget, GoBinaryTarget],
target_types=[GoModTarget, GoPackageTarget, GoBinaryTarget, GoSdkTarget],
)
rule_runner.set_options(["--go-test-args=-v"], env_inherit={"PATH"})
return rule_runner
Expand Down
9 changes: 7 additions & 2 deletions src/python/pants/backend/go/goals/check_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,12 @@
from pants.backend.go import target_type_rules
from pants.backend.go.goals import check
from pants.backend.go.goals.check import GoCheckFieldSet, GoCheckRequest
from pants.backend.go.target_types import GoModTarget, GoPackageTarget
from pants.backend.go.target_types import (
GoModTarget,
GoPackageTarget,
GoSdkPackageTarget,
GoSdkTarget,
)
from pants.backend.go.util_rules import (
assembly,
build_pkg,
Expand Down Expand Up @@ -44,7 +49,7 @@ def rule_runner() -> RuleRunner:
*target_type_rules.rules(),
QueryRule(CheckResults, [GoCheckRequest]),
],
target_types=[GoModTarget, GoPackageTarget],
target_types=[GoModTarget, GoPackageTarget, GoSdkTarget, GoSdkPackageTarget],
)
rule_runner.set_options([], env_inherit={"PATH"})
return rule_runner
Expand Down
9 changes: 7 additions & 2 deletions src/python/pants/backend/go/goals/generate_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,12 @@
from pants.backend.go import target_type_rules
from pants.backend.go.goals import generate
from pants.backend.go.goals.generate import GoGenerateGoal, OverwriteMergeDigests, _expand_env
from pants.backend.go.target_types import GoModTarget, GoPackageTarget
from pants.backend.go.target_types import (
GoModTarget,
GoPackageTarget,
GoSdkPackageTarget,
GoSdkTarget,
)
from pants.backend.go.util_rules import (
assembly,
build_pkg,
Expand Down Expand Up @@ -50,7 +55,7 @@ def rule_runner() -> RuleRunner:
get_filtered_environment,
QueryRule(DigestContents, (OverwriteMergeDigests,)),
],
target_types=[GoModTarget, GoPackageTarget],
target_types=[GoModTarget, GoPackageTarget, GoSdkTarget, GoSdkPackageTarget],
preserve_tmpdirs=True,
)
rule_runner.set_options([], env_inherit=PYTHON_BOOTSTRAP_ENV)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,13 @@
from pants.backend.go import target_type_rules
from pants.backend.go.goals import package_binary
from pants.backend.go.goals.package_binary import GoBinaryFieldSet
from pants.backend.go.target_types import GoBinaryTarget, GoModTarget, GoPackageTarget
from pants.backend.go.target_types import (
GoBinaryTarget,
GoModTarget,
GoPackageTarget,
GoSdkPackageTarget,
GoSdkTarget,
)
from pants.backend.go.util_rules import (
assembly,
build_pkg,
Expand Down Expand Up @@ -48,7 +54,13 @@ def rule_runner() -> RuleRunner:
*sdk.rules(),
QueryRule(BuiltPackage, (GoBinaryFieldSet,)),
],
target_types=[GoBinaryTarget, GoModTarget, GoPackageTarget],
target_types=[
GoBinaryTarget,
GoModTarget,
GoPackageTarget,
GoSdkTarget,
GoSdkPackageTarget,
],
)
rule_runner.set_options([], env_inherit={"PATH"})
return rule_runner
Expand Down
16 changes: 14 additions & 2 deletions src/python/pants/backend/go/goals/tailor_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,13 @@
has_package_main,
)
from pants.backend.go.goals.tailor import rules as go_tailor_rules
from pants.backend.go.target_types import GoBinaryTarget, GoModTarget, GoPackageTarget
from pants.backend.go.target_types import (
GoBinaryTarget,
GoModTarget,
GoPackageTarget,
GoSdkPackageTarget,
GoSdkTarget,
)
from pants.backend.go.util_rules import (
assembly,
build_pkg,
Expand Down Expand Up @@ -46,7 +52,13 @@ def rule_runner() -> RuleRunner:
*link.rules(),
QueryRule(PutativeTargets, [PutativeGoTargetsRequest, AllOwnedSources]),
],
target_types=[GoModTarget, GoBinaryTarget, GoPackageTarget],
target_types=[
GoModTarget,
GoBinaryTarget,
GoPackageTarget,
GoSdkTarget,
GoSdkPackageTarget,
],
tdyas marked this conversation as resolved.
Show resolved Hide resolved
)
rule_runner.set_options([], env_inherit={"PATH"})
return rule_runner
Expand Down
9 changes: 7 additions & 2 deletions src/python/pants/backend/go/goals/test_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,12 @@
from pants.backend.go.goals.test import GoTestFieldSet, GoTestRequest
from pants.backend.go.goals.test import rules as test_rules
from pants.backend.go.goals.test import transform_test_args
from pants.backend.go.target_types import GoModTarget, GoPackageTarget
from pants.backend.go.target_types import (
GoModTarget,
GoPackageTarget,
GoSdkPackageTarget,
GoSdkTarget,
)
from pants.backend.go.util_rules import (
assembly,
build_pkg,
Expand Down Expand Up @@ -52,7 +57,7 @@ def rule_runner() -> RuleRunner:
QueryRule(TestResult, [GoTestRequest.Batch]),
QueryRule(ProcessResult, [GoSdkProcess]),
],
target_types=[GoModTarget, GoPackageTarget, FileTarget],
target_types=[GoModTarget, GoPackageTarget, GoSdkTarget, GoSdkPackageTarget, FileTarget],
)
rule_runner.set_options(["--go-test-args=-v -bench=."], env_inherit={"PATH"})
return rule_runner
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,12 @@
from pants.backend.go.lint.golangci_lint.rules import GolangciLintFieldSet, GolangciLintRequest
from pants.backend.go.lint.golangci_lint.rules import rules as golangci_lint_rules
from pants.backend.go.lint.golangci_lint.subsystem import GolangciLint
from pants.backend.go.target_types import GoModTarget, GoPackageTarget
from pants.backend.go.target_types import (
GoModTarget,
GoPackageTarget,
GoSdkPackageTarget,
GoSdkTarget,
)
from pants.backend.go.util_rules import (
assembly,
build_pkg,
Expand All @@ -35,7 +40,7 @@
@pytest.fixture()
def rule_runner() -> RuleRunner:
rule_runner = RuleRunner(
target_types=[GoModTarget, GoPackageTarget],
target_types=[GoModTarget, GoPackageTarget, GoSdkTarget, GoSdkPackageTarget],
rules=[
*assembly.rules(),
*build_pkg.rules(),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,12 @@
from pants.backend.go.lint.vet.rules import GoVetFieldSet, GoVetRequest
from pants.backend.go.lint.vet.rules import rules as go_vet_rules
from pants.backend.go.lint.vet.subsystem import GoVetSubsystem
from pants.backend.go.target_types import GoModTarget, GoPackageTarget
from pants.backend.go.target_types import (
GoModTarget,
GoPackageTarget,
GoSdkPackageTarget,
GoSdkTarget,
)
from pants.backend.go.util_rules import (
assembly,
build_pkg,
Expand All @@ -36,7 +41,7 @@
@pytest.fixture()
def rule_runner() -> RuleRunner:
rule_runner = RuleRunner(
target_types=[GoModTarget, GoPackageTarget],
target_types=[GoModTarget, GoPackageTarget, GoSdkTarget, GoSdkPackageTarget],
rules=[
*skip_field.rules(),
*go_vet_rules(),
Expand Down
101 changes: 94 additions & 7 deletions src/python/pants/backend/go/target_type_rules.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,9 @@
GoModSourcesField,
GoModTarget,
GoPackageSourcesField,
GoSdkImportPathField,
GoSdkPackageTarget,
GoSdkTarget,
GoThirdPartyPackageDependenciesField,
GoThirdPartyPackageTarget,
)
Expand All @@ -36,7 +39,11 @@
OwningGoMod,
OwningGoModRequest,
)
from pants.backend.go.util_rules.import_analysis import GoStdLibPackages, GoStdLibPackagesRequest
from pants.backend.go.util_rules.import_analysis import (
GoStdLibPackage,
GoStdLibPackages,
GoStdLibPackagesRequest,
)
from pants.backend.go.util_rules.third_party_pkg import (
AllThirdPartyPackages,
AllThirdPartyPackagesRequest,
Expand All @@ -50,6 +57,12 @@
from pants.engine.addresses import Address
from pants.engine.engine_aware import EngineAwareParameter
from pants.engine.fs import Digest, Snapshot
from pants.engine.internals.synthetic_targets import (
SyntheticAddressMap,
SyntheticAddressMaps,
SyntheticTargetsRequest,
)
from pants.engine.internals.target_adaptor import TargetAdaptor
from pants.engine.rules import Get, MultiGet, collect_rules, rule
from pants.engine.target import (
AllTargets,
Expand Down Expand Up @@ -91,7 +104,8 @@ async def go_map_import_paths_by_module(
candidate_go_source_targets = [
tgt
for tgt in all_targets
if tgt.has_field(GoImportPathField) or tgt.has_field(GoPackageSourcesField)
if (tgt.has_field(GoImportPathField) or tgt.has_field(GoPackageSourcesField))
and not tgt.has_field(GoSdkImportPathField)
]

owning_go_mod_targets = await MultiGet(
Expand Down Expand Up @@ -225,7 +239,7 @@ async def infer_go_dependencies(
)

addr = request.field_set.address
maybe_pkg_analysis, std_lib_imports = await MultiGet(
maybe_pkg_analysis, stdlib_packages = await MultiGet(
Get(
FallibleFirstPartyPkgAnalysis, FirstPartyPkgAnalysisRequest(addr, build_opts=build_opts)
),
Expand All @@ -249,7 +263,9 @@ async def infer_go_dependencies(
*pkg_analysis.test_imports,
*pkg_analysis.xtest_imports,
):
if import_path in std_lib_imports:
# Skip inference for stdlib packages.
# TODO: This check is deprecated and will be removed once support for building SDK packages lands.
if import_path in stdlib_packages:
continue
# Avoid a dependency cycle caused by external test imports of this package (i.e., "xtest").
if import_path == pkg_analysis.import_path:
Expand Down Expand Up @@ -305,7 +321,7 @@ async def infer_go_third_party_package_dependencies(
Get(GoBuildOptions, GoBuildOptionsFromTargetRequest(go_mod_address)),
)

pkg_info, std_lib_imports = await MultiGet(
pkg_info, stdlib_packages = await MultiGet(
Get(
ThirdPartyPkgAnalysis,
ThirdPartyPkgAnalysisRequest(
Expand All @@ -324,9 +340,10 @@ async def infer_go_third_party_package_dependencies(

inferred_dependencies: list[Address] = []
for import_path in pkg_info.imports:
if import_path in std_lib_imports:
# Skip inference for stdlib packages.
# TODO: This check is deprecated and will be removed once support for building SDK packages lands.
if import_path in stdlib_packages:
continue

candidate_packages = package_mapping.mapping.get(import_path, ())
if candidate_packages:
if candidate_packages.infer_all:
Expand Down Expand Up @@ -414,6 +431,74 @@ def create_tgt(pkg_info: ThirdPartyPkgAnalysis) -> GoThirdPartyPackageTarget:
return GeneratedTargets(request.generator, result)


# -----------------------------------------------------------------------------------------------
# `go_sdk` and `go_sdk_package` target types
# -----------------------------------------------------------------------------------------------


@dataclass(frozen=True)
class GoSdkSyntheticTargetsRequest(SyntheticTargetsRequest):
path: str = SyntheticTargetsRequest.SINGLE_REQUEST_FOR_ALL_TARGETS


@rule
async def generate_go_sdk_synthetic_targets(
request: GoSdkSyntheticTargetsRequest,
) -> SyntheticAddressMaps:
return SyntheticAddressMaps(
[
SyntheticAddressMap.create(
"BUILD._go_sdk", [TargetAdaptor(GoSdkTarget.alias, name="default_go_sdk")]
)
]
)


class GenerateTargetsFromGoSdkRequest(GenerateTargetsRequest):
generate_from = GoSdkTarget


@rule(desc="Generate `_go_sdk_package` targets from `_go_sdk` target", level=LogLevel.DEBUG)
async def generate_targets_from_go_sdk(
request: GenerateTargetsFromGoSdkRequest,
union_membership: UnionMembership,
) -> GeneratedTargets:
generator_addr = request.generator.address

stdlib_packages, stdlib_packages_race = await MultiGet(
Get(
GoStdLibPackages,
GoStdLibPackagesRequest(with_race_detector=False),
),
Get(
GoStdLibPackages,
GoStdLibPackagesRequest(with_race_detector=True),
),
)

def create_tgt(pkg: GoStdLibPackage) -> GoSdkPackageTarget:
dep_import_paths = sorted(
{*pkg.imports, *stdlib_packages_race[pkg.import_path].imports} - {"C", "unsafe"}
)
return GoSdkPackageTarget(
{
**request.template,
GoSdkImportPathField.alias: pkg.import_path,
Dependencies.alias: [
generator_addr.create_generated(dep_import_path).spec
for dep_import_path in dep_import_paths
],
},
# E.g. `//:default_go_sdk#net/http`.
generator_addr.create_generated(pkg.import_path),
union_membership,
residence_dir=generator_addr.spec_path,
)

result = tuple(create_tgt(pkg_info) for pkg_info in stdlib_packages.values())
return GeneratedTargets(request.generator, result)


def rules():
return (
*collect_rules(),
Expand All @@ -423,5 +508,7 @@ def rules():
UnionRule(InferDependenciesRequest, InferGoPackageDependenciesRequest),
UnionRule(InferDependenciesRequest, InferGoThirdPartyPackageDependenciesRequest),
UnionRule(GenerateTargetsRequest, GenerateTargetsFromGoModRequest),
UnionRule(GenerateTargetsRequest, GenerateTargetsFromGoSdkRequest),
UnionRule(GoModuleImportPathsMappingsHook, FirstPartyGoModuleImportPathsMappingsHook),
UnionRule(SyntheticTargetsRequest, GoSdkSyntheticTargetsRequest),
)
Loading