@@ -450,13 +450,31 @@ pub mod common {
450
450
451
451
let bindings = Builder :: default ( )
452
452
. clang_arg (
453
- subdir ( base_dir_path. as_ref ( ) . join ( HOST_DIRNAME ) . join ( "include" ) ) . and_then (
454
- |p| {
453
+ subdir ( base_dir_path. as_ref ( ) . join ( HOST_DIRNAME ) . join ( "include" ) )
454
+ . and_then ( |p| {
455
455
p. to_str ( )
456
456
. map ( |s| format ! ( "-I{}" , s) )
457
457
. ok_or_else ( || anyhow ! ( "Could not convert path to string" ) )
458
- } ,
459
- ) ?,
458
+ } )
459
+ . or_else ( |_| {
460
+ // Fallback for Simics 7.28.0+ where Python headers are in separate package (1033)
461
+ println ! ( "cargo:warning=Traditional Python include path not found, trying Simics Python package fallback" ) ;
462
+ let parent_dir = base_dir_path. as_ref ( ) . parent ( ) . unwrap ( ) ;
463
+ let python_include_path = parent_dir
464
+ . join ( "simics-python-7.10.0" )
465
+ . join ( HOST_DIRNAME )
466
+ . join ( "include" ) ;
467
+ if python_include_path. exists ( ) {
468
+ subdir ( & python_include_path)
469
+ . and_then ( |p| {
470
+ p. to_str ( )
471
+ . map ( |s| format ! ( "-I{}" , s) )
472
+ . ok_or_else ( || anyhow ! ( "Could not convert path to string" ) )
473
+ } )
474
+ } else {
475
+ bail ! ( "Python include directory not found at {}" , python_include_path. display( ) )
476
+ }
477
+ } ) ?,
460
478
)
461
479
. clang_arg ( format ! ( "-I{}" , & wrapper_include_path) )
462
480
. clang_arg ( "-fretain-comments-from-system-headers" )
@@ -774,37 +792,52 @@ pub mod common {
774
792
775
793
let libvtutils = bin_dir. join ( "libvtutils.so" ) . canonicalize ( ) ?;
776
794
777
- let sys_lib_dir = base_dir_path
778
- . join ( HOST_DIRNAME )
779
- . join ( "sys" )
780
- . join ( "lib" )
781
- . canonicalize ( ) ?;
795
+ // Try both traditional and fallback sys/lib directories
796
+ let sys_lib_dirs = vec ! [
797
+ base_dir_path. join( HOST_DIRNAME ) . join( "sys" ) . join( "lib" ) ,
798
+ base_dir_path. parent( ) . unwrap( ) . join( "simics-python-7.10.0" ) . join( HOST_DIRNAME ) . join( "sys" ) . join( "lib" )
799
+ ] ;
800
+
801
+ let mut libpython_found = None ;
802
+ let mut used_sys_lib_dir = None ;
803
+
804
+ for sys_lib_path in & sys_lib_dirs {
805
+ println ! ( "cargo:warning=Trying libpython path: {}" , sys_lib_path. display( ) ) ;
806
+ if let Ok ( sys_lib_dir) = sys_lib_path. canonicalize ( ) {
807
+ if let Some ( libpython_path) = read_dir ( & sys_lib_dir)
808
+ . ok ( )
809
+ . and_then ( |entries| entries
810
+ . filter_map ( |p| p. ok ( ) )
811
+ . filter ( |p| p. path ( ) . is_file ( ) )
812
+ . filter ( |p| {
813
+ let path = p. path ( ) ;
814
+ let Some ( file_name) = path. file_name ( ) else {
815
+ return false ;
816
+ } ;
817
+ let Some ( file_name) = file_name. to_str ( ) else {
818
+ return false ;
819
+ } ;
820
+ file_name. starts_with ( "libpython" )
821
+ && file_name. contains ( ".so" )
822
+ && file_name != "libpython3.so"
823
+ } )
824
+ . map ( |p| p. path ( ) )
825
+ . next ( ) )
826
+ {
827
+ println ! ( "cargo:warning=Found libpython in: {}" , sys_lib_dir. display( ) ) ;
828
+ libpython_found = Some ( libpython_path) ;
829
+ used_sys_lib_dir = Some ( sys_lib_dir) ;
830
+ break ;
831
+ }
832
+ }
833
+ }
782
834
783
- let libpython = sys_lib_dir. join (
784
- read_dir ( & sys_lib_dir) ?
785
- . filter_map ( |p| p. ok ( ) )
786
- . filter ( |p| p. path ( ) . is_file ( ) )
787
- . filter ( |p| {
788
- let path = p. path ( ) ;
789
-
790
- let Some ( file_name) = path. file_name ( ) else {
791
- return false ;
792
- } ;
793
-
794
- let Some ( file_name) = file_name. to_str ( ) else {
795
- return false ;
796
- } ;
797
-
798
- file_name. starts_with ( "libpython" )
799
- && file_name. contains ( ".so" )
800
- && file_name != "libpython3.so"
801
- } )
802
- . map ( |p| p. path ( ) )
803
- . next ( )
804
- . ok_or_else ( || {
805
- anyhow ! ( "No libpythonX.XX.so.X.X found in {}" , sys_lib_dir. display( ) )
806
- } ) ?,
807
- ) ;
835
+ let ( sys_lib_dir, libpython_path) = match ( used_sys_lib_dir, libpython_found) {
836
+ ( Some ( dir) , Some ( path) ) => ( dir, path) ,
837
+ _ => return Err ( anyhow ! ( "No libpythonX.XX.so.X.X found in any sys/lib directory" ) ) ,
838
+ } ;
839
+
840
+ let libpython = sys_lib_dir. join ( libpython_path) ;
808
841
809
842
println ! (
810
843
"cargo:rustc-link-lib=dylib:+verbatim={}" ,
0 commit comments