rust-libteec 0.1.0

Rust bindings and wrapper library for Trusted Execution Environment Client (libteec).
Documentation
CC := gcc

DEBUG ?= 0

CC_TEEC_TARGET := cc-teec
TARGETS := $(CC_TEEC_TARGET)

TEE_CLIENT_SRC := tee_client.c
CC_TEEC_SRCS := cc-teec.c $(TEE_CLIENT_SRC)

ALL_SRCS := $(CC_TEEC_SRCS)

INC_DIR := include

BASE_CFLAGS := \
	-I$(INC_DIR) \
	-D_GNU_SOURCE \
	-DBINARY_PREFIX=\"TEEC\" \
	-std=gnu11

# 安全编译选项
SECURITY_CFLAGS := \
	-Wall \
	-Werror \
	-Wextra \
	-Wformat-security \
	-Wstrict-prototypes \
	-Wshadow \
	-Wunused \
	-Wcast-align \
	-Wpointer-arith
	#-Wmissing-prototypes
	#-Wmissing-declarations

# 安全链接选项
SECURITY_LDFLAGS := \
	-Wl,--as-needed \
	-Wl,-z,relro \
	-Wl,-z,now \
	-Wl,-z,noexecstack \
	-Wl,--no-undefined \
	-Wl,--fatal-warnings

# 位置无关代码
PIE_CFLAGS := -fPIE -fpie
PIE_LDFLAGS := -pie

# 栈保护
STACK_PROTECTOR := -fstack-protector-strong

# 优化选项
ifeq ($(BUILD_MODE), release)
	OPTIMIZE_CFLAGS := -O2
	OPTIMIZE_LDFLAGS := -s
else
	OPTIMIZE_CFLAGS := -O0 -ggdb3
	OPTIMIZE_LDFLAGS := -g
endif

# 调试选项
ifeq ($(DEBUG), 1)
	DEBUG_CFLAGS := -g3
	DEBUG_LDFLAGS := -g
else
	DEBUG_CFLAGS :=
	DEBUG_LDFLAGS :=
endif

CFLAGS := \
	$(BASE_CFLAGS) \
	$(SECURITY_CFLAGS) \
	$(PIE_CFLAGS) \
	$(STACK_PROTECTOR) \
	$(OPTIMIZE_CFLAGS) \
	$(DEBUG_CFLAGS)

LDFLAGS := \
	$(PIE_LDFLAGS) \
	$(SECURITY_LDFLAGS) \
	$(OPTIMIZE_LDFLAGS) \
	$(DEBUG_LDFLAGS)

LIBS := -l$(RUST_LIB_NAME)

.PHONY: all
all:
	@if [ ! -d "$(RUST_TARGET_BUILD_DIR)" ]; then \
		echo "Error: Build directory $(RUST_TARGET_BUILD_DIR) does not exist"; \
		echo "Please build the Rust library first: cd .. && cargo build --release"; \
		exit 1; \
	fi
	@RUST_LIB_PATH=$$(find $(RUST_TARGET_BUILD_DIR) -name "$(RUST_LIB_FILE)" 2>/dev/null | sort -r | head -1); \
	if [ -z "$$RUST_LIB_PATH" ]; then \
		echo "Error: Rust library $(RUST_LIB_FILE) not found in $(RUST_TARGET_BUILD_DIR)"; \
		echo "Available files:"; \
		ls -la $(RUST_TARGET_BUILD_DIR)/ 2>/dev/null || echo "  (directory empty or not accessible)"; \
		exit 1; \
	fi; \
	RUST_LIB_DIR=$$(dirname $$RUST_LIB_PATH); \
	echo "Using Rust library: $$RUST_LIB_PATH"; \
	$(CC) $(CFLAGS) $(LDFLAGS) -o $(CC_TEEC_TARGET) $(CC_TEEC_SRCS) -L$$RUST_LIB_DIR $(LIBS)
	@RUST_LIB_PATH=$$(find $(RUST_TARGET_BUILD_DIR) -name "$(RUST_LIB_FILE)" 2>/dev/null | sort -r | head -1); \

.PHONY: clean
clean:
	rm -rf $(TARGETS)