diff --git a/Makefile b/Makefile
index e21ddd09ea4..41b46fb2939 100644
--- a/Makefile
+++ b/Makefile
@@ -139,18 +139,21 @@ HEAD_OBJ += $(wildcard $(APPDIR)$(DELIM)import$(DELIM)startup$(DELIM)*$(OBJEXT))
 HEAD_OBJ += $(wildcard $(APPDIR)$(DELIM)builtin$(DELIM)*$(OBJEXT))
 
 .import: $(BIN) install
-	$(Q) echo "LD: nuttx"
+	$(ECHO_BEGIN)"LD: nuttx "
 	$(Q) $(LD) --entry=__start $(LDFLAGS) $(LDLIBPATH) $(EXTRA_LIBPATHS) \
 	  -L$(APPDIR)$(DELIM)import$(DELIM)scripts -T$(LDNAME) \
 	  -o nuttx$(EXEEXT) $(HEAD_OBJ) $(EXTRA_OBJS) $(LDSTARTGROUP) \
 	  $(BIN) $(LDLIBS) $(EXTRA_LIBS) $(LDENDGROUP)
+	$(ECHO_END)
 ifeq ($(CONFIG_INTELHEX_BINARY),y)
-	$(Q) echo "CP: nuttx.hex"
+	$(ECHO_BEGIN)"CP: nuttx.hex "
 	$(Q) $(OBJCOPY) $(OBJCOPYARGS) -O ihex nuttx$(EXEEXT) nuttx.hex
+	$(ECHO_END)
 endif
 ifeq ($(CONFIG_RAW_BINARY),y)
-	$(Q) echo "CP: nuttx.bin"
+	$(ECHO_BEGIN)"CP: nuttx.bin "
 	$(Q) $(OBJCOPY) $(OBJCOPYARGS) -O binary nuttx$(EXEEXT) nuttx.bin
+	$(ECHO_END)
 endif
 	$(call POSTBUILD, $(APPDIR))
 
diff --git a/boot/mcuboot/Makefile b/boot/mcuboot/Makefile
index 4b286241739..3c64dc9c9b5 100644
--- a/boot/mcuboot/Makefile
+++ b/boot/mcuboot/Makefile
@@ -21,6 +21,7 @@
 include $(APPDIR)/Make.defs
 
 MCUBOOT_VERSION := $(patsubst "%",%,$(CONFIG_MCUBOOT_VERSION))
+MCUBOOT_URL_BASE = https://github.com/mcu-tools/mcuboot/archive
 MCUBOOT_TARBALL  = $(MCUBOOT_VERSION).tar.gz
 MCUBOOT_UNPACK   = mcuboot
 MCUBOOT_SRCDIR   = $(MCUBOOT_UNPACK)$(DELIM)boot$(DELIM)bootutil$(DELIM)src
@@ -77,14 +78,14 @@ CXXFLAGS += ${INCDIR_PREFIX}mcuboot/ext/tinycrypt/lib/include
 endif
 
 $(MCUBOOT_TARBALL):
-	$(Q) echo "Downloading MCUboot-$(MCUBOOT_VERSION)"
-	$(Q) curl -O -L https://github.com/mcu-tools/mcuboot/archive/$(MCUBOOT_TARBALL)
+	$(call DOWNLOAD,$(MCUBOOT_URL_BASE),$(MCUBOOT_TARBALL))
 
 $(MCUBOOT_UNPACK): $(MCUBOOT_TARBALL)
-	$(Q) echo "Unpacking: $(MCUBOOT_TARBALL) -> $(MCUBOOT_UNPACK)"
+	$(ECHO_BEGIN)"Unpacking: $(MCUBOOT_TARBALL) -> $(MCUBOOT_UNPACK) "
 	$(Q) tar zxf $(MCUBOOT_TARBALL)
 	$(Q) mv mcuboot-$(MCUBOOT_VERSION) $(MCUBOOT_UNPACK)
 	$(Q) touch $(MCUBOOT_UNPACK)
+	$(ECHO_END)
 
 # Download and unpack tarball if no git repo found
 ifeq ($(wildcard $(MCUBOOT_UNPACK)/.git),)
diff --git a/canutils/lely-canopen/Makefile b/canutils/lely-canopen/Makefile
index 8bb3f04e4fa..1aaeb2d71ba 100644
--- a/canutils/lely-canopen/Makefile
+++ b/canutils/lely-canopen/Makefile
@@ -170,15 +170,16 @@ endif
 # Download and unpack tarball if no git repo found
 ifeq ($(wildcard $(LELYCANOPEN_SRCNAME)/.git),)
 $(LELYCANOPEN_TARBALL):
-	@echo "Downloading: $(LELYCANOPEN_TARBALL)"
-	$(Q) curl -L -O $(CONFIG_CANUTILS_LELYCANOPEN_URL)/$(LELYCANOPEN_TARBALL)
+	$(call DOWNLOAD,$(CONFIG_CANUTILS_LELYCANOPEN_URL),$(LELYCANOPEN_TARBALL))
 
 $(LELYCANOPEN_SRCNAME): $(LELYCANOPEN_TARBALL)
-	@echo "Unpacking: $(LELYCANOPEN_TARBALL) -> $(LELYCANOPEN_UNPACKNAME)"
+	$(ECHO_BEGIN)"Unpacking: $(LELYCANOPEN_TARBALL) -> $(LELYCANOPEN_UNPACKNAME) "
 	$(Q) $(UNPACK) $(LELYCANOPEN_TARBALL)
 	$(Q) mv $(LELYCANOPEN_UNPACKNAME) $(LELYCANOPEN_SRCNAME)
-	$(Q) cat 0001-NuttX-port.patch | patch -s -N -d $(LELYCANOPEN_SRCNAME) -p1
-	$(Q) echo "Patching $(LELYCANOPEN_SRCNAME)"
+	$(ECHO_END)
+	$(ECHO_BEGIN)"Patching $(LELYCANOPEN_SRCNAME) "
+	$(Q) patch -s -N -d $(LELYCANOPEN_SRCNAME) -p1 < 0001-NuttX-port.patch
+	$(ECHO_END)
 endif
 
 context:: $(LELYCANOPEN_SRCNAME)
diff --git a/crypto/libtomcrypt/Makefile b/crypto/libtomcrypt/Makefile
index 9d9e3f388c6..93500dab7b9 100644
--- a/crypto/libtomcrypt/Makefile
+++ b/crypto/libtomcrypt/Makefile
@@ -464,17 +464,18 @@ endif
 endif
 
 $(LIBTOMCRYPT_ZIP):
-	@echo "Downloading: $(LIBTOMCRYPT_ZIP)"
-	$(Q) curl -O -L $(CONFIG_LIBTOMCRYPT_URL)/$(LIBTOMCRYPT_ZIP)
+	$(call DOWNLOAD,$(CONFIG_LIBTOMCRYPT_URL),$(LIBTOMCRYPT_ZIP))
 
 $(LIBTOMCRYPT_UNPACKNAME): $(LIBTOMCRYPT_ZIP)
-	@echo "Unpacking: $(LIBTOMCRYPT_ZIP) -> $(LIBTOMCRYPT_UNPACKNAME)"
+	$(ECHO_BEGIN)"Unpacking: $(LIBTOMCRYPT_ZIP) -> $(LIBTOMCRYPT_UNPACKNAME) "
 	$(Q) $(UNPACK) $(LIBTOMCRYPT_ZIP)
 	$(Q) mv	libtomcrypt-$(LIBTOMCRYPT_VERSION) $(LIBTOMCRYPT_UNPACKNAME)
-	$(Q) echo "Patching $(LIBTOMCRYPT_UNPACKNAME)"
+	$(ECHO_END)
+	$(ECHO_BEGIN)"Patching $(LIBTOMCRYPT_UNPACKNAME) "
 	$(Q) patch -p0 < digit-bit.patch # Update deprecated macro from ltm
 	$(Q) patch -p0 < ltcrypt-flush.patch # Missing stdout flush in demo app
 	$(Q) touch $(LIBTOMCRYPT_UNPACKNAME)
+	$(ECHO_END)
 
 # Download and unpack tarball if no git repo found
 ifeq ($(wildcard $(LIBTOMCRYPT_UNPACKNAME)/.git),)
diff --git a/graphics/lvgl/Makefile b/graphics/lvgl/Makefile
index 912f87908b0..398a00d320b 100644
--- a/graphics/lvgl/Makefile
+++ b/graphics/lvgl/Makefile
@@ -95,17 +95,14 @@ LVGL_TARBALL = v$(LVGL_VERSION).zip
 
 LVGL_UNPACKNAME = lvgl
 UNPACK ?= unzip -o $(if $(V),,-q)
-CURL ?= curl -L -O $(if $(V),,-Ss)
 
 LVGL_UNPACKDIR =  $(WD)/$(LVGL_UNPACKNAME)
 
 $(LVGL_TARBALL):
-	$(ECHO_BEGIN)"Downloading: $(LVGL_TARBALL)"
-	$(Q) $(CURL) $(CONFIG_GRAPH_LVGL_URL)/$(LVGL_TARBALL)
-	$(ECHO_END)
+	$(call DOWNLOAD,$(CONFIG_GRAPH_LVGL_URL),$(LVGL_TARBALL))
 
 $(LVGL_UNPACKNAME): $(LVGL_TARBALL)
-	$(ECHO_BEGIN)"Unpacking: $(LVGL_TARBALL) -> $(LVGL_UNPACKNAME)"
+	$(ECHO_BEGIN)"Unpacking: $(LVGL_TARBALL) -> $(LVGL_UNPACKNAME) "
 	$(Q) $(UNPACK) $(LVGL_TARBALL)
 	$(Q) mv	lvgl-$(LVGL_VERSION) $(LVGL_UNPACKNAME)
 	$(Q) touch $(LVGL_UNPACKNAME)
diff --git a/industry/scpi/Makefile b/industry/scpi/Makefile
index 730bc28c7b3..c3bcd237f15 100644
--- a/industry/scpi/Makefile
+++ b/industry/scpi/Makefile
@@ -24,7 +24,6 @@ SCPI_VERSION  = 2.2
 SCPI_UNPACK   = scpi-parser
 SCPI_TARBALL  = v$(SCPI_VERSION).tar.gz
 SCPI_URL_BASE = https://github.com/j123b567/scpi-parser/archive/refs/tags
-SCPI_URL      = $(SCPI_URL_BASE)/$(SCPI_TARBALL)
 
 CSRCS += error.c fifo.c ieee488.c
 CSRCS += minimal.c parser.c units.c utils.c
@@ -51,11 +50,11 @@ VPATH += $(SCPI_UNPACK)/examples/common
 endif # CONFIG_SCPI_PARSER_DEMO
 
 $(SCPI_TARBALL):
-	$(Q) echo "Downloading $(SCPI_TARBALL)"
-	$(Q) curl -O -L $(SCPI_URL)
-	$(Q) echo "Unpacking $(SCPI_TARBALL) to $(SCPI_UNPACK)"
+	$(call DOWNLOAD,$(SCPI_URL_BASE),$(SCPI_TARBALL))
+	$(ECHO_BEGIN)"Unpacking $(SCPI_TARBALL) to $(SCPI_UNPACK) "
 	$(Q) tar xzvf $(SCPI_TARBALL)
 	$(Q) mv scpi-parser-$(SCPI_VERSION) $(SCPI_UNPACK)
+	$(ECHO_END)
 
 # Download and unpack tarball if no git repo found
 ifeq ($(wildcard $(SCPI_UNPACK)/.git),)
diff --git a/interpreters/duktape/Makefile b/interpreters/duktape/Makefile
index 699fb4f792e..630700ed757 100644
--- a/interpreters/duktape/Makefile
+++ b/interpreters/duktape/Makefile
@@ -24,7 +24,6 @@ DUKTAPE_VERSION  = 2.5.0
 DUKTAPE_UNPACK   = duktape
 DUKTAPE_TARBALL  = duktape-$(DUKTAPE_VERSION).tar.xz
 DUKTAPE_URL_BASE = https://github.com/svaarala/duktape/releases/download/
-DUKTAPE_URL      = $(DUKTAPE_URL_BASE)v$(DUKTAPE_VERSION)/$(DUKTAPE_TARBALL)
 
 CSRCS = duktape.c
 CSRCS += duk_console.c
@@ -49,15 +48,16 @@ CFLAGS += -DDUK_CMDLINE_CONSOLE_SUPPORT
 CFLAGS += -DDUK_CMDLINE_PRINTALERT_SUPPORT
 
 $(DUKTAPE_TARBALL):
-	$(Q) echo "Downloading $(DUKTAPE_TARBALL)"
-	$(Q) curl -O -L $(DUKTAPE_URL)
+	$(call DOWNLOAD,$(DUKTAPE_URL_BASE),$(DUKTAPE_TARBALL))
 
 $(DUKTAPE_UNPACK): $(DUKTAPE_TARBALL)
-	$(Q) echo "Unpacking $(DUKTAPE_TARBALL) to $(DUKTAPE_UNPACK)"
+	$(ECHO_BEGIN)"Unpacking $(DUKTAPE_TARBALL) to $(DUKTAPE_UNPACK) "
 	$(Q) tar xfJ $(DUKTAPE_TARBALL)
 	$(Q) mv duktape-$(DUKTAPE_VERSION) $(DUKTAPE_UNPACK)
-	$(Q) echo "Patching $(DUKTAPE_UNPACK)"
+	$(ECHO_END)
+	$(ECHO_BEGIN)"Patching $(DUKTAPE_UNPACK) "
 	$(Q) patch -p0 < duk_cmdline.patch
+	$(ECHO_END)
 
 $(DUKTAPE_UNPACK)/.patch: $(DUKTAPE_UNPACK)
 	$(Q) touch $(DUKTAPE_UNPACK)/.patch
diff --git a/interpreters/lua/Makefile b/interpreters/lua/Makefile
index a19582133b3..ac076725512 100644
--- a/interpreters/lua/Makefile
+++ b/interpreters/lua/Makefile
@@ -33,7 +33,6 @@ LUA_VERSION  = $(patsubst "%",%,$(strip $(CONFIG_INTERPRETER_LUA_VERSION)))
 LUA_TARBALL  = lua-$(LUA_VERSION).tar.gz
 LUA_UNPACK   = lua-$(LUA_VERSION)
 LUA_URL_BASE = http://www.lua.org/ftp
-LUA_URL      = $(LUA_URL_BASE)/$(LUA_TARBALL)
 LUA_SRC      = $(LUA_UNPACK)$(DELIM)src
 
 MAINSRC       = $(LUA_SRC)$(DELIM)lua.c
@@ -68,10 +67,10 @@ endif
 # Lua download and unpack
 
 $(LUA_TARBALL):
-	$(Q) echo "Downloading $(LUA_TARBALL)"
-	$(Q) curl -O -L $(LUA_URL)
-	$(Q) echo "Unpacking $(LUA_TARBALL) to $(LUA_UNPACK)"
+	$(call DOWNLOAD,$(LUA_URL_BASE),$(LUA_TARBALL))
+	$(ECHO_BEGIN)"Unpacking $(LUA_TARBALL) to $(LUA_UNPACK) "
 	$(Q) tar -xvzf $(LUA_TARBALL)
+	$(ECHO_END)
 
 # Download and unpack tarball if no git repo found
 ifeq ($(wildcard $(LUA_UNPACK)/.git),)
diff --git a/interpreters/lua/Module.mk b/interpreters/lua/Module.mk
index 675ef51bd4d..36406b8e576 100644
--- a/interpreters/lua/Module.mk
+++ b/interpreters/lua/Module.mk
@@ -21,10 +21,12 @@
 LUAMOD_REGISTRY = $(APPDIR)$(DELIM)interpreters$(DELIM)lua$(DELIM)registry
 
 define LUAMOD_REGISTER
-	$(Q) echo Register Lua Module: $1
+	$(ECHO_BEGIN)"Register Lua Module: $1 "
 	$(Q) echo { \"$1\", $2 }, > "$(LUAMOD_REGISTRY)$(DELIM)$1.bdat"
-	$(Q) echo "int $2(lua_State *L);" > "$(LUAMOD_REGISTRY)$(DELIM)$1.pdat"
+	$(ECHO_END)
+	$(ECHO_BEGIN)"int $2(lua_State *L);" > "$(LUAMOD_REGISTRY)$(DELIM)$1.pdat "
 	$(Q) touch "$(LUAMOD_REGISTRY)$(DELIM).updated"
+	$(ECHO_END)
 endef
 
 ifneq ($(LUAMODNAME),)
diff --git a/interpreters/luamodules/cjson/Makefile b/interpreters/luamodules/cjson/Makefile
index c5a8fb80034..7557378bbb6 100644
--- a/interpreters/luamodules/cjson/Makefile
+++ b/interpreters/luamodules/cjson/Makefile
@@ -24,21 +24,20 @@ LUACJSON_VERSION  = $(patsubst "%",%,$(strip $(CONFIG_LUA_CJSON_VERSION)))
 LUACJSON_TARBALL  = $(LUACJSON_VERSION).tar.gz
 LUACJSON_UNPACK   = lua-cjson
 LUACJSON_URL_BASE = https://github.com/openresty/lua-cjson/archive/refs/tags
-LUACJSON_URL      = $(LUACJSON_URL_BASE)/$(LUACJSON_TARBALL)
 LUACJSON_SRC      = $(LUACJSON_UNPACK)
 
 VPATH += lua-cjson
 CSRCS = lua_cjson.c strbuf.c fpconv.c
 
 $(LUACJSON_TARBALL):
-	$(Q) echo "Downloading $(LUACJSON_TARBALL) from $(LUACJSON_URL)"
-	$(Q) curl -O -L $(LUACJSON_URL)
+	$(call DOWNLOAD,$(LUACJSON_URL_BASE),$(LUACJSON_TARBALL))
 
 $(LUACJSON_UNPACK): $(LUACJSON_TARBALL)
-	$(Q) echo "Unpacking $(LUACJSON_TARBALL) to $(LUACJSON_UNPACK)"
+	$(ECHO_BEGIN)"Unpacking $(LUACJSON_TARBALL) to $(LUACJSON_UNPACK) "
 	$(Q) tar -xvzf $(LUACJSON_TARBALL)
 	$(Q) mv lua-cjson-$(LUACJSON_VERSION) $(LUACJSON_UNPACK)
 	$(Q) patch -d $(LUACJSON_UNPACK) -p1 < 0001-fix-compile-warnings.patch
+	$(ECHO_END)
 
 $(LUACJSON_UNPACK)/.patch: $(LUACJSON_UNPACK)
 	touch $(LUACJSON_UNPACK)/.patch
diff --git a/interpreters/luamodules/lfs/Makefile b/interpreters/luamodules/lfs/Makefile
index 2987ff3c244..d4a7fb7a284 100644
--- a/interpreters/luamodules/lfs/Makefile
+++ b/interpreters/luamodules/lfs/Makefile
@@ -24,21 +24,20 @@ LFS_VERSION  = $(patsubst "%",%,$(strip $(CONFIG_LUA_LFS_VERSION)))
 LFS_TARBALL  = v$(LFS_VERSION).tar.gz
 LFS_UNPACK   = lfs
 LFS_URL_BASE = https://github.com/lunarmodules/luafilesystem/archive/refs/tags
-LFS_URL      = $(LFS_URL_BASE)/$(LFS_TARBALL)
 LFS_SRC      = $(LFS_UNPACK)$(DELIM)src
 
 VPATH += $(LFS_SRC)
 CSRCS = lfs.c
 
 $(LFS_TARBALL):
-	$(Q) echo "Downloading $(LFS_TARBALL) from $(LFS_URL)"
-	$(Q) curl -O -L $(LFS_URL)
+	$(call DOWNLOAD,$(LFS_URL_BASE),$(LFS_TARBALL))
 
 $(LFS_UNPACK): $(LFS_TARBALL)
-	$(Q) echo "Unpacking $(LFS_TARBALL) to $(LFS_UNPACK)"
+	$(ECHO_BEGIN)"Unpacking $(LFS_TARBALL) to $(LFS_UNPACK) "
 	$(Q) tar -xvzf $(LFS_TARBALL)
 	$(Q) mv luafilesystem-$(LFS_VERSION) $(LFS_UNPACK)
 	$(Q) patch -d $(LFS_UNPACK) -p1 < 0001-call-symlink-or-link-directly.patch
+	$(ECHO_END)
 
 $(LFS_UNPACK)/.patch: $(LFS_UNPACK)
 	touch $(LFS_UNPACK)/.patch
diff --git a/interpreters/luamodules/luasyslog/Makefile b/interpreters/luamodules/luasyslog/Makefile
index 52f188d3520..f1acdd39999 100644
--- a/interpreters/luamodules/luasyslog/Makefile
+++ b/interpreters/luamodules/luasyslog/Makefile
@@ -24,7 +24,6 @@ LSYSLOG_VERSION  = $(patsubst "%",%,$(strip $(CONFIG_LUA_LSYSLOG_VERSION)))
 LSYSLOG_TARBALL  = $(LSYSLOG_VERSION).tar.gz
 LSYSLOG_UNPACK   = lsyslog
 LSYSLOG_URL_BASE = https://github.com/lunarmodules/luasyslog/archive/refs/tags
-LSYSLOG_URL      = $(LSYSLOG_URL_BASE)/$(LSYSLOG_TARBALL)
 LSYSLOG_SRC      = $(LSYSLOG_UNPACK)
 
 VPATH += $(LSYSLOG_SRC)
@@ -34,13 +33,13 @@ CFLAGS += -D'openlog(a,b,c)={(void)a; (void)c;}'
 CFLAGS += -D'closelog()={}'
 
 $(LSYSLOG_TARBALL):
-	$(Q) echo "Downloading $(LSYSLOG_TARBALL) from $(LSYSLOG_URL)"
-	$(Q) curl -O -L $(LSYSLOG_URL)
+	$(call DOWNLOAD,$(LSYSLOG_URL_BASE),$(LSYSLOG_TARBALL))
 
 $(LSYSLOG_UNPACK): $(LSYSLOG_TARBALL)
-	$(Q) echo "Unpacking $(LSYSLOG_TARBALL) to $(LSYSLOG_UNPACK)"
+	$(ECHO_BEGIN)"Unpacking $(LSYSLOG_TARBALL) to $(LSYSLOG_UNPACK) "
 	$(Q) tar -xvzf $(LSYSLOG_TARBALL)
 	$(Q) mv luasyslog-$(LSYSLOG_VERSION) $(LSYSLOG_UNPACK)
+	$(ECHO_END)
 
 $(LSYSLOG_UNPACK)/.patch: $(LSYSLOG_UNPACK)
 	touch $(LSYSLOG_UNPACK)/.patch
diff --git a/interpreters/luamodules/luv/Makefile b/interpreters/luamodules/luv/Makefile
index 9eb0111639d..5a5bc6b3617 100644
--- a/interpreters/luamodules/luv/Makefile
+++ b/interpreters/luamodules/luv/Makefile
@@ -26,7 +26,6 @@ LUV_VERSION  = $(patsubst "%",%,$(strip $(CONFIG_LUA_LUV_VERSION)))
 LUV_TARBALL  = luv-$(LUV_VERSION).tar.gz
 LUV_UNPACK   = luv
 LUV_URL_BASE = https://github.com/luvit/luv/releases/download/
-LUV_URL      = $(LUV_URL_BASE)/$(LUV_VERSION)/$(LUV_TARBALL)
 LUV_SRC      = $(LUV_UNPACK)$(DELIM)src
 
 VPATH += $(LUV_SRC)
@@ -35,14 +34,14 @@ CSRCS = luv.c
 # Luv download and unpack
 
 $(LUV_TARBALL):
-	$(Q) echo "Downloading $(LUV_TARBALL)"
-	$(Q) curl -O -L $(LUV_URL)
+	$(call DOWNLOAD,$(LUV_URL_BASE),$(LUV_TARBALL))
 
 $(LUV_UNPACK): $(LUV_TARBALL)
-	$(Q) echo "Unpacking $(LUV_TARBALL) to $(LUV_UNPACK)"
+	$(ECHO_BEGIN)"Unpacking $(LUV_TARBALL) to $(LUV_UNPACK) "
 	$(Q) tar -xvzf $(LUV_TARBALL)
 	$(Q) mv luv-$(LUV_VERSION) $(LUV_UNPACK)
 	$(Q) patch -d $(LUV_UNPACK) -p1 < 0001-fix-compile-warnings.patch
+	$(ECHO_END)
 
 $(LUV_UNPACK)/.patch: $(LUV_UNPACK)
 	touch $(LUV_UNPACK)/.patch
diff --git a/interpreters/quickjs/Makefile b/interpreters/quickjs/Makefile
index 7fc84662186..b1ca02cf885 100644
--- a/interpreters/quickjs/Makefile
+++ b/interpreters/quickjs/Makefile
@@ -24,7 +24,6 @@ QUICKJS_VERSION  = 2020-11-08
 QUICKJS_UNPACK   = quickjs
 QUICKJS_TARBALL  = quickjs-$(QUICKJS_VERSION).tar.xz
 QUICKJS_URL_BASE = https://bellard.org/quickjs/
-QUICKJS_URL      = $(QUICKJS_URL_BASE)/$(QUICKJS_TARBALL)
 
 CSRCS = quickjs.c libregexp.c libbf.c libunicode.c cutils.c
 
@@ -60,14 +59,14 @@ MODULE    = $(CONFIG_INTERPRETERS_QUICKJS)
 endif
 
 $(QUICKJS_TARBALL):
-	$(Q) echo "Downloading $(QUICKJS_TARBALL)"
-	$(Q) curl -O -L $(QUICKJS_URL)
+	$(call DOWNLOAD,$(QUICKJS_URL_BASE),$(QUICKJS_TARBALL))
 
 $(QUICKJS_UNPACK): $(QUICKJS_TARBALL)
-	$(Q) echo "Unpacking $(QUICKJS_TARBALL) to $(QUICKJS_UNPACK)"
+	$(ECHO_BEGIN)"Unpacking $(QUICKJS_TARBALL) to $(QUICKJS_UNPACK) "
 	$(Q) tar -Jxf $(QUICKJS_TARBALL)
 	$(Q) mv quickjs-$(QUICKJS_VERSION) $(QUICKJS_UNPACK)
 	$(Q) patch -d $(QUICKJS_UNPACK) -p1 < 0001-Disabled-unsupported-feature-on-NuttX.patch
+	$(ECHO_END)
 
 $(QUICKJS_UNPACK)/.patch: $(QUICKJS_UNPACK)
 	$(Q) touch $(QUICKJS_UNPACK)/.patch
diff --git a/interpreters/toywasm/Makefile b/interpreters/toywasm/Makefile
index f5cfd0fe5ba..a39729938ac 100644
--- a/interpreters/toywasm/Makefile
+++ b/interpreters/toywasm/Makefile
@@ -73,21 +73,20 @@ TOYWASM_VERSION  = 5a1d6bf349571e0b63a9d02d73e01b8e212fb8c0
 TOYWASM_UNPACK   = toywasm
 TOYWASM_TARBALL  = $(TOYWASM_VERSION).zip
 TOYWASM_URL_BASE = https://github.com/yamt/toywasm/archive/
-TOYWASM_URL      = $(TOYWASM_URL_BASE)/$(TOYWASM_TARBALL)
 
 VPATH += $(TOYWASM_UNPACK)/cli
 VPATH += $(TOYWASM_UNPACK)/lib
 VPATH += src
 
 $(TOYWASM_TARBALL):
-	$(Q) echo "Downloading $(TOYWASM_TARBALL)"
-	$(Q) curl -O -L $(TOYWASM_URL)
+	$(call DOWNLOAD,$(TOYWASM_URL_BASE),$(TOYWASM_TARBALL))
 
 $(TOYWASM_UNPACK): $(TOYWASM_TARBALL)
-	$(Q) echo "Unpacking $(TOYWASM_TARBALL) to $(TOYWASM_UNPACK)"
+	$(ECHO_BEGIN)"Unpacking $(TOYWASM_TARBALL) to $(TOYWASM_UNPACK) "
 	$(Q) unzip $(TOYWASM_TARBALL)
 	$(Q) mv toywasm-$(TOYWASM_VERSION) $(TOYWASM_UNPACK)
 	$(Q) touch $(TOYWASM_UNPACK)
+	$(ECHO_END)
 
 # Download and unpack tarball if no git repo found
 ifeq ($(wildcard $(TOYWASM_UNPACK)/.git),)
diff --git a/interpreters/wamr/Makefile b/interpreters/wamr/Makefile
index 45d36828260..33919e6ec8a 100644
--- a/interpreters/wamr/Makefile
+++ b/interpreters/wamr/Makefile
@@ -25,7 +25,6 @@ WAMR_UNPACK   = wamr
 
 WAMR_TARBALL  = $(WAMR_VERSION).zip
 WAMR_URL_BASE = https://github.com/bytecodealliance/wasm-micro-runtime/archive/
-WAMR_URL      = $(WAMR_URL_BASE)/$(WAMR_TARBALL)
 
 -include $(WAMR_UNPACK)/product-mini/platforms/nuttx/wamr.mk
 
@@ -41,14 +40,14 @@ MODULE    = $(CONFIG_INTERPRETERS_WAMR)
 endif
 
 $(WAMR_TARBALL):
-	$(Q) echo "Downloading $(WAMR_TARBALL)"
-	$(Q) curl -O -L $(WAMR_URL)
+	$(call DOWNLOAD,$(WAMR_URL_BASE),$(WAMR_TARBALL))
 
 $(WAMR_UNPACK): $(WAMR_TARBALL)
-	$(Q) echo "Unpacking $(WAMR_TARBALL) to $(WAMR_UNPACK)"
+	$(ECHO_BEGIN)"Unpacking $(WAMR_TARBALL) to $(WAMR_UNPACK) "
 	$(Q) unzip $(WAMR_TARBALL)
 	$(Q) mv wasm-micro-runtime-$(WAMR_VERSION) $(WAMR_UNPACK)
 	$(Q) touch $(WAMR_UNPACK)
+	$(ECHO_END)
 
 # Download and unpack tarball if no git repo found
 ifeq ($(wildcard $(WAMR_UNPACK)/.git),)
diff --git a/interpreters/wasm3/Makefile b/interpreters/wasm3/Makefile
index eeb9aa3d404..e14f1221d35 100644
--- a/interpreters/wasm3/Makefile
+++ b/interpreters/wasm3/Makefile
@@ -24,7 +24,6 @@ WASM3_VERSION  = 0.4.7
 WASM3_UNPACK   = wasm3
 WASM3_TARBALL  = v$(WASM3_VERSION).tar.gz
 WASM3_URL_BASE = https://github.com/wasm3/wasm3/archive
-WASM3_URL      = $(WASM3_URL_BASE)/$(WASM3_TARBALL)
 
 MAINSRC = main.c
 
@@ -60,13 +59,13 @@ STACKSIZE = $(CONFIG_INTERPRETERS_WASM3_STACKSIZE)
 MODULE    = $(CONFIG_INTERPRETERS_WASM3)
 
 $(WASM3_TARBALL):
-	$(Q) echo "Downloading $(WASM3_TARBALL)"
-	$(Q) curl -O -L $(WASM3_URL)
+	$(call DOWNLOAD,$(WASM3_URL_BASE),$(WASM3_TARBALL))
 
 $(WASM3_UNPACK): $(WASM3_TARBALL)
-	$(Q) echo "Unpacking $(WASM3_TARBALL) to $(WASM3_UNPACK)"
+	$(ECHO_BEGIN)"Unpacking $(WASM3_TARBALL) to $(WASM3_UNPACK) "
 	$(Q) tar xzvf $(WASM3_TARBALL)
 	$(Q) mv wasm3-$(WASM3_VERSION) $(WASM3_UNPACK)
+	$(ECHO_END)
 
 # Download and unpack tarball if no git repo found
 ifeq ($(wildcard $(WASM3_UNPACK)/.git),)
diff --git a/netutils/mqttc/Makefile b/netutils/mqttc/Makefile
index 22d5c77c97f..94bd040c2c8 100644
--- a/netutils/mqttc/Makefile
+++ b/netutils/mqttc/Makefile
@@ -24,6 +24,7 @@ MQTTC_VERSION := $(patsubst "%",%,$(CONFIG_NETUTILS_MQTTC_VERSION))
 MQTTC_TARBALL  = $(MQTTC_VERSION).tar.gz
 MQTTC_UNPACK   = MQTT-C
 MQTTC_SRCDIR   = $(MQTTC_UNPACK)$(DELIM)src
+MQTTC_URL_BASE = https://github.com/LiamBindle/MQTT-C/archive
 
 DEPPATH += --dep-path $(MQTTC_SRCDIR)
 VPATH   += :$(MQTTC_SRCDIR)
@@ -31,8 +32,7 @@ VPATH   += :$(MQTTC_SRCDIR)
 CSRCS := $(notdir $(wildcard $(MQTTC_SRCDIR)$(DELIM)*.c))
 
 $(MQTTC_TARBALL):
-	$(Q) echo "Downloading MQTT-C-$(MQTTC_VERSION)"
-	$(Q) curl -O -L https://github.com/LiamBindle/MQTT-C/archive/$(MQTTC_TARBALL)
+	$(call DOWNLOAD,$(MQTTC_URL_BASE),$(MQTTC_TARBALL))
 
 $(MQTTC_UNPACK): $(MQTTC_TARBALL)
 	$(Q) tar zxf $(MQTTC_TARBALL)
diff --git a/system/argtable3/Makefile b/system/argtable3/Makefile
index d2daf46aa50..934f0a30862 100644
--- a/system/argtable3/Makefile
+++ b/system/argtable3/Makefile
@@ -22,6 +22,7 @@ include $(APPDIR)/Make.defs
 
 ARGTABLE3_VERSION := $(patsubst "%",%,$(CONFIG_SYSTEM_ARGTABLE3_VERSION))
 ARGTABLE3_TARBALL  = v$(ARGTABLE3_VERSION).tar.gz
+ARGTABLE3_URL_BASE = https://github.com/argtable/argtable3/archive
 ARGTABLE3_UNPACK   = argtable3
 ARGTABLE3_SRCDIR   = $(ARGTABLE3_UNPACK)$(DELIM)src
 ARGTABLE3_TESTSDIR = $(ARGTABLE3_UNPACK)$(DELIM)tests
@@ -65,10 +66,7 @@ ifneq "$(shell $(CC) --version | grep clang)" ""
 endif
 
 $(ARGTABLE3_TARBALL):
-	$(Q) echo "Downloading argtable3-$(ARGTABLE3_VERSION)"
-	$(Q) echo "$(ARGTABLE3_SRCDIR)"
-	$(Q) echo "$(ARGTABLE3_TARBALL)--$(ARGTABLE3_UNPACK)"
-	$(Q) curl -O -L https://github.com/argtable/argtable3/archive/$(ARGTABLE3_TARBALL)
+	$(call DOWNLOAD,$(ARGTABLE3_URL_BASE),$(ARGTABLE3_TARBALL))
 
 $(ARGTABLE3_UNPACK): $(ARGTABLE3_TARBALL)
 	$(Q) tar zxf $(ARGTABLE3_TARBALL)
diff --git a/testing/iozone/Makefile b/testing/iozone/Makefile
index 81d36a08e61..c641ebce870 100644
--- a/testing/iozone/Makefile
+++ b/testing/iozone/Makefile
@@ -44,16 +44,17 @@ IOZONE_VERSION = $(patsubst "%",%,$(strip $(CONFIG_TESTING_IOZONE_VERSION)))
 IOZONE_ZIP = iozone$(IOZONE_VERSION).tgz
 
 $(IOZONE_ZIP):
-	@echo "Downloading: $(IOZONE_ZIP)"
-	$(Q) curl -O -L $(CONFIG_TESTING_IOZONE_URL)/$(IOZONE_ZIP)
+	$(call DOWNLOAD,$(CONFIG_TESTING_IOZONE_URL),$(IOZONE_ZIP))
 
 $(IOZONE_UNPACKNAME): $(IOZONE_ZIP)
-	@echo "Unpacking: $(IOZONE_ZIP) -> $(IOZONE_UNPACKNAME)"
+	$(ECHO_BEGIN)"Unpacking: $(IOZONE_ZIP) -> $(IOZONE_UNPACKNAME)"
 	$(Q) tar zxvf $(IOZONE_ZIP)
 	$(Q) mv iozone$(IOZONE_VERSION) $(IOZONE_UNPACKNAME)
-	$(Q) echo "Patching $(IOZONE_UNPACKNAME)"
-	$(Q) cat iozone.patch | patch -s -N -d $(IOZONE_UNPACKNAME) -p1
+	$(ECHO_END)
+	$(ECHO_BEGIN)"Patching $(IOZONE_UNPACKNAME)"
+	$(Q) patch -s -N -d $(IOZONE_UNPACKNAME) -p1 < iozone.patch
 	$(Q) touch $(IOZONE_UNPACKNAME)
+	$(ECHO_END)
 
 # Download and unpack tarball if no git repo found
 ifeq ($(wildcard $(IOZONE_UNPACKNAME)/.git),)
diff --git a/testing/ltp/Makefile b/testing/ltp/Makefile
index d21e0a6a6ad..3eaaa763e88 100644
--- a/testing/ltp/Makefile
+++ b/testing/ltp/Makefile
@@ -175,10 +175,11 @@ CFLAGS += -Wno-unused-variable -Wno-unused-function -Wno-unused-but-set-variable
 CFLAGS += -Wno-incompatible-pointer-types -Wno-overflow -Wno-int-to-pointer-cast
 
 $(LTP_UNPACK):
-	$(Q) echo "git clone $(LTP_URL)"
+	$(ECHO_BEGIN)"git clone $(LTP_URL) "
 	$(Q) git clone $(LTP_URL)
 	$(Q) git -C $(LTP_UNPACK) am < 0001-Fix-static-struct-warning.patch
 	$(Q) git -C $(LTP_UNPACK) am < 0002-Use-ifdef-instead-of-if-for-__linux__.patch
+	$(ECHO_END)
 
 # Download and unpack tarball if no git repo found
 ifeq ($(wildcard $(LTP_UNPACK)/.git),)