@@ -677,6 +677,7 @@ const GLOBAL_EXTENSIONS: &[&str] = &[
677677// _sha256 and _sha512 merged into _sha2 in 3.12.
678678// _xxinterpchannels added in 3.12.
679679// audioop removed in 3.13.
680+ // annotationlib added in 3.14.
680681
681682// We didn't build ctypes_test until 3.9.
682683// We didn't build some test extensions until 3.9.
@@ -739,6 +740,7 @@ const GLOBAL_EXTENSIONS_PYTHON_3_14: &[&str] = &[
739740 "_tokenize" ,
740741 "_typing" ,
741742 "_zoneinfo" ,
743+ "annotationlib" ,
742744] ;
743745
744746const GLOBAL_EXTENSIONS_MACOS : & [ & str ] = & [ "_scproxy" ] ;
@@ -1491,7 +1493,7 @@ fn validate_extension_modules(
14911493
14921494 if is_macos {
14931495 wanted. extend ( GLOBAL_EXTENSIONS_POSIX ) ;
1494- if python_major_minor == "3.13" {
1496+ if matches ! ( python_major_minor, "3.13" | "3.14" ) {
14951497 wanted. remove ( "_crypt" ) ;
14961498 }
14971499 wanted. extend ( GLOBAL_EXTENSIONS_MACOS ) ;
@@ -1515,7 +1517,7 @@ fn validate_extension_modules(
15151517 wanted. extend ( GLOBAL_EXTENSIONS_POSIX ) ;
15161518 // TODO: If there are more differences for `GLOBAL_EXTENSIONS_POSIX` in future Python
15171519 // versions, we should move the `_crypt` special-case into a constant
1518- if python_major_minor == "3.13" {
1520+ if matches ! ( python_major_minor, "3.13" | "3.14" ) {
15191521 wanted. remove ( "_crypt" ) ;
15201522 }
15211523 if matches ! ( python_major_minor, "3.9" | "3.10" | "3.11" | "3.12" ) {
@@ -1536,16 +1538,16 @@ fn validate_extension_modules(
15361538 ] ) ;
15371539 }
15381540
1539- if ( is_linux || is_macos) && python_major_minor == "3.13" {
1541+ if ( is_linux || is_macos) && matches ! ( python_major_minor, "3.13" | "3.14" ) {
15401542 wanted. extend ( [ "_suggestions" , "_testexternalinspection" ] ) ;
15411543 }
15421544
1543- if ( is_linux || is_macos) && matches ! ( python_major_minor, "3.12" | "3.13" ) {
1545+ if ( is_linux || is_macos) && matches ! ( python_major_minor, "3.12" | "3.13" | "3.14" ) {
15441546 wanted. insert ( "_testsinglephase" ) ;
15451547 }
15461548
15471549 // _wmi is Windows only on 3.12+.
1548- if matches ! ( python_major_minor, "3.12" | "3.13" ) && is_windows {
1550+ if matches ! ( python_major_minor, "3.12" | "3.13" | "3.14" ) && is_windows {
15491551 wanted. insert ( "_wmi" ) ;
15501552 }
15511553
@@ -1668,6 +1670,8 @@ fn validate_distribution(
16681670 "3.12"
16691671 } else if dist_filename. starts_with ( "cpython-3.13." ) {
16701672 "3.13"
1673+ } else if dist_filename. starts_with ( "cpython-3.14." ) {
1674+ "3.14"
16711675 } else {
16721676 return Err ( anyhow ! ( "could not parse Python version from filename" ) ) ;
16731677 } ;
@@ -1950,7 +1954,7 @@ fn validate_distribution(
19501954 false
19511955 // For some strange reason _PyWarnings_Init is exported as part of the ABI
19521956 } else if name == "_warnings" {
1953- // But not on Python 3.13 on Windows
1957+ // But not on Python 3.13+ on Windows
19541958 if triple. contains ( "-windows-" ) {
19551959 matches ! ( python_major_minor, "3.9" | "3.10" | "3.11" | "3.12" )
19561960 } else {
0 commit comments