trybuild_internals_api/
cargo.rs

1use crate::directory::Directory;
2use crate::error::{Error, Result};
3use crate::manifest::Name;
4use crate::run::Project;
5use crate::rustflags;
6use serde_derive::Deserialize;
7use std::fs::File;
8use std::path::PathBuf;
9use std::process::{Command, Output, Stdio};
10use std::{env, io, iter};
11use target_triple::TARGET;
12
13#[derive(#[doc(hidden)]
#[allow(non_upper_case_globals, unused_attributes, unused_qualifications,
clippy :: absolute_paths,)]
const _: () =
    {
        #[allow(unused_extern_crates, clippy :: useless_attribute)]
        extern crate serde as _serde;
        ;
        #[automatically_derived]
        impl<'de> _serde::Deserialize<'de> for Metadata {
            fn deserialize<__D>(__deserializer: __D)
                -> _serde::__private228::Result<Self, __D::Error> where
                __D: _serde::Deserializer<'de> {
                #[allow(non_camel_case_types)]
                #[doc(hidden)]
                enum __Field { __field0, __field1, __field2, __ignore, }
                #[doc(hidden)]
                struct __FieldVisitor;
                #[automatically_derived]
                impl<'de> _serde::de::Visitor<'de> for __FieldVisitor {
                    type Value = __Field;
                    fn expecting(&self,
                        __formatter: &mut _serde::__private228::Formatter)
                        -> _serde::__private228::fmt::Result {
                        _serde::__private228::Formatter::write_str(__formatter,
                            "field identifier")
                    }
                    fn visit_u64<__E>(self, __value: u64)
                        -> _serde::__private228::Result<Self::Value, __E> where
                        __E: _serde::de::Error {
                        match __value {
                            0u64 => _serde::__private228::Ok(__Field::__field0),
                            1u64 => _serde::__private228::Ok(__Field::__field1),
                            2u64 => _serde::__private228::Ok(__Field::__field2),
                            _ => _serde::__private228::Ok(__Field::__ignore),
                        }
                    }
                    fn visit_str<__E>(self, __value: &str)
                        -> _serde::__private228::Result<Self::Value, __E> where
                        __E: _serde::de::Error {
                        match __value {
                            "target_directory" =>
                                _serde::__private228::Ok(__Field::__field0),
                            "workspace_root" =>
                                _serde::__private228::Ok(__Field::__field1),
                            "packages" => _serde::__private228::Ok(__Field::__field2),
                            _ => { _serde::__private228::Ok(__Field::__ignore) }
                        }
                    }
                    fn visit_bytes<__E>(self, __value: &[u8])
                        -> _serde::__private228::Result<Self::Value, __E> where
                        __E: _serde::de::Error {
                        match __value {
                            b"target_directory" =>
                                _serde::__private228::Ok(__Field::__field0),
                            b"workspace_root" =>
                                _serde::__private228::Ok(__Field::__field1),
                            b"packages" => _serde::__private228::Ok(__Field::__field2),
                            _ => { _serde::__private228::Ok(__Field::__ignore) }
                        }
                    }
                }
                #[automatically_derived]
                impl<'de> _serde::Deserialize<'de> for __Field {
                    #[inline]
                    fn deserialize<__D>(__deserializer: __D)
                        -> _serde::__private228::Result<Self, __D::Error> where
                        __D: _serde::Deserializer<'de> {
                        _serde::Deserializer::deserialize_identifier(__deserializer,
                            __FieldVisitor)
                    }
                }
                #[doc(hidden)]
                struct __Visitor<'de> {
                    marker: _serde::__private228::PhantomData<Metadata>,
                    lifetime: _serde::__private228::PhantomData<&'de ()>,
                }
                #[automatically_derived]
                impl<'de> _serde::de::Visitor<'de> for __Visitor<'de> {
                    type Value = Metadata;
                    fn expecting(&self,
                        __formatter: &mut _serde::__private228::Formatter)
                        -> _serde::__private228::fmt::Result {
                        _serde::__private228::Formatter::write_str(__formatter,
                            "struct Metadata")
                    }
                    #[inline]
                    fn visit_seq<__A>(self, mut __seq: __A)
                        -> _serde::__private228::Result<Self::Value, __A::Error>
                        where __A: _serde::de::SeqAccess<'de> {
                        let __field0 =
                            match _serde::de::SeqAccess::next_element::<Directory>(&mut __seq)?
                                {
                                _serde::__private228::Some(__value) => __value,
                                _serde::__private228::None =>
                                    return _serde::__private228::Err(_serde::de::Error::invalid_length(0usize,
                                                &"struct Metadata with 3 elements")),
                            };
                        let __field1 =
                            match _serde::de::SeqAccess::next_element::<Directory>(&mut __seq)?
                                {
                                _serde::__private228::Some(__value) => __value,
                                _serde::__private228::None =>
                                    return _serde::__private228::Err(_serde::de::Error::invalid_length(1usize,
                                                &"struct Metadata with 3 elements")),
                            };
                        let __field2 =
                            match _serde::de::SeqAccess::next_element::<Vec<PackageMetadata>>(&mut __seq)?
                                {
                                _serde::__private228::Some(__value) => __value,
                                _serde::__private228::None =>
                                    return _serde::__private228::Err(_serde::de::Error::invalid_length(2usize,
                                                &"struct Metadata with 3 elements")),
                            };
                        _serde::__private228::Ok(Metadata {
                                target_directory: __field0,
                                workspace_root: __field1,
                                packages: __field2,
                            })
                    }
                    #[inline]
                    fn visit_map<__A>(self, mut __map: __A)
                        -> _serde::__private228::Result<Self::Value, __A::Error>
                        where __A: _serde::de::MapAccess<'de> {
                        let mut __field0: _serde::__private228::Option<Directory> =
                            _serde::__private228::None;
                        let mut __field1: _serde::__private228::Option<Directory> =
                            _serde::__private228::None;
                        let mut __field2:
                                _serde::__private228::Option<Vec<PackageMetadata>> =
                            _serde::__private228::None;
                        while let _serde::__private228::Some(__key) =
                                _serde::de::MapAccess::next_key::<__Field>(&mut __map)? {
                            match __key {
                                __Field::__field0 => {
                                    if _serde::__private228::Option::is_some(&__field0) {
                                        return _serde::__private228::Err(<__A::Error as
                                                        _serde::de::Error>::duplicate_field("target_directory"));
                                    }
                                    __field0 =
                                        _serde::__private228::Some(_serde::de::MapAccess::next_value::<Directory>(&mut __map)?);
                                }
                                __Field::__field1 => {
                                    if _serde::__private228::Option::is_some(&__field1) {
                                        return _serde::__private228::Err(<__A::Error as
                                                        _serde::de::Error>::duplicate_field("workspace_root"));
                                    }
                                    __field1 =
                                        _serde::__private228::Some(_serde::de::MapAccess::next_value::<Directory>(&mut __map)?);
                                }
                                __Field::__field2 => {
                                    if _serde::__private228::Option::is_some(&__field2) {
                                        return _serde::__private228::Err(<__A::Error as
                                                        _serde::de::Error>::duplicate_field("packages"));
                                    }
                                    __field2 =
                                        _serde::__private228::Some(_serde::de::MapAccess::next_value::<Vec<PackageMetadata>>(&mut __map)?);
                                }
                                _ => {
                                    let _ =
                                        _serde::de::MapAccess::next_value::<_serde::de::IgnoredAny>(&mut __map)?;
                                }
                            }
                        }
                        let __field0 =
                            match __field0 {
                                _serde::__private228::Some(__field0) => __field0,
                                _serde::__private228::None =>
                                    _serde::__private228::de::missing_field("target_directory")?,
                            };
                        let __field1 =
                            match __field1 {
                                _serde::__private228::Some(__field1) => __field1,
                                _serde::__private228::None =>
                                    _serde::__private228::de::missing_field("workspace_root")?,
                            };
                        let __field2 =
                            match __field2 {
                                _serde::__private228::Some(__field2) => __field2,
                                _serde::__private228::None =>
                                    _serde::__private228::de::missing_field("packages")?,
                            };
                        _serde::__private228::Ok(Metadata {
                                target_directory: __field0,
                                workspace_root: __field1,
                                packages: __field2,
                            })
                    }
                }
                #[doc(hidden)]
                const FIELDS: &'static [&'static str] =
                    &["target_directory", "workspace_root", "packages"];
                _serde::Deserializer::deserialize_struct(__deserializer,
                    "Metadata", FIELDS,
                    __Visitor {
                        marker: _serde::__private228::PhantomData::<Metadata>,
                        lifetime: _serde::__private228::PhantomData,
                    })
            }
        }
    };Deserialize)]
14pub struct Metadata {
15    pub target_directory: Directory,
16    pub workspace_root: Directory,
17    pub packages: Vec<PackageMetadata>,
18}
19
20#[derive(#[doc(hidden)]
#[allow(non_upper_case_globals, unused_attributes, unused_qualifications,
clippy :: absolute_paths,)]
const _: () =
    {
        #[allow(unused_extern_crates, clippy :: useless_attribute)]
        extern crate serde as _serde;
        ;
        #[automatically_derived]
        impl<'de> _serde::Deserialize<'de> for PackageMetadata {
            fn deserialize<__D>(__deserializer: __D)
                -> _serde::__private228::Result<Self, __D::Error> where
                __D: _serde::Deserializer<'de> {
                #[allow(non_camel_case_types)]
                #[doc(hidden)]
                enum __Field { __field0, __field1, __field2, __ignore, }
                #[doc(hidden)]
                struct __FieldVisitor;
                #[automatically_derived]
                impl<'de> _serde::de::Visitor<'de> for __FieldVisitor {
                    type Value = __Field;
                    fn expecting(&self,
                        __formatter: &mut _serde::__private228::Formatter)
                        -> _serde::__private228::fmt::Result {
                        _serde::__private228::Formatter::write_str(__formatter,
                            "field identifier")
                    }
                    fn visit_u64<__E>(self, __value: u64)
                        -> _serde::__private228::Result<Self::Value, __E> where
                        __E: _serde::de::Error {
                        match __value {
                            0u64 => _serde::__private228::Ok(__Field::__field0),
                            1u64 => _serde::__private228::Ok(__Field::__field1),
                            2u64 => _serde::__private228::Ok(__Field::__field2),
                            _ => _serde::__private228::Ok(__Field::__ignore),
                        }
                    }
                    fn visit_str<__E>(self, __value: &str)
                        -> _serde::__private228::Result<Self::Value, __E> where
                        __E: _serde::de::Error {
                        match __value {
                            "name" => _serde::__private228::Ok(__Field::__field0),
                            "targets" => _serde::__private228::Ok(__Field::__field1),
                            "manifest_path" =>
                                _serde::__private228::Ok(__Field::__field2),
                            _ => { _serde::__private228::Ok(__Field::__ignore) }
                        }
                    }
                    fn visit_bytes<__E>(self, __value: &[u8])
                        -> _serde::__private228::Result<Self::Value, __E> where
                        __E: _serde::de::Error {
                        match __value {
                            b"name" => _serde::__private228::Ok(__Field::__field0),
                            b"targets" => _serde::__private228::Ok(__Field::__field1),
                            b"manifest_path" =>
                                _serde::__private228::Ok(__Field::__field2),
                            _ => { _serde::__private228::Ok(__Field::__ignore) }
                        }
                    }
                }
                #[automatically_derived]
                impl<'de> _serde::Deserialize<'de> for __Field {
                    #[inline]
                    fn deserialize<__D>(__deserializer: __D)
                        -> _serde::__private228::Result<Self, __D::Error> where
                        __D: _serde::Deserializer<'de> {
                        _serde::Deserializer::deserialize_identifier(__deserializer,
                            __FieldVisitor)
                    }
                }
                #[doc(hidden)]
                struct __Visitor<'de> {
                    marker: _serde::__private228::PhantomData<PackageMetadata>,
                    lifetime: _serde::__private228::PhantomData<&'de ()>,
                }
                #[automatically_derived]
                impl<'de> _serde::de::Visitor<'de> for __Visitor<'de> {
                    type Value = PackageMetadata;
                    fn expecting(&self,
                        __formatter: &mut _serde::__private228::Formatter)
                        -> _serde::__private228::fmt::Result {
                        _serde::__private228::Formatter::write_str(__formatter,
                            "struct PackageMetadata")
                    }
                    #[inline]
                    fn visit_seq<__A>(self, mut __seq: __A)
                        -> _serde::__private228::Result<Self::Value, __A::Error>
                        where __A: _serde::de::SeqAccess<'de> {
                        let __field0 =
                            match _serde::de::SeqAccess::next_element::<String>(&mut __seq)?
                                {
                                _serde::__private228::Some(__value) => __value,
                                _serde::__private228::None =>
                                    return _serde::__private228::Err(_serde::de::Error::invalid_length(0usize,
                                                &"struct PackageMetadata with 3 elements")),
                            };
                        let __field1 =
                            match _serde::de::SeqAccess::next_element::<Vec<BuildTarget>>(&mut __seq)?
                                {
                                _serde::__private228::Some(__value) => __value,
                                _serde::__private228::None =>
                                    return _serde::__private228::Err(_serde::de::Error::invalid_length(1usize,
                                                &"struct PackageMetadata with 3 elements")),
                            };
                        let __field2 =
                            match _serde::de::SeqAccess::next_element::<PathBuf>(&mut __seq)?
                                {
                                _serde::__private228::Some(__value) => __value,
                                _serde::__private228::None =>
                                    return _serde::__private228::Err(_serde::de::Error::invalid_length(2usize,
                                                &"struct PackageMetadata with 3 elements")),
                            };
                        _serde::__private228::Ok(PackageMetadata {
                                name: __field0,
                                targets: __field1,
                                manifest_path: __field2,
                            })
                    }
                    #[inline]
                    fn visit_map<__A>(self, mut __map: __A)
                        -> _serde::__private228::Result<Self::Value, __A::Error>
                        where __A: _serde::de::MapAccess<'de> {
                        let mut __field0: _serde::__private228::Option<String> =
                            _serde::__private228::None;
                        let mut __field1:
                                _serde::__private228::Option<Vec<BuildTarget>> =
                            _serde::__private228::None;
                        let mut __field2: _serde::__private228::Option<PathBuf> =
                            _serde::__private228::None;
                        while let _serde::__private228::Some(__key) =
                                _serde::de::MapAccess::next_key::<__Field>(&mut __map)? {
                            match __key {
                                __Field::__field0 => {
                                    if _serde::__private228::Option::is_some(&__field0) {
                                        return _serde::__private228::Err(<__A::Error as
                                                        _serde::de::Error>::duplicate_field("name"));
                                    }
                                    __field0 =
                                        _serde::__private228::Some(_serde::de::MapAccess::next_value::<String>(&mut __map)?);
                                }
                                __Field::__field1 => {
                                    if _serde::__private228::Option::is_some(&__field1) {
                                        return _serde::__private228::Err(<__A::Error as
                                                        _serde::de::Error>::duplicate_field("targets"));
                                    }
                                    __field1 =
                                        _serde::__private228::Some(_serde::de::MapAccess::next_value::<Vec<BuildTarget>>(&mut __map)?);
                                }
                                __Field::__field2 => {
                                    if _serde::__private228::Option::is_some(&__field2) {
                                        return _serde::__private228::Err(<__A::Error as
                                                        _serde::de::Error>::duplicate_field("manifest_path"));
                                    }
                                    __field2 =
                                        _serde::__private228::Some(_serde::de::MapAccess::next_value::<PathBuf>(&mut __map)?);
                                }
                                _ => {
                                    let _ =
                                        _serde::de::MapAccess::next_value::<_serde::de::IgnoredAny>(&mut __map)?;
                                }
                            }
                        }
                        let __field0 =
                            match __field0 {
                                _serde::__private228::Some(__field0) => __field0,
                                _serde::__private228::None =>
                                    _serde::__private228::de::missing_field("name")?,
                            };
                        let __field1 =
                            match __field1 {
                                _serde::__private228::Some(__field1) => __field1,
                                _serde::__private228::None =>
                                    _serde::__private228::de::missing_field("targets")?,
                            };
                        let __field2 =
                            match __field2 {
                                _serde::__private228::Some(__field2) => __field2,
                                _serde::__private228::None =>
                                    _serde::__private228::de::missing_field("manifest_path")?,
                            };
                        _serde::__private228::Ok(PackageMetadata {
                                name: __field0,
                                targets: __field1,
                                manifest_path: __field2,
                            })
                    }
                }
                #[doc(hidden)]
                const FIELDS: &'static [&'static str] =
                    &["name", "targets", "manifest_path"];
                _serde::Deserializer::deserialize_struct(__deserializer,
                    "PackageMetadata", FIELDS,
                    __Visitor {
                        marker: _serde::__private228::PhantomData::<PackageMetadata>,
                        lifetime: _serde::__private228::PhantomData,
                    })
            }
        }
    };Deserialize)]
21pub struct PackageMetadata {
22    pub name: String,
23    pub targets: Vec<BuildTarget>,
24    pub manifest_path: PathBuf,
25}
26
27#[derive(#[doc(hidden)]
#[allow(non_upper_case_globals, unused_attributes, unused_qualifications,
clippy :: absolute_paths,)]
const _: () =
    {
        #[allow(unused_extern_crates, clippy :: useless_attribute)]
        extern crate serde as _serde;
        ;
        #[automatically_derived]
        impl<'de> _serde::Deserialize<'de> for BuildTarget {
            fn deserialize<__D>(__deserializer: __D)
                -> _serde::__private228::Result<Self, __D::Error> where
                __D: _serde::Deserializer<'de> {
                #[allow(non_camel_case_types)]
                #[doc(hidden)]
                enum __Field { __field0, __ignore, }
                #[doc(hidden)]
                struct __FieldVisitor;
                #[automatically_derived]
                impl<'de> _serde::de::Visitor<'de> for __FieldVisitor {
                    type Value = __Field;
                    fn expecting(&self,
                        __formatter: &mut _serde::__private228::Formatter)
                        -> _serde::__private228::fmt::Result {
                        _serde::__private228::Formatter::write_str(__formatter,
                            "field identifier")
                    }
                    fn visit_u64<__E>(self, __value: u64)
                        -> _serde::__private228::Result<Self::Value, __E> where
                        __E: _serde::de::Error {
                        match __value {
                            0u64 => _serde::__private228::Ok(__Field::__field0),
                            _ => _serde::__private228::Ok(__Field::__ignore),
                        }
                    }
                    fn visit_str<__E>(self, __value: &str)
                        -> _serde::__private228::Result<Self::Value, __E> where
                        __E: _serde::de::Error {
                        match __value {
                            "crate_types" =>
                                _serde::__private228::Ok(__Field::__field0),
                            _ => { _serde::__private228::Ok(__Field::__ignore) }
                        }
                    }
                    fn visit_bytes<__E>(self, __value: &[u8])
                        -> _serde::__private228::Result<Self::Value, __E> where
                        __E: _serde::de::Error {
                        match __value {
                            b"crate_types" =>
                                _serde::__private228::Ok(__Field::__field0),
                            _ => { _serde::__private228::Ok(__Field::__ignore) }
                        }
                    }
                }
                #[automatically_derived]
                impl<'de> _serde::Deserialize<'de> for __Field {
                    #[inline]
                    fn deserialize<__D>(__deserializer: __D)
                        -> _serde::__private228::Result<Self, __D::Error> where
                        __D: _serde::Deserializer<'de> {
                        _serde::Deserializer::deserialize_identifier(__deserializer,
                            __FieldVisitor)
                    }
                }
                #[doc(hidden)]
                struct __Visitor<'de> {
                    marker: _serde::__private228::PhantomData<BuildTarget>,
                    lifetime: _serde::__private228::PhantomData<&'de ()>,
                }
                #[automatically_derived]
                impl<'de> _serde::de::Visitor<'de> for __Visitor<'de> {
                    type Value = BuildTarget;
                    fn expecting(&self,
                        __formatter: &mut _serde::__private228::Formatter)
                        -> _serde::__private228::fmt::Result {
                        _serde::__private228::Formatter::write_str(__formatter,
                            "struct BuildTarget")
                    }
                    #[inline]
                    fn visit_seq<__A>(self, mut __seq: __A)
                        -> _serde::__private228::Result<Self::Value, __A::Error>
                        where __A: _serde::de::SeqAccess<'de> {
                        let __field0 =
                            match _serde::de::SeqAccess::next_element::<Vec<String>>(&mut __seq)?
                                {
                                _serde::__private228::Some(__value) => __value,
                                _serde::__private228::None =>
                                    return _serde::__private228::Err(_serde::de::Error::invalid_length(0usize,
                                                &"struct BuildTarget with 1 element")),
                            };
                        _serde::__private228::Ok(BuildTarget {
                                crate_types: __field0,
                            })
                    }
                    #[inline]
                    fn visit_map<__A>(self, mut __map: __A)
                        -> _serde::__private228::Result<Self::Value, __A::Error>
                        where __A: _serde::de::MapAccess<'de> {
                        let mut __field0:
                                _serde::__private228::Option<Vec<String>> =
                            _serde::__private228::None;
                        while let _serde::__private228::Some(__key) =
                                _serde::de::MapAccess::next_key::<__Field>(&mut __map)? {
                            match __key {
                                __Field::__field0 => {
                                    if _serde::__private228::Option::is_some(&__field0) {
                                        return _serde::__private228::Err(<__A::Error as
                                                        _serde::de::Error>::duplicate_field("crate_types"));
                                    }
                                    __field0 =
                                        _serde::__private228::Some(_serde::de::MapAccess::next_value::<Vec<String>>(&mut __map)?);
                                }
                                _ => {
                                    let _ =
                                        _serde::de::MapAccess::next_value::<_serde::de::IgnoredAny>(&mut __map)?;
                                }
                            }
                        }
                        let __field0 =
                            match __field0 {
                                _serde::__private228::Some(__field0) => __field0,
                                _serde::__private228::None =>
                                    _serde::__private228::de::missing_field("crate_types")?,
                            };
                        _serde::__private228::Ok(BuildTarget {
                                crate_types: __field0,
                            })
                    }
                }
                #[doc(hidden)]
                const FIELDS: &'static [&'static str] = &["crate_types"];
                _serde::Deserializer::deserialize_struct(__deserializer,
                    "BuildTarget", FIELDS,
                    __Visitor {
                        marker: _serde::__private228::PhantomData::<BuildTarget>,
                        lifetime: _serde::__private228::PhantomData,
                    })
            }
        }
    };Deserialize)]
28pub struct BuildTarget {
29    pub crate_types: Vec<String>,
30}
31
32fn raw_cargo() -> Command {
33    match env::var_os("CARGO") {
34        Some(cargo) => Command::new(cargo),
35        None => Command::new("cargo"),
36    }
37}
38
39pub fn cargo(project: &Project) -> Command {
40    let mut cmd = raw_cargo();
41    cmd.current_dir(&project.dir);
42    cmd.envs(cargo_target_dir(project));
43    cmd.env_remove("RUSTFLAGS");
44    cmd.env("CARGO_INCREMENTAL", "0");
45    cmd.arg("--offline");
46
47    let rustflags = rustflags::toml();
48    cmd.arg(::alloc::__export::must_use({
        ::alloc::fmt::format(format_args!("--config=build.rustflags={0}",
                rustflags))
    })format!("--config=build.rustflags={rustflags}"));
49    cmd.arg(::alloc::__export::must_use({
        ::alloc::fmt::format(format_args!("--config=target.{0}.rustflags={1}",
                TARGET, rustflags))
    })format!("--config=target.{TARGET}.rustflags={rustflags}"));
50
51    cmd
52}
53
54fn cargo_target_dir(project: &Project) -> impl Iterator<Item = (&'static str, PathBuf)> {
55    iter::once((
56        "CARGO_TARGET_DIR",
57        {
    let mut path = std::path::PathBuf::new();
    path.push(&(project.target_dir));
    path.push(&("tests"));
    path.push(&("trybuild"));
    path
}path!(project.target_dir / "tests" / "trybuild"),
58    ))
59}
60
61pub fn manifest_dir() -> Result<Directory> {
62    if let Some(manifest_dir) = env::var_os("CARGO_MANIFEST_DIR") {
63        return Ok(Directory::from(manifest_dir));
64    }
65    let mut dir = Directory::current()?;
66    loop {
67        if dir.join("Cargo.toml").exists() {
68            return Ok(dir);
69        }
70        dir = dir.parent().ok_or(Error::ProjectDir)?;
71    }
72}
73
74pub(crate) fn build_dependencies(project: &mut Project) -> Result<()> {
75    // Try copying or generating lockfile.
76    match File::open({
    let mut path = std::path::PathBuf::new();
    path.push(&(project.workspace));
    path.push(&("Cargo.lock"));
    path
}path!(project.workspace / "Cargo.lock")) {
77        Ok(mut workspace_cargo_lock) => {
78            if let Ok(mut new_cargo_lock) = File::create({
    let mut path = std::path::PathBuf::new();
    path.push(&(project.dir));
    path.push(&("Cargo.lock"));
    path
}path!(project.dir / "Cargo.lock")) {
79                // Not fs::copy in order to avoid producing a read-only destination
80                // file if the source file happens to be read-only.
81                let _ = io::copy(&mut workspace_cargo_lock, &mut new_cargo_lock);
82            }
83        }
84        Err(err) => {
85            if err.kind() == io::ErrorKind::NotFound {
86                let _ = cargo(project).arg("generate-lockfile").status();
87            }
88        }
89    }
90
91    let mut command = cargo(project);
92    command
93        .arg(if project.has_pass { "build" } else { "check" })
94        .args(target())
95        .arg("--bin")
96        .arg(&project.name)
97        .args(features(project));
98
99    let status = command.status().map_err(Error::Cargo)?;
100    if !status.success() {
101        return Err(Error::CargoFail);
102    }
103
104    // Check if this Cargo contains https://github.com/rust-lang/cargo/pull/10383
105    project.keep_going = command
106        .arg("--keep-going")
107        .stdout(Stdio::null())
108        .stderr(Stdio::null())
109        .status()
110        .map(|status| status.success())
111        .unwrap_or(false);
112
113    Ok(())
114}
115
116pub fn build_test(project: &Project, name: &Name) -> Result<Output> {
117    let _ = cargo(project)
118        .arg("clean")
119        .arg("--package")
120        .arg(&project.name)
121        .arg("--color=never")
122        .stdout(Stdio::null())
123        .stderr(Stdio::null())
124        .status();
125
126    cargo(project)
127        .arg(if project.has_pass { "build" } else { "check" })
128        .args(target())
129        .arg("--bin")
130        .arg(name)
131        .args(features(project))
132        .arg("--quiet")
133        .arg("--color=never")
134        .arg("--message-format=json")
135        .output()
136        .map_err(Error::Cargo)
137}
138
139pub fn build_all_tests(project: &Project) -> Result<Output> {
140    let _ = cargo(project)
141        .arg("clean")
142        .arg("--package")
143        .arg(&project.name)
144        .arg("--color=never")
145        .stdout(Stdio::null())
146        .stderr(Stdio::null())
147        .status();
148
149    cargo(project)
150        .arg(if project.has_pass { "build" } else { "check" })
151        .args(target())
152        .arg("--bins")
153        .args(features(project))
154        .arg("--quiet")
155        .arg("--color=never")
156        .arg("--message-format=json")
157        .arg("--keep-going")
158        .output()
159        .map_err(Error::Cargo)
160}
161
162pub fn run_test(project: &Project, name: &Name) -> Result<Output> {
163    cargo(project)
164        .arg("run")
165        .args(target())
166        .arg("--bin")
167        .arg(name)
168        .args(features(project))
169        .arg("--quiet")
170        .arg("--color=never")
171        .output()
172        .map_err(Error::Cargo)
173}
174
175pub fn metadata() -> Result<Metadata> {
176    let output = raw_cargo()
177        .arg("metadata")
178        .arg("--no-deps")
179        .arg("--format-version=1")
180        .output()
181        .map_err(Error::Cargo)?;
182
183    serde_json::from_slice(&output.stdout).map_err(|err| {
184        {
    use std::io::Write;
    let _ =
        crate::term::lock().write_fmt(format_args!("{0}",
                String::from_utf8_lossy(&output.stderr)));
};print!("{}", String::from_utf8_lossy(&output.stderr));
185        Error::Metadata(err)
186    })
187}
188
189fn features(project: &Project) -> Vec<String> {
190    match &project.features {
191        Some(features) => <[_]>::into_vec(::alloc::boxed::box_new(["--no-default-features".to_owned(),
                "--features".to_owned(), features.join(",")]))vec![
192            "--no-default-features".to_owned(),
193            "--features".to_owned(),
194            features.join(","),
195        ],
196        None => ::alloc::vec::Vec::new()vec![],
197    }
198}
199
200fn target() -> Vec<&'static str> {
201    // When --target flag is passed, cargo does not pass RUSTFLAGS to rustc when
202    // building proc-macro and build script even if the host and target triples
203    // are the same. Therefore, if we always pass --target to cargo, tools such
204    // as coverage that require RUSTFLAGS do not work for tests run by trybuild.
205    //
206    // To avoid that problem, do not pass --target to cargo if we know that it
207    // has not been passed.
208    //
209    // Currently, cargo does not have a way to tell the build script whether
210    // --target has been passed or not, and there is no heuristic that can
211    // handle this well.
212    //
213    // Therefore, expose a cfg to always treat the target as host.
214    if falsecfg!(trybuild_no_target) {
215        ::alloc::vec::Vec::new()vec![]
216    } else {
217        <[_]>::into_vec(::alloc::boxed::box_new(["--target", TARGET]))vec!["--target", TARGET]
218    }
219}