clavitor/oss/cli/Makefile

121 lines
3.0 KiB
Makefile

# clavitor CLI — Makefile
# Pure C, BearSSL + QuickJS + cJSON, target <1MB stripped
#
# Usage:
# make — build for host
# make clean — remove build artifacts
# make strip — strip the binary
# make size — show binary size
CC ?= cc
CFLAGS := -std=c11 -Wall -Wextra -Os -DNDEBUG
CFLAGS_GNU := -std=gnu11 -Wall -Os -DNDEBUG
LDFLAGS :=
STRIP ?= strip
# Platform detection
UNAME_S := $(shell uname -s 2>/dev/null || echo Windows)
ifeq ($(UNAME_S),Linux)
LDFLAGS += -lm -lpthread
endif
ifeq ($(UNAME_S),Darwin)
LDFLAGS += -lm
endif
ifeq ($(UNAME_S),FreeBSD)
LDFLAGS += -lm -lpthread
endif
# Directories
SRC_DIR := src
BUILD_DIR := build
VENDOR_DIR := vendor
BEARSSL_DIR := $(VENDOR_DIR)/bearssl
QUICKJS_DIR := $(VENDOR_DIR)/quickjs
CJSON_DIR := $(VENDOR_DIR)/cjson
CRYPTO_DIR := ../crypto
# Output binary
BIN := clavitor-cli
# --- Source files ---
# CLI sources
CLI_SRC := $(SRC_DIR)/main.c \
$(SRC_DIR)/http.c \
$(SRC_DIR)/keystore.c \
$(SRC_DIR)/jsbridge.c \
$(SRC_DIR)/util.c
# cJSON (single file)
CJSON_SRC := $(CJSON_DIR)/cJSON.c
# QuickJS core sources (no qjs.c/qjsc.c — those are standalone executables)
QUICKJS_SRC := $(QUICKJS_DIR)/quickjs.c \
$(QUICKJS_DIR)/cutils.c \
$(QUICKJS_DIR)/dtoa.c \
$(QUICKJS_DIR)/libregexp.c \
$(QUICKJS_DIR)/libunicode.c \
$(QUICKJS_DIR)/quickjs-libc.c
# BearSSL — compile all .c files in src/ subdirectories
BEARSSL_SRC := $(shell find $(BEARSSL_DIR)/src -name '*.c')
# All sources
ALL_SRC := $(CLI_SRC) $(CJSON_SRC) $(QUICKJS_SRC) $(BEARSSL_SRC)
# Object files (in build/)
ALL_OBJ := $(patsubst %.c,$(BUILD_DIR)/%.o,$(ALL_SRC))
# Include paths
INCLUDES := -I$(BEARSSL_DIR)/inc \
-I$(QUICKJS_DIR) \
-I$(CJSON_DIR) \
-I$(SRC_DIR)
# QuickJS needs these defines
QJS_DEFS := -DCONFIG_VERSION=\"2025-04-26\" \
-D_GNU_SOURCE \
-DCONFIG_BIGNUM
# --- Rules ---
.PHONY: all clean strip size
all: $(BIN)
$(BIN): $(ALL_OBJ)
$(CC) -o $@ $^ $(LDFLAGS)
@echo "built: $(BIN) ($(shell wc -c < $@ 2>/dev/null || echo '?') bytes)"
# CLI sources (need QuickJS + BearSSL headers)
$(BUILD_DIR)/$(SRC_DIR)/%.o: $(SRC_DIR)/%.c
@mkdir -p $(dir $@)
$(CC) $(CFLAGS) $(INCLUDES) -Wno-unused-parameter -c $< -o $@
# cJSON
$(BUILD_DIR)/$(CJSON_DIR)/%.o: $(CJSON_DIR)/%.c
@mkdir -p $(dir $@)
$(CC) $(CFLAGS) -I$(CJSON_DIR) -c $< -o $@
# QuickJS
$(BUILD_DIR)/$(QUICKJS_DIR)/%.o: $(QUICKJS_DIR)/%.c
@mkdir -p $(dir $@)
$(CC) $(CFLAGS_GNU) $(QJS_DEFS) -I$(QUICKJS_DIR) -Wno-sign-compare -Wno-unused-parameter -Wno-implicit-fallthrough -c $< -o $@
# BearSSL
$(BUILD_DIR)/$(BEARSSL_DIR)/%.o: $(BEARSSL_DIR)/%.c
@mkdir -p $(dir $@)
$(CC) $(CFLAGS) -I$(BEARSSL_DIR)/inc -I$(BEARSSL_DIR)/src -c $< -o $@
clean:
rm -rf $(BUILD_DIR) $(BIN)
strip: $(BIN)
$(STRIP) $(BIN)
@echo "stripped: $(BIN) ($(shell wc -c < $(BIN)) bytes)"
size: $(BIN)
@ls -la $(BIN)
@echo "---"
@size $(BIN) 2>/dev/null || true