diff mbox

[U-Boot,RFC] kbuild: use "cc-cross-prefix" to choose CROSS_COMPILE

Message ID 1394011464-23098-1-git-send-email-yamada.m@jp.panasonic.com
State RFC
Delegated to: Tom Rini
Headers show

Commit Message

Masahiro Yamada March 5, 2014, 9:24 a.m. UTC
CROSS_COMPILE is generally passed from the command line
or by the environment variable because cross tools
vary from user to user.

But, having some choices of often used CROSS_COMPILE
seems reasonable.

$(call cc-cross-prefix, ...) returns the first prefix
where a prefix$(CC) is found in PATH.

If your cross tools exist in the argument of
$(call cc-cross-prefix, ...), you do not have to
specify it explicitly.

Signed-off-by: Masahiro Yamada <yamada.m@jp.panasonic.com>
---

My question is which cross tools are popular enough
to be added to the list.

In my opition, arm-linux-gnueabi-gcc is popular
because it is distributed in Ubuntu.

On the other hand, I am not sure ppc_8xx-gcc is currently
being used.

Which one should be to added/deleted to our default list.
Your comments are very welcome.
(I am not familiar with compilers very much.)


 arch/arm/config.mk        | 2 +-
 arch/microblaze/config.mk | 2 +-
 arch/powerpc/config.mk    | 2 +-
 3 files changed, 3 insertions(+), 3 deletions(-)

Comments

Detlev Zundel March 5, 2014, 10:06 a.m. UTC | #1
Hi Masahiro,

> CROSS_COMPILE is generally passed from the command line
> or by the environment variable because cross tools
> vary from user to user.
>
> But, having some choices of often used CROSS_COMPILE
> seems reasonable.
>
> $(call cc-cross-prefix, ...) returns the first prefix
> where a prefix$(CC) is found in PATH.
>
> If your cross tools exist in the argument of
> $(call cc-cross-prefix, ...), you do not have to
> specify it explicitly.
>
> Signed-off-by: Masahiro Yamada <yamada.m@jp.panasonic.com>

I have to admit that I don't really like this approach.  On the one hand
it is an heuristic trying to guess the intentions of the user.  This is
nice if it works but can be very surprising when it goes wrong.

But more imprtantly, it will blur the the boundaries of the build
process as we trade the very self contained determinism of "use what
CROSS_COMPILE" says to "use what we may find in the rest of the system".

It would even be possible that a "once working" build process will not
work anymore because the user has installed a new toolchain in the
meantime and then this completely unrelated action has an (unwanted)
impact.

In short, I would rather want to stay with our current (clearly defined)
setup :)

Best wishes
  Detlev
Masahiro Yamada March 5, 2014, 10:27 a.m. UTC | #2
Hi Detlev,


On Wed, 05 Mar 2014 11:06:03 +0100
Detlev Zundel <dzu@denx.de> wrote:

> Hi Masahiro,
> 
> > CROSS_COMPILE is generally passed from the command line
> > or by the environment variable because cross tools
> > vary from user to user.
> >
> > But, having some choices of often used CROSS_COMPILE
> > seems reasonable.
> >
> > $(call cc-cross-prefix, ...) returns the first prefix
> > where a prefix$(CC) is found in PATH.
> >
> > If your cross tools exist in the argument of
> > $(call cc-cross-prefix, ...), you do not have to
> > specify it explicitly.
> >
> > Signed-off-by: Masahiro Yamada <yamada.m@jp.panasonic.com>
> 
> I have to admit that I don't really like this approach.  On the one hand
> it is an heuristic trying to guess the intentions of the user.  This is
> nice if it works but can be very surprising when it goes wrong.
> 
> But more imprtantly, it will blur the the boundaries of the build
> process as we trade the very self contained determinism of "use what
> CROSS_COMPILE" says to "use what we may find in the rest of the system".
> 
> It would even be possible that a "once working" build process will not
> work anymore because the user has installed a new toolchain in the
> meantime and then this completely unrelated action has an (unwanted)
> impact.
> 
> In short, I would rather want to stay with our current (clearly defined)
> setup :)
> 

Maybe this is verbose, but
just in case, let me add a few words.

If you like, you can still pass CROSS_COMPILE from the command line
or by the environment variable.


  ifeq ($(CROSS_COMPILE),)
  CROSS_COMPILE := $(call cc-cross-prefix, arm-linux- arm-linux-gnueabi-)
  endif

$(call cc-cross-prefix, ...) is invoked only when $(CROSS_COMPILE) is empty,
that is CROSS_COMPILE is not explicitely specified.


For users who know everything happening in the built system,
this patch might be helpful for less typing...


Best Regards
Masahiro Yamada
Detlev Zundel March 5, 2014, 10:38 a.m. UTC | #3
Hi Masahiro,

> Hi Detlev,
>
>
> On Wed, 05 Mar 2014 11:06:03 +0100
> Detlev Zundel <dzu@denx.de> wrote:
>
>> Hi Masahiro,
>> 
>> > CROSS_COMPILE is generally passed from the command line
>> > or by the environment variable because cross tools
>> > vary from user to user.
>> >
>> > But, having some choices of often used CROSS_COMPILE
>> > seems reasonable.
>> >
>> > $(call cc-cross-prefix, ...) returns the first prefix
>> > where a prefix$(CC) is found in PATH.
>> >
>> > If your cross tools exist in the argument of
>> > $(call cc-cross-prefix, ...), you do not have to
>> > specify it explicitly.
>> >
>> > Signed-off-by: Masahiro Yamada <yamada.m@jp.panasonic.com>
>> 
>> I have to admit that I don't really like this approach.  On the one hand
>> it is an heuristic trying to guess the intentions of the user.  This is
>> nice if it works but can be very surprising when it goes wrong.
>> 
>> But more imprtantly, it will blur the the boundaries of the build
>> process as we trade the very self contained determinism of "use what
>> CROSS_COMPILE" says to "use what we may find in the rest of the system".
>> 
>> It would even be possible that a "once working" build process will not
>> work anymore because the user has installed a new toolchain in the
>> meantime and then this completely unrelated action has an (unwanted)
>> impact.
>> 
>> In short, I would rather want to stay with our current (clearly defined)
>> setup :)
>> 
>
> Maybe this is verbose, but
> just in case, let me add a few words.
>
> If you like, you can still pass CROSS_COMPILE from the command line
> or by the environment variable.
>
>
>   ifeq ($(CROSS_COMPILE),)
>   CROSS_COMPILE := $(call cc-cross-prefix, arm-linux- arm-linux-gnueabi-)
>   endif
>
> $(call cc-cross-prefix, ...) is invoked only when $(CROSS_COMPILE) is
> empty,
> that is CROSS_COMPILE is not explicitely specified.
>
>
> For users who know everything happening in the built system,
> this patch might be helpful for less typing...

Yes, I fully understand your intention but I still believe that setting
CROSS_COMPILE is usually scripted anyway so the savings are near
negligible and the "price" we pay is adding (more) information about
cross-toolchains which is really outside of the scope of U-Boot (or any
other project I'd say).

If there would be real savings, then maybe it is worth to break the
principle of modularity but in the current discussion I just don't see
that.

Best wishes
  Detlev
Tom Rini March 5, 2014, 1:37 p.m. UTC | #4
On Wed, Mar 05, 2014 at 06:24:24PM +0900, Masahiro Yamada wrote:

> CROSS_COMPILE is generally passed from the command line
> or by the environment variable because cross tools
> vary from user to user.
> 
> But, having some choices of often used CROSS_COMPILE
> seems reasonable.
> 
> $(call cc-cross-prefix, ...) returns the first prefix
> where a prefix$(CC) is found in PATH.
> 
> If your cross tools exist in the argument of
> $(call cc-cross-prefix, ...), you do not have to
> specify it explicitly.
> 
> Signed-off-by: Masahiro Yamada <yamada.m@jp.panasonic.com>
> ---
> 
> My question is which cross tools are popular enough
> to be added to the list.
> 
> In my opition, arm-linux-gnueabi-gcc is popular
> because it is distributed in Ubuntu.
> 
> On the other hand, I am not sure ppc_8xx-gcc is currently
> being used.
> 
> Which one should be to added/deleted to our default list.
> Your comments are very welcome.
> (I am not familiar with compilers very much.)
> 
> 
>  arch/arm/config.mk        | 2 +-
>  arch/microblaze/config.mk | 2 +-
>  arch/powerpc/config.mk    | 2 +-
>  3 files changed, 3 insertions(+), 3 deletions(-)

Looking at the kernel, mips is a better example of where this becomes a
handy thing, over just a "stop passing CROSS_COMPILE".  But that
includes adding tool-archpref.
Gerhard Sittig March 5, 2014, 9:45 p.m. UTC | #5
On Wed, Mar 05, 2014 at 19:27 +0900, Masahiro Yamada wrote:
> 
> If you like, you can still pass CROSS_COMPILE from the command line
> or by the environment variable.
> 
>   ifeq ($(CROSS_COMPILE),)
>   CROSS_COMPILE := $(call cc-cross-prefix, arm-linux- arm-linux-gnueabi-)
>   endif
> 
> $(call cc-cross-prefix, ...) is invoked only when $(CROSS_COMPILE) is empty,
> that is CROSS_COMPILE is not explicitely specified.

Ouch!  Please don't do this.  You may call it "not explicitely
specified", while I call it "explicitly NOT specified".

What I did in the past is to specifically pass 'CROSS_COMPILE='
on the command line, explicitly voiding any potentially set
value.  If the computer takes this as an invitation to come up
with its own idea of what I might have meant, this is bad.

I agree with Detlev, and strongly so.  Computers should strictly
do what they were told to do, and not try guess (they are awful
at that), or even to outsmart the user (this is counter
productive, and causes a lot of heat).


virtually yours
Gerhard Sittig
Masahiro Yamada March 12, 2014, 5:47 a.m. UTC | #6
Hello Detlev, Gerhard, Tom, 

On Wed, 5 Mar 2014 08:37:54 -0500
Tom Rini <trini@ti.com> wrote:

> On Wed, Mar 05, 2014 at 06:24:24PM +0900, Masahiro Yamada wrote:
> 
> > CROSS_COMPILE is generally passed from the command line
> > or by the environment variable because cross tools
> > vary from user to user.
> > 
> > But, having some choices of often used CROSS_COMPILE
> > seems reasonable.
> > 
> > $(call cc-cross-prefix, ...) returns the first prefix
> > where a prefix$(CC) is found in PATH.
> > 
> > If your cross tools exist in the argument of
> > $(call cc-cross-prefix, ...), you do not have to
> > specify it explicitly.
> > 
> > Signed-off-by: Masahiro Yamada <yamada.m@jp.panasonic.com>
> > ---
> > 
> > My question is which cross tools are popular enough
> > to be added to the list.
> > 
> > In my opition, arm-linux-gnueabi-gcc is popular
> > because it is distributed in Ubuntu.
> > 
> > On the other hand, I am not sure ppc_8xx-gcc is currently
> > being used.
> > 
> > Which one should be to added/deleted to our default list.
> > Your comments are very welcome.
> > (I am not familiar with compilers very much.)
> > 
> > 
> >  arch/arm/config.mk        | 2 +-
> >  arch/microblaze/config.mk | 2 +-
> >  arch/powerpc/config.mk    | 2 +-
> >  3 files changed, 3 insertions(+), 3 deletions(-)
> 
> Looking at the kernel, mips is a better example of where this becomes a
> handy thing, over just a "stop passing CROSS_COMPILE".  But that
> includes adding tool-archpref.
> 
> -- 
> Tom


Actually, my motivation here was to emulate arch/$(ARCH)/Makefile
of Linux Kernel. Some of them are already using cc-cross-prefix.
And arch/mips/Makefile looked reasonable enough to me.

But if this patch is unwelcome to developers (it looks like so),
I do not mind retracting it.

Best Regards
Masahiro Yamada
diff mbox

Patch

diff --git a/arch/arm/config.mk b/arch/arm/config.mk
index 792cb43..c5fd22f 100644
--- a/arch/arm/config.mk
+++ b/arch/arm/config.mk
@@ -6,7 +6,7 @@ 
 #
 
 ifeq ($(CROSS_COMPILE),)
-CROSS_COMPILE := arm-linux-
+CROSS_COMPILE := $(call cc-cross-prefix, arm-linux- arm-linux-gnueabi-)
 endif
 
 ifndef CONFIG_STANDALONE_LOAD_ADDR
diff --git a/arch/microblaze/config.mk b/arch/microblaze/config.mk
index cdb321a..dae74f8 100644
--- a/arch/microblaze/config.mk
+++ b/arch/microblaze/config.mk
@@ -9,7 +9,7 @@ 
 #
 
 ifeq ($(CROSS_COMPILE),)
-CROSS_COMPILE := mb-
+CROSS_COMPILE := $(call cc-cross-prefix, mb- microblaze-linux-)
 endif
 
 CONFIG_STANDALONE_LOAD_ADDR ?= 0x80F00000
diff --git a/arch/powerpc/config.mk b/arch/powerpc/config.mk
index e398f97..ac94b2e 100644
--- a/arch/powerpc/config.mk
+++ b/arch/powerpc/config.mk
@@ -6,7 +6,7 @@ 
 #
 
 ifeq ($(CROSS_COMPILE),)
-CROSS_COMPILE := ppc_8xx-
+CROSS_COMPILE := $(call cc-cross-prefix, ppc_8xx- powerpc-linux-)
 endif
 
 CONFIG_STANDALONE_LOAD_ADDR ?= 0x40000