122433fc5SMasahiro Yamada /* 222433fc5SMasahiro Yamada * "Optimize" a list of dependencies as spit out by gcc -MD 322433fc5SMasahiro Yamada * for the kernel build 422433fc5SMasahiro Yamada * =========================================================================== 522433fc5SMasahiro Yamada * 622433fc5SMasahiro Yamada * Author Kai Germaschewski 722433fc5SMasahiro Yamada * Copyright 2002 by Kai Germaschewski <kai.germaschewski@gmx.de> 822433fc5SMasahiro Yamada * 922433fc5SMasahiro Yamada * This software may be used and distributed according to the terms 1022433fc5SMasahiro Yamada * of the GNU General Public License, incorporated herein by reference. 1122433fc5SMasahiro Yamada * 1222433fc5SMasahiro Yamada * 1322433fc5SMasahiro Yamada * Introduction: 1422433fc5SMasahiro Yamada * 1522433fc5SMasahiro Yamada * gcc produces a very nice and correct list of dependencies which 1622433fc5SMasahiro Yamada * tells make when to remake a file. 1722433fc5SMasahiro Yamada * 1822433fc5SMasahiro Yamada * To use this list as-is however has the drawback that virtually 1922433fc5SMasahiro Yamada * every file in the kernel includes autoconf.h. 2022433fc5SMasahiro Yamada * 2122433fc5SMasahiro Yamada * If the user re-runs make *config, autoconf.h will be 2222433fc5SMasahiro Yamada * regenerated. make notices that and will rebuild every file which 2322433fc5SMasahiro Yamada * includes autoconf.h, i.e. basically all files. This is extremely 2422433fc5SMasahiro Yamada * annoying if the user just changed CONFIG_HIS_DRIVER from n to m. 2522433fc5SMasahiro Yamada * 2622433fc5SMasahiro Yamada * So we play the same trick that "mkdep" played before. We replace 2722433fc5SMasahiro Yamada * the dependency on autoconf.h by a dependency on every config 2822433fc5SMasahiro Yamada * option which is mentioned in any of the listed prequisites. 2922433fc5SMasahiro Yamada * 3022433fc5SMasahiro Yamada * kconfig populates a tree in include/config/ with an empty file 3122433fc5SMasahiro Yamada * for each config symbol and when the configuration is updated 3222433fc5SMasahiro Yamada * the files representing changed config options are touched 3322433fc5SMasahiro Yamada * which then let make pick up the changes and the files that use 3422433fc5SMasahiro Yamada * the config symbols are rebuilt. 3522433fc5SMasahiro Yamada * 3622433fc5SMasahiro Yamada * So if the user changes his CONFIG_HIS_DRIVER option, only the objects 3722433fc5SMasahiro Yamada * which depend on "include/linux/config/his/driver.h" will be rebuilt, 3822433fc5SMasahiro Yamada * so most likely only his driver ;-) 3922433fc5SMasahiro Yamada * 4022433fc5SMasahiro Yamada * The idea above dates, by the way, back to Michael E Chastain, AFAIK. 4122433fc5SMasahiro Yamada * 4222433fc5SMasahiro Yamada * So to get dependencies right, there are two issues: 4322433fc5SMasahiro Yamada * o if any of the files the compiler read changed, we need to rebuild 4422433fc5SMasahiro Yamada * o if the command line given to the compile the file changed, we 4522433fc5SMasahiro Yamada * better rebuild as well. 4622433fc5SMasahiro Yamada * 4722433fc5SMasahiro Yamada * The former is handled by using the -MD output, the later by saving 4822433fc5SMasahiro Yamada * the command line used to compile the old object and comparing it 4922433fc5SMasahiro Yamada * to the one we would now use. 5022433fc5SMasahiro Yamada * 5122433fc5SMasahiro Yamada * Again, also this idea is pretty old and has been discussed on 5222433fc5SMasahiro Yamada * kbuild-devel a long time ago. I don't have a sensibly working 5322433fc5SMasahiro Yamada * internet connection right now, so I rather don't mention names 5422433fc5SMasahiro Yamada * without double checking. 5522433fc5SMasahiro Yamada * 5622433fc5SMasahiro Yamada * This code here has been based partially based on mkdep.c, which 5722433fc5SMasahiro Yamada * says the following about its history: 5822433fc5SMasahiro Yamada * 5922433fc5SMasahiro Yamada * Copyright abandoned, Michael Chastain, <mailto:mec@shout.net>. 6022433fc5SMasahiro Yamada * This is a C version of syncdep.pl by Werner Almesberger. 6122433fc5SMasahiro Yamada * 6222433fc5SMasahiro Yamada * 6322433fc5SMasahiro Yamada * It is invoked as 6422433fc5SMasahiro Yamada * 6522433fc5SMasahiro Yamada * fixdep <depfile> <target> <cmdline> 6622433fc5SMasahiro Yamada * 6722433fc5SMasahiro Yamada * and will read the dependency file <depfile> 6822433fc5SMasahiro Yamada * 6922433fc5SMasahiro Yamada * The transformed dependency snipped is written to stdout. 7022433fc5SMasahiro Yamada * 7122433fc5SMasahiro Yamada * It first generates a line 7222433fc5SMasahiro Yamada * 7322433fc5SMasahiro Yamada * cmd_<target> = <cmdline> 7422433fc5SMasahiro Yamada * 7522433fc5SMasahiro Yamada * and then basically copies the .<target>.d file to stdout, in the 7622433fc5SMasahiro Yamada * process filtering out the dependency on autoconf.h and adding 7722433fc5SMasahiro Yamada * dependencies on include/config/my/option.h for every 7822433fc5SMasahiro Yamada * CONFIG_MY_OPTION encountered in any of the prequisites. 7922433fc5SMasahiro Yamada * 8022433fc5SMasahiro Yamada * It will also filter out all the dependencies on *.ver. We need 8122433fc5SMasahiro Yamada * to make sure that the generated version checksum are globally up 8222433fc5SMasahiro Yamada * to date before even starting the recursive build, so it's too late 8322433fc5SMasahiro Yamada * at this point anyway. 8422433fc5SMasahiro Yamada * 8522433fc5SMasahiro Yamada * The algorithm to grep for "CONFIG_..." is bit unusual, but should 8622433fc5SMasahiro Yamada * be fast ;-) We don't even try to really parse the header files, but 8722433fc5SMasahiro Yamada * merely grep, i.e. if CONFIG_FOO is mentioned in a comment, it will 8822433fc5SMasahiro Yamada * be picked up as well. It's not a problem with respect to 8922433fc5SMasahiro Yamada * correctness, since that can only give too many dependencies, thus 9022433fc5SMasahiro Yamada * we cannot miss a rebuild. Since people tend to not mention totally 9122433fc5SMasahiro Yamada * unrelated CONFIG_ options all over the place, it's not an 9222433fc5SMasahiro Yamada * efficiency problem either. 9322433fc5SMasahiro Yamada * 9422433fc5SMasahiro Yamada * (Note: it'd be easy to port over the complete mkdep state machine, 9522433fc5SMasahiro Yamada * but I don't think the added complexity is worth it) 9622433fc5SMasahiro Yamada */ 9722433fc5SMasahiro Yamada /* 9822433fc5SMasahiro Yamada * Note 2: if somebody writes HELLO_CONFIG_BOOM in a file, it will depend onto 9922433fc5SMasahiro Yamada * CONFIG_BOOM. This could seem a bug (not too hard to fix), but please do not 10022433fc5SMasahiro Yamada * fix it! Some UserModeLinux files (look at arch/um/) call CONFIG_BOOM as 10122433fc5SMasahiro Yamada * UML_CONFIG_BOOM, to avoid conflicts with /usr/include/linux/autoconf.h, 10222433fc5SMasahiro Yamada * through arch/um/include/uml-config.h; this fixdep "bug" makes sure that 10322433fc5SMasahiro Yamada * those files will have correct dependencies. 10422433fc5SMasahiro Yamada */ 10522433fc5SMasahiro Yamada 10622433fc5SMasahiro Yamada #include <sys/types.h> 10722433fc5SMasahiro Yamada #include <sys/stat.h> 10822433fc5SMasahiro Yamada #include <sys/mman.h> 10922433fc5SMasahiro Yamada #include <unistd.h> 11022433fc5SMasahiro Yamada #include <fcntl.h> 11122433fc5SMasahiro Yamada #include <string.h> 11222433fc5SMasahiro Yamada #include <stdlib.h> 11322433fc5SMasahiro Yamada #include <stdio.h> 11422433fc5SMasahiro Yamada #include <limits.h> 11522433fc5SMasahiro Yamada #include <ctype.h> 11622433fc5SMasahiro Yamada #include <arpa/inet.h> 11722433fc5SMasahiro Yamada 11822433fc5SMasahiro Yamada #define INT_CONF ntohl(0x434f4e46) 11922433fc5SMasahiro Yamada #define INT_ONFI ntohl(0x4f4e4649) 12022433fc5SMasahiro Yamada #define INT_NFIG ntohl(0x4e464947) 12122433fc5SMasahiro Yamada #define INT_FIG_ ntohl(0x4649475f) 12222433fc5SMasahiro Yamada 12322433fc5SMasahiro Yamada char *target; 12422433fc5SMasahiro Yamada char *depfile; 12522433fc5SMasahiro Yamada char *cmdline; 126*8be60f06SMasahiro Yamada int is_spl_build = 0; /* hack for U-boot */ 12722433fc5SMasahiro Yamada 12822433fc5SMasahiro Yamada static void usage(void) 12922433fc5SMasahiro Yamada { 13022433fc5SMasahiro Yamada fprintf(stderr, "Usage: fixdep <depfile> <target> <cmdline>\n"); 13122433fc5SMasahiro Yamada exit(1); 13222433fc5SMasahiro Yamada } 13322433fc5SMasahiro Yamada 13422433fc5SMasahiro Yamada /* 13522433fc5SMasahiro Yamada * Print out the commandline prefixed with cmd_<target filename> := 13622433fc5SMasahiro Yamada */ 13722433fc5SMasahiro Yamada static void print_cmdline(void) 13822433fc5SMasahiro Yamada { 13922433fc5SMasahiro Yamada printf("cmd_%s := %s\n\n", target, cmdline); 14022433fc5SMasahiro Yamada } 14122433fc5SMasahiro Yamada 14222433fc5SMasahiro Yamada struct item { 14322433fc5SMasahiro Yamada struct item *next; 14422433fc5SMasahiro Yamada unsigned int len; 14522433fc5SMasahiro Yamada unsigned int hash; 14622433fc5SMasahiro Yamada char name[0]; 14722433fc5SMasahiro Yamada }; 14822433fc5SMasahiro Yamada 14922433fc5SMasahiro Yamada #define HASHSZ 256 15022433fc5SMasahiro Yamada static struct item *hashtab[HASHSZ]; 15122433fc5SMasahiro Yamada 15222433fc5SMasahiro Yamada static unsigned int strhash(const char *str, unsigned int sz) 15322433fc5SMasahiro Yamada { 15422433fc5SMasahiro Yamada /* fnv32 hash */ 15522433fc5SMasahiro Yamada unsigned int i, hash = 2166136261U; 15622433fc5SMasahiro Yamada 15722433fc5SMasahiro Yamada for (i = 0; i < sz; i++) 15822433fc5SMasahiro Yamada hash = (hash ^ str[i]) * 0x01000193; 15922433fc5SMasahiro Yamada return hash; 16022433fc5SMasahiro Yamada } 16122433fc5SMasahiro Yamada 16222433fc5SMasahiro Yamada /* 16322433fc5SMasahiro Yamada * Lookup a value in the configuration string. 16422433fc5SMasahiro Yamada */ 16522433fc5SMasahiro Yamada static int is_defined_config(const char *name, int len, unsigned int hash) 16622433fc5SMasahiro Yamada { 16722433fc5SMasahiro Yamada struct item *aux; 16822433fc5SMasahiro Yamada 16922433fc5SMasahiro Yamada for (aux = hashtab[hash % HASHSZ]; aux; aux = aux->next) { 17022433fc5SMasahiro Yamada if (aux->hash == hash && aux->len == len && 17122433fc5SMasahiro Yamada memcmp(aux->name, name, len) == 0) 17222433fc5SMasahiro Yamada return 1; 17322433fc5SMasahiro Yamada } 17422433fc5SMasahiro Yamada return 0; 17522433fc5SMasahiro Yamada } 17622433fc5SMasahiro Yamada 17722433fc5SMasahiro Yamada /* 17822433fc5SMasahiro Yamada * Add a new value to the configuration string. 17922433fc5SMasahiro Yamada */ 18022433fc5SMasahiro Yamada static void define_config(const char *name, int len, unsigned int hash) 18122433fc5SMasahiro Yamada { 18222433fc5SMasahiro Yamada struct item *aux = malloc(sizeof(*aux) + len); 18322433fc5SMasahiro Yamada 18422433fc5SMasahiro Yamada if (!aux) { 18522433fc5SMasahiro Yamada perror("fixdep:malloc"); 18622433fc5SMasahiro Yamada exit(1); 18722433fc5SMasahiro Yamada } 18822433fc5SMasahiro Yamada memcpy(aux->name, name, len); 18922433fc5SMasahiro Yamada aux->len = len; 19022433fc5SMasahiro Yamada aux->hash = hash; 19122433fc5SMasahiro Yamada aux->next = hashtab[hash % HASHSZ]; 19222433fc5SMasahiro Yamada hashtab[hash % HASHSZ] = aux; 19322433fc5SMasahiro Yamada } 19422433fc5SMasahiro Yamada 19522433fc5SMasahiro Yamada /* 19622433fc5SMasahiro Yamada * Clear the set of configuration strings. 19722433fc5SMasahiro Yamada */ 19822433fc5SMasahiro Yamada static void clear_config(void) 19922433fc5SMasahiro Yamada { 20022433fc5SMasahiro Yamada struct item *aux, *next; 20122433fc5SMasahiro Yamada unsigned int i; 20222433fc5SMasahiro Yamada 20322433fc5SMasahiro Yamada for (i = 0; i < HASHSZ; i++) { 20422433fc5SMasahiro Yamada for (aux = hashtab[i]; aux; aux = next) { 20522433fc5SMasahiro Yamada next = aux->next; 20622433fc5SMasahiro Yamada free(aux); 20722433fc5SMasahiro Yamada } 20822433fc5SMasahiro Yamada hashtab[i] = NULL; 20922433fc5SMasahiro Yamada } 21022433fc5SMasahiro Yamada } 21122433fc5SMasahiro Yamada 21222433fc5SMasahiro Yamada /* 21322433fc5SMasahiro Yamada * Record the use of a CONFIG_* word. 21422433fc5SMasahiro Yamada */ 21522433fc5SMasahiro Yamada static void use_config(const char *m, int slen) 21622433fc5SMasahiro Yamada { 21722433fc5SMasahiro Yamada unsigned int hash = strhash(m, slen); 21822433fc5SMasahiro Yamada int c, i; 21922433fc5SMasahiro Yamada 22022433fc5SMasahiro Yamada if (is_defined_config(m, slen, hash)) 22122433fc5SMasahiro Yamada return; 22222433fc5SMasahiro Yamada 22322433fc5SMasahiro Yamada define_config(m, slen, hash); 22422433fc5SMasahiro Yamada 225fc196d0eSMasahiro Yamada printf(" $(wildcard include/config/"); 22622433fc5SMasahiro Yamada for (i = 0; i < slen; i++) { 22722433fc5SMasahiro Yamada c = m[i]; 22822433fc5SMasahiro Yamada if (c == '_') 22922433fc5SMasahiro Yamada c = '/'; 23022433fc5SMasahiro Yamada else 23122433fc5SMasahiro Yamada c = tolower(c); 23222433fc5SMasahiro Yamada putchar(c); 23322433fc5SMasahiro Yamada } 23422433fc5SMasahiro Yamada printf(".h) \\\n"); 23522433fc5SMasahiro Yamada } 23622433fc5SMasahiro Yamada 23722433fc5SMasahiro Yamada static void parse_config_file(const char *map, size_t len) 23822433fc5SMasahiro Yamada { 23922433fc5SMasahiro Yamada const int *end = (const int *) (map + len); 24022433fc5SMasahiro Yamada /* start at +1, so that p can never be < map */ 24122433fc5SMasahiro Yamada const int *m = (const int *) map + 1; 24222433fc5SMasahiro Yamada const char *p, *q; 243*8be60f06SMasahiro Yamada char tmp_buf[256] = "SPL_"; /* hack for U-Boot */ 24422433fc5SMasahiro Yamada 24522433fc5SMasahiro Yamada for (; m < end; m++) { 24622433fc5SMasahiro Yamada if (*m == INT_CONF) { p = (char *) m ; goto conf; } 24722433fc5SMasahiro Yamada if (*m == INT_ONFI) { p = (char *) m-1; goto conf; } 24822433fc5SMasahiro Yamada if (*m == INT_NFIG) { p = (char *) m-2; goto conf; } 24922433fc5SMasahiro Yamada if (*m == INT_FIG_) { p = (char *) m-3; goto conf; } 25022433fc5SMasahiro Yamada continue; 25122433fc5SMasahiro Yamada conf: 25222433fc5SMasahiro Yamada if (p > map + len - 7) 25322433fc5SMasahiro Yamada continue; 25422433fc5SMasahiro Yamada if (memcmp(p, "CONFIG_", 7)) 25522433fc5SMasahiro Yamada continue; 25629974f77SMasahiro Yamada p += 7; 25729974f77SMasahiro Yamada for (q = p; q < map + len; q++) { 25822433fc5SMasahiro Yamada if (!(isalnum(*q) || *q == '_')) 25922433fc5SMasahiro Yamada goto found; 26022433fc5SMasahiro Yamada } 26122433fc5SMasahiro Yamada continue; 26222433fc5SMasahiro Yamada 26322433fc5SMasahiro Yamada found: 26422433fc5SMasahiro Yamada if (!memcmp(q - 7, "_MODULE", 7)) 26522433fc5SMasahiro Yamada q -= 7; 26629974f77SMasahiro Yamada if (q - p < 0) 26722433fc5SMasahiro Yamada continue; 268*8be60f06SMasahiro Yamada 269*8be60f06SMasahiro Yamada /* U-Boot also handles CONFIG_IS_{ENABLED/BUILTIN/MODULE} */ 270*8be60f06SMasahiro Yamada if ((q - p == 10 && !memcmp(p, "IS_ENABLED(", 11)) || 271*8be60f06SMasahiro Yamada (q - p == 10 && !memcmp(p, "IS_BUILTIN(", 11)) || 272*8be60f06SMasahiro Yamada (q - p == 9 && !memcmp(p, "IS_MODULE(", 10))) { 273*8be60f06SMasahiro Yamada p = q + 1; 274*8be60f06SMasahiro Yamada for (q = p; q < map + len; q++) 275*8be60f06SMasahiro Yamada if (*q == ')') 276*8be60f06SMasahiro Yamada goto found2; 277*8be60f06SMasahiro Yamada continue; 278*8be60f06SMasahiro Yamada 279*8be60f06SMasahiro Yamada found2: 280*8be60f06SMasahiro Yamada if (is_spl_build) { 281*8be60f06SMasahiro Yamada memcpy(tmp_buf + 4, p, q - p); 282*8be60f06SMasahiro Yamada q = tmp_buf + 4 + (q - p); 283*8be60f06SMasahiro Yamada p = tmp_buf; 284*8be60f06SMasahiro Yamada } 285*8be60f06SMasahiro Yamada } 286*8be60f06SMasahiro Yamada /* end U-Boot hack */ 287*8be60f06SMasahiro Yamada 28829974f77SMasahiro Yamada use_config(p, q - p); 28922433fc5SMasahiro Yamada } 29022433fc5SMasahiro Yamada } 29122433fc5SMasahiro Yamada 29222433fc5SMasahiro Yamada /* test is s ends in sub */ 29322433fc5SMasahiro Yamada static int strrcmp(char *s, char *sub) 29422433fc5SMasahiro Yamada { 29522433fc5SMasahiro Yamada int slen = strlen(s); 29622433fc5SMasahiro Yamada int sublen = strlen(sub); 29722433fc5SMasahiro Yamada 29822433fc5SMasahiro Yamada if (sublen > slen) 29922433fc5SMasahiro Yamada return 1; 30022433fc5SMasahiro Yamada 30122433fc5SMasahiro Yamada return memcmp(s + slen - sublen, sub, sublen); 30222433fc5SMasahiro Yamada } 30322433fc5SMasahiro Yamada 30422433fc5SMasahiro Yamada static void do_config_file(const char *filename) 30522433fc5SMasahiro Yamada { 30622433fc5SMasahiro Yamada struct stat st; 30722433fc5SMasahiro Yamada int fd; 30822433fc5SMasahiro Yamada void *map; 30922433fc5SMasahiro Yamada 31022433fc5SMasahiro Yamada fd = open(filename, O_RDONLY); 31122433fc5SMasahiro Yamada if (fd < 0) { 31222433fc5SMasahiro Yamada fprintf(stderr, "fixdep: error opening config file: "); 31322433fc5SMasahiro Yamada perror(filename); 31422433fc5SMasahiro Yamada exit(2); 31522433fc5SMasahiro Yamada } 31622433fc5SMasahiro Yamada fstat(fd, &st); 31722433fc5SMasahiro Yamada if (st.st_size == 0) { 31822433fc5SMasahiro Yamada close(fd); 31922433fc5SMasahiro Yamada return; 32022433fc5SMasahiro Yamada } 32122433fc5SMasahiro Yamada map = mmap(NULL, st.st_size, PROT_READ, MAP_PRIVATE, fd, 0); 32222433fc5SMasahiro Yamada if ((long) map == -1) { 32322433fc5SMasahiro Yamada perror("fixdep: mmap"); 32422433fc5SMasahiro Yamada close(fd); 32522433fc5SMasahiro Yamada return; 32622433fc5SMasahiro Yamada } 32722433fc5SMasahiro Yamada 32822433fc5SMasahiro Yamada parse_config_file(map, st.st_size); 32922433fc5SMasahiro Yamada 33022433fc5SMasahiro Yamada munmap(map, st.st_size); 33122433fc5SMasahiro Yamada 33222433fc5SMasahiro Yamada close(fd); 33322433fc5SMasahiro Yamada } 33422433fc5SMasahiro Yamada 33522433fc5SMasahiro Yamada /* 33622433fc5SMasahiro Yamada * Important: The below generated source_foo.o and deps_foo.o variable 33722433fc5SMasahiro Yamada * assignments are parsed not only by make, but also by the rather simple 33822433fc5SMasahiro Yamada * parser in scripts/mod/sumversion.c. 33922433fc5SMasahiro Yamada */ 34022433fc5SMasahiro Yamada static void parse_dep_file(void *map, size_t len) 34122433fc5SMasahiro Yamada { 34222433fc5SMasahiro Yamada char *m = map; 34322433fc5SMasahiro Yamada char *end = m + len; 34422433fc5SMasahiro Yamada char *p; 34522433fc5SMasahiro Yamada char s[PATH_MAX]; 34622433fc5SMasahiro Yamada int is_target; 34722433fc5SMasahiro Yamada int saw_any_target = 0; 34822433fc5SMasahiro Yamada int is_first_dep = 0; 34922433fc5SMasahiro Yamada 35022433fc5SMasahiro Yamada clear_config(); 35122433fc5SMasahiro Yamada 35222433fc5SMasahiro Yamada while (m < end) { 35322433fc5SMasahiro Yamada /* Skip any "white space" */ 35422433fc5SMasahiro Yamada while (m < end && (*m == ' ' || *m == '\\' || *m == '\n')) 35522433fc5SMasahiro Yamada m++; 35622433fc5SMasahiro Yamada /* Find next "white space" */ 35722433fc5SMasahiro Yamada p = m; 35822433fc5SMasahiro Yamada while (p < end && *p != ' ' && *p != '\\' && *p != '\n') 35922433fc5SMasahiro Yamada p++; 36022433fc5SMasahiro Yamada /* Is the token we found a target name? */ 36122433fc5SMasahiro Yamada is_target = (*(p-1) == ':'); 36222433fc5SMasahiro Yamada /* Don't write any target names into the dependency file */ 36322433fc5SMasahiro Yamada if (is_target) { 36422433fc5SMasahiro Yamada /* The /next/ file is the first dependency */ 36522433fc5SMasahiro Yamada is_first_dep = 1; 36622433fc5SMasahiro Yamada } else { 36722433fc5SMasahiro Yamada /* Save this token/filename */ 36822433fc5SMasahiro Yamada memcpy(s, m, p-m); 36922433fc5SMasahiro Yamada s[p - m] = 0; 37022433fc5SMasahiro Yamada 37122433fc5SMasahiro Yamada /* Ignore certain dependencies */ 37222433fc5SMasahiro Yamada if (strrcmp(s, "include/generated/autoconf.h") && 37322433fc5SMasahiro Yamada strrcmp(s, "arch/um/include/uml-config.h") && 37422433fc5SMasahiro Yamada strrcmp(s, "include/linux/kconfig.h") && 37522433fc5SMasahiro Yamada strrcmp(s, ".ver")) { 37622433fc5SMasahiro Yamada /* 37722433fc5SMasahiro Yamada * Do not list the source file as dependency, 37822433fc5SMasahiro Yamada * so that kbuild is not confused if a .c file 37922433fc5SMasahiro Yamada * is rewritten into .S or vice versa. Storing 38022433fc5SMasahiro Yamada * it in source_* is needed for modpost to 38122433fc5SMasahiro Yamada * compute srcversions. 38222433fc5SMasahiro Yamada */ 38322433fc5SMasahiro Yamada if (is_first_dep) { 38422433fc5SMasahiro Yamada /* 38522433fc5SMasahiro Yamada * If processing the concatenation of 38622433fc5SMasahiro Yamada * multiple dependency files, only 38722433fc5SMasahiro Yamada * process the first target name, which 38822433fc5SMasahiro Yamada * will be the original source name, 38922433fc5SMasahiro Yamada * and ignore any other target names, 39022433fc5SMasahiro Yamada * which will be intermediate temporary 39122433fc5SMasahiro Yamada * files. 39222433fc5SMasahiro Yamada */ 39322433fc5SMasahiro Yamada if (!saw_any_target) { 39422433fc5SMasahiro Yamada saw_any_target = 1; 39522433fc5SMasahiro Yamada printf("source_%s := %s\n\n", 39622433fc5SMasahiro Yamada target, s); 39722433fc5SMasahiro Yamada printf("deps_%s := \\\n", 39822433fc5SMasahiro Yamada target); 39922433fc5SMasahiro Yamada } 40022433fc5SMasahiro Yamada is_first_dep = 0; 40122433fc5SMasahiro Yamada } else 40222433fc5SMasahiro Yamada printf(" %s \\\n", s); 40322433fc5SMasahiro Yamada do_config_file(s); 40422433fc5SMasahiro Yamada } 40522433fc5SMasahiro Yamada } 40622433fc5SMasahiro Yamada /* 40722433fc5SMasahiro Yamada * Start searching for next token immediately after the first 40822433fc5SMasahiro Yamada * "whitespace" character that follows this token. 40922433fc5SMasahiro Yamada */ 41022433fc5SMasahiro Yamada m = p + 1; 41122433fc5SMasahiro Yamada } 41222433fc5SMasahiro Yamada 41322433fc5SMasahiro Yamada if (!saw_any_target) { 41422433fc5SMasahiro Yamada fprintf(stderr, "fixdep: parse error; no targets found\n"); 41522433fc5SMasahiro Yamada exit(1); 41622433fc5SMasahiro Yamada } 41722433fc5SMasahiro Yamada 41822433fc5SMasahiro Yamada printf("\n%s: $(deps_%s)\n\n", target, target); 41922433fc5SMasahiro Yamada printf("$(deps_%s):\n", target); 42022433fc5SMasahiro Yamada } 42122433fc5SMasahiro Yamada 42222433fc5SMasahiro Yamada static void print_deps(void) 42322433fc5SMasahiro Yamada { 42422433fc5SMasahiro Yamada struct stat st; 42522433fc5SMasahiro Yamada int fd; 42622433fc5SMasahiro Yamada void *map; 42722433fc5SMasahiro Yamada 42822433fc5SMasahiro Yamada fd = open(depfile, O_RDONLY); 42922433fc5SMasahiro Yamada if (fd < 0) { 43022433fc5SMasahiro Yamada fprintf(stderr, "fixdep: error opening depfile: "); 43122433fc5SMasahiro Yamada perror(depfile); 43222433fc5SMasahiro Yamada exit(2); 43322433fc5SMasahiro Yamada } 43422433fc5SMasahiro Yamada if (fstat(fd, &st) < 0) { 43522433fc5SMasahiro Yamada fprintf(stderr, "fixdep: error fstat'ing depfile: "); 43622433fc5SMasahiro Yamada perror(depfile); 43722433fc5SMasahiro Yamada exit(2); 43822433fc5SMasahiro Yamada } 43922433fc5SMasahiro Yamada if (st.st_size == 0) { 44022433fc5SMasahiro Yamada fprintf(stderr,"fixdep: %s is empty\n",depfile); 44122433fc5SMasahiro Yamada close(fd); 44222433fc5SMasahiro Yamada return; 44322433fc5SMasahiro Yamada } 44422433fc5SMasahiro Yamada map = mmap(NULL, st.st_size, PROT_READ, MAP_PRIVATE, fd, 0); 44522433fc5SMasahiro Yamada if ((long) map == -1) { 44622433fc5SMasahiro Yamada perror("fixdep: mmap"); 44722433fc5SMasahiro Yamada close(fd); 44822433fc5SMasahiro Yamada return; 44922433fc5SMasahiro Yamada } 45022433fc5SMasahiro Yamada 45122433fc5SMasahiro Yamada parse_dep_file(map, st.st_size); 45222433fc5SMasahiro Yamada 45322433fc5SMasahiro Yamada munmap(map, st.st_size); 45422433fc5SMasahiro Yamada 45522433fc5SMasahiro Yamada close(fd); 45622433fc5SMasahiro Yamada } 45722433fc5SMasahiro Yamada 45822433fc5SMasahiro Yamada static void traps(void) 45922433fc5SMasahiro Yamada { 46022433fc5SMasahiro Yamada static char test[] __attribute__((aligned(sizeof(int)))) = "CONF"; 46122433fc5SMasahiro Yamada int *p = (int *)test; 46222433fc5SMasahiro Yamada 46322433fc5SMasahiro Yamada if (*p != INT_CONF) { 46422433fc5SMasahiro Yamada fprintf(stderr, "fixdep: sizeof(int) != 4 or wrong endianness? %#x\n", 46522433fc5SMasahiro Yamada *p); 46622433fc5SMasahiro Yamada exit(2); 46722433fc5SMasahiro Yamada } 46822433fc5SMasahiro Yamada } 46922433fc5SMasahiro Yamada 47022433fc5SMasahiro Yamada int main(int argc, char *argv[]) 47122433fc5SMasahiro Yamada { 47222433fc5SMasahiro Yamada traps(); 47322433fc5SMasahiro Yamada 47422433fc5SMasahiro Yamada if (argc != 4) 47522433fc5SMasahiro Yamada usage(); 47622433fc5SMasahiro Yamada 47722433fc5SMasahiro Yamada depfile = argv[1]; 47822433fc5SMasahiro Yamada target = argv[2]; 47922433fc5SMasahiro Yamada cmdline = argv[3]; 48022433fc5SMasahiro Yamada 481*8be60f06SMasahiro Yamada /* hack for U-boot */ 482*8be60f06SMasahiro Yamada if (!strncmp(target, "spl/", 4) || !strncmp(target, "tpl/", 4)) 483*8be60f06SMasahiro Yamada is_spl_build = 1; 484*8be60f06SMasahiro Yamada 48522433fc5SMasahiro Yamada print_cmdline(); 48622433fc5SMasahiro Yamada print_deps(); 48722433fc5SMasahiro Yamada 48822433fc5SMasahiro Yamada return 0; 48922433fc5SMasahiro Yamada } 490