BUILD := build
C_SRC := c/bstack.c
C_INC := c
C_FLAGS := -std=c11 -O2
CC ?= clang
ifneq ($(findstring zig,$(CC)),)
_CC_FAMILY := zig
else ifneq ($(findstring clang,$(CC)),)
_CC_FAMILY := clang
else ifneq ($(findstring gcc,$(CC)),)
_CC_FAMILY := gcc
else
_CC_FAMILY := clang
endif
ifeq ($(_CC_FAMILY),zig)
AR = zig ar
else ifeq ($(_CC_FAMILY),gcc)
AR = ar
else
AR = llvm-ar
endif
CLANG_x86_64_apple_darwin := x86_64-apple-darwin
CLANG_aarch64_apple_darwin := aarch64-apple-darwin
CLANG_x86_64_unknown_linux_gnu := x86_64-linux-gnu
CLANG_aarch64_unknown_linux_gnu := aarch64-linux-gnu
CLANG_x86_64_unknown_linux_musl := x86_64-linux-musl
CLANG_aarch64_unknown_linux_musl := aarch64-linux-musl
clang_triple = $(CLANG_$(subst -,_,$(1)))
ZIG_x86_64_apple_darwin := x86_64-macos-none
ZIG_aarch64_apple_darwin := aarch64-macos-none
ZIG_x86_64_unknown_linux_gnu := x86_64-linux-gnu
ZIG_aarch64_unknown_linux_gnu := aarch64-linux-gnu
ZIG_x86_64_unknown_linux_musl := x86_64-linux-musl
ZIG_aarch64_unknown_linux_musl := aarch64-linux-musl
zig_triple = $(ZIG_$(subst -,_,$(1)))
GCCPFX_x86_64_apple_darwin :=
GCCPFX_aarch64_apple_darwin :=
GCCPFX_x86_64_unknown_linux_gnu := x86_64-linux-gnu
GCCPFX_aarch64_unknown_linux_gnu := aarch64-linux-gnu
GCCPFX_x86_64_unknown_linux_musl := x86_64-linux-musl
GCCPFX_aarch64_unknown_linux_musl := aarch64-linux-musl
gcc_prefix = $(GCCPFX_$(subst -,_,$(1)))
cc_for = $(if $(filter zig,$(_CC_FAMILY)),\
$(CC) -target $(call zig_triple,$(1)),\
$(if $(filter gcc,$(_CC_FAMILY)),\
$(if $(call gcc_prefix,$(1)),$(call gcc_prefix,$(1))-gcc,gcc),\
$(CC) --target=$(call clang_triple,$(1))))
ar_for = $(if $(filter gcc,$(_CC_FAMILY)),\
$(if $(call gcc_prefix,$(1)),$(call gcc_prefix,$(1))-ar,$(AR)),\
$(AR))
RUST_TARGETS := \
x86_64-apple-darwin \
aarch64-apple-darwin \
x86_64-unknown-linux-gnu \
aarch64-unknown-linux-gnu \
x86_64-unknown-linux-musl \
aarch64-unknown-linux-musl
RUST_PHONY := $(addprefix rust-,$(RUST_TARGETS))
C_PHONY := $(addprefix c-,$(RUST_TARGETS))
.PHONY: all release rust c test clean $(RUST_PHONY) $(C_PHONY)
all: release
release: rust c
rust: $(RUST_PHONY)
c: $(C_PHONY)
define rust_rule
rust-$(1):
@echo "==> rust $(1)"
@mkdir -p $(BUILD)/rust/$(1)
cargo zigbuild --target $(1) --release
cp target/$(1)/release/libbstack.rlib $(BUILD)/rust/$(1)/libbstack.rlib
cargo zigbuild --target $(1) --release --features set
cp target/$(1)/release/libbstack.rlib $(BUILD)/rust/$(1)/libbstack-set.rlib
endef
$(foreach t,$(RUST_TARGETS),$(eval $(call rust_rule,$(t))))
define c_rule
c-$(1):
@echo "==> c $(1) [$(_CC_FAMILY): $(call cc_for,$(1))]"
@mkdir -p $(BUILD)/c/$(1)
cp $(C_INC)/bstack.h $(BUILD)/c/$(1)/bstack.h
$(call cc_for,$(1)) $(C_FLAGS) \
-I $(C_INC) -c -o $(BUILD)/c/$(1)/bstack.o $(C_SRC)
$(call ar_for,$(1)) rcs $(BUILD)/c/$(1)/libbstack.a $(BUILD)/c/$(1)/bstack.o
$(call cc_for,$(1)) $(C_FLAGS) -DBSTACK_FEATURE_SET \
-I $(C_INC) -c -o $(BUILD)/c/$(1)/bstack-set.o $(C_SRC)
$(call ar_for,$(1)) rcs $(BUILD)/c/$(1)/libbstack-set.a $(BUILD)/c/$(1)/bstack-set.o
endef
$(foreach t,$(RUST_TARGETS),$(eval $(call c_rule,$(t))))
test:
cargo test
$(MAKE) -C c clean
$(MAKE) -C c test
$(MAKE) -C c clean
$(MAKE) -C c test DEFINES=-DBSTACK_FEATURE_SET
$(MAKE) -C c clean
clean:
rm -rf $(BUILD) target
$(MAKE) -C c clean