]> Pileus Git - ~andy/linux/blobdiff - scripts/basic/fixdep.c
Merge tag 'rdma-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/roland...
[~andy/linux] / scripts / basic / fixdep.c
index 7f6425e24ce3ad985635e9249a64552f661566f2..078fe1d64e7df3e38e94dcd595bb834e5bd9da9c 100644 (file)
@@ -320,49 +320,78 @@ static void parse_dep_file(void *map, size_t len)
        char *end = m + len;
        char *p;
        char s[PATH_MAX];
-       int first;
-
-       p = strchr(m, ':');
-       if (!p) {
-               fprintf(stderr, "fixdep: parse error\n");
-               exit(1);
-       }
-       memcpy(s, m, p-m); s[p-m] = 0;
-       m = p+1;
+       int is_target;
+       int saw_any_target = 0;
+       int is_first_dep = 0;
 
        clear_config();
 
-       first = 1;
        while (m < end) {
+               /* Skip any "white space" */
                while (m < end && (*m == ' ' || *m == '\\' || *m == '\n'))
                        m++;
+               /* Find next "white space" */
                p = m;
-               while (p < end && *p != ' ') p++;
-               if (p == end) {
-                       do p--; while (!isalnum(*p));
+               while (p < end && *p != ' ' && *p != '\\' && *p != '\n')
                        p++;
+               /* Is the token we found a target name? */
+               is_target = (*(p-1) == ':');
+               /* Don't write any target names into the dependency file */
+               if (is_target) {
+                       /* The /next/ file is the first dependency */
+                       is_first_dep = 1;
+               } else {
+                       /* Save this token/filename */
+                       memcpy(s, m, p-m);
+                       s[p - m] = 0;
+
+                       /* Ignore certain dependencies */
+                       if (strrcmp(s, "include/generated/autoconf.h") &&
+                           strrcmp(s, "arch/um/include/uml-config.h") &&
+                           strrcmp(s, "include/linux/kconfig.h") &&
+                           strrcmp(s, ".ver")) {
+                               /*
+                                * Do not list the source file as dependency,
+                                * so that kbuild is not confused if a .c file
+                                * is rewritten into .S or vice versa. Storing
+                                * it in source_* is needed for modpost to
+                                * compute srcversions.
+                                */
+                               if (is_first_dep) {
+                                       /*
+                                        * If processing the concatenation of
+                                        * multiple dependency files, only
+                                        * process the first target name, which
+                                        * will be the original source name,
+                                        * and ignore any other target names,
+                                        * which will be intermediate temporary
+                                        * files.
+                                        */
+                                       if (!saw_any_target) {
+                                               saw_any_target = 1;
+                                               printf("source_%s := %s\n\n",
+                                                       target, s);
+                                               printf("deps_%s := \\\n",
+                                                       target);
+                                       }
+                                       is_first_dep = 0;
+                               } else
+                                       printf("  %s \\\n", s);
+                               do_config_file(s);
+                       }
                }
-               memcpy(s, m, p-m); s[p-m] = 0;
-               if (strrcmp(s, "include/generated/autoconf.h") &&
-                   strrcmp(s, "arch/um/include/uml-config.h") &&
-                   strrcmp(s, "include/linux/kconfig.h") &&
-                   strrcmp(s, ".ver")) {
-                       /*
-                        * Do not list the source file as dependency, so that
-                        * kbuild is not confused if a .c file is rewritten
-                        * into .S or vice versa. Storing it in source_* is
-                        * needed for modpost to compute srcversions.
-                        */
-                       if (first) {
-                               printf("source_%s := %s\n\n", target, s);
-                               printf("deps_%s := \\\n", target);
-                       } else
-                               printf("  %s \\\n", s);
-                       do_config_file(s);
-               }
-               first = 0;
+               /*
+                * Start searching for next token immediately after the first
+                * "whitespace" character that follows this token.
+                */
                m = p + 1;
        }
+
+       if (!saw_any_target) {
+               fprintf(stderr, "fixdep: parse error; no targets found\n");
+               exit(1);
+       }
+
        printf("\n%s: $(deps_%s)\n\n", target, target);
        printf("$(deps_%s):\n", target);
 }