@@ -397,17 +397,40 @@ fn cbindgen_rust2c(crate_dir: &Path) {
397397}
398398
399399fn main ( ) {
400- println ! ( "cargo:rerun-if-env- changed=DUCKDB_VERSION " ) ;
400+ println ! ( "cargo:rerun-if-changed=cpp/include " ) ;
401401 println ! ( "cargo:rerun-if-env-changed=VX_DUCKDB_DEBUG" ) ;
402402 println ! ( "cargo:rerun-if-env-changed=VX_DUCKDB_SAN" ) ;
403403 println ! ( "cargo:rerun-if-env-changed=CARGO_HTTP_TIMEOUT" ) ;
404404 println ! ( "cargo:rerun-if-env-changed=HTTP_TIMEOUT" ) ;
405405 println ! ( "cargo:rerun-if-env-changed=TARGET" ) ;
406406
407- // `DUCKDB_VERSION` is set by the extension build in CI.
408- // This is to ensure we don't implicitly build against a different DuckDB
409- // version during an extension build which might lead to subtle ABI breaks,
410- // e.g. reordering fields in C++ structs.
407+ // These two variables are set in duckdb-vortex's CI. Don't download
408+ // duckdb if they are present
409+ println ! ( "cargo:rerun-if-env-changed=DUCKDB_SOURCE_DIR" ) ;
410+ println ! ( "cargo:rerun-if-env-changed=DUCKDB_VERSION" ) ;
411+
412+ // sanity check that either none or both are provided
413+ assert_eq ! (
414+ env:: var( "DUCKDB_VERSION" ) . is_ok( ) ,
415+ env:: var( "DUCKDB_SOURCE_DIR" ) . is_ok( )
416+ ) ;
417+ // If variables are not set, we are either running locally or
418+ // in vortex's CI.
419+
420+ let crate_dir = PathBuf :: from ( env:: var ( "CARGO_MANIFEST_DIR" ) . unwrap ( ) ) ;
421+ if let Some ( source_dir) = env:: var_os ( "DUCKDB_SOURCE_DIR" ) {
422+ let source_dir = PathBuf :: from ( source_dir) ;
423+ let duckdb_include_dir = source_dir. join ( "src" ) . join ( "include" ) ;
424+ println ! (
425+ "cargo:info=Using DuckDB source from DUCKDB_SOURCE_DIR={}" ,
426+ source_dir. display( )
427+ ) ;
428+ bindgen_c2rust ( & crate_dir, & duckdb_include_dir) ;
429+ cbindgen_rust2c ( & crate_dir) ;
430+ compile_cpp ( & duckdb_include_dir) ;
431+ return ;
432+ }
433+
411434 let version = env:: var ( "DUCKDB_VERSION" )
412435 // You can also change this version to a commit hash
413436 . unwrap_or_else ( |_| DEFAULT_DUCKDB_VERSION . to_owned ( ) ) ;
@@ -417,7 +440,6 @@ fn main() {
417440 DuckDBVersion :: Commit ( c) => println ! ( "cargo:info=Using DuckDB commit: {c}" ) ,
418441 }
419442
420- let crate_dir = PathBuf :: from ( env:: var ( "CARGO_MANIFEST_DIR" ) . unwrap ( ) ) ;
421443 let duckdb_dir = crate_dir. join ( "duckdb" ) ;
422444 let out_dir = PathBuf :: from ( env:: var ( "OUT_DIR" ) . unwrap ( ) ) ;
423445 let library_dir = out_dir. join ( format ! ( "duckdb-lib-{version}" ) ) ;
@@ -486,7 +508,6 @@ fn main() {
486508 } ;
487509
488510 let duckdb_include_dir = inner_dir. join ( "src" ) . join ( "include" ) ;
489- println ! ( "cargo:rerun-if-changed=cpp/include" ) ;
490511 bindgen_c2rust ( & crate_dir, & duckdb_include_dir) ;
491512 cbindgen_rust2c ( & crate_dir) ;
492513 compile_cpp ( & duckdb_include_dir) ;
0 commit comments