dtc: Implement -d option to write out a dependency file
authorStephen Warren <swarren@nvidia.com>
Wed, 11 Jan 2012 00:27:52 +0000 (17:27 -0700)
committerMichal Marek <mmarek@suse.cz>
Sat, 14 Jan 2012 22:47:37 +0000 (23:47 +0100)
This will allow callers to rebuild .dtb files when any of the /include/d
.dtsi files are modified, not just the top-level .dts file.

Signed-off-by: Stephen Warren <swarren@nvidia.com>
Signed-off-by: Michal Marek <mmarek@suse.cz>
scripts/dtc/dtc.c
scripts/dtc/srcpos.c
scripts/dtc/srcpos.h

index cbc0193098e4e83ea4628facb1d86dcbcc54be18..451c92d31b196634cfb9ed7b2b15c632efd89691 100644 (file)
@@ -71,6 +71,7 @@ static void  __attribute__ ((noreturn)) usage(void)
        fprintf(stderr, "\t\t\tasm - assembler source\n");
        fprintf(stderr, "\t-V <output version>\n");
        fprintf(stderr, "\t\tBlob version to produce, defaults to %d (relevant for dtb\n\t\tand asm output only)\n", DEFAULT_FDT_VERSION);
+       fprintf(stderr, "\t-d <output dependency file>\n");
        fprintf(stderr, "\t-R <number>\n");
        fprintf(stderr, "\t\tMake space for <number> reserve map entries (relevant for \n\t\tdtb and asm output only)\n");
        fprintf(stderr, "\t-S <bytes>\n");
@@ -99,6 +100,7 @@ int main(int argc, char *argv[])
        const char *inform = "dts";
        const char *outform = "dts";
        const char *outname = "-";
+       const char *depname = NULL;
        int force = 0, check = 0, sort = 0;
        const char *arg;
        int opt;
@@ -111,7 +113,8 @@ int main(int argc, char *argv[])
        minsize    = 0;
        padsize    = 0;
 
-       while ((opt = getopt(argc, argv, "hI:O:o:V:R:S:p:fcqb:vH:s")) != EOF) {
+       while ((opt = getopt(argc, argv, "hI:O:o:V:d:R:S:p:fcqb:vH:s"))
+                       != EOF) {
                switch (opt) {
                case 'I':
                        inform = optarg;
@@ -125,6 +128,9 @@ int main(int argc, char *argv[])
                case 'V':
                        outversion = strtol(optarg, NULL, 0);
                        break;
+               case 'd':
+                       depname = optarg;
+                       break;
                case 'R':
                        reservenum = strtol(optarg, NULL, 0);
                        break;
@@ -188,6 +194,14 @@ int main(int argc, char *argv[])
        fprintf(stderr, "DTC: %s->%s  on file \"%s\"\n",
                inform, outform, arg);
 
+       if (depname) {
+               depfile = fopen(depname, "w");
+               if (!depfile)
+                       die("Couldn't open dependency file %s: %s\n", depname,
+                           strerror(errno));
+               fprintf(depfile, "%s:", outname);
+       }
+
        if (streq(inform, "dts"))
                bi = dt_from_source(arg);
        else if (streq(inform, "fs"))
@@ -197,6 +211,11 @@ int main(int argc, char *argv[])
        else
                die("Unknown input format \"%s\"\n", inform);
 
+       if (depfile) {
+               fputc('\n', depfile);
+               fclose(depfile);
+       }
+
        if (cmdline_boot_cpuid != -1)
                bi->boot_cpuid_phys = cmdline_boot_cpuid;
 
index 2dbc874288ca1b7487dd423d630cb7ac3b63e50f..36a38e9f1a2cb9200ee07bfce22eab489f1f1127 100644 (file)
@@ -40,6 +40,7 @@ static char *dirname(const char *path)
        return NULL;
 }
 
+FILE *depfile; /* = NULL */
 struct srcfile_state *current_srcfile; /* = NULL */
 
 /* Detect infinite include recursion. */
@@ -67,6 +68,9 @@ FILE *srcfile_relative_open(const char *fname, char **fullnamep)
                            strerror(errno));
        }
 
+       if (depfile)
+               fprintf(depfile, " %s", fullname);
+
        if (fullnamep)
                *fullnamep = fullname;
        else
index bd7966e56a53672f8c5c34369067c38696e9e246..ce980cafe58867d64d7a142b00914034f24f0d50 100644 (file)
@@ -30,6 +30,7 @@ struct srcfile_state {
        struct srcfile_state *prev;
 };
 
+extern FILE *depfile; /* = NULL */
 extern struct srcfile_state *current_srcfile; /* = NULL */
 
 FILE *srcfile_relative_open(const char *fname, char **fullnamep);