33use std:: fs:: { self , File } ;
44use std:: path:: PathBuf ;
55
6- use semver:: Version ;
6+ use semver:: { BuildMetadata , Prerelease , Version } ;
77use svm:: Releases ;
88
99/// The string describing the [svm::Platform] to build for
@@ -41,45 +41,57 @@ fn get_platform() -> svm::Platform {
4141}
4242
4343fn version_const_name ( version : & Version ) -> String {
44- format ! (
45- "SOLC_VERSION_{}_{}_{}" ,
46- version. major, version. minor, version. patch
47- )
44+ if version. pre == Prerelease :: EMPTY {
45+ format ! (
46+ "SOLC_VERSION_{}_{}_{}" ,
47+ version. major, version. minor, version. patch
48+ )
49+ } else {
50+ let sanitized_pre = version
51+ . pre
52+ . as_str ( )
53+ . replace ( |c : char | !c. is_alphanumeric ( ) , "" )
54+ . to_uppercase ( ) ;
55+ format ! (
56+ "SOLC_VERSION_{}_{}_{}_{}" ,
57+ version. major, version. minor, version. patch, sanitized_pre
58+ )
59+ }
4860}
4961
5062/// Adds build info related constants
5163fn add_build_info_constants ( output : & mut String , releases : & Releases , platform : svm:: Platform ) {
5264 let mut version_idents = Vec :: with_capacity ( releases. builds . len ( ) ) ;
5365 let mut checksum_match_arms = Vec :: with_capacity ( releases. builds . len ( ) ) ;
54-
5566 for build in releases. builds . iter ( ) {
56- let version = Version :: new (
57- build. version . major ,
58- build. version . minor ,
59- build. version . patch ,
60- ) ;
67+ let prerelease = build. prerelease . clone ( ) . unwrap_or_default ( ) ;
68+ let version = Version {
69+ major : build. version . major ,
70+ minor : build. version . minor ,
71+ patch : build. version . patch ,
72+ pre : Prerelease :: new ( & prerelease) . unwrap_or_default ( ) ,
73+ build : BuildMetadata :: EMPTY ,
74+ } ;
6175 let version_name = version_const_name ( & version) ;
6276
6377 output. push_str ( & format ! (
6478 "/// Solidity compiler version `{version}`.\n \
6579 pub const {version_name}: semver::Version = semver::Version::new({}, {}, {});\n \n ",
6680 version. major, version. minor, version. patch
6781 ) ) ;
68- version_idents. push ( version_name) ;
6982
7083 let sha256 = hex:: encode ( & build. sha256 ) ;
71- let checksum_name = format ! (
72- "SOLC_VERSION_{}_{}_{}_CHECKSUM" ,
73- build. version. major, build. version. minor, build. version. patch
74- ) ;
84+ let checksum_name = format ! ( "{version_name}_CHECKSUM" ) ;
85+
86+ version_idents. push ( version_name) ;
7587
7688 output. push_str ( & format ! (
7789 "/// Checksum for Solidity compiler version `{version}`.\n \
7890 pub const {checksum_name}: &str = \" {sha256}\" ;\n \n ",
7991 ) ) ;
8092 checksum_match_arms. push ( format ! (
81- "({}, {}, {}) => {}" ,
82- version. major, version. minor, version. patch, checksum_name
93+ "({}, {}, {}, \" {} \" ) => {}" ,
94+ version. major, version. minor, version. patch, version . pre , checksum_name
8395 ) ) ;
8496 }
8597
@@ -100,7 +112,7 @@ pub static ALL_SOLC_VERSIONS : [semver::Version; {}] = [
100112 r#"
101113/// Get the checksum of a solc version's binary if it exists.
102114pub fn get_checksum(version: &semver::Version) -> Option<Vec<u8>> {{
103- let checksum = match (version.major, version.minor, version.patch) {{
115+ let checksum = match (version.major, version.minor, version.patch, version.pre.as_str() ) {{
104116 {},
105117 _ => return None
106118 }};
0 commit comments