@@ -676,6 +676,7 @@ const GLOBAL_EXTENSIONS: &[&str] = &[
676676// _sha256 and _sha512 merged into _sha2 in 3.12.
677677// _xxinterpchannels added in 3.12.
678678// audioop removed in 3.13.
679+ // annotationlib added in 3.14.
679680
680681// We didn't build ctypes_test until 3.9.
681682// We didn't build some test extensions until 3.9.
@@ -738,6 +739,7 @@ const GLOBAL_EXTENSIONS_PYTHON_3_14: &[&str] = &[
738739 "_tokenize" ,
739740 "_typing" ,
740741 "_zoneinfo" ,
742+ "annotationlib" ,
741743] ;
742744
743745const GLOBAL_EXTENSIONS_MACOS : & [ & str ] = & [ "_scproxy" ] ;
@@ -1490,7 +1492,7 @@ fn validate_extension_modules(
14901492
14911493 if is_macos {
14921494 wanted. extend ( GLOBAL_EXTENSIONS_POSIX ) ;
1493- if python_major_minor == "3.13" {
1495+ if matches ! ( python_major_minor, "3.13" | "3.14" ) {
14941496 wanted. remove ( "_crypt" ) ;
14951497 }
14961498 wanted. extend ( GLOBAL_EXTENSIONS_MACOS ) ;
@@ -1514,7 +1516,7 @@ fn validate_extension_modules(
15141516 wanted. extend ( GLOBAL_EXTENSIONS_POSIX ) ;
15151517 // TODO: If there are more differences for `GLOBAL_EXTENSIONS_POSIX` in future Python
15161518 // versions, we should move the `_crypt` special-case into a constant
1517- if python_major_minor == "3.13" {
1519+ if matches ! ( python_major_minor, "3.13" | "3.14" ) {
15181520 wanted. remove ( "_crypt" ) ;
15191521 }
15201522 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