diff --git a/py/mkenv.mk b/py/mkenv.mk
index 87e92ec6f9d6b054fe4cc86148717230f335e96b..04e7acc1bfc9b7b3b82402b76f0756596aaf1516 100644
--- a/py/mkenv.mk
+++ b/py/mkenv.mk
@@ -42,6 +42,7 @@ ECHO = @echo
 CP = cp
 MKDIR = mkdir
 SED = sed
+CAT = cat
 PYTHON = python3
 
 AS = $(CROSS_COMPILE)as
diff --git a/py/py.mk b/py/py.mk
index 0fbc9f14bbe3c7feda8acaa6ec104f24eb6dd67d..3d8d849e2b57f5235ba6b9705ec95307bb29d7ee 100644
--- a/py/py.mk
+++ b/py/py.mk
@@ -338,7 +338,7 @@ MPCONFIGPORT_MK = $(wildcard mpconfigport.mk)
 # the lines in "" and then unwrap after the preprocessor is finished.
 $(HEADER_BUILD)/qstrdefs.generated.h: $(PY_QSTR_DEFS) $(QSTR_DEFS) $(QSTR_DEFS_COLLECTED) $(PY_SRC)/makeqstrdata.py mpconfigport.h $(MPCONFIGPORT_MK) $(PY_SRC)/mpconfig.h | $(HEADER_BUILD)
 	$(ECHO) "GEN $@"
-	$(Q)cat $(PY_QSTR_DEFS) $(QSTR_DEFS) $(QSTR_DEFS_COLLECTED) | $(SED) 's/^Q(.*)/"&"/' | $(CPP) $(CFLAGS) - | $(SED) 's/^"\(Q(.*)\)"/\1/' > $(HEADER_BUILD)/qstrdefs.preprocessed.h
+	$(Q)$(CAT) $(PY_QSTR_DEFS) $(QSTR_DEFS) $(QSTR_DEFS_COLLECTED) | $(SED) 's/^Q(.*)/"&"/' | $(CPP) $(CFLAGS) - | $(SED) 's/^\"\(Q(.*)\)\"/\1/' > $(HEADER_BUILD)/qstrdefs.preprocessed.h
 	$(Q)$(PYTHON) $(PY_SRC)/makeqstrdata.py $(HEADER_BUILD)/qstrdefs.preprocessed.h > $@
 
 # build a list of registered modules for py/objmodule.c.