return -1;
        }
 
-       fputs(str_get(&autoconf_cmd), out);
-
-       fprintf(out, "\n%s: $(deps_config)\n\n", autoconf_name);
+       fprintf(out, "autoconfig := %s\n", autoconf_name);
 
-       env_write_dep(out, autoconf_name);
-
-       fprintf(out, "\n$(deps_config): ;\n");
+       fputs(str_get(&autoconf_cmd), out);
 
        fflush(out);
        ret = ferror(out); /* error check for all fprintf() calls */
 
        VAR_RECURSIVE,
        VAR_APPEND,
 };
-void env_write_dep(FILE *f, const char *auto_conf_name);
+void env_write_dep(struct gstr *gs);
 void variable_add(const char *name, const char *value,
                  enum variable_flavor flavor);
 void variable_all_del(void);
 
 
        autoconf_cmd = str_new();
 
-       str_printf(&autoconf_cmd, "deps_config := \\\n");
+       str_printf(&autoconf_cmd, "\ndeps_config := \\\n");
 
        zconf_initscan(name);
 
                yydebug = 1;
        yyparse();
 
+       str_printf(&autoconf_cmd,
+                  "\n"
+                  "$(autoconfig): $(deps_config)\n"
+                  "$(deps_config): ;\n");
+
+       env_write_dep(&autoconf_cmd);
+
        /* Variables are expanded in the parse phase. We can free them here. */
        variable_all_del();
 
 
        return xstrdup(value);
 }
 
-void env_write_dep(FILE *f, const char *autoconfig_name)
+void env_write_dep(struct gstr *s)
 {
        struct env *e, *tmp;
 
        list_for_each_entry_safe(e, tmp, &env_list, node) {
-               fprintf(f, "ifneq \"$(%s)\" \"%s\"\n", e->name, e->value);
-               fprintf(f, "%s: FORCE\n", autoconfig_name);
-               fprintf(f, "endif\n");
+               str_printf(s,
+                          "\n"
+                          "ifneq \"$(%s)\" \"%s\"\n"
+                          "$(autoconfig): FORCE\n"
+                          "endif\n",
+                          e->name, e->value);
                env_del(e);
        }
 }