diff mbox

[U-Boot,v3,20/21] Adjust dependency rules to permit per-file flags

Message ID 1317082255-24247-21-git-send-email-sjg@chromium.org
State New, archived
Headers show

Commit Message

Simon Glass Sept. 27, 2011, 12:10 a.m. UTC
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(-)

Comments

Simon Glass Oct. 4, 2011, 1:10 a.m. UTC | #1
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
Mike Frysinger Oct. 10, 2011, 2:50 a.m. UTC | #2
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
Simon Glass Oct. 10, 2011, 3:45 a.m. UTC | #3
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 mbox

Patch

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