Browse Source

dtc: Implement -d option to write out a dependency file

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>
Acked-by: David Gibson <david@gibson.dropbear.id.au>
main
Stephen Warren 13 years ago committed by Jon Loeliger
parent
commit
69df9f0de2
  1. 3
      Documentation/manual.txt
  2. 20
      dtc.c
  3. 4
      srcpos.c
  4. 1
      srcpos.h
  5. 1
      tests/dependencies.cmp
  6. 6
      tests/dependencies.dts
  7. 1
      tests/deps_inc1.dtsi
  8. 1
      tests/deps_inc2.dtsi
  9. 4
      tests/run_tests.sh

3
Documentation/manual.txt

@ -106,6 +106,9 @@ Options:
-O <output_format> -O <output_format>
The generated output format, as listed above. The generated output format, as listed above.


-d <dependency_filename>
Generate a dependency file during compilation.

-q -q
Quiet: -q suppress warnings, -qq errors, -qqq all Quiet: -q suppress warnings, -qq errors, -qqq all



20
dtc.c

@ -71,6 +71,7 @@ static void __attribute__ ((noreturn)) usage(void)
fprintf(stderr, "\t\t\tasm - assembler source\n"); fprintf(stderr, "\t\t\tasm - assembler source\n");
fprintf(stderr, "\t-V <output version>\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\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-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\tMake space for <number> reserve map entries (relevant for \n\t\tdtb and asm output only)\n");
fprintf(stderr, "\t-S <bytes>\n"); fprintf(stderr, "\t-S <bytes>\n");
@ -99,6 +100,7 @@ int main(int argc, char *argv[])
const char *inform = "dts"; const char *inform = "dts";
const char *outform = "dts"; const char *outform = "dts";
const char *outname = "-"; const char *outname = "-";
const char *depname = NULL;
int force = 0, sort = 0; int force = 0, sort = 0;
const char *arg; const char *arg;
int opt; int opt;
@ -111,7 +113,7 @@ int main(int argc, char *argv[])
minsize = 0; minsize = 0;
padsize = 0; padsize = 0;


while ((opt = getopt(argc, argv, "hI:O:o:V:R:S:p:fqb:vH:s")) != EOF) { while ((opt = getopt(argc, argv, "hI:O:o:V:d:R:S:p:fqb:vH:s")) != EOF) {
switch (opt) { switch (opt) {
case 'I': case 'I':
inform = optarg; inform = optarg;
@ -125,6 +127,9 @@ int main(int argc, char *argv[])
case 'V': case 'V':
outversion = strtol(optarg, NULL, 0); outversion = strtol(optarg, NULL, 0);
break; break;
case 'd':
depname = optarg;
break;
case 'R': case 'R':
reservenum = strtol(optarg, NULL, 0); reservenum = strtol(optarg, NULL, 0);
break; break;
@ -185,6 +190,14 @@ int main(int argc, char *argv[])
fprintf(stderr, "DTC: %s->%s on file \"%s\"\n", fprintf(stderr, "DTC: %s->%s on file \"%s\"\n",
inform, outform, arg); 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")) if (streq(inform, "dts"))
bi = dt_from_source(arg); bi = dt_from_source(arg);
else if (streq(inform, "fs")) else if (streq(inform, "fs"))
@ -194,6 +207,11 @@ int main(int argc, char *argv[])
else else
die("Unknown input format \"%s\"\n", inform); die("Unknown input format \"%s\"\n", inform);


if (depfile) {
fputc('\n', depfile);
fclose(depfile);
}

if (cmdline_boot_cpuid != -1) if (cmdline_boot_cpuid != -1)
bi->boot_cpuid_phys = cmdline_boot_cpuid; bi->boot_cpuid_phys = cmdline_boot_cpuid;



4
srcpos.c

@ -40,6 +40,7 @@ static char *dirname(const char *path)
return NULL; return NULL;
} }


FILE *depfile; /* = NULL */
struct srcfile_state *current_srcfile; /* = NULL */ struct srcfile_state *current_srcfile; /* = NULL */


/* Detect infinite include recursion. */ /* Detect infinite include recursion. */
@ -67,6 +68,9 @@ FILE *srcfile_relative_open(const char *fname, char **fullnamep)
strerror(errno)); strerror(errno));
} }


if (depfile)
fprintf(depfile, " %s", fullname);

if (fullnamep) if (fullnamep)
*fullnamep = fullname; *fullnamep = fullname;
else else

1
srcpos.h

@ -30,6 +30,7 @@ struct srcfile_state {
struct srcfile_state *prev; struct srcfile_state *prev;
}; };


extern FILE *depfile; /* = NULL */
extern struct srcfile_state *current_srcfile; /* = NULL */ extern struct srcfile_state *current_srcfile; /* = NULL */


FILE *srcfile_relative_open(const char *fname, char **fullnamep); FILE *srcfile_relative_open(const char *fname, char **fullnamep);

1
tests/dependencies.cmp

@ -0,0 +1 @@
dependencies.test.dtb: dependencies.dts deps_inc1.dtsi deps_inc2.dtsi

6
tests/dependencies.dts

@ -0,0 +1,6 @@
/dts-v1/;

/include/ "deps_inc1.dtsi"

/ {
};

1
tests/deps_inc1.dtsi

@ -0,0 +1 @@
/include/ "deps_inc2.dtsi"

1
tests/deps_inc2.dtsi

@ -0,0 +1 @@
/* Empty */

4
tests/run_tests.sh

@ -357,6 +357,10 @@ dtc_tests () {
run_sh_test dtc-fatal.sh -I dts -O dtb nosuchfile.dts run_sh_test dtc-fatal.sh -I dts -O dtb nosuchfile.dts
run_sh_test dtc-fatal.sh -I dtb -O dtb nosuchfile.dtb run_sh_test dtc-fatal.sh -I dtb -O dtb nosuchfile.dtb
run_sh_test dtc-fatal.sh -I fs -O dtb nosuchfile run_sh_test dtc-fatal.sh -I fs -O dtb nosuchfile

# Dependencies
run_dtc_test -I dts -O dtb -o dependencies.test.dtb -d dependencies.test.d dependencies.dts
run_wrap_test cmp dependencies.test.d dependencies.cmp
} }


cmp_tests () { cmp_tests () {

Loading…
Cancel
Save