Skip to content

Commit 97ebebd

Browse files
committed
distributed compilation support for asm & preprocessor outputs
Fixes #2556
1 parent f52f7ce commit 97ebebd

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,
@@ -305,6 +306,17 @@ impl Language {
305306
)
306307
}
307308

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

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

src/compiler/gcc.rs

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

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

0 commit comments

Comments
 (0)