From 490ab32726953d0b42aef7cd583ba4932cb23708 Mon Sep 17 00:00:00 2001 From: Erica Vellanoweth Date: Thu, 9 Nov 2023 11:03:26 -0800 Subject: [PATCH 1/4] removing compiler alternatives existing on the machine before providing new ones --- .../CompilerInstallationTests.cs | 24 +++++++++--- .../CompilerInstallation.cs | 37 ++++++++++++++++--- 2 files changed, 49 insertions(+), 12 deletions(-) diff --git a/src/VirtualClient/VirtualClient.Dependencies.UnitTests/CompilerInstallationTests.cs b/src/VirtualClient/VirtualClient.Dependencies.UnitTests/CompilerInstallationTests.cs index 9cb5a2c46..a9dfbee60 100644 --- a/src/VirtualClient/VirtualClient.Dependencies.UnitTests/CompilerInstallationTests.cs +++ b/src/VirtualClient/VirtualClient.Dependencies.UnitTests/CompilerInstallationTests.cs @@ -69,13 +69,19 @@ public async Task CompilerInstallationRunsTheExpectedWorkloadCommandInLinuxForGc "sudo add-apt-repository ppa:ubuntu-toolchain-r/test -y", "sudo apt update", "sudo apt install build-essential gcc-123 g++-123 gfortran-123 -y --quiet", + "sudo update-alternatives --remove-all g++", + "sudo update-alternatives --remove-all gcov", + "sudo update-alternatives --remove-all gcc-ar", + "sudo update-alternatives --remove-all gcc-ranlib", + "sudo update-alternatives --remove-all gfortran", + "sudo update-alternatives --remove-all cpp", "sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-123 1230 " + $"--slave /usr/bin/g++ g++ /usr/bin/g++-123 " + $"--slave /usr/bin/gcov gcov /usr/bin/gcov-123 " + $"--slave /usr/bin/gcc-ar gcc-ar /usr/bin/gcc-ar-123 " + $"--slave /usr/bin/gcc-ranlib gcc-ranlib /usr/bin/gcc-ranlib-123 " + - $"--slave /usr/bin/gfortran gfortran /usr/bin/gfortran-123", - "sudo update-alternatives --install /usr/bin/cpp cpp /usr/bin/cpp-123 1230", + $"--slave /usr/bin/gfortran gfortran /usr/bin/gfortran-123 " + + $"--slave /usr/bin/cpp cpp /usr/bin/cpp-123", }; int commandExecuted = 0; @@ -107,7 +113,7 @@ public async Task CompilerInstallationRunsTheExpectedWorkloadCommandInLinuxForGc await compilerInstallation.ExecuteAsync(CancellationToken.None).ConfigureAwait(false); } - Assert.AreEqual(5, commandExecuted); + Assert.AreEqual(10, commandExecuted); } [Test] @@ -242,13 +248,19 @@ public async Task CompilerInstallationInLinuxDefaultsToGcc10() "sudo add-apt-repository ppa:ubuntu-toolchain-r/test -y", "sudo apt update", "sudo apt install build-essential gcc-10 g++-10 gfortran-10 -y --quiet", + "sudo update-alternatives --remove-all g++", + "sudo update-alternatives --remove-all gcov", + "sudo update-alternatives --remove-all gcc-ar", + "sudo update-alternatives --remove-all gcc-ranlib", + "sudo update-alternatives --remove-all gfortran", + "sudo update-alternatives --remove-all cpp", "sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-10 100 " + $"--slave /usr/bin/g++ g++ /usr/bin/g++-10 " + $"--slave /usr/bin/gcov gcov /usr/bin/gcov-10 " + $"--slave /usr/bin/gcc-ar gcc-ar /usr/bin/gcc-ar-10 " + $"--slave /usr/bin/gcc-ranlib gcc-ranlib /usr/bin/gcc-ranlib-10 " + - $"--slave /usr/bin/gfortran gfortran /usr/bin/gfortran-10", - "sudo update-alternatives --install /usr/bin/cpp cpp /usr/bin/cpp-10 100", + $"--slave /usr/bin/gfortran gfortran /usr/bin/gfortran-10 " + + $"--slave /usr/bin/cpp cpp /usr/bin/cpp-10", }; int commandExecuted = 0; @@ -281,7 +293,7 @@ public async Task CompilerInstallationInLinuxDefaultsToGcc10() await compilerInstallation.ExecuteAsync(CancellationToken.None).ConfigureAwait(false); } - Assert.AreEqual(5, commandExecuted); + Assert.AreEqual(10, commandExecuted); } [Test] diff --git a/src/VirtualClient/VirtualClient.Dependencies/CompilerInstallation.cs b/src/VirtualClient/VirtualClient.Dependencies/CompilerInstallation.cs index 935500de8..6c214f7c6 100644 --- a/src/VirtualClient/VirtualClient.Dependencies/CompilerInstallation.cs +++ b/src/VirtualClient/VirtualClient.Dependencies/CompilerInstallation.cs @@ -167,7 +167,6 @@ protected async Task ConfirmGccVersionInstalledAsync(CancellationToken can using (IProcessProxy process = this.systemManager.ProcessManager.CreateProcess(compiler, "--version")) { this.Logger.LogTraceMessage($"Confirming expected compiler version installed..."); - Console.WriteLine(compiler + "1"); await process.StartAndWaitAsync(cancellationToken); @@ -237,18 +236,44 @@ private async Task InstallGccAsync(string gccVersion, EventContext telemetryCont private async Task SetGccPriorityAsync(string gccVersion, EventContext telemetryContext, CancellationToken cancellationToken) { + string[] compilers = + { + "g++", + "gcov", + "gcc-ar", + "gcc-ranlib", + "gfortran", + "cpp" + }; + + // due to the following error: + // update-alternatives: error: alternative g++ can't be slave of gcc: it is a master alternative + // must remove alternatives from the VM to avoid errors, then set all of them together + + foreach (string compiler in compilers) + { + try + { + await this.ExecuteCommandAsync("update-alternatives", $"--remove-all {compiler}", Environment.CurrentDirectory, telemetryContext, cancellationToken); + } + catch + { + // the message is: + // "error: no alternatives for g++" + // so we can continue as normal; non-breaking + continue; + } + } + string updateAlternativeArgument = $"--install /usr/bin/gcc gcc /usr/bin/gcc-{gccVersion} {gccVersion}0 " + $"--slave /usr/bin/g++ g++ /usr/bin/g++-{gccVersion} " + $"--slave /usr/bin/gcov gcov /usr/bin/gcov-{gccVersion} " + $"--slave /usr/bin/gcc-ar gcc-ar /usr/bin/gcc-ar-{gccVersion} " + $"--slave /usr/bin/gcc-ranlib gcc-ranlib /usr/bin/gcc-ranlib-{gccVersion} " + - $"--slave /usr/bin/gfortran gfortran /usr/bin/gfortran-{gccVersion}"; + $"--slave /usr/bin/gfortran gfortran /usr/bin/gfortran-{gccVersion} " + + $"--slave /usr/bin/cpp cpp /usr/bin/cpp-{gccVersion}"; await this.ExecuteCommandAsync("update-alternatives", updateAlternativeArgument, Environment.CurrentDirectory, telemetryContext, cancellationToken); - - // For some update path, the cpp can't be update-alternative by a gcc, so needs a separate call. - string updateAlternativeArgumentCpp = $"--install /usr/bin/cpp cpp /usr/bin/cpp-{gccVersion} {gccVersion}0"; - await this.ExecuteCommandAsync("update-alternatives", updateAlternativeArgumentCpp, Environment.CurrentDirectory, telemetryContext, cancellationToken); } private async Task InstallAoccAsync(string aoccVersion, EventContext telemetryContext, CancellationToken cancellationToken) From e1e027c9213b5c8d36ebeefbc696b4bd11359a3b Mon Sep 17 00:00:00 2001 From: Erica Vellanoweth Date: Thu, 9 Nov 2023 12:16:55 -0800 Subject: [PATCH 2/4] adding remove-all gcc --- .../VirtualClient.Dependencies/CompilerInstallation.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/VirtualClient/VirtualClient.Dependencies/CompilerInstallation.cs b/src/VirtualClient/VirtualClient.Dependencies/CompilerInstallation.cs index 6c214f7c6..ce81d5c5b 100644 --- a/src/VirtualClient/VirtualClient.Dependencies/CompilerInstallation.cs +++ b/src/VirtualClient/VirtualClient.Dependencies/CompilerInstallation.cs @@ -238,6 +238,7 @@ private async Task SetGccPriorityAsync(string gccVersion, EventContext telemetry { string[] compilers = { + "gcc", "g++", "gcov", "gcc-ar", From b82b057daf099f9f67bb0ce1a226a36dca561310 Mon Sep 17 00:00:00 2001 From: Erica Vellanoweth Date: Thu, 9 Nov 2023 12:38:29 -0800 Subject: [PATCH 3/4] adding cc --- .../VirtualClient.Dependencies/CompilerInstallation.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/VirtualClient/VirtualClient.Dependencies/CompilerInstallation.cs b/src/VirtualClient/VirtualClient.Dependencies/CompilerInstallation.cs index ce81d5c5b..222cce610 100644 --- a/src/VirtualClient/VirtualClient.Dependencies/CompilerInstallation.cs +++ b/src/VirtualClient/VirtualClient.Dependencies/CompilerInstallation.cs @@ -239,6 +239,7 @@ private async Task SetGccPriorityAsync(string gccVersion, EventContext telemetry string[] compilers = { "gcc", + "cc", "g++", "gcov", "gcc-ar", @@ -262,7 +263,6 @@ private async Task SetGccPriorityAsync(string gccVersion, EventContext telemetry // the message is: // "error: no alternatives for g++" // so we can continue as normal; non-breaking - continue; } } From 3b2f3408f1baeae03e5ebf2b8fb73324ddd3f682 Mon Sep 17 00:00:00 2001 From: Erica Vellanoweth Date: Fri, 10 Nov 2023 10:42:06 -0800 Subject: [PATCH 4/4] updating tests --- .../CompilerInstallationTests.cs | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/VirtualClient/VirtualClient.Dependencies.UnitTests/CompilerInstallationTests.cs b/src/VirtualClient/VirtualClient.Dependencies.UnitTests/CompilerInstallationTests.cs index a9dfbee60..838d854e3 100644 --- a/src/VirtualClient/VirtualClient.Dependencies.UnitTests/CompilerInstallationTests.cs +++ b/src/VirtualClient/VirtualClient.Dependencies.UnitTests/CompilerInstallationTests.cs @@ -69,6 +69,8 @@ public async Task CompilerInstallationRunsTheExpectedWorkloadCommandInLinuxForGc "sudo add-apt-repository ppa:ubuntu-toolchain-r/test -y", "sudo apt update", "sudo apt install build-essential gcc-123 g++-123 gfortran-123 -y --quiet", + "sudo update-alternatives --remove-all gcc", + "sudo update-alternatives --remove-all cc", "sudo update-alternatives --remove-all g++", "sudo update-alternatives --remove-all gcov", "sudo update-alternatives --remove-all gcc-ar", @@ -113,7 +115,7 @@ public async Task CompilerInstallationRunsTheExpectedWorkloadCommandInLinuxForGc await compilerInstallation.ExecuteAsync(CancellationToken.None).ConfigureAwait(false); } - Assert.AreEqual(10, commandExecuted); + Assert.AreEqual(12, commandExecuted); } [Test] @@ -248,6 +250,8 @@ public async Task CompilerInstallationInLinuxDefaultsToGcc10() "sudo add-apt-repository ppa:ubuntu-toolchain-r/test -y", "sudo apt update", "sudo apt install build-essential gcc-10 g++-10 gfortran-10 -y --quiet", + "sudo update-alternatives --remove-all gcc", + "sudo update-alternatives --remove-all cc", "sudo update-alternatives --remove-all g++", "sudo update-alternatives --remove-all gcov", "sudo update-alternatives --remove-all gcc-ar", @@ -293,7 +297,7 @@ public async Task CompilerInstallationInLinuxDefaultsToGcc10() await compilerInstallation.ExecuteAsync(CancellationToken.None).ConfigureAwait(false); } - Assert.AreEqual(10, commandExecuted); + Assert.AreEqual(12, commandExecuted); } [Test]