diff --git a/read.c b/read.c
index 047807ae..5d84a13a 100644
--- a/read.c
+++ b/read.c
@@ -2055,22 +2055,24 @@ record_files (struct nameseq *filenames, const char *pattern,
 
       /* Check for special targets.  Do it here instead of, say, snap_deps()
          so that we can immediately use the value.  */
-      if (streq (name, ".POSIX"))
+      if (!posix_pedantic && streq (name, ".POSIX"))
         {
           posix_pedantic = 1;
           define_variable_cname (".SHELLFLAGS", "-ec", o_default, 0);
-          /* These default values are based on IEEE Std 1003.1-2008.  */
+          /* These default values are based on IEEE Std 1003.1-2008.
+             It requires '-O 1' for [CF]FLAGS, but GCC doesn't allow space
+             between -O and the number so omit it here.  */
           define_variable_cname ("ARFLAGS", "-rv", o_default, 0);
           define_variable_cname ("CC", "c99", o_default, 0);
-          define_variable_cname ("CFLAGS", "-O", o_default, 0);
+          define_variable_cname ("CFLAGS", "-O1", o_default, 0);
           define_variable_cname ("FC", "fort77", o_default, 0);
-          define_variable_cname ("FFLAGS", "-O 1", o_default, 0);
+          define_variable_cname ("FFLAGS", "-O1", o_default, 0);
           define_variable_cname ("SCCSGETFLAGS", "-s", o_default, 0);
         }
-      else if (streq (name, ".SECONDEXPANSION"))
+      else if (!second_expansion && streq (name, ".SECONDEXPANSION"))
         second_expansion = 1;
 #if !defined (__MSDOS__) && !defined (__EMX__)
-      else if (streq (name, ".ONESHELL"))
+      else if (!one_shell && streq (name, ".ONESHELL"))
         one_shell = 1;
 #endif
 
diff --git a/tests/scripts/targets/POSIX b/tests/scripts/targets/POSIX
index f9da8c35..c44cc500 100644
--- a/tests/scripts/targets/POSIX
+++ b/tests/scripts/targets/POSIX
@@ -34,8 +34,8 @@ my %POSIX = (AR => 'ar', ARFLAGS => '-rv',
              YACC => 'yacc', YFLAGS => '',
              LEX => 'lex', LFLAGS => '',
              LDFLAGS => '',
-             CC => 'c99', CFLAGS => '-O',
-             FC => 'fort77', FFLAGS => '-O 1',
+             CC => 'c99', CFLAGS => '-O1',
+             FC => 'fort77', FFLAGS => '-O1',
              SCCSFLAGS => '', SCCSGETFLAGS => '-s');
 my $make = join('', map { "\t\@echo '$_=\$($_)'\n" } sort keys %POSIX);
 my $r = join('', map { "$_=$POSIX{$_}\n"} sort keys %POSIX);