diff --git a/py/makeqstrdata.py b/py/makeqstrdata.py
index 74133657122468f26c26821349e159b73300fb53..81b003545170392507116c8201688d03aa00e03e 100644
--- a/py/makeqstrdata.py
+++ b/py/makeqstrdata.py
@@ -26,6 +26,7 @@ def compute_hash(qstr):
 def do_work(infiles):
     # read the qstrs in from the input files
     qstrs = {}
+    cpp_header_blocks = 3
     for infile in infiles:
         with open(infile, 'rt') as f:
             line_number = 0
@@ -37,6 +38,14 @@ def do_work(infiles):
                 if len(line) == 0 or line.startswith('//'):
                     continue
 
+                # We'll have 3 line-number lines for py/qstrdefs.h - initial, leaving it to
+                # go into other headers, and returning to it.
+                if line.startswith('# ') and 'py/qstrdefs.h' in line:
+                    cpp_header_blocks -= 1
+                    continue
+                if cpp_header_blocks != 0:
+                    continue
+
                 # verify line is of the correct form
                 match = re.match(r'Q\((.+)\)$', line)
                 if not match:
diff --git a/py/py.mk b/py/py.mk
index ecc4a6a0dcb2ed18f6cc215d38596ff3db863428..23ba9ebe743325acb860fff2578bbc48ebbb4475 100644
--- a/py/py.mk
+++ b/py/py.mk
@@ -104,9 +104,10 @@ $(PY_BUILD)/py-version.h: FORCE
 # Adding an order only dependency on $(PY_BUILD) causes $(PY_BUILD) to get
 # created before we run the script to generate the .h
 $(PY_BUILD)/qstrdefs.generated.h: | $(PY_BUILD)/
-$(PY_BUILD)/qstrdefs.generated.h: $(PY_QSTR_DEFS) $(QSTR_DEFS) $(PY_SRC)/makeqstrdata.py
+$(PY_BUILD)/qstrdefs.generated.h: $(PY_QSTR_DEFS) $(QSTR_DEFS) $(PY_SRC)/makeqstrdata.py mpconfigport.h $(PY_SRC)/mpconfig.h
 	$(ECHO) "makeqstrdata $(PY_QSTR_DEFS) $(QSTR_DEFS)"
-	$(Q)$(PYTHON) $(PY_SRC)/makeqstrdata.py $(PY_QSTR_DEFS) $(QSTR_DEFS) > $@
+	$(CPP) $(CFLAGS) $(PY_QSTR_DEFS) -o $(PY_BUILD)/qstrdefs.preprocessed.h
+	$(Q)$(PYTHON) $(PY_SRC)/makeqstrdata.py $(PY_BUILD)/qstrdefs.preprocessed.h $(QSTR_DEFS) > $@
 
 # We don't know which source files actually need the generated.h (since
 # it is #included from str.h). The compiler generated dependencies will cause
diff --git a/py/qstrdefs.h b/py/qstrdefs.h
index 17948434b4a3bd4c9d8d172ac0812bd47f04bded..eb72fd265f67f32597f4e1b54c99e62bc1776eac 100644
--- a/py/qstrdefs.h
+++ b/py/qstrdefs.h
@@ -1,6 +1,6 @@
+#include "mpconfig.h"
 // All the qstr definitions in this file are available as constants.
 // That is, they are in ROM and you can reference them simply as MP_QSTR_xxxx.
-// TODO make it so we can use #defines here to select only those words that will be used
 
 Q(__build_class__)
 Q(__class__)