diff --git a/mkspecs/features/lex.prf b/mkspecs/features/lex.prf
index 43d8fbd03817f5d21e9ed10bc8372ed239d91383..19ffe1932cd8eeea4bbcdfcc95f7ecf0fa8515ce 100644
--- a/mkspecs/features/lex.prf
+++ b/mkspecs/features/lex.prf
@@ -10,13 +10,22 @@
     } else {
         lex.variable_out = GENERATED_SOURCES
     }
-    isEmpty(QMAKE_LEXFLAGS_MANGLE):QMAKE_LEXFLAGS_MANGLE = -P${QMAKE_FILE_BASE}
-    QMAKE_LEXEXTRAFLAGS = $$QMAKE_LEXFLAGS
-    !yacc_no_name_mangle:QMAKE_LEXEXTRAFLAGS += $$QMAKE_LEXFLAGS_MANGLE
 
-    lex.commands = $$QMAKE_LEX $$QMAKE_LEXEXTRAFLAGS ${QMAKE_FILE_IN}$$escape_expand(\\n\\t) \
-                   $$QMAKE_DEL_FILE $${QMAKE_CPP_MOD_MOC}${QMAKE_FILE_BASE}_lex$${first(QMAKE_EXT_CPP)}$$escape_expand(\\n\\t) \
-                   $$QMAKE_MOVE lex.${QMAKE_FILE_BASE}.c $${QMAKE_CPP_MOD_MOC}${QMAKE_FILE_BASE}_lex$${first(QMAKE_EXT_CPP)}$$escape_expand(\\n\\t)
+    contains(QMAKE_LEX, .*flex) {
+        # GNU flex, we can use -o outfile
+        lex.commands = $$QMAKE_LEX $$QMAKE_LEXFLAGS --nounistd -o ${QMAKE_FILE_OUT} ${QMAKE_FILE_IN}
+    } else {
+        # stupid POSIX lex, it only generates a file called lex.yy.c
+        # or lex.prefix.c if the -P<prefix> option is active
+        intermediate_file = lex.yy.c
+        QMAKE_LEXEXTRAFLAGS = $$QMAKE_LEXFLAGS $$QMAKE_LEXFLAGS_MANGLE
+
+        lex.commands = \
+                   -$(DEL_FILE) ${QMAKE_FILE_OUT}$$escape_expand(\\n\\t) \
+                   $$QMAKE_LEX $$QMAKE_LEXEXTRAFLAGS ${QMAKE_FILE_IN}$$escape_expand(\\n\\t) \
+                   $(MOVE) $$intermediate_file ${QMAKE_FILE_OUT} $$escape_expand(\\n\\t)
+        unset(intermediate_file)
+    }
     lex.output = $${QMAKE_CPP_MOD_MOC}${QMAKE_FILE_BASE}_lex$${first(QMAKE_EXT_CPP)}
 
     silent:lex.commands = @echo Lex ${QMAKE_FILE_IN} && $$lex.commands