ifeq ($(OS),Windows_NT) DETECTED_OS := Windows RM := del /Q RMDIR := rmdir /S /Q ARCH_RAW := $(PROCESSOR_ARCHITECTURE) BIN_EXT := .exe MKDIR_P = if not exist "$(1)" mkdir "$(1)" RUN_PREFIX := else DETECTED_OS := $(shell uname -s) RM := rm -f RMDIR := rm -rf ARCH_RAW := $(shell uname -m) BIN_EXT := MKDIR_P = mkdir -p "$(1)" RUN_PREFIX := ./ endif ifneq (,$(filter x86_64 amd64 AMD64 x86 i386 i486 i586 i686,$(ARCH_RAW))) ARCH := x86 else ifneq (,$(filter aarch64 arm64 ARM64 armv7l armv6l arm,$(ARCH_RAW))) ARCH := arm else ifneq (,$(filter ppc64 ppc64le powerpc,$(ARCH_RAW))) ARCH := powerpc else ARCH := $(ARCH_RAW) endif CC ?= cc CFLAGS ?= -std=c99 -Wall -Wextra -Iinclude BUILD_DIR := build/$(ARCH) BIN_DIR := $(BUILD_DIR)/bin TEST_DIR := $(BUILD_DIR)/.tests BIN := $(BIN_DIR)/micropascal$(BIN_EXT) TEST_BIN := $(TEST_DIR)/micropascal-tests$(BIN_EXT) LIB_SRCS := $(wildcard src/micropascal-lexer/*.c) $(wildcard src/micropascal-parser/*.c) APP_SRCS := src/main.c $(LIB_SRCS) TEST_SRCS := tests/test_main.c tests/test_lexer.c tests/test_parser.c $(LIB_SRCS) ARGS ?= examples/testaparidade.pas .PHONY: all help build run test clean all: build help: @echo "micro-Pascal - alvos disponiveis" @echo " make help mostra esta ajuda" @echo " make build compila o compilador em $(BIN)" @echo " make run compila e executa em uma amostra (ARGS=arquivo)" @echo " make test compila e executa a suite de testes" @echo " make clean remove o diretorio build" build: $(BIN) $(BIN): $(APP_SRCS) @$(call MKDIR_P,$(BIN_DIR)) $(CC) $(CFLAGS) $(APP_SRCS) -o $(BIN) $(TEST_BIN): $(TEST_SRCS) @$(call MKDIR_P,$(TEST_DIR)) $(CC) $(CFLAGS) $(TEST_SRCS) -o $(TEST_BIN) run: build $(RUN_PREFIX)$(BIN) $(ARGS) test: $(TEST_BIN) $(RUN_PREFIX)$(TEST_BIN) clean: $(RMDIR) build