Implement the -MG option (SF RFE 1564264)
authorH. Peter Anvin <hpa@zytor.com>
Mon, 24 Sep 2007 20:41:58 +0000 (13:41 -0700)
committerH. Peter Anvin <hpa@zytor.com>
Mon, 24 Sep 2007 20:41:58 +0000 (13:41 -0700)
Implement the -MG option, to generate dependencies in the presence of
generated files.  In the end, we probably need to support the full
gamut of GCC-like dependency-generation options.

doc/nasmdoc.src
nasm.c
preproc.c

index cdcb6b9..103f40f 100644 (file)
@@ -16,6 +16,7 @@
 \IR{-F} \c{-F} option
 \IR{-I} \c{-I} option
 \IR{-M} \c{-M} option
+\IR{-MG} \c{-MG} option
 \IR{-On} \c{-On} option
 \IR{-P} \c{-P} option
 \IR{-U} \c{-U} option
@@ -519,6 +520,14 @@ This can be redirected to a file for further processing. For example:
 \c NASM -M myfile.asm > myfile.dep
 
 
+\S{opt-MG} The \i\c{-MG} Option: Generate \i{Makefile Dependencies}.
+
+This option can be used to generate makefile dependencies on stdout.
+This differs from the \c{-M} option in that if a nonexisting file is
+encountered, it is assumed to be a generated file and is added to the
+dependency list without a prefix.
+
+
 \S{opt-F} The \i\c{-F} Option: Selecting a \i{Debug Information Format}
 
 This option is used to select the format of the debug information emitted 
diff --git a/nasm.c b/nasm.c
index d20fd26..5fa3ebb 100644 (file)
--- a/nasm.c
+++ b/nasm.c
@@ -80,7 +80,8 @@ static Preproc *preproc;
 enum op_type {
     op_normal,                  /* Preprocess and assemble */
     op_preprocess,              /* Preprocess only */
-    op_depend                   /* Generate dependencies */
+    op_depend,                  /* Generate dependencies */
+    op_depend_missing_ok,      /* Generate dependencies, missing OK */
 };
 static enum op_type operating_mode;
 
@@ -196,6 +197,9 @@ int main(int argc, char **argv)
     }
 
     switch (operating_mode) {
+    case op_depend_missing_ok:
+       pp_include_path(NULL);  /* "assume generated" */
+       /* fall through */
     case op_depend:
         {
             char *line;
@@ -479,7 +483,8 @@ static int process_arg(char *p, char *q)
             printf
                 ("    -e          preprocess only (writes output to stdout by default)\n"
                  "    -a          don't preprocess (assemble only)\n"
-                 "    -M          generate Makefile dependencies on stdout\n\n"
+                 "    -M          generate Makefile dependencies on stdout\n"
+                 "    -MG         d:o, missing files assumed generated\n\n"
                  "    -E<file>    redirect error messages to file\n"
                  "    -s          redirect error messages to stdout\n\n"
                  "    -F format   select a debugging format\n\n"
@@ -553,7 +558,7 @@ static int process_arg(char *p, char *q)
             }
             break;
         case 'M':
-            operating_mode = op_depend;
+            operating_mode = p[2] == 'G' ? op_depend_missing_ok : op_depend;
             break;
 
         case '-':
index b3e32d1..4de749d 100644 (file)
--- a/preproc.c
+++ b/preproc.c
@@ -1178,6 +1178,19 @@ static FILE *inc_fopen(char *file)
             break;
         prefix = ip->path;
         ip = ip->next;
+
+       if (!prefix) {
+               /* -MG given and file not found */
+               if (pass == 0) {
+                       namelen += strlen(file) + 1;
+                       if (namelen > 62) {
+                               printf(" \\\n  ");
+                               namelen = 2;
+                       }
+                       printf(" %s", file);
+               }
+           return NULL;
+       }
     }
 
     error(ERR_FATAL, "unable to open include file `%s'", file);
@@ -1868,14 +1881,19 @@ static int do_directive(Token * tline)
         inc->next = istk;
         inc->conds = NULL;
         inc->fp = inc_fopen(p);
-        inc->fname = src_set_fname(p);
-        inc->lineno = src_set_linnum(0);
-        inc->lineinc = 1;
-        inc->expansion = NULL;
-        inc->mstk = NULL;
-        istk = inc;
-        list->uplevel(LIST_INCLUDE);
-        free_tlist(origline);
+       if (!inc->fp && pass == 0) {
+           /* -MG given but file not found */
+           nasm_free(inc);
+       } else {
+           inc->fname = src_set_fname(p);
+           inc->lineno = src_set_linnum(0);
+           inc->lineinc = 1;
+           inc->expansion = NULL;
+           inc->mstk = NULL;
+           istk = inc;
+           list->uplevel(LIST_INCLUDE);
+       }
+       free_tlist(origline);
         return DIRECTIVE_FOUND;
 
     case PP_PUSH:
@@ -3897,9 +3915,9 @@ static void pp_cleanup(int pass)
 void pp_include_path(char *path)
 {
     IncPath *i;
-/*  by alexfru: order of path inclusion fixed (was reverse order) */
+
     i = nasm_malloc(sizeof(IncPath));
-    i->path = nasm_strdup(path);
+    i->path = path ? nasm_strdup(path) : NULL;
     i->next = NULL;
 
     if (ipath != NULL) {