|
| 1 | +# ============================================================================= |
| 2 | +# Kcode v31.0.0 — Makefile (공개용 / Public Build) |
| 3 | +# |
| 4 | +# 빌드 타겟: |
| 5 | +# make — 전체 빌드 (gen + kvm + llvm-check) |
| 6 | +# make gen — C 코드 생성기 빌드 (kcode_gen) |
| 7 | +# make kvm — 바이트코드 VM 빌드 (kbc) |
| 8 | +# make test — 렉서 단위 테스트 |
| 9 | +# make all — gen + kvm + test |
| 10 | +# make llvm-check — LLVM 설치 여부 확인 |
| 11 | +# make LLVM=1 — LLVM 백엔드 포함 빌드 (kcode_llvm) |
| 12 | +# make clean — 빌드 결과물 삭제 |
| 13 | +# |
| 14 | +# 참고: 인터프리터(kinterp)는 온톨로지 엔진 연동이 필요하여 |
| 15 | +# 전체 엔진 빌드에서 제외됩니다. |
| 16 | +# 바이트코드 VM(kbc)으로 .han 파일을 실행하세요. |
| 17 | +# |
| 18 | +# MIT License / zerojat7-ui |
| 19 | +# ============================================================================= |
| 20 | + |
| 21 | +CC = gcc |
| 22 | +CFLAGS = -Wall -std=c11 -g -Wno-format-truncation |
| 23 | +LDFLAGS = -lm |
| 24 | + |
| 25 | +# ============================================================================= |
| 26 | +# 레이어 0 — 코어 (렉서 + 파서) |
| 27 | +# ============================================================================= |
| 28 | +LAYER0_SRC = klexer.c kparser.c |
| 29 | + |
| 30 | +# ============================================================================= |
| 31 | +# 레이어 1 — 기본 런타임 (GC + 텐서 + 자동미분 + MCP) |
| 32 | +# ============================================================================= |
| 33 | +LAYER1_SRC = kgc.c kc_tensor.c kc_autograd.c kc_mcp.c |
| 34 | + |
| 35 | +# ============================================================================= |
| 36 | +# C 코드 생성기 타겟 |
| 37 | +# ============================================================================= |
| 38 | +GEN_SRC = $(LAYER0_SRC) \ |
| 39 | + kcodegen.c kcodegen_core.c kcodegen_expr.c \ |
| 40 | + kcodegen_stmt.c kcodegen_func.c kcodegen_main.c |
| 41 | +GEN_BIN = kcode_gen |
| 42 | + |
| 43 | +# ============================================================================= |
| 44 | +# KVM 바이트코드 VM 타겟 |
| 45 | +# ============================================================================= |
| 46 | +KVM_SRC = $(LAYER0_SRC) kc_bytecode.c kc_bcgen.c kgc.c kc_vm.c kbc_main.c |
| 47 | +KVM_BIN = kbc |
| 48 | + |
| 49 | +# ============================================================================= |
| 50 | +# 렉서 단위 테스트 |
| 51 | +# ============================================================================= |
| 52 | +TEST_SRC = klexer.c ktest_lexer.c |
| 53 | +TEST_BIN = ktest_lexer |
| 54 | + |
| 55 | +# ============================================================================= |
| 56 | +# LLVM 옵션 (make LLVM=1) |
| 57 | +# ============================================================================= |
| 58 | +LLVM ?= 0 |
| 59 | + |
| 60 | +ifeq ($(LLVM), 1) |
| 61 | + LLVM_CONFIG := $(shell command -v llvm-config 2>/dev/null) |
| 62 | + ifeq ($(LLVM_CONFIG),) |
| 63 | + $(warning [경고] llvm-config 를 찾을 수 없습니다. LLVM 없이 빌드합니다.) |
| 64 | + LLVM := 0 |
| 65 | + else |
| 66 | + LLVM_CFLAGS := $(shell llvm-config --cflags) |
| 67 | + LLVM_LDFLAGS := $(shell llvm-config --ldflags --libs core analysis native bitwriter) |
| 68 | + CFLAGS += $(LLVM_CFLAGS) -DKCODE_LLVM=1 |
| 69 | + LDFLAGS += $(LLVM_LDFLAGS) |
| 70 | + $(info [정보] LLVM 연동 활성화: $(shell llvm-config --version)) |
| 71 | + endif |
| 72 | +endif |
| 73 | + |
| 74 | +LLVM_GEN_SRC = $(LAYER0_SRC) \ |
| 75 | + kcodegen.c kcodegen_core.c kcodegen_expr.c \ |
| 76 | + kcodegen_stmt.c kcodegen_func.c \ |
| 77 | + kcodegen_llvm.c kcodegen_llvm_expr.c \ |
| 78 | + kcodegen_llvm_stmt.c kcodegen_llvm_builtin.c \ |
| 79 | + kcodegen_llvm_util.c kcodegen_llvm_main.c |
| 80 | +LLVM_BIN = kcode_llvm |
| 81 | + |
| 82 | +# ============================================================================= |
| 83 | +# 기본 타겟 |
| 84 | +# ============================================================================= |
| 85 | +.PHONY: all gen kvm test llvm-check clean help |
| 86 | + |
| 87 | +all: gen kvm test |
| 88 | + @echo "" |
| 89 | + @echo "=========================================" |
| 90 | + @echo " Kcode v31.0.0 빌드 완료" |
| 91 | + @echo " C 생성기 : ./$(GEN_BIN)" |
| 92 | + @echo " 바이트코드VM: ./$(KVM_BIN)" |
| 93 | + @echo "=========================================" |
| 94 | + @echo " .han 파일 실행:" |
| 95 | + @echo " ./kbc exec 소스.han" |
| 96 | + @echo "=========================================" |
| 97 | + |
| 98 | +# --- C 코드 생성기 ------------------------------------------------------------ |
| 99 | +gen: $(GEN_BIN) |
| 100 | + |
| 101 | +$(GEN_BIN): $(GEN_SRC) klexer.h kparser.h kcodegen.h |
| 102 | + $(CC) $(CFLAGS) -o $@ $(GEN_SRC) $(LDFLAGS) |
| 103 | + @echo "[빌드 완료] C 코드 생성기 → $@" |
| 104 | + |
| 105 | +# --- KVM 바이트코드 VM -------------------------------------------------------- |
| 106 | +kvm: $(KVM_BIN) |
| 107 | + |
| 108 | +$(KVM_BIN): $(KVM_SRC) klexer.h kparser.h kc_bytecode.h kc_bcgen.h kc_vm.h |
| 109 | + $(CC) $(CFLAGS) -o $@ $(KVM_SRC) $(LDFLAGS) |
| 110 | + @echo "[빌드 완료] 바이트코드 VM → $@" |
| 111 | + |
| 112 | +# --- LLVM 생성기 (make LLVM=1) ------------------------------------------------ |
| 113 | +ifeq ($(LLVM), 1) |
| 114 | +llvm: $(LLVM_BIN) |
| 115 | + |
| 116 | +$(LLVM_BIN): $(LLVM_GEN_SRC) klexer.h kparser.h kcodegen.h kcodegen_llvm.h |
| 117 | + $(CC) $(CFLAGS) -o $@ $(LLVM_GEN_SRC) $(LDFLAGS) |
| 118 | + @echo "[빌드 완료] LLVM 생성기 → $@" |
| 119 | +endif |
| 120 | + |
| 121 | +# --- 렉서 단위 테스트 --------------------------------------------------------- |
| 122 | +test: $(TEST_BIN) |
| 123 | + @echo "" |
| 124 | + @echo "=== Kcode 렉서 단위 테스트 ===" |
| 125 | + -./$(TEST_BIN) |
| 126 | + |
| 127 | +$(TEST_BIN): $(TEST_SRC) klexer.h |
| 128 | + @sed 's|#include "../src/klexer.h"|#include "klexer.h"|g' ktest_lexer.c > _ktest_patched.c |
| 129 | + $(CC) $(CFLAGS) -o $@ klexer.c _ktest_patched.c $(LDFLAGS) |
| 130 | + @rm -f _ktest_patched.c |
| 131 | + @echo "[빌드 완료] 렉서 테스트 → $@" |
| 132 | + |
| 133 | +# ============================================================================= |
| 134 | +# LLVM 설치 확인 |
| 135 | +# ============================================================================= |
| 136 | +llvm-check: |
| 137 | + @echo "--- LLVM 환경 확인 ---" |
| 138 | + @if command -v llvm-config >/dev/null 2>&1; then \ |
| 139 | + echo "[OK] llvm-config: $$(llvm-config --version)"; \ |
| 140 | + echo " → make LLVM=1 으로 빌드"; \ |
| 141 | + else \ |
| 142 | + echo "[없음] llvm-config 를 찾을 수 없습니다."; \ |
| 143 | + echo " Ubuntu/Debian : sudo apt install llvm-dev"; \ |
| 144 | + echo " macOS (brew) : brew install llvm"; \ |
| 145 | + fi |
| 146 | + |
| 147 | +# ============================================================================= |
| 148 | +# 정리 |
| 149 | +# ============================================================================= |
| 150 | +clean: |
| 151 | + rm -f $(GEN_BIN) $(KVM_BIN) $(LLVM_BIN) $(TEST_BIN) \ |
| 152 | + *.kbc _ktest_patched.c |
| 153 | + @echo "[정리 완료]" |
| 154 | + |
| 155 | +# ============================================================================= |
| 156 | +# 도움말 |
| 157 | +# ============================================================================= |
| 158 | +help: |
| 159 | + @echo "Kcode v31.0.0 빌드 도움말" |
| 160 | + @echo "" |
| 161 | + @echo " make 전체 빌드 (gen + kvm + test)" |
| 162 | + @echo " make gen C 코드 생성기 (kcode_gen)" |
| 163 | + @echo " make kvm 바이트코드 VM (kbc)" |
| 164 | + @echo " make test 렉서 단위 테스트" |
| 165 | + @echo " make LLVM=1 LLVM 백엔드 포함 빌드" |
| 166 | + @echo " make llvm-check LLVM 설치 확인" |
| 167 | + @echo " make clean 빌드 결과물 삭제" |
| 168 | + @echo "" |
| 169 | + @echo " .han 파일 실행:" |
| 170 | + @echo " ./kbc exec 소스.han 컴파일 + 즉시 실행" |
| 171 | + @echo " ./kbc compile 소스.han → 소스.kbc 생성" |
| 172 | + @echo " ./kbc run 소스.kbc 바이트코드 실행" |
| 173 | + @echo " ./kbc dump 소스.kbc 디스어셈블" |
0 commit comments