Skip to content

Commit cc16ce8

Browse files
authored
Run sync with --skip_incompatible_explicit_targets (#7617)
1 parent 9b1bbb7 commit cc16ce8

File tree

15 files changed

+189
-5
lines changed

15 files changed

+189
-5
lines changed

.bazelrc

+2-2
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,8 @@ build --tool_java_language_version=21 --tool_java_runtime_version=21
33

44
# Delete test data packages, needed for bazel integration tests. Update by running the following command:
55
# bazel run @rules_bazel_integration_test//tools:update_deleted_packages
6-
build --deleted_packages=aspect/testing/tests/src/com/google/idea/blaze/aspect/integration/testdata,clwb/tests/projects/external_includes/main,clwb/tests/projects/llvm_toolchain/.clwb/aspects,clwb/tests/projects/llvm_toolchain/main,clwb/tests/projects/llvm_toolchain/wasm,clwb/tests/projects/query_sync/main,clwb/tests/projects/simple/main,clwb/tests/projects/virtual_includes/lib/impl_deps,clwb/tests/projects/virtual_includes/lib/strip_absolut,clwb/tests/projects/virtual_includes/lib/strip_relative,clwb/tests/projects/virtual_includes/main,ijwb/tests/projects/simple,testing/test_deps/projects,testing/test_deps/projects/java_and_deps,testing/test_deps/projects/java_and_deps/deps/top_level_lib_1,testing/test_deps/projects/java_and_deps/deps/top_level_lib_2,testing/test_deps/projects/java_and_deps/deps/transitive_dep_lib,testing/test_deps/projects/java_and_deps/project,testing/test_deps/projects/java_and_deps/project/java/com/example/sample/nested,testing/test_deps/projects/simple_java,testing/test_deps/projects/simple_java/java/com/example/sample/nested
7-
query --deleted_packages=aspect/testing/tests/src/com/google/idea/blaze/aspect/integration/testdata,clwb/tests/projects/external_includes/main,clwb/tests/projects/llvm_toolchain/.clwb/aspects,clwb/tests/projects/llvm_toolchain/main,clwb/tests/projects/llvm_toolchain/wasm,clwb/tests/projects/query_sync/main,clwb/tests/projects/simple/main,clwb/tests/projects/virtual_includes/lib/impl_deps,clwb/tests/projects/virtual_includes/lib/strip_absolut,clwb/tests/projects/virtual_includes/lib/strip_relative,clwb/tests/projects/virtual_includes/main,ijwb/tests/projects/simple,testing/test_deps/projects,testing/test_deps/projects/java_and_deps,testing/test_deps/projects/java_and_deps/deps/top_level_lib_1,testing/test_deps/projects/java_and_deps/deps/top_level_lib_2,testing/test_deps/projects/java_and_deps/deps/transitive_dep_lib,testing/test_deps/projects/java_and_deps/project,testing/test_deps/projects/java_and_deps/project/java/com/example/sample/nested,testing/test_deps/projects/simple_java,testing/test_deps/projects/simple_java/java/com/example/sample/nested
6+
build --deleted_packages=aspect/testing/tests/src/com/google/idea/blaze/aspect/integration/testdata,clwb/tests/projects/external_includes/main,clwb/tests/projects/llvm_toolchain/main,clwb/tests/projects/llvm_toolchain/wasm,clwb/tests/projects/query_sync/main,clwb/tests/projects/simple/main,clwb/tests/projects/target_compatible/main,clwb/tests/projects/virtual_includes/lib/impl_deps,clwb/tests/projects/virtual_includes/lib/strip_absolut,clwb/tests/projects/virtual_includes/lib/strip_relative,clwb/tests/projects/virtual_includes/main,ijwb/tests/projects/simple,testing/test_deps/projects,testing/test_deps/projects/java_and_deps,testing/test_deps/projects/java_and_deps/deps/no_ide,testing/test_deps/projects/java_and_deps/deps/top_level_lib_1,testing/test_deps/projects/java_and_deps/deps/top_level_lib_2,testing/test_deps/projects/java_and_deps/deps/transitive_dep_lib,testing/test_deps/projects/java_and_deps/project,testing/test_deps/projects/java_and_deps/project/java/com/example/sample/nested,testing/test_deps/projects/simple_java,testing/test_deps/projects/simple_java/java/com/example/sample/nested,testing/test_deps/projects/simple_proto/external,testing/test_deps/projects/simple_proto/project
7+
query --deleted_packages=aspect/testing/tests/src/com/google/idea/blaze/aspect/integration/testdata,clwb/tests/projects/external_includes/main,clwb/tests/projects/llvm_toolchain/main,clwb/tests/projects/llvm_toolchain/wasm,clwb/tests/projects/query_sync/main,clwb/tests/projects/simple/main,clwb/tests/projects/target_compatible/main,clwb/tests/projects/virtual_includes/lib/impl_deps,clwb/tests/projects/virtual_includes/lib/strip_absolut,clwb/tests/projects/virtual_includes/lib/strip_relative,clwb/tests/projects/virtual_includes/main,ijwb/tests/projects/simple,testing/test_deps/projects,testing/test_deps/projects/java_and_deps,testing/test_deps/projects/java_and_deps/deps/no_ide,testing/test_deps/projects/java_and_deps/deps/top_level_lib_1,testing/test_deps/projects/java_and_deps/deps/top_level_lib_2,testing/test_deps/projects/java_and_deps/deps/transitive_dep_lib,testing/test_deps/projects/java_and_deps/project,testing/test_deps/projects/java_and_deps/project/java/com/example/sample/nested,testing/test_deps/projects/simple_java,testing/test_deps/projects/simple_java/java/com/example/sample/nested,testing/test_deps/projects/simple_proto/external,testing/test_deps/projects/simple_proto/project
88

99
common --enable_bzlmod
1010
common --noincompatible_disallow_empty_glob

base/src/com/google/idea/blaze/base/buildview/events/AbortedParser.kt

+4
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.google.idea.blaze.base.buildview.events
22

3+
import com.google.devtools.build.lib.buildeventstream.BuildEventStreamProtos.Aborted.AbortReason
34
import com.google.devtools.build.lib.buildeventstream.BuildEventStreamProtos.BuildEvent
45
import com.google.devtools.build.lib.buildeventstream.BuildEventStreamProtos.BuildEventId
56
import com.google.idea.blaze.base.scope.output.IssueOutput
@@ -64,6 +65,9 @@ class AbortedParser : BuildEventParser {
6465
override fun parse(event: BuildEvent): IssueOutput? {
6566
if (!event.hasAborted()) return null
6667

68+
// do not report skipped targets, this event is expected because sync is executed with `--skip_incompatible_explicit_targets`
69+
if (event.aborted.reason == AbortReason.SKIPPED) return null
70+
6771
val label = getLabel(event.id) ?: return null
6872
val issue = BazelBuildIssue(
6973
label = label,

base/src/com/google/idea/blaze/base/command/BlazeFlags.java

+5
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,11 @@ public final class BlazeFlags {
6161
// during syncing projects.
6262
public static final String DISABLE_VALIDATIONS = "--noexperimental_run_validations";
6363

64+
// Since query cannot resolve target_compatible_with constraints we try to explicitly build
65+
// incompatible targets during the sync. This flags allows bazel to skip incompatible targets
66+
// even if they were explicitly requested.
67+
public static final String SKIP_INCOMPATIBLE_TARGETS = "--skip_incompatible_explicit_targets";
68+
6469
// Custom build metadata. This option takes a key-value pair as an argument.
6570
public static final String BUILD_METADATA = "--build_metadata=";
6671

base/src/com/google/idea/blaze/base/sync/aspects/BlazeIdeInterfaceAspectsImpl.java

+18-3
Original file line numberDiff line numberDiff line change
@@ -636,10 +636,25 @@ public BlazeBuildOutputs.Legacy build(
636636
context.output(SummaryOutput.output(Prefix.INFO, message).dedupe());
637637
context.output(PrintOutput.log(message));
638638
}
639+
640+
final var additionalBlazeFlagsBuilder = ImmutableList.<String>builder();
641+
639642
// Fetching blaze flags here using parent context, to avoid duplicate fetch for every shard.
640-
List<String> additionalBlazeFlags =
641-
BlazeFlags.blazeFlags(
642-
project, projectViewSet, BlazeCommandName.BUILD, context, blazeInvocationContext);
643+
additionalBlazeFlagsBuilder.addAll(BlazeFlags.blazeFlags(
644+
project,
645+
projectViewSet,
646+
BlazeCommandName.BUILD,
647+
context,
648+
blazeInvocationContext
649+
));
650+
651+
// The --skip_incompatible_explicit_targets flag is only available in Bazel 7+
652+
if (blazeVersion.bazelIsAtLeastVersion(7, 0, 0)) {
653+
additionalBlazeFlagsBuilder.add(BlazeFlags.SKIP_INCOMPATIBLE_TARGETS);
654+
}
655+
656+
final var additionalBlazeFlags = additionalBlazeFlagsBuilder.build();
657+
643658
Function<List<? extends TargetExpression>, BuildResult> invocation =
644659
targets ->
645660
Scope.push(

clwb/BUILD

+7
Original file line numberDiff line numberDiff line change
@@ -193,6 +193,12 @@ clwb_headless_test(
193193
project = "simple",
194194
)
195195

196+
clwb_headless_test(
197+
name = "target_compatible_headless_test",
198+
srcs = ["tests/headlesstests/com/google/idea/blaze/clwb/TargetCompatibleTest.java"],
199+
project = "target_compatible",
200+
)
201+
196202
test_suite(
197203
name = "headless_tests",
198204
tests = [
@@ -202,5 +208,6 @@ test_suite(
202208
":simple_headless_test",
203209
":virtual_includes_headless_test",
204210
":execution_headless_test",
211+
":target_compatible_headless_test",
205212
],
206213
)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
package com.google.idea.blaze.clwb.radler
2+
3+
import com.google.idea.blaze.base.model.BlazeProjectData
4+
import com.google.idea.blaze.base.model.primitives.LanguageClass
5+
import com.google.idea.blaze.base.syncstatus.LegacySyncStatusContributor
6+
import com.google.idea.blaze.base.syncstatus.LegacySyncStatusContributor.*
7+
import com.intellij.ide.projectView.ProjectViewNode
8+
import com.intellij.ide.projectView.impl.nodes.PsiFileNode
9+
import com.intellij.openapi.fileTypes.FileTypeManager
10+
import com.intellij.openapi.vfs.VirtualFile
11+
import com.jetbrains.rider.cpp.fileType.CppFileType
12+
import com.jetbrains.rider.cpp.fileType.psi.CppFile
13+
14+
class RadSyncStatusContributor : LegacySyncStatusContributor {
15+
16+
override fun toPsiFileAndName(
17+
projectData: BlazeProjectData,
18+
node: ProjectViewNode<*>,
19+
): PsiFileAndName? {
20+
if (node !is PsiFileNode) return null
21+
22+
val file = node.value
23+
if (file !is CppFile) return null
24+
25+
return PsiFileAndName(file, file.getName())
26+
}
27+
28+
override fun handlesFile(projectData: BlazeProjectData, file: VirtualFile): Boolean {
29+
if (!projectData.getWorkspaceLanguageSettings().isLanguageActive(LanguageClass.C)) {
30+
return false;
31+
}
32+
33+
val fileType = FileTypeManager.getInstance().getFileTypeByFile(file);
34+
return fileType is CppFileType
35+
}
36+
}

clwb/src/com/google/idea/blaze/clwb/radler/optional-plugin.xml

+1
Original file line numberDiff line numberDiff line change
@@ -19,5 +19,6 @@
1919
<TestContextProvider implementation="com.google.idea.blaze.clwb.radler.RadCatchTestContextProvider"/>
2020
<BinaryContextProvider implementation="com.google.idea.blaze.clwb.radler.RadBinaryContextProvider"/>
2121
<BlazeTestEventsHandler implementation="com.google.idea.blaze.clwb.radler.RadTestEventsHandler"/>
22+
<SyncStatusContributor implementation="com.google.idea.blaze.clwb.radler.RadSyncStatusContributor"/>
2223
</extensions>
2324
</idea-plugin>

clwb/tests/headlesstests/com/google/idea/blaze/clwb/SimpleTest.java

+7
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import static com.google.idea.blaze.clwb.base.Assertions.assertContainsPattern;
77

88
import com.google.idea.blaze.base.lang.buildfile.psi.LoadStatement;
9+
import com.google.idea.blaze.base.sync.autosync.ProjectTargetManager.SyncStatus;
910
import com.google.idea.blaze.clwb.base.ClwbHeadlessTestCase;
1011
import com.intellij.openapi.util.SystemInfo;
1112
import com.intellij.psi.util.PsiTreeUtil;
@@ -30,6 +31,7 @@ public void testClwb() throws IOException {
3031
checkTest();
3132
checkXcode();
3233
checkResolveRulesCC();
34+
checkSyncStatus();
3335
}
3436

3537
private void checkCompiler() {
@@ -83,4 +85,9 @@ private void checkResolveRulesCC() {
8385
assertThat(reference.resolve()).isNotNull();
8486
}
8587
}
88+
89+
private void checkSyncStatus() {
90+
assertThat(getSyncStatus("main/hello-world.cc")).isEqualTo(SyncStatus.SYNCED);
91+
assertThat(getSyncStatus("main/test.cc")).isEqualTo(SyncStatus.SYNCED);
92+
}
8693
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
package com.google.idea.blaze.clwb;
2+
3+
import static com.google.common.truth.Truth.assertThat;
4+
5+
import com.google.idea.blaze.base.sync.autosync.ProjectTargetManager.SyncStatus;
6+
import com.google.idea.blaze.clwb.base.ClwbHeadlessTestCase;
7+
import com.google.idea.testing.headless.BazelVersionRule;
8+
import com.intellij.openapi.util.SystemInfo;
9+
import org.junit.Rule;
10+
import org.junit.Test;
11+
import org.junit.runner.RunWith;
12+
import org.junit.runners.JUnit4;
13+
14+
@RunWith(JUnit4.class)
15+
public class TargetCompatibleTest extends ClwbHeadlessTestCase {
16+
17+
// the --skip_incompatible_explicit_targets flag is only supported in bazel 7+
18+
@Rule
19+
public final BazelVersionRule bazelRule = new BazelVersionRule(7, 0);
20+
21+
@Test
22+
public void testClwb() throws Exception {
23+
final var errors = runSync(defaultSyncParams().build());
24+
errors.assertNoErrors();
25+
26+
checkTargets();
27+
}
28+
29+
private void checkTargets() throws Exception {
30+
if (SystemInfo.isMac) {
31+
assertConfiguration("main/linux.cc", false);
32+
assertConfiguration("main/macos.cc", true);
33+
assertConfiguration("main/windows.cc", false);
34+
} else if (SystemInfo.isLinux) {
35+
assertConfiguration("main/linux.cc", true);
36+
assertConfiguration("main/macos.cc", false);
37+
assertConfiguration("main/windows.cc", false);
38+
} else if (SystemInfo.isWindows) {
39+
assertConfiguration("main/linux.cc", false);
40+
assertConfiguration("main/macos.cc", false);
41+
assertConfiguration("main/windows.cc", true);
42+
}
43+
}
44+
45+
private void assertConfiguration(String relativePath, boolean configured) {
46+
final var configurations = getWorkspace().getConfigurationsForFile(findProjectFile(relativePath));
47+
48+
if (configured) {
49+
assertThat(configurations).hasSize(1);
50+
assertThat(getSyncStatus(relativePath)).isEqualTo(SyncStatus.SYNCED);
51+
} else {
52+
assertThat(configurations).isEmpty();
53+
assertThat(getSyncStatus(relativePath)).isEqualTo(SyncStatus.UNSYNCED);
54+
}
55+
}
56+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
bazel_dep(name = "rules_cc", version = "0.1.1")
2+
bazel_dep(name = "platforms", version = "0.0.11")
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
load("@rules_cc//cc:defs.bzl", "cc_binary")
2+
3+
cc_binary(
4+
name = "windows",
5+
srcs = ["windows.cc"],
6+
target_compatible_with = ["@platforms//os:windows"],
7+
)
8+
9+
cc_binary(
10+
name = "macos",
11+
srcs = ["macos.cc"],
12+
target_compatible_with = ["@platforms//os:macos"],
13+
)
14+
15+
cc_binary(
16+
name = "linux",
17+
srcs = ["linux.cc"],
18+
target_compatible_with = ["@platforms//os:linux"],
19+
)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
#include <stdlib.h>
2+
#include <stdio.h>
3+
4+
int main() {
5+
printf("Hello, linux!\n");
6+
return EXIT_SUCCESS;
7+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
#include <stdlib.h>
2+
#include <stdio.h>
3+
4+
int main() {
5+
printf("Hello, macos!\n");
6+
return EXIT_SUCCESS;
7+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
#include <stdlib.h>
2+
#include <stdio.h>
3+
4+
int main() {
5+
printf("Hello, windows!\n");
6+
return EXIT_SUCCESS;
7+
}

testing/src/com/google/idea/testing/headless/HeadlessTestCase.java

+11
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,10 @@
2222
import com.google.idea.blaze.base.sync.BlazeSyncParams;
2323
import com.google.idea.blaze.base.sync.SyncMode;
2424
import com.google.idea.blaze.base.sync.SyncPhaseCoordinator;
25+
import com.google.idea.blaze.base.sync.autosync.ProjectTargetManager.SyncStatus;
2526
import com.google.idea.blaze.base.sync.data.BlazeDataStorage;
2627
import com.google.idea.blaze.base.sync.workspace.WorkspacePathResolverImpl;
28+
import com.google.idea.blaze.base.syncstatus.LegacySyncStatusContributor;
2729
import com.google.idea.blaze.base.toolwindow.TasksToolWindowFactory;
2830
import com.google.idea.blaze.base.wizard2.BlazeProjectCommitException;
2931
import com.google.idea.blaze.base.wizard2.BlazeProjectImportBuilder;
@@ -324,4 +326,13 @@ protected FuncallExpression findRule(Label label) {
324326

325327
return element;
326328
}
329+
330+
protected SyncStatus getSyncStatus(String relativePath) {
331+
final var file = findProjectFile(relativePath);
332+
333+
final var status = LegacySyncStatusContributor.getSyncStatus(myProject, file);
334+
assertThat(status).isNotNull();
335+
336+
return status;
337+
}
327338
}

0 commit comments

Comments
 (0)