@@ -5,7 +5,6 @@ use std::path::PathBuf;
55
66fn main ( ) {
77 println ! ( "cargo:rerun-if-changed=versions.env" ) ;
8- println ! ( "cargo:rerun-if-env-changed=BUNDLE_POSTGRESQL" ) ;
98
109 // Load versions from versions.env
1110 let versions_env = fs:: read_to_string ( "versions.env" ) . expect ( "Failed to read versions.env" ) ;
@@ -35,27 +34,11 @@ fn main() {
3534 println ! ( "cargo:rustc-env=PGVECTOR_COMPILED_TAG={}" , pgvector_tag) ;
3635 println ! ( "cargo:rustc-env=PGVECTOR_COMPILED_REPO={}" , pgvector_repo) ;
3736
38- // Check if we should bundle PostgreSQL
39- let bundle = env:: var ( "BUNDLE_POSTGRESQL" )
40- . map ( |v| v == "1" || v == "true" )
41- . unwrap_or ( false ) ;
42-
4337 let out_dir = PathBuf :: from ( env:: var ( "OUT_DIR" ) . unwrap ( ) ) ;
4438
45- if bundle {
46- bundle_postgresql ( & pg_version, & out_dir) ;
47- } else {
48- // Create an empty marker file so include_bytes! doesn't fail
49- let marker = out_dir. join ( "postgresql_bundle.tar.gz" ) ;
50- if !marker. exists ( ) {
51- fs:: write ( & marker, b"" ) . expect ( "Failed to create empty bundle marker" ) ;
52- }
53- println ! (
54- "cargo:rustc-env=POSTGRESQL_BUNDLE_PATH={}" ,
55- marker. display( )
56- ) ;
57- println ! ( "cargo:rustc-env=POSTGRESQL_BUNDLED=false" ) ;
58- }
39+ // Bundle PostgreSQL and pgvector
40+ bundle_postgresql ( & pg_version, & out_dir) ;
41+ bundle_pgvector ( & pg_version, & pgvector_tag, & pgvector_repo, & out_dir) ;
5942}
6043
6144fn bundle_postgresql ( pg_version : & str , out_dir : & PathBuf ) {
@@ -115,7 +98,71 @@ fn bundle_postgresql(pg_version: &str, out_dir: &PathBuf) {
11598 "cargo:rustc-env=POSTGRESQL_BUNDLE_PATH={}" ,
11699 bundle_path. display( )
117100 ) ;
118- println ! ( "cargo:rustc-env=POSTGRESQL_BUNDLED=true" ) ;
101+ }
102+
103+ fn bundle_pgvector ( pg_version : & str , pgvector_tag : & str , pgvector_repo : & str , out_dir : & PathBuf ) {
104+ let target = env:: var ( "TARGET" ) . unwrap ( ) ;
105+
106+ // Map Rust target to pgvector platform name
107+ let pgvector_platform = match target. as_str ( ) {
108+ "aarch64-apple-darwin" => "aarch64-apple-darwin" ,
109+ "x86_64-apple-darwin" => "x86_64-apple-darwin" ,
110+ "x86_64-unknown-linux-gnu" => "x86_64-unknown-linux-gnu" ,
111+ "x86_64-unknown-linux-musl" => "x86_64-unknown-linux-gnu" , // musl uses gnu pgvector
112+ "aarch64-unknown-linux-gnu" => "aarch64-unknown-linux-gnu" ,
113+ "aarch64-unknown-linux-musl" => "aarch64-unknown-linux-gnu" , // musl uses gnu pgvector
114+ "x86_64-pc-windows-msvc" => {
115+ eprintln ! ( "Warning: pgvector not available for Windows, skipping bundle" ) ;
116+ let marker = out_dir. join ( "pgvector_bundle.tar.gz" ) ;
117+ fs:: write ( & marker, b"" ) . expect ( "Failed to create empty pgvector marker" ) ;
118+ println ! (
119+ "cargo:rustc-env=PGVECTOR_BUNDLE_PATH={}" ,
120+ marker. display( )
121+ ) ;
122+ return ;
123+ }
124+ _ => {
125+ eprintln ! (
126+ "Warning: Unknown target {}, pgvector will not be bundled" ,
127+ target
128+ ) ;
129+ let marker = out_dir. join ( "pgvector_bundle.tar.gz" ) ;
130+ fs:: write ( & marker, b"" ) . expect ( "Failed to create empty pgvector marker" ) ;
131+ println ! (
132+ "cargo:rustc-env=PGVECTOR_BUNDLE_PATH={}" ,
133+ marker. display( )
134+ ) ;
135+ return ;
136+ }
137+ } ;
138+
139+ // Get PG major version (e.g., "18" from "18.1.0")
140+ let pg_major = pg_version. split ( '.' ) . next ( ) . unwrap_or ( "18" ) ;
141+
142+ let filename = format ! ( "pgvector-{}-pg{}.tar.gz" , pgvector_platform, pg_major) ;
143+ let url = format ! (
144+ "https://github.com/{}/releases/download/{}/{}" ,
145+ pgvector_repo, pgvector_tag, filename
146+ ) ;
147+
148+ let bundle_path = out_dir. join ( & filename) ;
149+
150+ // Download if not already cached
151+ if !bundle_path. exists ( ) {
152+ eprintln ! (
153+ "Downloading pgvector for {} (PG {})..." ,
154+ pgvector_platform, pg_major
155+ ) ;
156+ download_file ( & url, & bundle_path) . expect ( "Failed to download pgvector bundle" ) ;
157+ eprintln ! ( "Downloaded to {}" , bundle_path. display( ) ) ;
158+ } else {
159+ eprintln ! ( "Using cached pgvector bundle: {}" , bundle_path. display( ) ) ;
160+ }
161+
162+ println ! (
163+ "cargo:rustc-env=PGVECTOR_BUNDLE_PATH={}" ,
164+ bundle_path. display( )
165+ ) ;
119166}
120167
121168fn download_file ( url : & str , dest : & PathBuf ) -> io:: Result < ( ) > {
0 commit comments