Blame view
tools/build/fixdep.c
3.72 KB
b24413180 License cleanup: ... |
1 |
// SPDX-License-Identifier: GPL-2.0 |
9f7ef9854 tools build: Add ... |
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 |
/* * "Optimize" a list of dependencies as spit out by gcc -MD * for the build framework. * * Original author: * Copyright 2002 by Kai Germaschewski <kai.germaschewski@gmx.de> * * This code has been borrowed from kbuild's fixdep (scripts/basic/fixdep.c), * Please check it for detailed explanation. This fixdep borow only the * base transformation of dependecies without the CONFIG mangle. */ #include <sys/types.h> #include <sys/stat.h> #include <sys/mman.h> #include <unistd.h> #include <fcntl.h> #include <string.h> #include <stdlib.h> #include <stdio.h> #include <limits.h> char *target; char *depfile; char *cmdline; static void usage(void) { fprintf(stderr, "Usage: fixdep <depfile> <target> <cmdline> "); exit(1); } /* * Print out the commandline prefixed with cmd_<target filename> := */ static void print_cmdline(void) { printf("cmd_%s := %s ", target, cmdline); } /* * Important: The below generated source_foo.o and deps_foo.o variable * assignments are parsed not only by make, but also by the rather simple * parser in scripts/mod/sumversion.c. */ static void parse_dep_file(void *map, size_t len) { char *m = map; char *end = m + len; char *p; char s[PATH_MAX]; |
1cd6472e3 tools build: Make... |
56 |
int is_target, has_target = 0; |
9f7ef9854 tools build: Add ... |
57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 |
int saw_any_target = 0; int is_first_dep = 0; while (m < end) { /* Skip any "white space" */ while (m < end && (*m == ' ' || *m == '\\' || *m == ' ')) m++; /* Find next "white space" */ p = m; while (p < end && *p != ' ' && *p != '\\' && *p != ' ') 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; |
1cd6472e3 tools build: Make... |
76 77 |
has_target = 1; } else if (has_target) { |
9f7ef9854 tools build: Add ... |
78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 |
/* Save this token/filename */ memcpy(s, m, p-m); s[p - m] = 0; /* * 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 ", target, s); printf("deps_%s := \\ ", target); } is_first_dep = 0; } else printf(" %s \\ ", s); } /* * 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 "); exit(1); } printf(" %s: $(deps_%s) ", target, target); printf("$(deps_%s): ", target); } static void print_deps(void) { struct stat st; int fd; void *map; fd = open(depfile, O_RDONLY); if (fd < 0) { fprintf(stderr, "fixdep: error opening depfile: "); perror(depfile); exit(2); } if (fstat(fd, &st) < 0) { fprintf(stderr, "fixdep: error fstat'ing depfile: "); perror(depfile); exit(2); } if (st.st_size == 0) { fprintf(stderr, "fixdep: %s is empty ", depfile); close(fd); return; } map = mmap(NULL, st.st_size, PROT_READ, MAP_PRIVATE, fd, 0); if ((long) map == -1) { perror("fixdep: mmap"); close(fd); return; } parse_dep_file(map, st.st_size); munmap(map, st.st_size); close(fd); } int main(int argc, char **argv) { if (argc != 4) usage(); depfile = argv[1]; target = argv[2]; cmdline = argv[3]; print_cmdline(); print_deps(); return 0; } |