16cdb10c1Sopenharmony_ci// SPDX-License-Identifier: Apache-2.0 26cdb10c1Sopenharmony_ci 36cdb10c1Sopenharmony_ci//! Finds `libclang` static or shared libraries and links to them. 46cdb10c1Sopenharmony_ci//! 56cdb10c1Sopenharmony_ci//! # Environment Variables 66cdb10c1Sopenharmony_ci//! 76cdb10c1Sopenharmony_ci//! This build script can make use of several environment variables to help it 86cdb10c1Sopenharmony_ci//! find the required static or shared libraries. 96cdb10c1Sopenharmony_ci//! 106cdb10c1Sopenharmony_ci//! * `LLVM_CONFIG_PATH` - provides a path to an `llvm-config` executable 116cdb10c1Sopenharmony_ci//! * `LIBCLANG_PATH` - provides a path to a directory containing a `libclang` 126cdb10c1Sopenharmony_ci//! shared library or a path to a specific `libclang` shared library 136cdb10c1Sopenharmony_ci//! * `LIBCLANG_STATIC_PATH` - provides a path to a directory containing LLVM 146cdb10c1Sopenharmony_ci//! and Clang static libraries 156cdb10c1Sopenharmony_ci 166cdb10c1Sopenharmony_ci#![allow(unused_attributes)] 176cdb10c1Sopenharmony_ci 186cdb10c1Sopenharmony_ciextern crate glob; 196cdb10c1Sopenharmony_ci 206cdb10c1Sopenharmony_ciuse std::path::Path; 216cdb10c1Sopenharmony_ci 226cdb10c1Sopenharmony_ci#[path = "build/common.rs"] 236cdb10c1Sopenharmony_cipub mod common; 246cdb10c1Sopenharmony_ci#[path = "build/dynamic.rs"] 256cdb10c1Sopenharmony_cipub mod dynamic; 266cdb10c1Sopenharmony_ci#[path = "build/static.rs"] 276cdb10c1Sopenharmony_cipub mod r#static; 286cdb10c1Sopenharmony_ci 296cdb10c1Sopenharmony_ci/// Copies a file. 306cdb10c1Sopenharmony_ci#[cfg(feature = "runtime")] 316cdb10c1Sopenharmony_cifn copy(source: &str, destination: &Path) { 326cdb10c1Sopenharmony_ci use std::fs::File; 336cdb10c1Sopenharmony_ci use std::io::{Read, Write}; 346cdb10c1Sopenharmony_ci 356cdb10c1Sopenharmony_ci let mut string = String::new(); 366cdb10c1Sopenharmony_ci File::open(source) 376cdb10c1Sopenharmony_ci .unwrap() 386cdb10c1Sopenharmony_ci .read_to_string(&mut string) 396cdb10c1Sopenharmony_ci .unwrap(); 406cdb10c1Sopenharmony_ci File::create(destination) 416cdb10c1Sopenharmony_ci .unwrap() 426cdb10c1Sopenharmony_ci .write_all(string.as_bytes()) 436cdb10c1Sopenharmony_ci .unwrap(); 446cdb10c1Sopenharmony_ci} 456cdb10c1Sopenharmony_ci 466cdb10c1Sopenharmony_ci/// Copies the code used to find and link to `libclang` shared libraries into 476cdb10c1Sopenharmony_ci/// the build output directory so that it may be used when linking at runtime. 486cdb10c1Sopenharmony_ci#[cfg(feature = "runtime")] 496cdb10c1Sopenharmony_cifn main() { 506cdb10c1Sopenharmony_ci use std::env; 516cdb10c1Sopenharmony_ci 526cdb10c1Sopenharmony_ci if cfg!(feature = "static") { 536cdb10c1Sopenharmony_ci panic!("`runtime` and `static` features can't be combined"); 546cdb10c1Sopenharmony_ci } 556cdb10c1Sopenharmony_ci 566cdb10c1Sopenharmony_ci let out = env::var("OUT_DIR").unwrap(); 576cdb10c1Sopenharmony_ci copy("build/common.rs", &Path::new(&out).join("common.rs")); 586cdb10c1Sopenharmony_ci copy("build/dynamic.rs", &Path::new(&out).join("dynamic.rs")); 596cdb10c1Sopenharmony_ci} 606cdb10c1Sopenharmony_ci 616cdb10c1Sopenharmony_ci/// Finds and links to the required libraries dynamically or statically. 626cdb10c1Sopenharmony_ci#[cfg(not(feature = "runtime"))] 636cdb10c1Sopenharmony_cifn main() { 646cdb10c1Sopenharmony_ci if cfg!(feature = "static") { 656cdb10c1Sopenharmony_ci // r#static::link(); 666cdb10c1Sopenharmony_ci } else { 676cdb10c1Sopenharmony_ci dynamic::link(); 686cdb10c1Sopenharmony_ci } 696cdb10c1Sopenharmony_ci 706cdb10c1Sopenharmony_ci if let Some(output) = common::run_llvm_config(&["--includedir"]) { 716cdb10c1Sopenharmony_ci let directory = Path::new(output.trim_end()); 726cdb10c1Sopenharmony_ci println!("cargo:include={}", directory.display()); 736cdb10c1Sopenharmony_ci } 746cdb10c1Sopenharmony_ci} 75