Skip to content

Commit 56aade9

Browse files
committedOct 9, 2019
Add perlapi_verXX config attributes for conditional build
1 parent 3e97983 commit 56aade9

File tree

4 files changed

+51
-8
lines changed

4 files changed

+51
-8
lines changed
 

‎build.rs

+2
Original file line numberDiff line numberDiff line change
@@ -5,4 +5,6 @@ fn main() {
55
perl.emit_cargo_ldopts();
66

77
perl.emit_features(&["useithreads"]);
8+
9+
perl.emit_perlapi_vers(10, 30);
810
}

‎examples/102_padname_type.rs

+19-7
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,33 @@
11
use std::env;
22

33
use libperl_rs::perl::Perl;
4-
use libperl_sys;
4+
use libperl_sys::{cv, PADLIST, PADNAMELIST};
55

66
#[cfg(perl_useithreads)]
7-
fn get_main_cv(perl: &Perl) -> *const libperl_sys::cv {
7+
fn get_main_cv(perl: &Perl) -> *const cv {
88
unsafe {(*perl.my_perl)}.Imain_cv
99
}
1010

1111
#[cfg(not(perl_useithreads))]
12-
fn get_main_cv(_perl: &Perl) -> *const libperl_sys::cv {
12+
fn get_main_cv(_perl: &Perl) -> *const cv {
1313
unsafe {libperl_sys::PL_main_cv}
1414
}
1515

16+
#[cfg(perlapi_ver24)]
17+
fn fetch_padnamelist(padlist: *const PADLIST) -> *const PADNAMELIST {
18+
unsafe {
19+
(*(*padlist).xpadl_arr.xpadlarr_dbg).padnl
20+
}
21+
}
22+
23+
#[cfg(not(perlapi_ver24))]
24+
fn fetch_padnamelist(padlist: *const PADLIST) -> *const PADNAMELIST {
25+
unsafe {
26+
*((*padlist).xpadl_alloc
27+
as *const *const PADNAMELIST)
28+
}
29+
}
30+
1631
fn test() {
1732
let mut perl = Perl::new();
1833

@@ -25,10 +40,7 @@ fn test() {
2540
print!("xpvcv = {:#?}\n", xpvcv);
2641
let padlist = unsafe {(*xpvcv).xcv_padlist_u.xcv_padlist};
2742
print!("padlist = {:#?}\n", padlist);
28-
let padnamelist_ptr = unsafe {
29-
*((*padlist).xpadl_arr.xpadlarr_alloc
30-
as *const *const libperl_sys::PADNAMELIST)
31-
};
43+
let padnamelist_ptr = fetch_padnamelist(padlist);
3244
if let Some(padnamelist) = unsafe {padnamelist_ptr.as_ref()} {
3345
println!("padnamelist = {:?}", padnamelist);
3446
let mut ix: usize = 0;

‎libperl-config/src/perl_config.rs

+27
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,33 @@ impl PerlConfig {
5656
process_command_output(cmd.output()?)
5757
}
5858

59+
pub fn read_one_config(&self, configs: &[&str]) -> Result<String, Error> {
60+
let script = ["-wle", r#"
61+
use strict;
62+
use Config;
63+
print ($Config{shift()} // '');
64+
"#
65+
];
66+
let mut cmd = self.command(&[&script[..], configs].concat());
67+
68+
process_command_output(cmd.output()?)
69+
}
70+
71+
pub fn emit_perlapi_vers(&self, min: i32, max: i32) {
72+
let config = self.read_one_config(&["PERL_API_VERSION"]).unwrap();
73+
let config = config.trim();
74+
println!("# PERL_API_VERSION={}", config);
75+
let ver = i32::from_str_radix(String::from(config).trim(), 10).unwrap();
76+
for v in min..=max {
77+
if v % 2 == 1 {
78+
continue;
79+
}
80+
if ver >= v {
81+
println!("cargo:rustc-cfg=perlapi_ver{}", v);
82+
}
83+
}
84+
}
85+
5986
pub fn emit_features(&self, configs: &[&str]) -> ConfigDict {
6087
let dict = self.read_config(&configs).unwrap();
6188

‎libperl-sys/build.rs

+3-1
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,9 @@ fn main() {
3535
let ccopts = perl.read_ccopts().unwrap();
3636
println!("# perl ccopts = {:?}, ", ccopts);
3737

38-
perl.emit_features(&["useithreads"]);
38+
perl.emit_features(&["useithreads"]); // "usemultiplicity"
39+
40+
perl.emit_perlapi_vers(10, 30);
3941

4042
let src_file_name = "wrapper.h";
4143
let src_path = cargo_topdir_file(src_file_name);

0 commit comments

Comments
 (0)
Please sign in to comment.