diff --git a/cpp/src/com/google/idea/blaze/cpp/BlazeConfigurationResolver.java b/cpp/src/com/google/idea/blaze/cpp/BlazeConfigurationResolver.java index f34f9dcb70a..cd8c2a56bbe 100644 --- a/cpp/src/com/google/idea/blaze/cpp/BlazeConfigurationResolver.java +++ b/cpp/src/com/google/idea/blaze/cpp/BlazeConfigurationResolver.java @@ -86,7 +86,7 @@ public BlazeConfigurationResolverResult update( context, blazeProjectData.getTargetMap()); Optional xcodeSettings = - BlazeConfigurationToolchainResolver.resolveXcodeCompilerSettings(context, project); + BlazeConfigurationToolchainResolver.resolveXcodeCompilerSettings(context, project, blazeProjectData); ImmutableMap compilerSettings = BlazeConfigurationToolchainResolver.buildCompilerSettingsMap( diff --git a/cpp/src/com/google/idea/blaze/cpp/BlazeConfigurationToolchainResolver.java b/cpp/src/com/google/idea/blaze/cpp/BlazeConfigurationToolchainResolver.java index 0c2f32353a9..789d153c40f 100644 --- a/cpp/src/com/google/idea/blaze/cpp/BlazeConfigurationToolchainResolver.java +++ b/cpp/src/com/google/idea/blaze/cpp/BlazeConfigurationToolchainResolver.java @@ -35,6 +35,7 @@ import com.google.idea.blaze.base.ideinfo.TargetIdeInfo; import com.google.idea.blaze.base.ideinfo.TargetKey; import com.google.idea.blaze.base.ideinfo.TargetMap; +import com.google.idea.blaze.base.model.BlazeProjectData; import com.google.idea.blaze.base.model.primitives.ExecutionRootPath; import com.google.idea.blaze.base.model.primitives.LanguageClass; import com.google.idea.blaze.base.model.primitives.TargetExpression; @@ -424,14 +425,13 @@ private static ListenableFuture submit(Callable callable) { return BlazeExecutor.getInstance().submit(callable); } - public static Optional resolveXcodeCompilerSettings(BlazeContext context, - Project project) { + public static Optional resolveXcodeCompilerSettings(BlazeContext context, Project project, BlazeProjectData projectData) { return Scope.push( context, childContext -> { childContext.push(new TimingScope("Resolve Xcode information", EventType.Other)); try { - return XcodeCompilerSettingsProvider.getInstance(project).fromContext(context, project); + return XcodeCompilerSettingsProvider.getInstance(project).fromContext(context, project, projectData); } catch (XcodeCompilerSettingsException e) { IssueOutput.warn( String.format("There was an error fetching the Xcode information from the build: %s\n\nSome C++ functionality may not be available.", e.toString()) diff --git a/cpp/src/com/google/idea/blaze/cpp/XcodeCompilerSettingsProvider.java b/cpp/src/com/google/idea/blaze/cpp/XcodeCompilerSettingsProvider.java index 397ec1afcf7..d08c5285fe9 100644 --- a/cpp/src/com/google/idea/blaze/cpp/XcodeCompilerSettingsProvider.java +++ b/cpp/src/com/google/idea/blaze/cpp/XcodeCompilerSettingsProvider.java @@ -16,6 +16,7 @@ package com.google.idea.blaze.cpp; import com.google.common.collect.ImmutableMap; +import com.google.idea.blaze.base.model.BlazeProjectData; import com.google.idea.blaze.base.scope.BlazeContext; import com.intellij.openapi.components.ServiceManager; import com.intellij.openapi.project.Project; @@ -30,7 +31,7 @@ static XcodeCompilerSettingsProvider getInstance(Project project) { return ServiceManager.getService(project, XcodeCompilerSettingsProvider.class); } - Optional fromContext(BlazeContext context, Project project) + Optional fromContext(BlazeContext context, Project project, BlazeProjectData projectData) throws XcodeCompilerSettingsException; default ImmutableMap asEnvironmentVariables( diff --git a/cpp/src/com/google/idea/blaze/cpp/XcodeCompilerSettingsProviderImpl.java b/cpp/src/com/google/idea/blaze/cpp/XcodeCompilerSettingsProviderImpl.java index 522c5812b01..6fb8b0a9647 100644 --- a/cpp/src/com/google/idea/blaze/cpp/XcodeCompilerSettingsProviderImpl.java +++ b/cpp/src/com/google/idea/blaze/cpp/XcodeCompilerSettingsProviderImpl.java @@ -26,6 +26,7 @@ import com.google.idea.blaze.base.command.BlazeCommand; import com.google.idea.blaze.base.command.BlazeCommandName; import com.google.idea.blaze.base.console.BlazeConsoleLineProcessorProvider; +import com.google.idea.blaze.base.model.BlazeProjectData; import com.google.idea.blaze.base.model.primitives.Label; import com.google.idea.blaze.base.model.primitives.WorkspaceRoot; import com.google.idea.blaze.base.scope.BlazeContext; @@ -45,20 +46,26 @@ public class XcodeCompilerSettingsProviderImpl implements XcodeCompilerSettingsProvider { - + + // provides only the default xcode version but is available in Bazel 9 as well + private static final String HOST_XCODES_TARGET = "@bazel_tools//tools/cpp:host_xcodes"; + + // provides the current xcode version but is not available in Bazel 9 anymore + private static final String CURRENT_XCODE_CONFIG_TARGET = "@bazel_tools//tools/osx:current_xcode_config"; + private static final String QUERY_STARLARK_FILE = "xcode_query.bzl"; // This only exists because it's impossible to escape a `deps()` query expression correctly in a Java string. private static final String[] QUERY_XCODE_VERSION_SCRIPT_LINES = new String[]{ "#!/bin/bash", "__BAZEL_BIN__ cquery \\", - " 'deps(\"@bazel_tools//tools/osx:current_xcode_config\")' \\", + " 'deps(__TARGET__)' \\", " --output=starlark \\", " --starlark:file='__QUERY_FILE__'", }; @Override - public Optional fromContext(BlazeContext context, Project project) + public Optional fromContext(BlazeContext context, Project project, BlazeProjectData projectData) throws XcodeCompilerSettingsException { WorkspaceRoot workspaceRoot = WorkspaceRoot.fromProject(project); BuildSystem.BuildInvoker invoker = @@ -68,7 +75,8 @@ public Optional fromContext(BlazeContext context, Project context, invoker, workspaceRoot, - project); + project, + projectData); if (!xcodeAndSdkVersions.isPresent()) { return Optional.empty(); @@ -205,7 +213,8 @@ private static Optional queryXcodeAndSdkVersions( BlazeContext context, BuildInvoker invoker, WorkspaceRoot workspaceRoot, - Project project) + Project project, + BlazeProjectData projectData) throws XcodeCompilerSettingsException { // this will not work with query sync, since at the moment aspects are only written as part of the async final var queryFile = AspectStorageService.of(project) @@ -213,6 +222,13 @@ private static Optional queryXcodeAndSdkVersions( .orElseThrow(() -> new IllegalStateException("could not resolve query file")) .toFilePath() .toString(); + + final String queryTarget; + if (projectData.getBlazeVersionData().bazelIsAtLeastVersion(9, 0, 0)) { + queryTarget = HOST_XCODES_TARGET; + } else { + queryTarget = CURRENT_XCODE_CONFIG_TARGET; + } File blazeCqueryWrapper = null; try { @@ -226,6 +242,7 @@ private static Optional queryXcodeAndSdkVersions( Arrays.stream(QUERY_XCODE_VERSION_SCRIPT_LINES).forEach(line -> { line = line.replace("__BAZEL_BIN__", invoker.getBinaryPath()); line = line.replace("__QUERY_FILE__", queryFile); + line = line.replace("__TARGET__", queryTarget); pw.println(line); }); diff --git a/cpp/src/com/google/idea/blaze/cpp/XcodeCompilerSettingsProviderNoopImpl.java b/cpp/src/com/google/idea/blaze/cpp/XcodeCompilerSettingsProviderNoopImpl.java index 6184fc518d5..5c497a02914 100644 --- a/cpp/src/com/google/idea/blaze/cpp/XcodeCompilerSettingsProviderNoopImpl.java +++ b/cpp/src/com/google/idea/blaze/cpp/XcodeCompilerSettingsProviderNoopImpl.java @@ -1,6 +1,7 @@ package com.google.idea.blaze.cpp; import com.google.common.collect.ImmutableMap; +import com.google.idea.blaze.base.model.BlazeProjectData; import com.google.idea.blaze.base.scope.BlazeContext; import com.intellij.openapi.project.Project; import java.util.Optional; @@ -13,7 +14,7 @@ public class XcodeCompilerSettingsProviderNoopImpl implements XcodeCompilerSettingsProvider { @Override - public Optional fromContext(BlazeContext context, Project project) + public Optional fromContext(BlazeContext context, Project project, BlazeProjectData projectData) throws XcodeCompilerSettingsException { return Optional.empty(); } diff --git a/cpp/tests/utils/com/google/idea/blaze/cpp/MockXcodeSettingsProvider.java b/cpp/tests/utils/com/google/idea/blaze/cpp/MockXcodeSettingsProvider.java index eca31ba1c72..cd877f4c5e9 100644 --- a/cpp/tests/utils/com/google/idea/blaze/cpp/MockXcodeSettingsProvider.java +++ b/cpp/tests/utils/com/google/idea/blaze/cpp/MockXcodeSettingsProvider.java @@ -16,6 +16,7 @@ package com.google.idea.blaze.cpp; import com.google.idea.blaze.base.scope.BlazeContext; +import com.google.idea.blaze.base.model.BlazeProjectData; import com.intellij.openapi.project.Project; import java.util.Optional; @@ -28,7 +29,7 @@ public void setXcodeSettings(XcodeCompilerSettings settings) { } @Override - public Optional fromContext(BlazeContext context, Project project) + public Optional fromContext(BlazeContext context, Project project, BlazeProjectData projectData) throws XcodeCompilerSettingsException { if (this.settings != null) { return Optional.of(this.settings);