From 03e5708074e3943e58216e14fda9d69f9ce0257d Mon Sep 17 00:00:00 2001
From: viktorxda <35473052+viktorxda@users.noreply.github.com>
Date: Sat, 13 May 2023 16:13:10 +0200
Subject: [PATCH] Makefile: overhaul usage and commands (#791)

---
 Makefile                                      | 192 ++++--------------
 .../0001-redefine-fallthrough.patch           |  13 ++
 .../remove_fallthrough.patch                  |  84 --------
 3 files changed, 54 insertions(+), 235 deletions(-)
 create mode 100644 general/package/all-patches/wireguard-linux-compat/0001-redefine-fallthrough.patch
 delete mode 100644 general/package/all-patches/wireguard-linux-compat/remove_fallthrough.patch

diff --git a/Makefile b/Makefile
index 30cb9103..58928750 100644
--- a/Makefile
+++ b/Makefile
@@ -1,173 +1,63 @@
-ifneq ($(PLATFORM),)
-	PLATFORM := $(error Setting PLATFORM in make arguments is deprecated, please remove it)
-else
-	ifneq ($(BOARD),)
-		FULL_PATH := $(shell find br-ext-chip-* -name "$(BOARD)*_defconfig")
-		ifeq ($(FULL_PATH),)
-			FULL_PATH := $(error Cannot find anything for $(BOARD))
-		else ifneq ($(shell echo $(FULL_PATH) | wc -w), 1)
-			FULL_PATH := $(error For provided '$(BOARD)' multiple options found: $(FULL_PATH))
-		endif
+BR_DIR = $(PWD)/buildroot-$(BR_VER)
+BR_MAKE = $(MAKE) -C $(BR_DIR) BR2_EXTERNAL=$(PWD)/general O=$(PWD)/output
 
-		PLATFORM := $(shell echo $(FULL_PATH) | cut -d '/' -f 1 | cut -d '-' -f 4)
-		FAMILY := $(shell grep "/board/" $(FULL_PATH) | head -1 | cut -d "/" -f 3)
-		ifeq ($(FAMILY),hi3516cv500)
-			BR_VER ?= 2022.08
-		else ifeq ($(FAMILY),infinity6e)
-			BR_VER ?= 2023.02
-		endif
+ifdef BOARD
+	CHECK = $(wildcard $(BR_DIR))
+	CONFIG = $(shell find br-ext-chip-*/configs -type f | grep -m1 $(BOARD))
+endif
+
+ifeq ($(CONFIG),)
+	BR_VER = $(error variable BOARD must be defined to initialize build)
+else
+	ifneq ($(shell grep GCC_VERSION_12 $(CONFIG)),)
+		BR_VER = 2023.02
+	else
+		BR_VER = 2021.02.12
 	endif
 endif
 
-ROOT_DIR      := $(CURDIR)
-BR_EXT_DIR    := $(ROOT_DIR)/br-ext-chip-$(PLATFORM)
-GENERAL_DIR   := $(ROOT_DIR)/general
-SCRIPTS_DIR   := $(GENERAL_DIR)/scripts
+.PHONY: all clean defconfig distclean help prepare toolname
 
-BR_VER        ?= 2021.02.12
-BR_DIR        := $(ROOT_DIR)/buildroot-$(BR_VER)
-
-.PHONY: usage help clean distclean prepare install-deps all toolchain-params run-tests overlayed-rootfs-%
-
-usage help:
+help:
 	@printf "BR-OpenIPC usage:\n \
-	- make help | usage - print this help\n \
+	- make clean - remove defconfig and target folder\n \
+	- make distclean - remove buildroot and output folder\n \
 	- make install-deps - install system dependencies\n \
-	- make prepare - download and unpack buildroot\n \
 	- make list-configs - show available board configurations\n \
-	- make <DEFCONFIG> - build the targeted device, includes prepare\n \
-	- make BOARD=<BOARD-ID> all - build the targeted device\n \
-	- make clean - cleaning before reassembly\n \
-	- make distclean - switching to the factory state\n \
-	- make overlayed-rootfs-<FS-TYPE> ROOTFS_OVERLAYS=[path] - create rootfs overlay\n\n \
-	Example:\n \
-	- make overlayed-rootfs-squashfs ROOTFS_OVERLAYS=echo_server/overlay\n\n"
+	- make all BOARD=<device> - builds the selected board\n\n"
 
-distclean:
-	@rm -rf output buildroot-$(BR_VER)
+all: defconfig
+	@$(BR_MAKE) all
 
-clean:
-	@rm -rf output/target output/.config
+br-%: defconfig
+	@$(BR_MAKE) $(subst br-,,$@)
 
-prepare: $(BR_DIR)
-$(ROOT_DIR)/buildroot-$(BR_VER).tar.gz:
-	wget -O $@ -nv \
-		--retry-connrefused --continue --timeout=3 \
-		http://buildroot.org/downloads/buildroot-$(BR_VER).tar.gz || \
-	wget -O $@ -nv \
-		--retry-connrefused --continue --timeout=3 \
+defconfig: prepare
+	@$(BR_MAKE) BR2_DEFCONFIG=$(PWD)/$(CONFIG) defconfig
+
+toolname: prepare
+	@general/scripts/show_toolchains.sh $(CONFIG) $(BR_VER)
+
+prepare:
+ifeq ($(CHECK),)
+	@wget -O $(BR_DIR).tar.gz -nv --retry-connrefused --timeout=3 \
 		https://github.com/buildroot/buildroot/archive/refs/tags/$(BR_VER).tar.gz
-
-$(BR_DIR): $(ROOT_DIR)/buildroot-$(BR_VER).tar.gz
-	tar -C $(ROOT_DIR) -xf buildroot-$(BR_VER).tar.gz
-	rm -f buildroot-$(BR_VER).tar.gz
-
-
-install-deps:
-ifneq ($(shell id -u), 0)
-	@echo "You must be root to perform this action."
-else
-	DEBIAN_FRONTEND=noninteractive apt-get update && \
-		apt-get -y install \
-		build-essential git make libncurses-dev wget curl \
-		cpio rsync bc unzip file lzop
+	@tar -C $(PWD) -xf $(BR_DIR).tar.gz
+	@rm -f $(BR_DIR).tar.gz
 endif
 
 buildroot-version:
 	@echo $(BR_VER)
 
-has-nand:
-	@sed -rn "s/^BR2_TARGET_ROOTFS_UBI=(y)/\1/p" $(FULL_PATH)
+clean:
+	@rm -rf output/target output/.config
 
-toolname:
-	@$(SCRIPTS_DIR)/show_toolchains.sh $(FULL_PATH) $(BR_VER)
+distclean:
+	@rm -rf output buildroot-*.*
 
 list-configs:
 	@ls -1 br-ext-chip-*/configs
-	@echo
 
-%_defconfig: prepare
-	$(BOARD_MAKE) BR2_DEFCONFIG=$(ROOT_DIR)/$(shell find br-ext-chip-* -name $@) defconfig
-	$(BOARD_MAKE) all
-
-# -------------------------------------------------------------------------------------------------
-OUT_DIR ?= $(ROOT_DIR)/output
-
-# Buildroot considers relative paths relatively to its' own root directory. So we use absolute paths
-# to avoid ambiguity
-override OUT_DIR := $(abspath $(OUT_DIR))
-BOARD_MAKE := $(MAKE) -C $(BR_DIR) BR2_EXTERNAL=$(GENERAL_DIR) O=$(OUT_DIR)
-
-define CREATE_TOOLCHAIN_PARAMS
-    eval $$($(BOARD_MAKE) -s --no-print-directory VARS=GNU_TARGET_NAME printvars) \
-    && $(SCRIPTS_DIR)/create_toolchain_binding.sh $(OUT_DIR)/host/bin $$GNU_TARGET_NAME \
-    > $(OUT_DIR)/toolchain-params.mk
-endef
-
-# -------------------------------------------------------------------------------------------------
-$(OUT_DIR)/.config:
-ifndef BOARD
-	$(error Variable BOARD must be defined to initialize output directory)
-else
-	$(BOARD_MAKE) BR2_DEFCONFIG=$(BR_EXT_DIR)/configs/$(BOARD)_defconfig defconfig
-endif
-
-
-$(OUT_DIR)/toolchain-params.mk: $(OUT_DIR)/.config $(SCRIPTS_DIR)/create_toolchain_binding.sh
-	$(CREATE_TOOLCHAIN_PARAMS)
-
-
-# TODO: Elaborate how to compile wireguard-linux-compat under GCC 12 without this patch
-define remove-patches
-	$(if $(filter $(BR_VER),2020.02.12 2021.02.12),-rm general/package/all-patches/wireguard-linux-compat/remove_fallthrough.patch)
-endef
-
-
-# -------------------------------------------------------------------------------------------------
-# build all needed for a board
-all: $(OUT_DIR)/.config $(OUT_DIR)/toolchain-params.mk
-	$(remove-patches)
-	$(BOARD_MAKE) all
-
-
-# -------------------------------------------------------------------------------------------------
-# re-create params file
-toolchain-params:
-	$(CREATE_TOOLCHAIN_PARAMS)
-
-# -------------------------------------------------------------------------------------------------
-# create rootfs image that contains original Buildroot target dir overlayed by some custom layers
-# space-separated list of overlays
-
-ROOTFS_OVERLAYS ?=
-# overlayed rootfs directory
-ROOTFS_OVERLAYED_DIR ?= $(OUT_DIR)/target-overlayed
-# overlayed rootfs image's name (without prefix)
-ROOTFS_OVERLAYED_IMAGE ?= rootfs-overlayed
-
-overlayed-rootfs-%: $(OUT_DIR)/.config
-	$(SCRIPTS_DIR)/create_overlayed_rootfs.sh $(ROOTFS_OVERLAYED_DIR) $(OUT_DIR)/target $(ROOTFS_OVERLAYS)
-	$(BOARD_MAKE) $(subst overlayed-,,$@) \
-	    BASE_TARGET_DIR=$(abspath $(ROOTFS_OVERLAYED_DIR)) \
-	    ROOTFS_$(call UPPERCASE,$(subst overlayed-rootfs-,,$@))_FINAL_IMAGE_NAME=$(ROOTFS_OVERLAYED_IMAGE).$(subst overlayed-rootfs-,,$@)
-
-# -------------------------------------------------------------------------------------------------
-# such targets (with trimmed `br-` prefix) are passed to Buildroot's Makefile
-br-%: $(OUT_DIR)/.config
-	$(remove-patches)
-	$(BOARD_MAKE) $(subst br-,,$@)
-
-
-# -------------------------------------------------------------------------------------------------
-run-tests:
-	$(MAKE) -C $(ROOT_DIR)/tests
-
-
-# -------------------------------------------------------------------------------------------------
-# there are some extra targets of specific packages
-include $(sort $(wildcard $(ROOT_DIR)/extra/*.mk))
-
-
-# -------------------------------------------------------------------------------------------------
-# util stuff is below
-UPPERCASE = $(shell echo $(1) | tr a-z A-Z)
+install-deps:
+	@sudo apt-get install -y build-essential libncurses-dev \
+		bc cpio curl file git lzop make rsync unzip wget
diff --git a/general/package/all-patches/wireguard-linux-compat/0001-redefine-fallthrough.patch b/general/package/all-patches/wireguard-linux-compat/0001-redefine-fallthrough.patch
new file mode 100644
index 00000000..473f22bc
--- /dev/null
+++ b/general/package/all-patches/wireguard-linux-compat/0001-redefine-fallthrough.patch
@@ -0,0 +1,13 @@
+--- a/src/compat/siphash/siphash.c	2023-05-12 15:21:03.029519429 +0300
++++ b/src/compat/siphash/siphash.c	2023-05-12 15:19:42.105522000 +0300
+@@ -13,6 +13,10 @@
+ #include <linux/siphash.h>
+ #include <asm/unaligned.h>
+ 
++#if GCC_VERSION >= 70000
++#define fallthrough __attribute__((fallthrough))
++#endif
++
+ #if LINUX_VERSION_CODE < KERNEL_VERSION(3, 14, 0)
+ #ifdef __LITTLE_ENDIAN
+ #define bytemask_from_count(cnt)	(~(~0ul << (cnt)*8))
diff --git a/general/package/all-patches/wireguard-linux-compat/remove_fallthrough.patch b/general/package/all-patches/wireguard-linux-compat/remove_fallthrough.patch
deleted file mode 100644
index 4a1c8a78..00000000
--- a/general/package/all-patches/wireguard-linux-compat/remove_fallthrough.patch
+++ /dev/null
@@ -1,84 +0,0 @@
---- a/src/compat/siphash/siphash.c	2022-10-13 13:32:56.761640510 +0300
-+++ b/src/compat/siphash/siphash.c	2022-10-13 13:33:41.061624482 +0300
-@@ -77,11 +77,11 @@
- 						  bytemask_from_count(left)));
- #else
- 	switch (left) {
--	case 7: b |= ((u64)end[6]) << 48; fallthrough;
--	case 6: b |= ((u64)end[5]) << 40; fallthrough;
--	case 5: b |= ((u64)end[4]) << 32; fallthrough;
-+	case 7: b |= ((u64)end[6]) << 48;
-+	case 6: b |= ((u64)end[5]) << 40;
-+	case 5: b |= ((u64)end[4]) << 32;
- 	case 4: b |= le32_to_cpup(data); break;
--	case 3: b |= ((u64)end[2]) << 16; fallthrough;
-+	case 3: b |= ((u64)end[2]) << 16;
- 	case 2: b |= le16_to_cpup(data); break;
- 	case 1: b |= end[0];
- 	}
-@@ -109,11 +109,11 @@
- 						  bytemask_from_count(left)));
- #else
- 	switch (left) {
--	case 7: b |= ((u64)end[6]) << 48; fallthrough;
--	case 6: b |= ((u64)end[5]) << 40; fallthrough;
--	case 5: b |= ((u64)end[4]) << 32; fallthrough;
-+	case 7: b |= ((u64)end[6]) << 48;
-+	case 6: b |= ((u64)end[5]) << 40;
-+	case 5: b |= ((u64)end[4]) << 32;
- 	case 4: b |= get_unaligned_le32(end); break;
--	case 3: b |= ((u64)end[2]) << 16; fallthrough;
-+	case 3: b |= ((u64)end[2]) << 16;
- 	case 2: b |= get_unaligned_le16(end); break;
- 	case 1: b |= end[0];
- 	}
-@@ -269,11 +269,11 @@
- 						  bytemask_from_count(left)));
- #else
- 	switch (left) {
--	case 7: b |= ((u64)end[6]) << 48; fallthrough;
--	case 6: b |= ((u64)end[5]) << 40; fallthrough;
--	case 5: b |= ((u64)end[4]) << 32; fallthrough;
-+	case 7: b |= ((u64)end[6]) << 48;
-+	case 6: b |= ((u64)end[5]) << 40;
-+	case 5: b |= ((u64)end[4]) << 32;
- 	case 4: b |= le32_to_cpup(data); break;
--	case 3: b |= ((u64)end[2]) << 16; fallthrough;
-+	case 3: b |= ((u64)end[2]) << 16;
- 	case 2: b |= le16_to_cpup(data); break;
- 	case 1: b |= end[0];
- 	}
-@@ -301,11 +301,11 @@
- 						  bytemask_from_count(left)));
- #else
- 	switch (left) {
--	case 7: b |= ((u64)end[6]) << 48; fallthrough;
--	case 6: b |= ((u64)end[5]) << 40; fallthrough;
--	case 5: b |= ((u64)end[4]) << 32; fallthrough;
-+	case 7: b |= ((u64)end[6]) << 48;
-+	case 6: b |= ((u64)end[5]) << 40;
-+	case 5: b |= ((u64)end[4]) << 32;
- 	case 4: b |= get_unaligned_le32(end); break;
--	case 3: b |= ((u64)end[2]) << 16; fallthrough;
-+	case 3: b |= ((u64)end[2]) << 16;
- 	case 2: b |= get_unaligned_le16(end); break;
- 	case 1: b |= end[0];
- 	}
-@@ -426,7 +426,7 @@
- 		v0 ^= m;
- 	}
- 	switch (left) {
--	case 3: b |= ((u32)end[2]) << 16; fallthrough;
-+	case 3: b |= ((u32)end[2]) << 16;
- 	case 2: b |= le16_to_cpup(data); break;
- 	case 1: b |= end[0];
- 	}
-@@ -448,7 +448,7 @@
- 		v0 ^= m;
- 	}
- 	switch (left) {
--	case 3: b |= ((u32)end[2]) << 16; fallthrough;
-+	case 3: b |= ((u32)end[2]) << 16;
- 	case 2: b |= get_unaligned_le16(end); break;
- 	case 1: b |= end[0];
- 	}