~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

TOMOYO Linux Cross Reference
Linux/tools/build/fixdep.c

Version: ~ [ linux-5.16-rc1 ] ~ [ linux-5.15.2 ] ~ [ linux-5.14.18 ] ~ [ linux-5.13.19 ] ~ [ linux-5.12.19 ] ~ [ linux-5.11.22 ] ~ [ linux-5.10.79 ] ~ [ linux-5.9.16 ] ~ [ linux-5.8.18 ] ~ [ linux-5.7.19 ] ~ [ linux-5.6.19 ] ~ [ linux-5.5.19 ] ~ [ linux-5.4.159 ] ~ [ linux-5.3.18 ] ~ [ linux-5.2.21 ] ~ [ linux-5.1.21 ] ~ [ linux-5.0.21 ] ~ [ linux-4.20.17 ] ~ [ linux-4.19.217 ] ~ [ linux-4.18.20 ] ~ [ linux-4.17.19 ] ~ [ linux-4.16.18 ] ~ [ linux-4.15.18 ] ~ [ linux-4.14.255 ] ~ [ linux-4.13.16 ] ~ [ linux-4.12.14 ] ~ [ linux-4.11.12 ] ~ [ linux-4.10.17 ] ~ [ linux-4.9.290 ] ~ [ linux-4.8.17 ] ~ [ linux-4.7.10 ] ~ [ linux-4.6.7 ] ~ [ linux-4.5.7 ] ~ [ linux-4.4.292 ] ~ [ linux-4.3.6 ] ~ [ linux-4.2.8 ] ~ [ linux-4.1.52 ] ~ [ linux-4.0.9 ] ~ [ linux-3.18.140 ] ~ [ linux-3.16.85 ] ~ [ linux-3.14.79 ] ~ [ linux-3.12.74 ] ~ [ linux-3.10.108 ] ~ [ linux-2.6.32.71 ] ~ [ linux-2.6.0 ] ~ [ linux-2.4.37.11 ] ~ [ unix-v6-master ] ~ [ ccs-tools-1.8.5 ] ~ [ policy-sample ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

  1 /*
  2  * "Optimize" a list of dependencies as spit out by gcc -MD
  3  * for the build framework.
  4  *
  5  * Original author:
  6  *   Copyright    2002 by Kai Germaschewski  <kai.germaschewski@gmx.de>
  7  *
  8  * This code has been borrowed from kbuild's fixdep (scripts/basic/fixdep.c),
  9  * Please check it for detailed explanation. This fixdep borow only the
 10  * base transformation of dependecies without the CONFIG mangle.
 11  */
 12 
 13 #include <sys/types.h>
 14 #include <sys/stat.h>
 15 #include <sys/mman.h>
 16 #include <unistd.h>
 17 #include <fcntl.h>
 18 #include <string.h>
 19 #include <stdlib.h>
 20 #include <stdio.h>
 21 #include <limits.h>
 22 
 23 char *target;
 24 char *depfile;
 25 char *cmdline;
 26 
 27 static void usage(void)
 28 {
 29         fprintf(stderr, "Usage: fixdep <depfile> <target> <cmdline>\n");
 30         exit(1);
 31 }
 32 
 33 /*
 34  * Print out the commandline prefixed with cmd_<target filename> :=
 35  */
 36 static void print_cmdline(void)
 37 {
 38         printf("cmd_%s := %s\n\n", target, cmdline);
 39 }
 40 
 41 /*
 42  * Important: The below generated source_foo.o and deps_foo.o variable
 43  * assignments are parsed not only by make, but also by the rather simple
 44  * parser in scripts/mod/sumversion.c.
 45  */
 46 static void parse_dep_file(void *map, size_t len)
 47 {
 48         char *m = map;
 49         char *end = m + len;
 50         char *p;
 51         char s[PATH_MAX];
 52         int is_target;
 53         int saw_any_target = 0;
 54         int is_first_dep = 0;
 55 
 56         while (m < end) {
 57                 /* Skip any "white space" */
 58                 while (m < end && (*m == ' ' || *m == '\\' || *m == '\n'))
 59                         m++;
 60                 /* Find next "white space" */
 61                 p = m;
 62                 while (p < end && *p != ' ' && *p != '\\' && *p != '\n')
 63                         p++;
 64                 /* Is the token we found a target name? */
 65                 is_target = (*(p-1) == ':');
 66                 /* Don't write any target names into the dependency file */
 67                 if (is_target) {
 68                         /* The /next/ file is the first dependency */
 69                         is_first_dep = 1;
 70                 } else {
 71                         /* Save this token/filename */
 72                         memcpy(s, m, p-m);
 73                         s[p - m] = 0;
 74 
 75                         /*
 76                          * Do not list the source file as dependency,
 77                          * so that kbuild is not confused if a .c file
 78                          * is rewritten into .S or vice versa. Storing
 79                          * it in source_* is needed for modpost to
 80                          * compute srcversions.
 81                          */
 82                         if (is_first_dep) {
 83                                 /*
 84                                  * If processing the concatenation of
 85                                  * multiple dependency files, only
 86                                  * process the first target name, which
 87                                  * will be the original source name,
 88                                  * and ignore any other target names,
 89                                  * which will be intermediate temporary
 90                                  * files.
 91                                  */
 92                                 if (!saw_any_target) {
 93                                         saw_any_target = 1;
 94                                         printf("source_%s := %s\n\n",
 95                                                 target, s);
 96                                         printf("deps_%s := \\\n",
 97                                                 target);
 98                                 }
 99                                 is_first_dep = 0;
100                         } else
101                                 printf("  %s \\\n", s);
102                 }
103                 /*
104                  * Start searching for next token immediately after the first
105                  * "whitespace" character that follows this token.
106                  */
107                 m = p + 1;
108         }
109 
110         if (!saw_any_target) {
111                 fprintf(stderr, "fixdep: parse error; no targets found\n");
112                 exit(1);
113         }
114 
115         printf("\n%s: $(deps_%s)\n\n", target, target);
116         printf("$(deps_%s):\n", target);
117 }
118 
119 static void print_deps(void)
120 {
121         struct stat st;
122         int fd;
123         void *map;
124 
125         fd = open(depfile, O_RDONLY);
126         if (fd < 0) {
127                 fprintf(stderr, "fixdep: error opening depfile: ");
128                 perror(depfile);
129                 exit(2);
130         }
131         if (fstat(fd, &st) < 0) {
132                 fprintf(stderr, "fixdep: error fstat'ing depfile: ");
133                 perror(depfile);
134                 exit(2);
135         }
136         if (st.st_size == 0) {
137                 fprintf(stderr, "fixdep: %s is empty\n", depfile);
138                 close(fd);
139                 return;
140         }
141         map = mmap(NULL, st.st_size, PROT_READ, MAP_PRIVATE, fd, 0);
142         if ((long) map == -1) {
143                 perror("fixdep: mmap");
144                 close(fd);
145                 return;
146         }
147 
148         parse_dep_file(map, st.st_size);
149 
150         munmap(map, st.st_size);
151 
152         close(fd);
153 }
154 
155 int main(int argc, char **argv)
156 {
157         if (argc != 4)
158                 usage();
159 
160         depfile = argv[1];
161         target  = argv[2];
162         cmdline = argv[3];
163 
164         print_cmdline();
165         print_deps();
166 
167         return 0;
168 }
169 

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

kernel.org | git.kernel.org | LWN.net | Project Home | Wiki (Japanese) | Wiki (English) | SVN repository | Mail admin

Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.

osdn.jp