mumu 0.9.1

Lava Mumu is a language for those in the now and that know
Documentation
VERSION = 0.9.1

COLOR_RESET  = \033[0m
COLOR_BLUE   = \033[34m
COLOR_GREEN  = \033[32m
COLOR_RED    = \033[31m

PLUGINS := $(shell sed -n '/members *=/,/\]/p' Cargo.toml \
           | sed '1d;$d' \
           | tr -d '[",]' \
           | sed 's/^ *//g' \
           | grep -v '^\.') 

# ------------------------------------------------------------------------------
# By default, run a debug build (core + plugins).
# ------------------------------------------------------------------------------
default: build-core-debug build-plugins-debug build-docs
	@echo "$(COLOR_GREEN)=== Default build: debug done. ===$(COLOR_RESET)"

# ------------------------------------------------------------------------------
# "all" => release build, docs, strip, plus macOS dmg or .deb
# ------------------------------------------------------------------------------
all: build-core-release build-plugins-release build-docs strip-binaries macos-or-deb-step
	@echo "$(COLOR_GREEN)=== DONE building version $(VERSION) => Release + deb/dmg. See warnings.log. ===$(COLOR_RESET)"

###############################################################################
# 1) Build Main Crate (Debug)
###############################################################################
build-core-debug:
	@rm -f warnings.log build_temp.log
	@echo "$(COLOR_BLUE)=== Building main crate (.) [DEBUG] ===$(COLOR_RESET)"
	RUSTFLAGS="-C link-args=-Wl,-rpath,@executable_path -C link-args=-Wl,-rpath,/usr/local/lib" \
	  cargo build --color=always 2>&1 | tee build_temp.log
	@if [ $$? -ne 0 ]; then \
	  echo "$(COLOR_RED)Build failed (debug) in main crate. Stopping.$(COLOR_RESET)"; \
	  exit 1; \
	fi
	@echo "=== Warnings/Errors (debug) from main crate (.) ===" >> warnings.log
	@grep -E -B2 -A3 '(^warning:|^error:|^ *--> )' build_temp.log >> warnings.log || true
	@rm -f build_temp.log

###############################################################################
# 2) Build Plugins (Debug)
###############################################################################
build-plugins-debug:
	@for plugin in $(PLUGINS); do \
	  echo "$(COLOR_BLUE)=== Building $$plugin [DEBUG] ===$(COLOR_RESET)"; \
	  cd $$plugin && \
	    RUSTFLAGS="-C link-args=-Wl,-rpath,@executable_path -C link-args=-Wl,-rpath,/usr/local/lib" \
	      cargo build --color=always 2>&1 | tee ../build_temp.log; \
	  if [ $$? -ne 0 ]; then \
	    echo "$(COLOR_RED)Build failed (debug) in plugin: $$plugin. Stopping.$(COLOR_RESET)"; \
	    exit 1; \
	  fi; \
	  cd ..; \
	  echo "=== Warnings/Errors (debug) from $$plugin ===" >> warnings.log; \
	  grep -E -B2 -A3 '(^warning:|^error:|^ *--> )' build_temp.log >> warnings.log || true; \
	  rm -f build_temp.log; \
	done

###############################################################################
# 3) Build Main Crate (Release)
###############################################################################
build-core-release:
	@echo "$(COLOR_BLUE)=== Building main crate (.) [RELEASE] ===$(COLOR_RESET)"
	RUSTFLAGS="-C link-arg=-Wl,-headerpad_max_install_names -C link-args=-Wl,-rpath,@executable_path -C link-args=-Wl,-rpath,/usr/local/lib" \
	  cargo build --release --color=always 2>&1 | tee build_temp.log
	@if [ $$? -ne 0 ]; then \
	  echo "$(COLOR_RED)Build failed (release) in main crate. Stopping.$(COLOR_RESET)"; \
	  exit 1; \
	fi
	@echo "=== Warnings/Errors (release) from main crate (.) ===" >> warnings.log
	@grep -E -B2 -A3 '(^warning:|^error:|^ *--> )' build_temp.log >> warnings.log || true
	@rm -f build_temp.log

###############################################################################
# 4) Build Plugins (Release)
###############################################################################
build-plugins-release:
	@for plugin in $(PLUGINS); do \
	  echo "$(COLOR_BLUE)=== Building $$plugin [RELEASE] ===$(COLOR_RESET)"; \
	  cd $$plugin && \
	    RUSTFLAGS="-C link-arg=-Wl,-headerpad_max_install_names -C link-args=-Wl,-rpath,@executable_path -C link-args=-Wl,-rpath,/usr/local/lib" \
	      cargo build --release --color=always 2>&1 | tee ../build_temp.log; \
	  if [ $$? -ne 0 ]; then \
	    echo "$(COLOR_RED)Build failed (release) in plugin: $$plugin. Stopping.$(COLOR_RESET)"; \
	    exit 1; \
	  fi; \
	  cd ..; \
	  echo "=== Warnings/Errors (release) from $$plugin ===" >> warnings.log; \
	  grep -E -B2 -A3 '(^warning:|^error:|^ *--> )' build_temp.log >> warnings.log || true; \
	  rm -f build_temp.log; \
	done

###############################################################################
# 5) Build Docs
###############################################################################
build-docs:
	@echo "$(COLOR_BLUE)=== Building docs => running build-single-index.js ===$(COLOR_RESET)"
	cd src/public && node build-single-index.js

###############################################################################
# 6) Strip Binaries (debug + release), if strip is available
###############################################################################
strip-binaries:
	@echo "$(COLOR_BLUE)=== Stripping artifacts (if strip is available) ===$(COLOR_RESET)"
	@which strip >/dev/null 2>&1 && \
	  find target -type f \
	    \( -name 'lib*.so' -o -name 'lib*.dylib' -o -name '*.dll' -o -name 'mumu' \) \
	    -exec strip {} \; 2>/dev/null || true

###############################################################################
# 7) On macOS => build a .dmg, else => build the .deb
###############################################################################
macos-or-deb-step:
	@if [ "$$(uname)" = "Darwin" ]; then \
	  $(MAKE) macos-dmg-step; \
	else \
	  $(MAKE) cargo-deb-step; \
	fi

###############################################################################
# 7a) macOS .dmg creation WITH Installer Package (.pkg)
###############################################################################
macos-dmg-step: macos-pkg-step
	@echo "$(COLOR_BLUE)=== Creating macOS .dmg with Installer Package (.pkg) ===$(COLOR_RESET)"
	rm -rf target/dist_macos
	mkdir -p target/dist_macos

	# Copy the .pkg we just built into dist_macos
	cp target/mumu.pkg target/dist_macos/

	hdiutil create \
	  -volname "LavaInstaller" \
	  -srcfolder target/dist_macos \
	  -ov \
	  -format UDZO \
	  target/mumu.dmg

	@echo "$(COLOR_GREEN)=== macOS .dmg created at target/mumu.dmg ===$(COLOR_RESET)"

macos-pkg-step:
	@echo "$(COLOR_BLUE)=== Creating macOS pkg installer => pkgbuild ===$(COLOR_RESET)"
	rm -rf target/pkgroot
	mkdir -p target/pkgroot/usr/local/bin
	mkdir -p target/pkgroot/usr/local/lib

	# 1) Copy the main 'mumu' binary
	cp target/release/mumu target/pkgroot/usr/local/bin/mumu

	# 2) Copy each plugin's .dylib to /usr/local/lib
	@for plugin in $(PLUGINS); do \
	  if [ -f "target/release/libmumu$$plugin.dylib" ]; then \
	    cp "target/release/libmumu$$plugin.dylib" target/pkgroot/usr/local/lib/; \
	  fi; \
	done

	# 3) pkgbuild => produce mumu.pkg in top-level target
	pkgbuild \
	  --root target/pkgroot \
	  --identifier "com.example.mumu" \
	  --version "$(VERSION)" \
	  --install-location "/" \
	  target/mumu.pkg

###############################################################################
# 7b) Build the .deb file with cargo-deb
###############################################################################
cargo-deb-step:
	@echo "$(COLOR_BLUE)=== Building .deb package => cargo deb ===$(COLOR_RESET)"
	cargo deb
	@if [ $$? -ne 0 ]; then \
	  echo "$(COLOR_RED)cargo-deb failed => no .deb created.$(COLOR_RESET)"; \
	  exit 1; \
	fi

###############################################################################
# Clean
###############################################################################
clean:
	cargo clean
	@for plugin in $(PLUGINS); do \
	  (cd $$plugin && cargo clean); \
	done
	rm -f warnings.log

.PHONY: default all build-core-debug build-plugins-debug build-core-release build-plugins-release build-docs strip-binaries macos-or-deb-step macos-dmg-step macos-pkg-step cargo-deb-step clean