|
@@ -82,8 +82,7 @@
|
|
|
* to date before even starting the recursive build, so it's too late
|
|
|
* at this point anyway.
|
|
|
*
|
|
|
- * The algorithm to grep for "CONFIG_..." is bit unusual, but should
|
|
|
- * be fast ;-) We don't even try to really parse the header files, but
|
|
|
+ * We don't even try to really parse the header files, but
|
|
|
* merely grep, i.e. if CONFIG_FOO is mentioned in a comment, it will
|
|
|
* be picked up as well. It's not a problem with respect to
|
|
|
* correctness, since that can only give too many dependencies, thus
|
|
@@ -115,11 +114,6 @@
|
|
|
#include <ctype.h>
|
|
|
#include <arpa/inet.h>
|
|
|
|
|
|
-#define INT_CONF ntohl(0x434f4e46)
|
|
|
-#define INT_ONFI ntohl(0x4f4e4649)
|
|
|
-#define INT_NFIG ntohl(0x4e464947)
|
|
|
-#define INT_FIG_ ntohl(0x4649475f)
|
|
|
-
|
|
|
int insert_extra_deps;
|
|
|
char *target;
|
|
|
char *depfile;
|
|
@@ -241,37 +235,22 @@ static void use_config(const char *m, int slen)
|
|
|
print_config(m, slen);
|
|
|
}
|
|
|
|
|
|
-static void parse_config_file(const char *map, size_t len)
|
|
|
+static void parse_config_file(const char *p)
|
|
|
{
|
|
|
- const int *end = (const int *) (map + len);
|
|
|
- /* start at +1, so that p can never be < map */
|
|
|
- const int *m = (const int *) map + 1;
|
|
|
- const char *p, *q;
|
|
|
-
|
|
|
- for (; m < end; m++) {
|
|
|
- if (*m == INT_CONF) { p = (char *) m ; goto conf; }
|
|
|
- if (*m == INT_ONFI) { p = (char *) m-1; goto conf; }
|
|
|
- if (*m == INT_NFIG) { p = (char *) m-2; goto conf; }
|
|
|
- if (*m == INT_FIG_) { p = (char *) m-3; goto conf; }
|
|
|
- continue;
|
|
|
- conf:
|
|
|
- if (p > map + len - 7)
|
|
|
- continue;
|
|
|
- if (memcmp(p, "CONFIG_", 7))
|
|
|
- continue;
|
|
|
+ const char *q, *r;
|
|
|
+
|
|
|
+ while ((p = strstr(p, "CONFIG_"))) {
|
|
|
p += 7;
|
|
|
- for (q = p; q < map + len; q++) {
|
|
|
- if (!(isalnum(*q) || *q == '_'))
|
|
|
- goto found;
|
|
|
- }
|
|
|
- continue;
|
|
|
-
|
|
|
- found:
|
|
|
- if (!memcmp(q - 7, "_MODULE", 7))
|
|
|
- q -= 7;
|
|
|
- if (q - p < 0)
|
|
|
- continue;
|
|
|
- use_config(p, q - p);
|
|
|
+ q = p;
|
|
|
+ while (*q && (isalnum(*q) || *q == '_'))
|
|
|
+ q++;
|
|
|
+ if (memcmp(q - 7, "_MODULE", 7) == 0)
|
|
|
+ r = q - 7;
|
|
|
+ else
|
|
|
+ r = q;
|
|
|
+ if (r > p)
|
|
|
+ use_config(p, r - p);
|
|
|
+ p = q;
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -291,7 +270,7 @@ static void do_config_file(const char *filename)
|
|
|
{
|
|
|
struct stat st;
|
|
|
int fd;
|
|
|
- void *map;
|
|
|
+ char *map;
|
|
|
|
|
|
fd = open(filename, O_RDONLY);
|
|
|
if (fd < 0) {
|
|
@@ -308,18 +287,23 @@ static void do_config_file(const char *filename)
|
|
|
close(fd);
|
|
|
return;
|
|
|
}
|
|
|
- map = mmap(NULL, st.st_size, PROT_READ, MAP_PRIVATE, fd, 0);
|
|
|
- if ((long) map == -1) {
|
|
|
- perror("fixdep: mmap");
|
|
|
+ map = malloc(st.st_size + 1);
|
|
|
+ if (!map) {
|
|
|
+ perror("fixdep: malloc");
|
|
|
close(fd);
|
|
|
return;
|
|
|
}
|
|
|
+ if (read(fd, map, st.st_size) != st.st_size) {
|
|
|
+ perror("fixdep: read");
|
|
|
+ close(fd);
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ map[st.st_size] = '\0';
|
|
|
+ close(fd);
|
|
|
|
|
|
- parse_config_file(map, st.st_size);
|
|
|
-
|
|
|
- munmap(map, st.st_size);
|
|
|
+ parse_config_file(map);
|
|
|
|
|
|
- close(fd);
|
|
|
+ free(map);
|
|
|
}
|
|
|
|
|
|
/*
|
|
@@ -446,22 +430,8 @@ static void print_deps(void)
|
|
|
close(fd);
|
|
|
}
|
|
|
|
|
|
-static void traps(void)
|
|
|
-{
|
|
|
- static char test[] __attribute__((aligned(sizeof(int)))) = "CONF";
|
|
|
- int *p = (int *)test;
|
|
|
-
|
|
|
- if (*p != INT_CONF) {
|
|
|
- fprintf(stderr, "fixdep: sizeof(int) != 4 or wrong endianness? %#x\n",
|
|
|
- *p);
|
|
|
- exit(2);
|
|
|
- }
|
|
|
-}
|
|
|
-
|
|
|
int main(int argc, char *argv[])
|
|
|
{
|
|
|
- traps();
|
|
|
-
|
|
|
if (argc == 5 && !strcmp(argv[1], "-e")) {
|
|
|
insert_extra_deps = 1;
|
|
|
argv++;
|