diff --git a/clwb/src/META-INF/clwb.xml b/clwb/src/META-INF/clwb.xml index 9782a007564..8d84ef90e4c 100644 --- a/clwb/src/META-INF/clwb.xml +++ b/clwb/src/META-INF/clwb.xml @@ -33,6 +33,7 @@ + diff --git a/clwb/src/com/google/idea/blaze/clwb/run/BlazeCidrRunConfigurationRunner.java b/clwb/src/com/google/idea/blaze/clwb/run/BlazeCidrRunConfigurationRunner.java index 3429fd59d15..2ce3cc1841f 100644 --- a/clwb/src/com/google/idea/blaze/clwb/run/BlazeCidrRunConfigurationRunner.java +++ b/clwb/src/com/google/idea/blaze/clwb/run/BlazeCidrRunConfigurationRunner.java @@ -44,6 +44,10 @@ import com.intellij.util.PathUtil; import com.jetbrains.cidr.execution.CidrCommandLineState; +import com.jetbrains.cidr.lang.toolchains.CidrSwitchBuilder; +import com.jetbrains.cidr.lang.workspace.compiler.ClangClCompilerKind; +import com.jetbrains.cidr.lang.workspace.compiler.ClangCompilerKind; +import com.jetbrains.cidr.lang.workspace.compiler.MSVCCompilerKind; import javax.annotation.Nullable; import java.io.File; import java.util.List; @@ -110,22 +114,39 @@ private ImmutableList getExtraDebugFlags(ExecutionEnvironment env) { } final var flagsBuilder = ImmutableList.builder(); - - if (debuggerKind == BlazeDebuggerKind.BUNDLED_LLDB && !Registry.is("bazel.trim.absolute.path.disabled")) { - flagsBuilder.add("--copt=-fdebug-compilation-dir=" + WorkspaceRoot.fromProject(env.getProject())); - - if (SystemInfo.isMac) { - flagsBuilder.add("--linkopt=-Wl,-oso_prefix,."); - } + if (Registry.is("bazel.clwb.debug.enforce.dbg.compilation.mode")) { + flagsBuilder.add("--compilation_mode=dbg"); + flagsBuilder.add("--strip=never"); + flagsBuilder.add("--dynamic_mode=off"); } - flagsBuilder.add("--compilation_mode=dbg"); - flagsBuilder.add("--copt=-O0"); - flagsBuilder.add("--copt=-g"); - flagsBuilder.add("--strip=never"); - flagsBuilder.add("--dynamic_mode=off"); - flagsBuilder.addAll(BlazeGDBServerProvider.getOptionalFissionArguments()); + var compilerKind = RunConfigurationUtils.getCompilerKind(configuration); + if (compilerKind == ClangClCompilerKind.INSTANCE || compilerKind == MSVCCompilerKind.INSTANCE) { + var sb = new CidrSwitchBuilder(); + var sb2 = compilerKind.getSwitchBuilder(sb); + sb2 + .withDebugInfo(-1) // ignored for msvc/clangcl + .withDisableOptimization(); + + sb2.buildRaw().forEach((opt) -> { + flagsBuilder.add("--copt=" + opt); + }); + + } else { + if (debuggerKind == BlazeDebuggerKind.BUNDLED_LLDB && !Registry.is( + "bazel.trim.absolute.path.disabled")) { + flagsBuilder.add( + "--copt=-fdebug-compilation-dir=" + WorkspaceRoot.fromProject(env.getProject())); + + if (SystemInfo.isMac) { + flagsBuilder.add("--linkopt=-Wl,-oso_prefix,."); + } + } + flagsBuilder.add("--copt=-O0"); + flagsBuilder.add("--copt=-g"); + flagsBuilder.addAll(BlazeGDBServerProvider.getOptionalFissionArguments()); + } return flagsBuilder.build(); } diff --git a/clwb/tests/headlesstests/com/google/idea/blaze/clwb/ExecutionTest.java b/clwb/tests/headlesstests/com/google/idea/blaze/clwb/ExecutionTest.java index 8051c1e7403..d2841043553 100644 --- a/clwb/tests/headlesstests/com/google/idea/blaze/clwb/ExecutionTest.java +++ b/clwb/tests/headlesstests/com/google/idea/blaze/clwb/ExecutionTest.java @@ -3,6 +3,7 @@ import static com.google.common.truth.Truth.assertThat; import com.google.idea.blaze.base.run.producers.BlazeBuildFileRunConfigurationProducer; +import com.google.idea.blaze.clwb.base.AllowedVfsRoot; import com.google.idea.blaze.clwb.base.ClwbHeadlessTestCase; import com.google.idea.blaze.common.Label; import com.intellij.execution.ExecutionListener; @@ -12,6 +13,7 @@ import com.intellij.execution.PsiLocation; import com.intellij.execution.actions.ConfigurationContext; import com.intellij.execution.actions.RunConfigurationProducer; +import com.intellij.execution.executors.DefaultDebugExecutor; import com.intellij.execution.executors.DefaultRunExecutor; import com.intellij.execution.impl.ExecutionManagerImpl; import com.intellij.execution.process.ProcessHandler; @@ -22,7 +24,10 @@ import com.intellij.openapi.actionSystem.PlatformCoreDataKeys; import com.intellij.openapi.actionSystem.impl.SimpleDataContext; import com.intellij.openapi.module.ModuleUtilCore; +import com.intellij.openapi.util.SystemInfo; import com.intellij.testFramework.PlatformTestUtil; +import com.intellij.util.system.OS; +import java.util.ArrayList; import java.util.concurrent.CompletableFuture; import java.util.concurrent.TimeUnit; import org.jetbrains.annotations.NotNull; @@ -33,12 +38,30 @@ @RunWith(JUnit4.class) public class ExecutionTest extends ClwbHeadlessTestCase { + @Override + protected void addAllowedVfsRoots(ArrayList roots) { + super.addAllowedVfsRoots(roots); + + // use flat? + String path; + if (SystemInfo.isWindows) { + path = "main/hello-world.exe"; + } else { + path = "main/hello-world"; + } + + var fastBuildRoot = AllowedVfsRoot.bazelBinRecursive(myBazelInfo, path); + var debugBuildRoot = AllowedVfsRoot.recursive(fastBuildRoot.toString().replace("fastbuild", "dbg")); + roots.add(debugBuildRoot); + } + @Test public void testClwb() throws Exception { final var errors = runSync(defaultSyncParams().build()); errors.assertNoErrors(); checkRun(); + checkDebug(); checkTest(); } @@ -47,6 +70,11 @@ private void checkRun() throws Exception { assertThat(result).isEqualTo(0); } + private void checkDebug() throws Exception { + final var result = execute(Label.of("//main:hello-world"), DefaultDebugExecutor.EXECUTOR_ID); + assertThat(result).isEqualTo(0); + } + private void checkTest() throws Exception { final var result = execute(Label.of("//main:test"), DefaultRunExecutor.EXECUTOR_ID); assertThat(result).isEqualTo(0); @@ -61,7 +89,7 @@ private int execute(Label label, String executorId) throws Exception { .add(Location.DATA_KEY, PsiLocation.fromPsiElement(element)) .build(), ActionPlaces.UNKNOWN); - final var executor = ExecutorRegistry.getInstance().getExecutorById(DefaultRunExecutor.EXECUTOR_ID); + final var executor = ExecutorRegistry.getInstance().getExecutorById(executorId); assertThat(executor).isNotNull(); final var producer = RunConfigurationProducer.getInstance(BlazeBuildFileRunConfigurationProducer.class);