sqlite_vdbe 0.0.3

Low-level access to SQLite's VDBE bytecode engine
Documentation
use std::env;
use std::fs;
use std::path::PathBuf;

fn main() {
    let manifest_dir = PathBuf::from(env::var("CARGO_MANIFEST_DIR").unwrap());
    let out_dir = PathBuf::from(env::var("OUT_DIR").unwrap());

    // Bundled SQLite amalgamation
    let sqlite_dir = manifest_dir.join("c").join("sqlite");
    let sqlite_c = sqlite_dir.join("sqlite3.c");
    let sqlite_h = sqlite_dir.join("sqlite3.h");

    // vdbe_rust.c helpers
    let vdbe_rust_c = manifest_dir.join("c").join("vdbe_rust.c");

    // Track source files for rebuild
    println!("cargo:rerun-if-changed={}", sqlite_c.display());
    println!("cargo:rerun-if-changed={}", sqlite_h.display());
    println!("cargo:rerun-if-changed={}", vdbe_rust_c.display());

    #[cfg(feature = "bundled")]
    {
        // Create combined source: amalgamation + vdbe_rust.c
        let combined_source = out_dir.join("sqlite3_combined.c");
        let sqlite_content = fs::read_to_string(&sqlite_c).expect("Failed to read sqlite3.c");
        let vdbe_rust_content =
            fs::read_to_string(&vdbe_rust_c).expect("Failed to read vdbe_rust.c");

        let combined = format!(
            "// Combined SQLite amalgamation with VDBE Rust helpers\n\
            // Auto-generated by build.rs\n\n\
            {}\n\n\
            // ---- vdbe_rust.c ----\n\
            #define VDBE_RUST_AMALGAMATION 1\n\
            {}\n",
            sqlite_content, vdbe_rust_content
        );
        fs::write(&combined_source, combined).expect("Failed to write combined source");

        let mut build = cc::Build::new();

        build
            .file(&combined_source)
            .include(&sqlite_dir)
            // Make internal functions externally visible
            .define("SQLITE_PRIVATE", Some(""))
            // Standard SQLite options
            .define("SQLITE_ENABLE_COLUMN_METADATA", None)
            .define("SQLITE_ENABLE_FTS5", None)
            .define("SQLITE_ENABLE_RTREE", None)
            .define("SQLITE_ENABLE_JSON1", None)
            .define("SQLITE_THREADSAFE", Some("0"))
            .define("SQLITE_OMIT_DEPRECATED", None)
            .define("SQLITE_DQS", Some("0"))
            .warnings(false);

        if cfg!(target_os = "linux") {
            build.define("_GNU_SOURCE", None);
        }

        build.compile("sqlite3");
    }
}