# Variables for build tools
CMAKE=/usr/bin/cmake
MESON=/usr/bin/meson
# Paths for installed apps
INCLUDE_SYS_PATH=/usr/include

# Set the default target to build
.DEFAULT_GOAL := build

### Makefile targets for hyprwm libraries ###

# Build and install tomlplusplus if it's not on the system
tomlplusplus:
	git clone https://github.com/marzer/tomlplusplus.git
__Tomlplusplus = $(INCLUDE_SYS_PATH)/toml++
$(__Tomlplusplus): tomlplusplus
	@echo "Building and installing tomlplusplus..."
	cd tomlplusplus && $(MESON) setup build --buildtype=release --prefix=/usr
	ninja -C tomlplusplus/build
	sudo $(MESON) install -C tomlplusplus/build

# Build hyprcursor if the .hpp file is not installed (required hyprlang)
# Library for hyprwm
.PHONY : hyprcursor
hyprcursor:
	git submodule init
	git submodule update --remote hyprcursor
__Hyprcursor = $(INCLUDE_SYS_PATH)/hyprcursor.hpp
$(__Hyprcursor): $(__Tomlplusplus) $(__Hyperlang) 
	@[[ -z "$(ls -A hyprcursor)" ]] && $(MAKE) hyprcursor
	$(CMAKE) --no-warn-unused-cli -DCMAKE_BUILD_TYPE:STRING=Release \
		-DCMAKE_INSTALL_PREFIX:PATH=/usr -S ./hyprcursor -B ./hyprcursor/build
	$(CMAKE) --build ./hyprcursor/build --config Release --target all \
		-j`nproc 2>/dev/null || getconf _NPROCESSORS_CONF`
	@echo "Installing library hyprcursor..."
	sudo $(CMAKE) --install hyprcursor/build

# Build hyprutils if the .hpp file is not installed
# Library for hyprwm
.PHONY : hyprutils
hyprutils:
	git submodule init
	git submodule update --remote hyprutils
__Hyprutils = $(INCLUDE_SYS_PATH)/hyprutils
$(__Hyprutils):
	@[[ -z "$(ls -A hyprutils)" ]] && $(MAKE) hyprutils
	$(CMAKE) --no-warn-unused-cli -DCMAKE_BUILD_TYPE:STRING=Release \
		-DCMAKE_INSTALL_PREFIX:PATH=/usr -S hyprutils -B ./hyprutils/build
	$(CMAKE) --build ./hyprutils/build --config Release --target all -j`nproc \
		2>/dev/null || getconf _NPROCESSORS_CONF`
	sudo $(CMAKE) --install hyprutils/build

# Build hyprlang if the .hpp file is not installed
# Library for hyprwm
.PHONY : hyprlang
hyprlang:
	git submodule init
	git submodule update --remote hyprlang
__Hyprlang = $(INCLUDE_SYS_PATH)/hyprlang.hpp 
$(__Hyprlang): $(__Hyprutils)
	@[[ -z "$(ls -A hyprlang)" ]] && $(MAKE) hyprlang
	# built using cmake
	$(CMAKE) --no-warn-unused-cli -DCMAKE_BUILD_TYPE:STRING=Release \
		-DCMAKE_INSTALL_PREFIX:PATH=/usr -S ./hyprlang -B ./hyprlang/build
	$(CMAKE) --build ./hyprlang/build --config Release --target hyprlang \
		-j`nproc 2>/dev/null || getconf _NPROCESSORS_CONF`
	# At this point install hyprlang since it is a library other apps need
	@echo "Installing library hyprlang..."
	sudo $(CMAKE) --install ./hyprlang/build

.PHONY : hyprwayland-scanner
hyprwayland-scanner:
	git submodule init
	git submodule update --remote hyprwayland-scanner
__Hyprwayland-scanner = /usr/lib64/cmake/hyprwayland-scanner
$(__Hyprwayland-scanner):
	@[[ -z "$(ls -A hyprwayland-scanner)" ]] && $(MAKE) hyprwayland-scanner
	$(CMAKE) -DCMAKE_INSTALL_PREFIX=/usr -S ./hyprwayland-scanner \
		-B hyprwayland-scanner/build
	$(CMAKE) --build ./hyprwayland-scanner/build -j \
		`nproc 2>/dev/null || getconf _NPROCESSORS_CONF`
	@echo "Installing library hyprwayland-scanner..."
	sudo $(CMAKE) --install ./hyprwayland-scanner/build

## :@TODO: install libxcb-errors
.PHONY : libxcb-errors
libxcb-errors:
	git clone https://gitlab.freedesktop.org/xorg/lib/libxcb-errors.git
__Libxcb-errors = /usr/include/xcb
$(__Libxcb-errors):
	@echo "Building and install library libxcb-errors..."
	@[[ -z "$(ls -A libxcb-errors)" ]] && $(MAKE) libxcb-errors
	cd libxcb-errors && { \
		git submodule update --init ; \
		/bin/sh autogen.sh ; \
		/bin/sh configure --prefix=/usr ; \
		make && sudo make install ; } 

### Makefile targets for hyprwm apps ###

# Build Hyprland if it's not installed on the system
.PHONY : Hyprland
Hyprland:
	git submodule init
	git submodule update --recursive --remote Hyprland
__Hyprland = Hyprland/build
$(__Hyprland): $(__Hyperlang) $(__Hypercursor) $(__Hyprwayland-scanner) \
	$(__Libxcb-errors)
	@[[ -z "$(ls -A Hyprland)" ]] && $(MAKE) Hyprland
	sudo $(MAKE) -C Hyprland all

# Build hyprlock if it's not installed on the system
.PHONY : hyprlock
hyprlock:
	git submodule init
	git submodule update --remote hyprlock
__Hyprlock = hyprlock/build
$(__Hyprlock): $(__Hyprlang)
	@[[ -z "$(ls -A hyprlock)" ]] && $(MAKE) hyprlock
	$(CMAKE) --no-warn-unused-cli -DCMAKE_BUILD_TYPE:STRING=Release \
		-S ./hyprlock -B ./hyprlock/build
	$(CMAKE) --build ./hyprlock/build --config Release --target hyprlock \
		-j`nproc 2>/dev/null || getconf _NPROCESSORS_CONF`

# Build hyprpaper if it's not installed on the system
.PHONY : hyprpaper
hyprpaper:
	git submodule init
	git submodule update --init --recursive --remote hyprpaper
__Hyprpaper = hyprpaper/build
$(__Hyprpaper): $(__Hyprlang)
	@[[ -z "$(ls -A hyprpaper)" ]] && $(MAKE) hyprpaper
	$(CMAKE) --no-warn-unused-cli -DCMAKE_BUILD_TYPE:STRING=Release \
		-DCMAKE_INSTALL_PREFIX:PATH=/usr -S ./hyprpaper -B ./hyprpaper/build
	$(CMAKE) --build ./hyprpaper/build --config Release --target hyprpaper \
		-j`nproc 2>/dev/null || getconf _NPROCESSORS_CONF`

# Build wl-clipboard if it's not installed on the system
.PHONY : wl-clipboard
wl-clipboard:
	git submodule init
	git submodule update --remote wl-clipboard
__Wl_clipboard = wl-clipboard/build
$(__Wl_clipboard): 
	@[[ -z "$(ls -A wl-clipboard)" ]] && $(MAKE) wl-clipboard
	cd wl-clipboard && $(MESON) setup --prefix=/usr build
	ninja -C wl-clipboard/build

### PHONY targets that a user would run ###
.PHONY : build
build: $(__Hyprlock) $(__Hyprpaper) $(__Wl-clipboard) $(__Hyprland)

.PHONY : install
install: build
	@echo "Installing Hyprland..."
	sudo $(MAKE) -f Hyprland/Makefile install
	@echo "Installing hyprlock..."
	sudo $(CMAKE) --install hyprlock/build
	@echo "Installing hyprpaper"
	$(CMAKE) --install hyprpaper/build
	@echo "Installing wl-clipboard"
	sudo $(MESON) install -C wl-clipboard/build
	@echo "Installing Hyprland"
	sudo $(MAKE) -C install


.PHONY: test
test: build
	@echo "Be real, you don't want to do this, so we'll abort."
	$(error No test-suite implemented)
