15f9996aaSopenharmony_ci/*
25f9996aaSopenharmony_ci * Copyright (c) 2023 Huawei Device Co., Ltd.
35f9996aaSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
45f9996aaSopenharmony_ci * you may not use this file except in compliance with the License.
55f9996aaSopenharmony_ci * You may obtain a copy of the License at
65f9996aaSopenharmony_ci *
75f9996aaSopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
85f9996aaSopenharmony_ci *
95f9996aaSopenharmony_ci * Unless required by applicable law or agreed to in writing, software
105f9996aaSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
115f9996aaSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
125f9996aaSopenharmony_ci * See the License for the specific language governing permissions and
135f9996aaSopenharmony_ci * limitations under the License.
145f9996aaSopenharmony_ci */
155f9996aaSopenharmony_ci
165f9996aaSopenharmony_ci//! test_rlib_cargo_crate
175f9996aaSopenharmony_ciuse std::env;
185f9996aaSopenharmony_ciuse std::path::Path;
195f9996aaSopenharmony_ciuse std::io::Write;
205f9996aaSopenharmony_ciuse std::process::Command;
215f9996aaSopenharmony_ciuse std::str::{self, FromStr};
225f9996aaSopenharmony_ci
235f9996aaSopenharmony_cifn main() {
245f9996aaSopenharmony_ci    println!("cargo:rustc-cfg=build_script_ran");
255f9996aaSopenharmony_ci    let my_minor = match rustc_minor_version() {
265f9996aaSopenharmony_ci        Some(my_minor) => my_minor,
275f9996aaSopenharmony_ci        None => return,
285f9996aaSopenharmony_ci    };
295f9996aaSopenharmony_ci
305f9996aaSopenharmony_ci    if my_minor >= 34 {
315f9996aaSopenharmony_ci        println!("cargo:rustc-cfg=is_new_rustc");
325f9996aaSopenharmony_ci    } else {
335f9996aaSopenharmony_ci        println!("cargo:rustc-cfg=is_old_rustc");
345f9996aaSopenharmony_ci    }
355f9996aaSopenharmony_ci
365f9996aaSopenharmony_ci    let target = env::var("TARGET").unwrap();
375f9996aaSopenharmony_ci
385f9996aaSopenharmony_ci    if target.contains("ohos") {
395f9996aaSopenharmony_ci        println!("cargo:rustc-cfg=is_ohos");
405f9996aaSopenharmony_ci    }
415f9996aaSopenharmony_ci    if target.contains("darwin") {
425f9996aaSopenharmony_ci        println!("cargo:rustc-cfg=is_mac");
435f9996aaSopenharmony_ci    }
445f9996aaSopenharmony_ci
455f9996aaSopenharmony_ci    let feature_a = env::var_os("CARGO_FEATURE_MY_FEATURE_A").is_some();
465f9996aaSopenharmony_ci    if feature_a {
475f9996aaSopenharmony_ci        println!("cargo:rustc-cfg=has_feature_a");
485f9996aaSopenharmony_ci    }
495f9996aaSopenharmony_ci    let feature_b = env::var_os("CARGO_FEATURE_MY_FEATURE_B").is_some();
505f9996aaSopenharmony_ci    if feature_b {
515f9996aaSopenharmony_ci        println!("cargo:rustc-cfg=has_feature_b");
525f9996aaSopenharmony_ci    }
535f9996aaSopenharmony_ci
545f9996aaSopenharmony_ci    // Some tests as to whether we're properly emulating various cargo features.
555f9996aaSopenharmony_ci    assert!(Path::new("build.rs").exists());
565f9996aaSopenharmony_ci    assert!(Path::new(&env::var_os("CARGO_MANIFEST_DIR").unwrap()).join("build.rs").exists());
575f9996aaSopenharmony_ci    assert!(Path::new(&env::var_os("OUT_DIR").unwrap()).exists());
585f9996aaSopenharmony_ci
595f9996aaSopenharmony_ci    // Confirm the following env var is set
605f9996aaSopenharmony_ci    env::var_os("CARGO_CFG_TARGET_ARCH").unwrap();
615f9996aaSopenharmony_ci
625f9996aaSopenharmony_ci    generate_some_code().unwrap();
635f9996aaSopenharmony_ci}
645f9996aaSopenharmony_ci
655f9996aaSopenharmony_cifn generate_some_code() -> std::io::Result<()> {
665f9996aaSopenharmony_ci    let test_output_dir = Path::new(&env::var_os("OUT_DIR").unwrap()).join("generated");
675f9996aaSopenharmony_ci    let _ = std::fs::create_dir_all(&test_output_dir);
685f9996aaSopenharmony_ci    // Test that environment variables from .gn files are passed to build scripts
695f9996aaSopenharmony_ci    let preferred_number = env::var("ENV_VAR_FOR_BUILD_SCRIPT").unwrap();
705f9996aaSopenharmony_ci    let mut file = std::fs::File::create(test_output_dir.join("generated.rs"))?;
715f9996aaSopenharmony_ci    write!(file, "fn run_some_generated_code() -> u32 {{ {} }}", preferred_number)?;
725f9996aaSopenharmony_ci    Ok(())
735f9996aaSopenharmony_ci}
745f9996aaSopenharmony_ci
755f9996aaSopenharmony_cifn rustc_minor_version() -> Option<u32> {
765f9996aaSopenharmony_ci    let rustc_bin = match env::var_os("RUSTC") {
775f9996aaSopenharmony_ci        Some(rustc_bin) => rustc_bin,
785f9996aaSopenharmony_ci        None => return None,
795f9996aaSopenharmony_ci    };
805f9996aaSopenharmony_ci
815f9996aaSopenharmony_ci    let output = match Command::new(rustc_bin).arg("--version").output() {
825f9996aaSopenharmony_ci        Ok(output) => output,
835f9996aaSopenharmony_ci        Err(_) => return None,
845f9996aaSopenharmony_ci    };
855f9996aaSopenharmony_ci
865f9996aaSopenharmony_ci    let rustc_version = match str::from_utf8(&output.stdout) {
875f9996aaSopenharmony_ci        Ok(rustc_version) => rustc_version,
885f9996aaSopenharmony_ci        Err(_) => return None,
895f9996aaSopenharmony_ci    };
905f9996aaSopenharmony_ci
915f9996aaSopenharmony_ci    let mut pieces = rustc_version.split('.');
925f9996aaSopenharmony_ci    if pieces.next() != Some("rustc 1") {
935f9996aaSopenharmony_ci        return None;
945f9996aaSopenharmony_ci    }
955f9996aaSopenharmony_ci
965f9996aaSopenharmony_ci    let next_var = match pieces.next() {
975f9996aaSopenharmony_ci        Some(next_var) => next_var,
985f9996aaSopenharmony_ci        None => return None,
995f9996aaSopenharmony_ci    };
1005f9996aaSopenharmony_ci
1015f9996aaSopenharmony_ci    u32::from_str(next_var).ok()
1025f9996aaSopenharmony_ci}
103