Skip to content

Commit 5ba240e

Browse files
committed
distributed compilation support for asm & preprocessed outputs
Fixes #2556
1 parent 31b993d commit 5ba240e

File tree

4 files changed

+72
-7
lines changed

4 files changed

+72
-7
lines changed

Cargo.lock

Lines changed: 21 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ chrono = "0.4"
4242
clap = { version = "4.5.13", features = ["derive", "env", "wrap_help"] }
4343
directories = "6.0"
4444
encoding_rs = "0.8"
45+
enum-iterator = "2.3.0"
4546
env_logger = "0.11"
4647
filetime = "0.2"
4748
flate2 = { version = "1.0", optional = true, default-features = false, features = [

src/compiler/compiler.rs

Lines changed: 39 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ use crate::server;
3838
use crate::util::{fmt_duration_as_secs, run_input_output};
3939
use crate::{counted_array, dist};
4040
use async_trait::async_trait;
41+
use enum_iterator::Sequence;
4142
use filetime::FileTime;
4243
use fs::File;
4344
use fs_err as fs;
@@ -212,7 +213,7 @@ pub enum CompilerKind {
212213
Rust,
213214
}
214215

215-
#[derive(Debug, PartialEq, Eq, Clone, Copy)]
216+
#[derive(Debug, PartialEq, Eq, Clone, Copy, Sequence)]
216217
pub enum Language {
217218
AssemblerToPreprocess,
218219
Assembler,
@@ -304,6 +305,17 @@ impl Language {
304305
)
305306
}
306307

308+
pub fn to_c_preprocessed_language(self) -> Option<Language> {
309+
match self {
310+
Language::AssemblerToPreprocess => Some(Language::Assembler),
311+
Language::C => Some(Language::CPreprocessed),
312+
Language::Cxx => Some(Language::CxxPreprocessed),
313+
Language::ObjectiveC => Some(Language::ObjectiveCPreprocessed),
314+
Language::ObjectiveCxx => Some(Language::ObjectiveCxxPreprocessed),
315+
_ => None,
316+
}
317+
}
318+
307319
/// Common implementation for GCC and Clang language argument mapping
308320
fn to_compiler_arg(self, cuda_arg: &'static str) -> Option<&'static str> {
309321
match self {
@@ -1856,13 +1868,39 @@ mod test {
18561868
use crate::mock_command::*;
18571869
use crate::test::mock_storage::MockStorage;
18581870
use crate::test::utils::*;
1871+
use enum_iterator::all;
18591872
use fs::File;
18601873
use std::io::{Cursor, Write};
18611874
use std::sync::Arc;
18621875
use std::time::Duration;
18631876
use test_case::test_case;
18641877
use tokio::runtime::Runtime;
18651878

1879+
#[test]
1880+
fn test_c_preprocessing_consistent() {
1881+
for lang in all::<Language>() {
1882+
let maybe_processed = lang.to_c_preprocessed_language();
1883+
1884+
if let Some(processed) = maybe_processed {
1885+
assert!(
1886+
!processed.needs_c_preprocessing(),
1887+
"{:?} should not need preprocessing - it is a result of {:?} processing",
1888+
processed,
1889+
lang
1890+
);
1891+
}
1892+
1893+
if !lang.needs_c_preprocessing() {
1894+
assert!(
1895+
maybe_processed.is_none(),
1896+
"{:?} should not be processed, but it is produce the {:?} as a C preprocessing result",
1897+
lang,
1898+
maybe_processed.unwrap()
1899+
);
1900+
}
1901+
}
1902+
}
1903+
18661904
#[test]
18671905
fn test_detect_compiler_kind_gcc() {
18681906
let f = TestFixture::new();

src/compiler/gcc.rs

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -908,12 +908,17 @@ where
908908
// https://gcc.gnu.org/onlinedocs/gcc-4.9.0/gcc/Overall-Options.html
909909
let mut language: Option<String> =
910910
language_to_arg(parsed_args.language).map(|lang| lang.into());
911-
if !rewrite_includes_only {
912-
match parsed_args.language {
913-
Language::C => language = Some("cpp-output".into()),
914-
Language::GenericHeader | Language::CHeader | Language::CxxHeader => {}
915-
_ => language.as_mut()?.push_str("-cpp-output"),
916-
}
911+
if rewrite_includes_only
912+
|| matches!(
913+
parsed_args.language,
914+
Language::GenericHeader | Language::CHeader | Language::CxxHeader
915+
)
916+
{
917+
// Nothing to do
918+
} else if let Some(processed_lang) = parsed_args.language.to_c_preprocessed_language() {
919+
language = Some(language_to_arg(processed_lang)?.into());
920+
} else if parsed_args.language.needs_c_preprocessing() {
921+
language.as_mut()?.push_str("-cpp-output");
917922
}
918923

919924
let mut arguments: Vec<String> = vec![];

0 commit comments

Comments
 (0)