|
| 1 | +SRC_FILES := $(wildcard *.c) |
| 2 | + |
| 3 | +# Define architectures and platforms |
| 4 | +ARCHS := x86_64 arm64 |
| 5 | +PLATFORMS := macos linux |
| 6 | + |
| 7 | +# Define output directories |
| 8 | +BUILD_DIR := build |
| 9 | +DIST_DIR := dist |
| 10 | + |
| 11 | +# Platform-specific settings |
| 12 | +MACOS_SDK := $(shell xcrun --sdk macosx --show-sdk-path 2>/dev/null || echo "") |
| 13 | +MACOS_MIN_VERSION := 10.15 |
| 14 | + |
| 15 | +# Compiler flags |
| 16 | +COMMON_FLAGS := -O2 |
| 17 | + |
| 18 | +# Platform and architecture specific flags |
| 19 | +MACOS_X86_64_FLAGS := -target x86_64-apple-macos$(MACOS_MIN_VERSION) -isysroot $(MACOS_SDK) |
| 20 | +MACOS_ARM64_FLAGS := -target arm64-apple-macos$(MACOS_MIN_VERSION) -isysroot $(MACOS_SDK) |
| 21 | +LINUX_X86_64_FLAGS := -target x86_64-unknown-linux-gnu |
| 22 | +LINUX_ARM64_FLAGS := -target aarch64-unknown-linux-gnu |
| 23 | + |
| 24 | +.PHONY: all clean macos linux universal |
| 25 | + |
| 26 | +all: macos linux |
| 27 | + |
| 28 | +# Create necessary directories |
| 29 | +$(BUILD_DIR): |
| 30 | + mkdir -p $(BUILD_DIR)/macos/x86_64 |
| 31 | + mkdir -p $(BUILD_DIR)/macos/arm64 |
| 32 | + mkdir -p $(BUILD_DIR)/linux/x86_64 |
| 33 | + mkdir -p $(BUILD_DIR)/linux/arm64 |
| 34 | + |
| 35 | +$(DIST_DIR): |
| 36 | + mkdir -p $(DIST_DIR)/macos |
| 37 | + mkdir -p $(DIST_DIR)/linux |
| 38 | + |
| 39 | +# macOS x86_64 build |
| 40 | +$(BUILD_DIR)/macos/x86_64/%.o: %.c | $(BUILD_DIR) |
| 41 | + clang $(COMMON_FLAGS) $(MACOS_X86_64_FLAGS) -c -o $@ $< |
| 42 | + |
| 43 | +# macOS arm64 build |
| 44 | +$(BUILD_DIR)/macos/arm64/%.o: %.c | $(BUILD_DIR) |
| 45 | + clang $(COMMON_FLAGS) $(MACOS_ARM64_FLAGS) -c -o $@ $< |
| 46 | + |
| 47 | +# Linux x86_64 build |
| 48 | +$(BUILD_DIR)/linux/x86_64/%.o: %.c | $(BUILD_DIR) |
| 49 | + clang $(COMMON_FLAGS) $(LINUX_X86_64_FLAGS) -c -o $@ $< |
| 50 | + |
| 51 | +# Linux arm64 build |
| 52 | +$(BUILD_DIR)/linux/arm64/%.o: %.c | $(BUILD_DIR) |
| 53 | + clang $(COMMON_FLAGS) $(LINUX_ARM64_FLAGS) -c -o $@ $< |
| 54 | + |
| 55 | +# Define object files for each platform and architecture |
| 56 | +MACOS_X86_64_OBJ_FILES := $(patsubst %.c,$(BUILD_DIR)/macos/x86_64/%.o,$(SRC_FILES)) |
| 57 | +MACOS_ARM64_OBJ_FILES := $(patsubst %.c,$(BUILD_DIR)/macos/arm64/%.o,$(SRC_FILES)) |
| 58 | +LINUX_X86_64_OBJ_FILES := $(patsubst %.c,$(BUILD_DIR)/linux/x86_64/%.o,$(SRC_FILES)) |
| 59 | +LINUX_ARM64_OBJ_FILES := $(patsubst %.c,$(BUILD_DIR)/linux/arm64/%.o,$(SRC_FILES)) |
| 60 | + |
| 61 | +# Create individual architecture libraries |
| 62 | +$(DIST_DIR)/macos/libSimple_x86_64.a: $(MACOS_X86_64_OBJ_FILES) | $(DIST_DIR) |
| 63 | + llvm-ar rc $@ $^ |
| 64 | + |
| 65 | +$(DIST_DIR)/macos/libSimple_arm64.a: $(MACOS_ARM64_OBJ_FILES) | $(DIST_DIR) |
| 66 | + llvm-ar rc $@ $^ |
| 67 | + |
| 68 | +$(DIST_DIR)/linux/libSimple_x86_64.a: $(LINUX_X86_64_OBJ_FILES) | $(DIST_DIR) |
| 69 | + llvm-ar rc $@ $^ |
| 70 | + |
| 71 | +$(DIST_DIR)/linux/libSimple_arm64.a: $(LINUX_ARM64_OBJ_FILES) | $(DIST_DIR) |
| 72 | + llvm-ar rc $@ $^ |
| 73 | + |
| 74 | +# Create universal binary for macOS |
| 75 | +$(DIST_DIR)/macos/libSimple.a: $(DIST_DIR)/macos/libSimple_x86_64.a $(DIST_DIR)/macos/libSimple_arm64.a |
| 76 | + lipo -create -output $@ $^ |
| 77 | + |
| 78 | +# For Linux, we'll provide separate libraries since lipo is macOS-specific |
| 79 | +linux: $(DIST_DIR)/linux/libSimple_x86_64.a $(DIST_DIR)/linux/libSimple_arm64.a |
| 80 | + @echo "Linux libraries built in $(DIST_DIR)/linux/" |
| 81 | + @echo "Note: For Linux, use the architecture-specific libraries as needed." |
| 82 | + |
| 83 | +macos: $(DIST_DIR)/macos/libSimple.a |
| 84 | + @echo "macOS universal library built at $(DIST_DIR)/macos/libSimple.a" |
| 85 | + |
| 86 | +clean: |
| 87 | + rm -rf $(BUILD_DIR) $(DIST_DIR) |
0 commit comments