pass Py_3_x cfg var with links

This commit is contained in:
Nikolay Kim 2017-04-02 23:14:25 -07:00
parent 23c36f5714
commit 364d7af69c
3 changed files with 20 additions and 12 deletions

View File

@ -27,13 +27,17 @@ fn main() {
for f in flags.split(",") { for f in flags.split(",") {
// write out flags as --cfg so that the same #cfg blocks can be used // write out flags as --cfg so that the same #cfg blocks can be used
// in rust-cpython as in the -sys libs // in rust-cpython as in the -sys libs
let key_and_val: Vec<&str> = f.split("=").collect(); if f.starts_with("CFG") {
let key = key_and_val[0]; println!("cargo:rustc-cfg={}", &f[4..])
let val = key_and_val[1];
if key.starts_with("FLAG") {
println!("cargo:rustc-cfg={}=\"{}\"", CFG_KEY, &key[5..])
} else { } else {
println!("cargo:rustc-cfg={}=\"{}_{}\"", CFG_KEY, &key[4..], val); let key_and_val: Vec<&str> = f.split("=").collect();
let key = key_and_val[0];
let val = key_and_val[1];
if key.starts_with("FLAG") {
println!("cargo:rustc-cfg={}=\"{}\"", CFG_KEY, &key[5..]);
} else {
println!("cargo:rustc-cfg={}=\"{}_{}\"", CFG_KEY, &key[4..], val);
}
} }
} }
} }

View File

@ -306,7 +306,7 @@ print(sys.exec_prefix);";
/// cargo vars to stdout. /// cargo vars to stdout.
/// ///
/// Note that if the python doesn't satisfy expected_version, this will error. /// Note that if the python doesn't satisfy expected_version, this will error.
fn configure_from_path(expected_version: &PythonVersion) -> Result<String, String> { fn configure_from_path(expected_version: &PythonVersion) -> Result<(String, String), String> {
let (interpreter_version, interpreter_path, lines) = let (interpreter_version, interpreter_path, lines) =
try!(find_interpreter_and_get_config(expected_version)); try!(find_interpreter_and_get_config(expected_version));
let libpath: &str = &lines[1]; let libpath: &str = &lines[1];
@ -325,6 +325,7 @@ fn configure_from_path(expected_version: &PythonVersion) -> Result<String, Strin
} }
} }
let mut flags = String::new();
if let PythonVersion { major: 3, minor: some_minor} = interpreter_version { if let PythonVersion { major: 3, minor: some_minor} = interpreter_version {
if env::var_os("CARGO_FEATURE_PEP_384").is_some() { if env::var_os("CARGO_FEATURE_PEP_384").is_some() {
@ -333,11 +334,11 @@ fn configure_from_path(expected_version: &PythonVersion) -> Result<String, Strin
if let Some(minor) = some_minor { if let Some(minor) = some_minor {
for i in 4..(minor+1) { for i in 4..(minor+1) {
println!("cargo:rustc-cfg=Py_3_{}", i); println!("cargo:rustc-cfg=Py_3_{}", i);
flags += format!("CFG_Py_3_{},", i).as_ref();
} }
} }
} }
return Ok((interpreter_path, flags));
return Ok(interpreter_path);
} }
/// Determine the python version we're supposed to be building /// Determine the python version we're supposed to be building
@ -380,7 +381,7 @@ fn main() {
// try using 'env' (sorry but this isn't our fault - it just has to // try using 'env' (sorry but this isn't our fault - it just has to
// match the pkg-config package name, which is going to have a . in it). // match the pkg-config package name, which is going to have a . in it).
let version = version_from_env().unwrap(); let version = version_from_env().unwrap();
let python_interpreter_path = configure_from_path(&version).unwrap(); let (python_interpreter_path, flags) = configure_from_path(&version).unwrap();
let config_map = get_config_vars(&python_interpreter_path).unwrap(); let config_map = get_config_vars(&python_interpreter_path).unwrap();
for (key, val) in &config_map { for (key, val) in &config_map {
match cfg_line_for_var(key, val) { match cfg_line_for_var(key, val) {
@ -402,6 +403,7 @@ fn main() {
// rust-cypthon/build.rs contains an example of how to unpack this data // rust-cypthon/build.rs contains an example of how to unpack this data
// into cfg flags that replicate the ones present in this library, so // into cfg flags that replicate the ones present in this library, so
// you can use the same cfg syntax. // you can use the same cfg syntax.
//let mut flags = flags;
let flags: String = config_map.iter().fold("".to_owned(), |memo, (key, val)| { let flags: String = config_map.iter().fold("".to_owned(), |memo, (key, val)| {
if is_value(key) { if is_value(key) {
memo + format!("VAL_{}={},", key, val).as_ref() memo + format!("VAL_{}={},", key, val).as_ref()
@ -410,7 +412,8 @@ fn main() {
} else { } else {
memo memo
} }
}); }) + flags.as_str();
println!("cargo:python_flags={}", println!("cargo:python_flags={}",
if flags.len() > 0 { &flags[..flags.len()-1] } else { "" }); if flags.len() > 0 { &flags[..flags.len()-1] } else { "" });
} }

View File

@ -109,7 +109,7 @@ macro_rules! py_class_type_object_dynamic_init {
} }
} }
#[cfg(not(Py_3_4))] #[cfg(not(Py_3_5))]
#[macro_export] #[macro_export]
#[doc(hidden)] #[doc(hidden)]
macro_rules! py_class_type_object_dynamic_init { macro_rules! py_class_type_object_dynamic_init {
@ -221,6 +221,7 @@ macro_rules! py_class_as_number {
macro_rules! py_class_as_async { macro_rules! py_class_as_async {
([]) => (0 as *mut $crate::_detail::ffi::PyAsyncMethods); ([]) => (0 as *mut $crate::_detail::ffi::PyAsyncMethods);
([$( $slot_name:ident : $slot_value:expr ,)+]) => {{ ([$( $slot_name:ident : $slot_value:expr ,)+]) => {{
println!("register async");
static mut ASYNC_METHODS : $crate::_detail::ffi::PyAsyncMethods static mut ASYNC_METHODS : $crate::_detail::ffi::PyAsyncMethods
= $crate::_detail::ffi::PyAsyncMethods { = $crate::_detail::ffi::PyAsyncMethods {
$( $slot_name : $slot_value, )* $( $slot_name : $slot_value, )*