Message ID | 1317082255-24247-21-git-send-email-sjg@chromium.org |
---|---|
State | New, archived |
Headers | show |
Hi, On Mon, Sep 26, 2011 at 5:10 PM, Simon Glass <sjg@chromium.org> wrote: > The dependency rules are currently done in a shell 'for' loop. This does not > permit Makefile variables to adjust preprocessor flags as is done with normal > compile flags, using the CFLAGS_path/file.o syntax. > > This change moves the dependency generation into the Makefile itself, and > permits a CPPFLAGS_path/file.o to adjust preprocessor flags on a file or > directory basis. > > The CPPFLAGS_... variable is also folded into CFLAGS during the build. > > Signed-off-by: Simon Glass <sjg@chromium.org> > --- > Changes in v3: > - Change U-Boot's dependency generation to permit per-file flags > > .gitignore | 2 +- > config.mk | 7 +++++++ > rules.mk | 23 ++++++++++++----------- > 3 files changed, 20 insertions(+), 12 deletions(-) > > diff --git a/.gitignore b/.gitignore > index dbf545f..7ba0dd9 100644 > --- a/.gitignore > +++ b/.gitignore > @@ -39,7 +39,7 @@ > # Generated files > # > > -*.depend > +*.depend* > /LOG > /errlog > /reloc_off > diff --git a/config.mk b/config.mk > index e2b440d..3fa9eef 100644 > --- a/config.mk > +++ b/config.mk > @@ -277,6 +277,13 @@ export CONFIG_SYS_TEXT_BASE PLATFORM_CPPFLAGS PLATFORM_RELFLAGS CPPFLAGS CFLAGS > BCURDIR = $(subst $(SRCTREE)/,,$(CURDIR:$(obj)%=%)) > ALL_AFLAGS = $(AFLAGS) $(AFLAGS_$(BCURDIR)/$(@F)) $(AFLAGS_$(BCURDIR)) > ALL_CFLAGS = $(CFLAGS) $(CFLAGS_$(BCURDIR)/$(@F)) $(CFLAGS_$(BCURDIR)) > +EXTRA_CPPFLAGS = $(CPPFLAGS_$(BCURDIR)/$(@F)) $(CPPFLAGS_$(BCURDIR)) > +ALL_CFLAGS += $(EXTRA_CPPFLAGS) > + > +# The _DEP version uses the $< file target (for dependency generation) > +# See rules.mk > +EXTRA_CPPFLAGS_DEP = $(CPPFLAGS_$(BCURDIR)/$(addsuffix .o,$(basename $<))) \ > + $(CPPFLAGS_$(BCURDIR)) > $(obj)%.s: %.S > $(CPP) $(ALL_AFLAGS) -o $@ $< > $(obj)%.o: %.S > diff --git a/rules.mk b/rules.mk > index d79fcd3..56b9044 100644 > --- a/rules.mk > +++ b/rules.mk > @@ -25,17 +25,18 @@ > > _depend: $(obj).depend > > -$(obj).depend: $(src)Makefile $(TOPDIR)/config.mk $(SRCS) $(HOSTSRCS) > - @rm -f $@ > - @touch $@ > - @for f in $(SRCS); do \ > - g=`basename $$f | sed -e 's/\(.*\)\.[[:alnum:]_]/\1.o/'`; \ > - $(CC) -M $(CPPFLAGS) -MQ $(obj)$$g $$f >> $@ ; \ > - done > - @for f in $(HOSTSRCS); do \ > - g=`basename $$f | sed -e 's/\(.*\)\.[[:alnum:]_]/\1.o/'`; \ > - $(HOSTCC) -M $(HOSTCPPFLAGS) -MQ $(obj)$$g $$f >> $@ ; \ > - done > +DEPS := $(basename $(patsubst %,$(obj).depend.%,$(SRCS))) > + > +$(obj).depend: $(src)Makefile $(TOPDIR)/config.mk $(DEPS) $(HOSTSRCS) > + cat /dev/null $(DEPS) >$@ > + @for f in $(HOSTSRCS); do \ > + g=`basename $$f | sed -e 's/\(.*\)\.[[:alnum:]_]/\1.o/'`; \ > + $(HOSTCC) -M $(HOSTCPPFLAGS) -MQ $(obj)$$g $$f >> $@ ; \ > + done > + > +$(obj).depend.%: %.c > + $(CC) -M $(CPPFLAGS) $(EXTRA_CPPFLAGS_DEP) \ > + -MQ $(addsuffix .o,$(basename $<)) $< >$@ > > $(HOSTOBJS): $(obj)%.o: %.c > $(HOSTCC) $(HOSTCFLAGS) $(HOSTCFLAGS_$(@F)) $(HOSTCFLAGS_$(BCURDIR)) -o $@ $< -c > -- > 1.7.3.1 > > Sadly this doesn't work for two reasons: 1. It ignores .S files (which is easy to fix) 2. It doesn't like paths like ../common/fred.c. I can fix that with a patsubst I suspect. Does anyone have better ideas on how to deal with this? Regards, Simon
On Monday 03 October 2011 21:10:17 Simon Glass wrote: > Hi, > > On Mon, Sep 26, 2011 at 5:10 PM, Simon Glass <sjg@chromium.org> wrote: > > The dependency rules are currently done in a shell 'for' loop. This does > > not permit Makefile variables to adjust preprocessor flags as is done > > with normal compile flags, using the CFLAGS_path/file.o syntax. > > > > This change moves the dependency generation into the Makefile itself, and > > permits a CPPFLAGS_path/file.o to adjust preprocessor flags on a file or > > directory basis. > > > > The CPPFLAGS_... variable is also folded into CFLAGS during the build. > > > > Signed-off-by: Simon Glass <sjg@chromium.org> > > --- > > Changes in v3: > > - Change U-Boot's dependency generation to permit per-file flags > > > > .gitignore | 2 +- > > config.mk | 7 +++++++ > > rules.mk | 23 ++++++++++++----------- > > 3 files changed, 20 insertions(+), 12 deletions(-) > > > > diff --git a/.gitignore b/.gitignore > > index dbf545f..7ba0dd9 100644 > > --- a/.gitignore > > +++ b/.gitignore > > @@ -39,7 +39,7 @@ > > # Generated files > > # > > > > -*.depend > > +*.depend* > > /LOG > > /errlog > > /reloc_off > > diff --git a/config.mk b/config.mk > > index e2b440d..3fa9eef 100644 > > --- a/config.mk > > +++ b/config.mk > > @@ -277,6 +277,13 @@ export CONFIG_SYS_TEXT_BASE PLATFORM_CPPFLAGS > > PLATFORM_RELFLAGS CPPFLAGS CFLAGS BCURDIR = $(subst > > $(SRCTREE)/,,$(CURDIR:$(obj)%=%)) > > ALL_AFLAGS = $(AFLAGS) $(AFLAGS_$(BCURDIR)/$(@F)) $(AFLAGS_$(BCURDIR)) > > ALL_CFLAGS = $(CFLAGS) $(CFLAGS_$(BCURDIR)/$(@F)) $(CFLAGS_$(BCURDIR)) > > +EXTRA_CPPFLAGS = $(CPPFLAGS_$(BCURDIR)/$(@F)) $(CPPFLAGS_$(BCURDIR)) > > +ALL_CFLAGS += $(EXTRA_CPPFLAGS) > > + > > +# The _DEP version uses the $< file target (for dependency generation) > > +# See rules.mk > > +EXTRA_CPPFLAGS_DEP = $(CPPFLAGS_$(BCURDIR)/$(addsuffix .o,$(basename > > $<))) \ + $(CPPFLAGS_$(BCURDIR)) > > $(obj)%.s: %.S > > $(CPP) $(ALL_AFLAGS) -o $@ $< > > $(obj)%.o: %.S > > diff --git a/rules.mk b/rules.mk > > index d79fcd3..56b9044 100644 > > --- a/rules.mk > > +++ b/rules.mk > > @@ -25,17 +25,18 @@ > > > > _depend: $(obj).depend > > > > -$(obj).depend: $(src)Makefile $(TOPDIR)/config.mk $(SRCS) $(HOSTSRCS) > > - @rm -f $@ > > - @touch $@ > > - @for f in $(SRCS); do \ > > - g=`basename $$f | sed -e > > 's/\(.*\)\.[[:alnum:]_]/\1.o/'`; \ - $(CC) -M > > $(CPPFLAGS) -MQ $(obj)$$g $$f >> $@ ; \ - done > > - @for f in $(HOSTSRCS); do \ > > - g=`basename $$f | sed -e > > 's/\(.*\)\.[[:alnum:]_]/\1.o/'`; \ - $(HOSTCC) -M > > $(HOSTCPPFLAGS) -MQ $(obj)$$g $$f >> $@ ; \ - done > > +DEPS := $(basename $(patsubst %,$(obj).depend.%,$(SRCS))) > > + > > +$(obj).depend: $(src)Makefile $(TOPDIR)/config.mk $(DEPS) $(HOSTSRCS) > > + cat /dev/null $(DEPS) >$@ > > + @for f in $(HOSTSRCS); do \ > > + g=`basename $$f | sed -e 's/\(.*\)\.[[:alnum:]_]/\1.o/'`; > > \ + $(HOSTCC) -M $(HOSTCPPFLAGS) -MQ $(obj)$$g $$f >> $@ ; > > \ + done > > + > > +$(obj).depend.%: %.c > > + $(CC) -M $(CPPFLAGS) $(EXTRA_CPPFLAGS_DEP) \ > > + -MQ $(addsuffix .o,$(basename $<)) $< >$@ > > > > $(HOSTOBJS): $(obj)%.o: %.c > > $(HOSTCC) $(HOSTCFLAGS) $(HOSTCFLAGS_$(@F)) > > $(HOSTCFLAGS_$(BCURDIR)) -o $@ $< -c -- > > 1.7.3.1 > > Sadly this doesn't work for two reasons: > > 1. It ignores .S files (which is easy to fix) > > 2. It doesn't like paths like ../common/fred.c. I can fix that with a > patsubst I suspect. > > Does anyone have better ideas on how to deal with this? what if we move away from a single .depend file ? most every project i see out there utilizes one .depend file per source. -mike
Hi Mike, On Sun, Oct 9, 2011 at 7:50 PM, Mike Frysinger <vapier@gentoo.org> wrote: > On Monday 03 October 2011 21:10:17 Simon Glass wrote: >> Hi, >> >> On Mon, Sep 26, 2011 at 5:10 PM, Simon Glass <sjg@chromium.org> wrote: >> > The dependency rules are currently done in a shell 'for' loop. This does >> > not permit Makefile variables to adjust preprocessor flags as is done >> > with normal compile flags, using the CFLAGS_path/file.o syntax. >> > >> > This change moves the dependency generation into the Makefile itself, and >> > permits a CPPFLAGS_path/file.o to adjust preprocessor flags on a file or >> > directory basis. >> > >> > The CPPFLAGS_... variable is also folded into CFLAGS during the build. >> > >> > Signed-off-by: Simon Glass <sjg@chromium.org> >> > --- >> > Changes in v3: >> > - Change U-Boot's dependency generation to permit per-file flags >> > >> > .gitignore | 2 +- >> > config.mk | 7 +++++++ >> > rules.mk | 23 ++++++++++++----------- >> > 3 files changed, 20 insertions(+), 12 deletions(-) >> > >> > diff --git a/.gitignore b/.gitignore >> > index dbf545f..7ba0dd9 100644 >> > --- a/.gitignore >> > +++ b/.gitignore >> > @@ -39,7 +39,7 @@ >> > # Generated files >> > # >> > >> > -*.depend >> > +*.depend* >> > /LOG >> > /errlog >> > /reloc_off >> > diff --git a/config.mk b/config.mk >> > index e2b440d..3fa9eef 100644 >> > --- a/config.mk >> > +++ b/config.mk >> > @@ -277,6 +277,13 @@ export CONFIG_SYS_TEXT_BASE PLATFORM_CPPFLAGS >> > PLATFORM_RELFLAGS CPPFLAGS CFLAGS BCURDIR = $(subst >> > $(SRCTREE)/,,$(CURDIR:$(obj)%=%)) >> > ALL_AFLAGS = $(AFLAGS) $(AFLAGS_$(BCURDIR)/$(@F)) $(AFLAGS_$(BCURDIR)) >> > ALL_CFLAGS = $(CFLAGS) $(CFLAGS_$(BCURDIR)/$(@F)) $(CFLAGS_$(BCURDIR)) >> > +EXTRA_CPPFLAGS = $(CPPFLAGS_$(BCURDIR)/$(@F)) $(CPPFLAGS_$(BCURDIR)) >> > +ALL_CFLAGS += $(EXTRA_CPPFLAGS) >> > + >> > +# The _DEP version uses the $< file target (for dependency generation) >> > +# See rules.mk >> > +EXTRA_CPPFLAGS_DEP = $(CPPFLAGS_$(BCURDIR)/$(addsuffix .o,$(basename >> > $<))) \ + $(CPPFLAGS_$(BCURDIR)) >> > $(obj)%.s: %.S >> > $(CPP) $(ALL_AFLAGS) -o $@ $< >> > $(obj)%.o: %.S >> > diff --git a/rules.mk b/rules.mk >> > index d79fcd3..56b9044 100644 >> > --- a/rules.mk >> > +++ b/rules.mk >> > @@ -25,17 +25,18 @@ >> > >> > _depend: $(obj).depend >> > >> > -$(obj).depend: $(src)Makefile $(TOPDIR)/config.mk $(SRCS) $(HOSTSRCS) >> > - @rm -f $@ >> > - @touch $@ >> > - @for f in $(SRCS); do \ >> > - g=`basename $$f | sed -e >> > 's/\(.*\)\.[[:alnum:]_]/\1.o/'`; \ - $(CC) -M >> > $(CPPFLAGS) -MQ $(obj)$$g $$f >> $@ ; \ - done >> > - @for f in $(HOSTSRCS); do \ >> > - g=`basename $$f | sed -e >> > 's/\(.*\)\.[[:alnum:]_]/\1.o/'`; \ - $(HOSTCC) -M >> > $(HOSTCPPFLAGS) -MQ $(obj)$$g $$f >> $@ ; \ - done >> > +DEPS := $(basename $(patsubst %,$(obj).depend.%,$(SRCS))) >> > + >> > +$(obj).depend: $(src)Makefile $(TOPDIR)/config.mk $(DEPS) $(HOSTSRCS) >> > + cat /dev/null $(DEPS) >$@ >> > + @for f in $(HOSTSRCS); do \ >> > + g=`basename $$f | sed -e 's/\(.*\)\.[[:alnum:]_]/\1.o/'`; >> > \ + $(HOSTCC) -M $(HOSTCPPFLAGS) -MQ $(obj)$$g $$f >> $@ ; >> > \ + done >> > + >> > +$(obj).depend.%: %.c >> > + $(CC) -M $(CPPFLAGS) $(EXTRA_CPPFLAGS_DEP) \ >> > + -MQ $(addsuffix .o,$(basename $<)) $< >$@ >> > >> > $(HOSTOBJS): $(obj)%.o: %.c >> > $(HOSTCC) $(HOSTCFLAGS) $(HOSTCFLAGS_$(@F)) >> > $(HOSTCFLAGS_$(BCURDIR)) -o $@ $< -c -- >> > 1.7.3.1 >> >> Sadly this doesn't work for two reasons: >> >> 1. It ignores .S files (which is easy to fix) >> >> 2. It doesn't like paths like ../common/fred.c. I can fix that with a >> patsubst I suspect. >> >> Does anyone have better ideas on how to deal with this? > > what if we move away from a single .depend file ? most every project i see out > there utilizes one .depend file per source. > -mike > That is essentially what my patch does for the most part - the non-host files are generated with a separate rule and then combined later into a single file. Combining them is just a convenience for the Makefile - easier to include one file than 50, that's all. Regards, Simon
diff --git a/.gitignore b/.gitignore index dbf545f..7ba0dd9 100644 --- a/.gitignore +++ b/.gitignore @@ -39,7 +39,7 @@ # Generated files # -*.depend +*.depend* /LOG /errlog /reloc_off diff --git a/config.mk b/config.mk index e2b440d..3fa9eef 100644 --- a/config.mk +++ b/config.mk @@ -277,6 +277,13 @@ export CONFIG_SYS_TEXT_BASE PLATFORM_CPPFLAGS PLATFORM_RELFLAGS CPPFLAGS CFLAGS BCURDIR = $(subst $(SRCTREE)/,,$(CURDIR:$(obj)%=%)) ALL_AFLAGS = $(AFLAGS) $(AFLAGS_$(BCURDIR)/$(@F)) $(AFLAGS_$(BCURDIR)) ALL_CFLAGS = $(CFLAGS) $(CFLAGS_$(BCURDIR)/$(@F)) $(CFLAGS_$(BCURDIR)) +EXTRA_CPPFLAGS = $(CPPFLAGS_$(BCURDIR)/$(@F)) $(CPPFLAGS_$(BCURDIR)) +ALL_CFLAGS += $(EXTRA_CPPFLAGS) + +# The _DEP version uses the $< file target (for dependency generation) +# See rules.mk +EXTRA_CPPFLAGS_DEP = $(CPPFLAGS_$(BCURDIR)/$(addsuffix .o,$(basename $<))) \ + $(CPPFLAGS_$(BCURDIR)) $(obj)%.s: %.S $(CPP) $(ALL_AFLAGS) -o $@ $< $(obj)%.o: %.S diff --git a/rules.mk b/rules.mk index d79fcd3..56b9044 100644 --- a/rules.mk +++ b/rules.mk @@ -25,17 +25,18 @@ _depend: $(obj).depend -$(obj).depend: $(src)Makefile $(TOPDIR)/config.mk $(SRCS) $(HOSTSRCS) - @rm -f $@ - @touch $@ - @for f in $(SRCS); do \ - g=`basename $$f | sed -e 's/\(.*\)\.[[:alnum:]_]/\1.o/'`; \ - $(CC) -M $(CPPFLAGS) -MQ $(obj)$$g $$f >> $@ ; \ - done - @for f in $(HOSTSRCS); do \ - g=`basename $$f | sed -e 's/\(.*\)\.[[:alnum:]_]/\1.o/'`; \ - $(HOSTCC) -M $(HOSTCPPFLAGS) -MQ $(obj)$$g $$f >> $@ ; \ - done +DEPS := $(basename $(patsubst %,$(obj).depend.%,$(SRCS))) + +$(obj).depend: $(src)Makefile $(TOPDIR)/config.mk $(DEPS) $(HOSTSRCS) + cat /dev/null $(DEPS) >$@ + @for f in $(HOSTSRCS); do \ + g=`basename $$f | sed -e 's/\(.*\)\.[[:alnum:]_]/\1.o/'`; \ + $(HOSTCC) -M $(HOSTCPPFLAGS) -MQ $(obj)$$g $$f >> $@ ; \ + done + +$(obj).depend.%: %.c + $(CC) -M $(CPPFLAGS) $(EXTRA_CPPFLAGS_DEP) \ + -MQ $(addsuffix .o,$(basename $<)) $< >$@ $(HOSTOBJS): $(obj)%.o: %.c $(HOSTCC) $(HOSTCFLAGS) $(HOSTCFLAGS_$(@F)) $(HOSTCFLAGS_$(BCURDIR)) -o $@ $< -c
The dependency rules are currently done in a shell 'for' loop. This does not permit Makefile variables to adjust preprocessor flags as is done with normal compile flags, using the CFLAGS_path/file.o syntax. This change moves the dependency generation into the Makefile itself, and permits a CPPFLAGS_path/file.o to adjust preprocessor flags on a file or directory basis. The CPPFLAGS_... variable is also folded into CFLAGS during the build. Signed-off-by: Simon Glass <sjg@chromium.org> --- Changes in v3: - Change U-Boot's dependency generation to permit per-file flags .gitignore | 2 +- config.mk | 7 +++++++ rules.mk | 23 ++++++++++++----------- 3 files changed, 20 insertions(+), 12 deletions(-)