.PHONY: build test lint fmt sbom clean all bump-version \
ffi ffi-header ffi-all ffi-macos-arm64 ffi-macos-amd64 ffi-linux-amd64 ffi-linux-arm64 \
cli cli-target cli-macos-arm64 cli-macos-amd64 cli-linux-amd64 cli-linux-arm64 cli-all \
dist dist-all \
pkg-deb pkg-rpm
all: build sbom
build:
cargo build
test:
cargo test
lint:
cargo clippy
fmt:
cargo fmt
sbom:
@echo "Generating SPDX SBOM..."
@mkdir -p target/sbom
cargo sbom --output-format spdx_json_2_3 > target/sbom/sqlglot-rust.spdx.json
@echo "SBOM written to target/sbom/sqlglot-rust.spdx.json"
clean:
cargo clean
FFI_OUT = target/ffi
HEADER = $(FFI_OUT)/include/sqlglot.h
ffi-header: $(HEADER)
$(HEADER):
@mkdir -p $(FFI_OUT)/include
cbindgen --config cbindgen.toml --crate sqlglot-rust --output $(HEADER)
@echo "Header written to $(HEADER)"
ffi-target: ffi-header
ifndef TARGET
$(error TARGET is required. E.g. make ffi-target TARGET=aarch64-apple-darwin)
endif
cargo build --release --target $(TARGET)
@mkdir -p $(FFI_OUT)/$(TARGET)/lib
@cp -f target/$(TARGET)/release/libsqlglot_rust.a $(FFI_OUT)/$(TARGET)/lib/ 2>/dev/null || true
@cp -f target/$(TARGET)/release/libsqlglot_rust.so $(FFI_OUT)/$(TARGET)/lib/ 2>/dev/null || true
@cp -f target/$(TARGET)/release/libsqlglot_rust.dylib $(FFI_OUT)/$(TARGET)/lib/ 2>/dev/null || true
@echo "Built FFI libraries for $(TARGET) → $(FFI_OUT)/$(TARGET)/lib/"
ffi-macos-arm64:
$(MAKE) ffi-target TARGET=aarch64-apple-darwin
ffi-macos-amd64:
$(MAKE) ffi-target TARGET=x86_64-apple-darwin
ffi-linux-amd64:
$(MAKE) ffi-target TARGET=x86_64-unknown-linux-gnu
ffi-linux-arm64:
$(MAKE) ffi-target TARGET=aarch64-unknown-linux-gnu
ffi: ffi-header
cargo build --release
@mkdir -p $(FFI_OUT)/lib
@cp -f target/release/libsqlglot_rust.a $(FFI_OUT)/lib/ 2>/dev/null || true
@cp -f target/release/libsqlglot_rust.so $(FFI_OUT)/lib/ 2>/dev/null || true
@cp -f target/release/libsqlglot_rust.dylib $(FFI_OUT)/lib/ 2>/dev/null || true
@echo "Built FFI libraries for host → $(FFI_OUT)/lib/"
ffi-all: ffi-macos-arm64 ffi-macos-amd64 ffi-linux-amd64 ffi-linux-arm64
@echo "All FFI targets built → $(FFI_OUT)/"
CLI_OUT = target/cli
cli-target:
ifndef TARGET
$(error TARGET is required. E.g. make cli-target TARGET=aarch64-apple-darwin)
endif
cargo build --release --features cli --target $(TARGET)
@mkdir -p $(CLI_OUT)/$(TARGET)/bin
@cp -f target/$(TARGET)/release/sqlglot $(CLI_OUT)/$(TARGET)/bin/ 2>/dev/null || true
@echo "Built CLI for $(TARGET) → $(CLI_OUT)/$(TARGET)/bin/sqlglot"
cli-macos-arm64:
$(MAKE) cli-target TARGET=aarch64-apple-darwin
cli-macos-amd64:
$(MAKE) cli-target TARGET=x86_64-apple-darwin
cli-linux-amd64:
$(MAKE) cli-target TARGET=x86_64-unknown-linux-gnu
cli-linux-arm64:
$(MAKE) cli-target TARGET=aarch64-unknown-linux-gnu
cli:
cargo build --release --features cli
@mkdir -p $(CLI_OUT)/bin
@cp -f target/release/sqlglot $(CLI_OUT)/bin/ 2>/dev/null || true
@echo "Built CLI for host → $(CLI_OUT)/bin/sqlglot"
cli-all: cli-macos-arm64 cli-macos-amd64 cli-linux-amd64 cli-linux-arm64
@echo "All CLI targets built → $(CLI_OUT)/"
dist: ffi cli
@echo "Distribution built for host → target/ffi/ + target/cli/"
dist-all: ffi-all cli-all
@echo "Full distribution built for all targets"
pkg-deb: ffi cli
cargo deb --no-build --no-strip
@echo "Debian package built → target/debian/"
pkg-rpm: ffi cli
cargo generate-rpm
@echo "RPM package built → target/generate-rpm/"
bump-version:
ifndef VERSION
$(error VERSION is required. Usage: make bump-version VERSION=1.2.3)
endif
@echo "$(VERSION)" | grep -qE '^[0-9]+\.[0-9]+\.[0-9]+$$' || \
{ echo "Error: VERSION must be a full semantic version (MAJOR.MINOR.PATCH), e.g. 1.2.3"; exit 1; }
@echo "Bumping version to $(VERSION)..."
@ sed -i '' 's/^version = ".*"/version = "$(VERSION)"/' Cargo.toml
@ sed -i '' 's/sqlglot-rust = "[^"]*"/sqlglot-rust = "$(VERSION)"/' README.md
sed -i '' 's/sqlglot-rust = "[^"]*"/sqlglot-rust = "$(VERSION)"/' docs/installation.md
@ cargo generate-lockfile
@echo "Version updated to $(VERSION)"