diff options
| author | Zuhaitz Méndez Fernández de Aránguiz <zuhaitz@debian> | 2026-01-25 18:24:05 +0000 |
|---|---|---|
| committer | Zuhaitz Méndez Fernández de Aránguiz <zuhaitz@debian> | 2026-01-25 18:24:05 +0000 |
| commit | e3ab29bb4d7174cae65de2275f19105eb3d93d91 (patch) | |
| tree | 89970111c1be4c3ddd291b720d4fdf496f10b2d5 /Makefile | |
| parent | 489336b2101bf16edeec7bfc4379408eb19b936e (diff) | |
APE shall never kill APE
Diffstat (limited to 'Makefile')
| -rw-r--r-- | Makefile | 123 |
1 files changed, 103 insertions, 20 deletions
@@ -1,10 +1,27 @@ +# OS detection and portable commands +ifeq ($(OS),Windows_NT) + EXE = .exe + RM = rm -rf + MKDIR = mkdir -p + CP = cp -af + LN = ln -sf + INSTALL = install +else + EXE = + RM = rm -rf + MKDIR = mkdir -p + CP = cp -af + LN = ln -sf + INSTALL = install +endif + # Compiler configuration # Default: gcc # To build with clang: make CC=clang # To build with zig: make CC="zig cc" CC = gcc CFLAGS = -Wall -Wextra -g -I./src -I./src/ast -I./src/parser -I./src/codegen -I./plugins -I./src/zen -I./src/utils -I./src/lexer -I./src/analysis -I./src/lsp -TARGET = zc +TARGET = zc$(EXE) LIBS = -lm -lpthread -ldl SRCS = src/main.c \ @@ -46,60 +63,126 @@ INCLUDEDIR = $(PREFIX)/include/zenc PLUGINS = plugins/befunge.so plugins/brainfuck.so plugins/forth.so plugins/lisp.so plugins/regex.so plugins/sql.so +# APE (Actually Portable Executable) configuration +COSMOCC = cosmocc +OUT_STAGE = out/stage +OUT_BIN = out/bin +ZC_ENTRY_O = $(OUT_STAGE)/zc_entry.o +ZC_COM_BIN = $(OUT_STAGE)/zc.com +ZC_COM = $(OUT_BIN)/zc.com +ZC_BOOT_SRC = ape/boot/boot.zc +ZC_BOOT_COM_BIN = $(OUT_STAGE)/zc-boot.com +ZC_BOOT_COM = $(OUT_BIN)/zc-boot.com + # Default target all: $(TARGET) $(PLUGINS) +# APE target +ape: $(ZC_COM) $(ZC_BOOT_COM) + # Build plugins plugins/%.so: plugins/%.c $(CC) $(CFLAGS) -shared -fPIC -o $@ $< # Link $(TARGET): $(OBJS) - @mkdir -p $(dir $@) + @$(MKDIR) $(dir $@) $(CC) $(CFLAGS) -o $@ $^ $(LIBS) @echo "=> Build complete: $(TARGET)" # Compile $(OBJ_DIR)/%.o: %.c - @mkdir -p $(dir $@) + @$(MKDIR) $(dir $@) $(CC) $(CFLAGS) -c $< -o $@ +# APE targets +$(ZC_ENTRY_O): ape/zc_entry.c + @$(MKDIR) $(@D) + $(COSMOCC) -c $< -o $@ + +$(ZC_COM_BIN): $(ZC_ENTRY_O) $(SRCS) + @$(MKDIR) $(@D) + $(MAKE) \ + PLUGINS= \ + CC=$(COSMOCC) \ + OBJ_DIR=obj-ape \ + LIBS="$(abspath $(ZC_ENTRY_O)) -Wl,--wrap=main" \ + TARGET="$(abspath $@)"; + +$(ZC_COM): $(ZC_COM_BIN) + @$(MKDIR) $(@D) + @$(CP) $(ZC_COM_BIN) $(wildcard $(ZC_COM_BIN).*) "$(@D)"; \ + zip -r "$(abspath $@)" std.zc std LICENSE; + +$(ZC_BOOT_COM_BIN): $(ZC_BOOT_SRC) $(ZC_COM) + @$(MKDIR) $(@D) + ./$(ZC_COM) build --cc $(COSMOCC) -o $@ $< + +$(ZC_BOOT_COM): $(ZC_BOOT_COM_BIN) ape/boot/.args + @$(MKDIR) $(@D) + @$(CP) $(ZC_BOOT_COM_BIN) $(wildcard $(ZC_BOOT_COM_BIN).*) "$(@D)"; \ + (cd ape/boot && zip "$(abspath $@)" .args hello.zc instructions.txt Makefile); \ + zip "$(abspath $@)" LICENSE; + # Install install: $(TARGET) - install -d $(BINDIR) - install -m 755 $(TARGET) $(BINDIR)/$(TARGET) + $(INSTALL) -d $(BINDIR) + $(INSTALL) -m 755 $(TARGET) $(BINDIR)/$(TARGET) # Install man pages - install -d $(MANDIR)/man1 $(MANDIR)/man5 $(MANDIR)/man7 - test -f man/zc.1 && install -m 644 man/zc.1 $(MANDIR)/man1/zc.1 || true - test -f man/zc.5 && install -m 644 man/zc.5 $(MANDIR)/man5/zc.5 || true - test -f man/zc.7 && install -m 644 man/zc.7 $(MANDIR)/man7/zc.7 || true + $(INSTALL) -d $(MANDIR)/man1 $(MANDIR)/man5 $(MANDIR)/man7 + test -f man/zc.1 && $(INSTALL) -m 644 man/zc.1 $(MANDIR)/man1/zc.1 || true + test -f man/zc.5 && $(INSTALL) -m 644 man/zc.5 $(MANDIR)/man5/zc.5 || true + test -f man/zc.7 && $(INSTALL) -m 644 man/zc.7 $(MANDIR)/man7/zc.7 || true # Install standard library - install -d $(SHAREDIR) - cp -r std $(SHAREDIR)/ + $(INSTALL) -d $(SHAREDIR) + $(CP) std $(SHAREDIR)/ # Install plugin headers - install -d $(INCLUDEDIR) - install -m 644 plugins/zprep_plugin.h $(INCLUDEDIR)/zprep_plugin.h + $(INSTALL) -d $(INCLUDEDIR) + $(INSTALL) -m 644 plugins/zprep_plugin.h $(INCLUDEDIR)/zprep_plugin.h @echo "=> Installed to $(BINDIR)/$(TARGET)" @echo "=> Man pages installed to $(MANDIR)" @echo "=> Standard library installed to $(SHAREDIR)/std" # Uninstall uninstall: - rm -f $(BINDIR)/$(TARGET) - rm -f $(MANDIR)/man1/zc.1 - rm -f $(MANDIR)/man5/zc.5 - rm -f $(MANDIR)/man7/zc.7 - rm -rf $(SHAREDIR) + $(RM) $(BINDIR)/$(TARGET) + $(RM) $(MANDIR)/man1/zc.1 + $(RM) $(MANDIR)/man5/zc.5 + $(RM) $(MANDIR)/man7/zc.7 + $(RM) $(SHAREDIR) @echo "=> Uninstalled from $(BINDIR)/$(TARGET)" @echo "=> Removed man pages from $(MANDIR)" @echo "=> Removed $(SHAREDIR)" +# Install APE +install-ape: ape + $(INSTALL) -d $(BINDIR) + $(INSTALL) -m 755 $(ZC_COM) $(BINDIR)/zc.com + $(INSTALL) -m 755 $(ZC_BOOT_COM) $(BINDIR)/zc-boot.com + $(LN) $(BINDIR)/zc.com $(BINDIR)/zc + + # Install standard library (shared) + $(INSTALL) -d $(SHAREDIR) + $(CP) std $(SHAREDIR)/ + @echo "=> Installed APE binaries to $(BINDIR)" + @echo "=> Alias 'zc' points to zc.com" + @echo "=> Standard library installed to $(SHAREDIR)/std" + +# Uninstall APE +uninstall-ape: + $(RM) $(BINDIR)/zc + $(RM) $(BINDIR)/zc.com + $(RM) $(BINDIR)/zc-boot.com + $(RM) $(SHAREDIR) + @echo "=> Uninstalled APE binaries from $(BINDIR)" + @echo "=> Removed $(SHAREDIR)" + # Clean clean: - rm -rf $(OBJ_DIR) $(TARGET) out.c plugins/*.so + $(RM) $(OBJ_DIR) obj-ape $(TARGET) out.c plugins/*.so out @echo "=> Clean complete!" # Test @@ -114,4 +197,4 @@ zig: clang: $(MAKE) CC=clang -.PHONY: all clean install uninstall test zig clang +.PHONY: all clean install uninstall install-ape uninstall-ape test zig clang ape |
