2015-07-13 11:11:13

by Alexey Brodkin

[permalink] [raw]
Subject: [PATCH] Revert "perf tools: Allow to specify custom linker command"

This reverts commit 5ef7bbb09f7b
("perf tools: Allow to specify custom linker command").

LD is a pre-defined variable in GNU Make. I.e. it is always defined.
Which means there's no point to check "LD ?= ..." because it will never
succeed. And so LD will be either that explicitly passed to make like
this:
------->8-------
make LD=path_to_my_ld ...
------->8-------
or default value, which is host's "ld".

Latter leads to failure of cross-linkage because instead of cross linker
"$(CROSS_COMPILE)ld" host's "ld" is used.

As for commit which is reverted here:
[1] Usually for selection of non-default flavour of CPU core/options
linker flags are used like "-mtune=xxx" or "-mMyCPUType" etc.

[2] Still to implement ability to use "ld" that differs from
"$(CROSS_COMPILE)ld" one will need to add new makefile variable like
TARGET_LD and then check if $(TARGET_LD) is not specified on make
invocation then use "$(CROSS_COMPILE)ld".

But for now to fix cross-building of perf this revert is enough.

Signed-off-by: Alexey Brodkin <[email protected]>
Cc: Vineet Gupta <[email protected]>
Cc: Aaro Koskinen <[email protected]>
Cc: Jiri Olsa <[email protected]>
Cc: Paul Mackerras <[email protected]>
Cc: Peter Zijlstra <[email protected]>
Cc: Arnaldo Carvalho de Melo <[email protected]>
Cc: [email protected]
---
tools/perf/Makefile.perf | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/tools/perf/Makefile.perf b/tools/perf/Makefile.perf
index 7a4b549..0e0938a 100644
--- a/tools/perf/Makefile.perf
+++ b/tools/perf/Makefile.perf
@@ -110,7 +110,7 @@ $(OUTPUT)PERF-VERSION-FILE: ../../.git/HEAD
$(Q)touch $(OUTPUT)PERF-VERSION-FILE

CC = $(CROSS_COMPILE)gcc
-LD ?= $(CROSS_COMPILE)ld
+LD = $(CROSS_COMPILE)ld
AR = $(CROSS_COMPILE)ar
PKG_CONFIG = $(CROSS_COMPILE)pkg-config

--
2.4.3


2015-07-13 20:32:39

by Aaro Koskinen

[permalink] [raw]
Subject: Re: [PATCH] Revert "perf tools: Allow to specify custom linker command"

Hi,

On Mon, Jul 13, 2015 at 02:10:53PM +0300, Alexey Brodkin wrote:
> This reverts commit 5ef7bbb09f7b
> ("perf tools: Allow to specify custom linker command").
>
> LD is a pre-defined variable in GNU Make. I.e. it is always defined.
> Which means there's no point to check "LD ?= ..." because it will never
> succeed. And so LD will be either that explicitly passed to make like
> this:
> ------->8-------
> make LD=path_to_my_ld ...
> ------->8-------
> or default value, which is host's "ld".
>
> Latter leads to failure of cross-linkage because instead of cross linker
> "$(CROSS_COMPILE)ld" host's "ld" is used.
>
> As for commit which is reverted here:
> [1] Usually for selection of non-default flavour of CPU core/options
> linker flags are used like "-mtune=xxx" or "-mMyCPUType" etc.
>
> [2] Still to implement ability to use "ld" that differs from
> "$(CROSS_COMPILE)ld" one will need to add new makefile variable like
> TARGET_LD and then check if $(TARGET_LD) is not specified on make
> invocation then use "$(CROSS_COMPILE)ld".
>
> But for now to fix cross-building of perf this revert is enough.

Hmm. You are probably right, my build system always exports LD with
correct linker for cross builds so perhaps that's why I this "worked"
for me when testing. Sorry.

I guess the correct fix would be [1], i.e. there should be some new
variable to pass flags to ld command.

Or maybe [2], could we use make "origin" function? If LD is "default",
then use "$(CROSS_COMPILE)ld", otherwise use what the user passed?

A.

2015-07-14 06:31:59

by Jiri Olsa

[permalink] [raw]
Subject: Re: [PATCH] Revert "perf tools: Allow to specify custom linker command"

On Mon, Jul 13, 2015 at 11:24:06PM +0300, Aaro Koskinen wrote:
> Hi,
>
> On Mon, Jul 13, 2015 at 02:10:53PM +0300, Alexey Brodkin wrote:
> > This reverts commit 5ef7bbb09f7b
> > ("perf tools: Allow to specify custom linker command").
> >
> > LD is a pre-defined variable in GNU Make. I.e. it is always defined.
> > Which means there's no point to check "LD ?= ..." because it will never
> > succeed. And so LD will be either that explicitly passed to make like
> > this:
> > ------->8-------
> > make LD=path_to_my_ld ...
> > ------->8-------
> > or default value, which is host's "ld".
> >
> > Latter leads to failure of cross-linkage because instead of cross linker
> > "$(CROSS_COMPILE)ld" host's "ld" is used.
> >
> > As for commit which is reverted here:
> > [1] Usually for selection of non-default flavour of CPU core/options
> > linker flags are used like "-mtune=xxx" or "-mMyCPUType" etc.
> >
> > [2] Still to implement ability to use "ld" that differs from
> > "$(CROSS_COMPILE)ld" one will need to add new makefile variable like
> > TARGET_LD and then check if $(TARGET_LD) is not specified on make
> > invocation then use "$(CROSS_COMPILE)ld".
> >
> > But for now to fix cross-building of perf this revert is enough.
>
> Hmm. You are probably right, my build system always exports LD with
> correct linker for cross builds so perhaps that's why I this "worked"
> for me when testing. Sorry.
>
> I guess the correct fix would be [1], i.e. there should be some new
> variable to pass flags to ld command.
>
> Or maybe [2], could we use make "origin" function? If LD is "default",
> then use "$(CROSS_COMPILE)ld", otherwise use what the user passed?

thats what Steven did in traceevent/Makefile:

---
# Makefiles suck: This macro sets a default value of $(2) for the
# variable named by $(1), unless the variable has been set by
# environment or command line. This is necessary for CC and AR
# because make sets default values, so the simpler ?= approach
# won't work as expected.
define allow-override
$(if $(or $(findstring environment,$(origin $(1))),\
$(findstring command line,$(origin $(1)))),,\
$(eval $(1) = $(2)))
endef

# Allow setting CC and AR, or setting CROSS_COMPILE as a prefix.
$(call allow-override,CC,$(CROSS_COMPILE)gcc)
$(call allow-override,AR,$(CROSS_COMPILE)ar)
$(call allow-override,NM,$(CROSS_COMPILE)nm)
---

jirka

2015-07-14 09:05:34

by Alexey Brodkin

[permalink] [raw]
Subject: [PATCH] perf tools: Really allow to specify custom CC, AR or LD

Commit 5ef7bbb09f7b ("perf tools: Allow to specify custom linker command")
was meant to enable usage non $(CROSS_COMPILE)ld linker during perf
building. But implementation didn't take in account fact that LD is
a pre-defined variable in GNU Make. I.e. it is always defined.
Which means there's no point to check "LD ?= ..." because it will never
succeed. And so LD will be either that explicitly passed to make like
this:
------->8-------
make LD=path_to_my_ld ...
------->8-------
or default value, which is host's "ld".

Latter leads to failure of cross-linkage because instead of cross linker
"$(CROSS_COMPILE)ld" host's "ld" is used.

Fortunately there's a way to do correct substitution of $(CROSS_COMPILE)ld
with user defined LD on command-line.

As a reference was used implementation in "tools/lib/traceevent/Makefile".

Build tested for x86_64 and ARC.

Thanks Jiri for this hint.

Signed-off-by: Alexey Brodkin <[email protected]>
Cc: Vineet Gupta <[email protected]>
Cc: Aaro Koskinen <[email protected]>
Cc: Jiri Olsa <[email protected]>
Cc: Paul Mackerras <[email protected]>
Cc: Peter Zijlstra <[email protected]>
Cc: Arnaldo Carvalho de Melo <[email protected]>
Cc: [email protected]
---
tools/perf/Makefile.perf | 19 ++++++++++++++++---
1 file changed, 16 insertions(+), 3 deletions(-)

diff --git a/tools/perf/Makefile.perf b/tools/perf/Makefile.perf
index 7a4b549..bba3463 100644
--- a/tools/perf/Makefile.perf
+++ b/tools/perf/Makefile.perf
@@ -109,9 +109,22 @@ $(OUTPUT)PERF-VERSION-FILE: ../../.git/HEAD
$(Q)$(SHELL_PATH) util/PERF-VERSION-GEN $(OUTPUT)
$(Q)touch $(OUTPUT)PERF-VERSION-FILE

-CC = $(CROSS_COMPILE)gcc
-LD ?= $(CROSS_COMPILE)ld
-AR = $(CROSS_COMPILE)ar
+# Makefiles suck: This macro sets a default value of $(2) for the
+# variable named by $(1), unless the variable has been set by
+# environment or command line. This is necessary for CC and AR
+# because make sets default values, so the simpler ?= approach
+# won't work as expected.
+define allow-override
+ $(if $(or $(findstring environment,$(origin $(1))),\
+ $(findstring command line,$(origin $(1)))),,\
+ $(eval $(1) = $(2)))
+endef
+
+# Allow setting CC and AR and LD, or setting CROSS_COMPILE as a prefix.
+$(call allow-override,CC,$(CROSS_COMPILE)gcc)
+$(call allow-override,AR,$(CROSS_COMPILE)ar)
+$(call allow-override,LD,$(CROSS_COMPILE)ld)
+
PKG_CONFIG = $(CROSS_COMPILE)pkg-config

RM = rm -f
--
2.4.3

2015-07-14 13:46:25

by Arnaldo Carvalho de Melo

[permalink] [raw]
Subject: Re: [PATCH] Revert "perf tools: Allow to specify custom linker command"

Em Mon, Jul 13, 2015 at 11:24:06PM +0300, Aaro Koskinen escreveu:
> Hi,
>
> On Mon, Jul 13, 2015 at 02:10:53PM +0300, Alexey Brodkin wrote:
> > This reverts commit 5ef7bbb09f7b
> > ("perf tools: Allow to specify custom linker command").
> >
> > LD is a pre-defined variable in GNU Make. I.e. it is always defined.
> > Which means there's no point to check "LD ?= ..." because it will never
> > succeed. And so LD will be either that explicitly passed to make like
> > this:
> > ------->8-------
> > make LD=path_to_my_ld ...
> > ------->8-------
> > or default value, which is host's "ld".
> >
> > Latter leads to failure of cross-linkage because instead of cross linker
> > "$(CROSS_COMPILE)ld" host's "ld" is used.
> >
> > As for commit which is reverted here:
> > [1] Usually for selection of non-default flavour of CPU core/options
> > linker flags are used like "-mtune=xxx" or "-mMyCPUType" etc.
> >
> > [2] Still to implement ability to use "ld" that differs from
> > "$(CROSS_COMPILE)ld" one will need to add new makefile variable like
> > TARGET_LD and then check if $(TARGET_LD) is not specified on make
> > invocation then use "$(CROSS_COMPILE)ld".
> >
> > But for now to fix cross-building of perf this revert is enough.
>
> Hmm. You are probably right, my build system always exports LD with
> correct linker for cross builds so perhaps that's why I this "worked"
> for me when testing. Sorry.

So, I think this is an "Acked-by: Aaro Koskinen <[email protected]>"
for the revert, right?

> I guess the correct fix would be [1], i.e. there should be some new
> variable to pass flags to ld command.
>
> Or maybe [2], could we use make "origin" function? If LD is "default",
> then use "$(CROSS_COMPILE)ld", otherwise use what the user passed?

When you guys get to some conclusion, please submit a new patch, for now
I am taking the revert with the (implied) Acked-by Aaro, ok?

- Arnaldo

2015-07-14 14:00:13

by Alexey Brodkin

[permalink] [raw]
Subject: Re: [PATCH] Revert "perf tools: Allow to specify custom linker command"

Hi Arnaldo,

On Tue, 2015-07-14 at 10:46 -0300, Arnaldo Carvalho de Melo wrote:
+AD4- Em Mon, Jul 13, 2015 at 11:24:06PM +-0300, Aaro Koskinen escreveu:
+AD4- +AD4- Hi,
+AD4- +AD4-
+AD4- +AD4- On Mon, Jul 13, 2015 at 02:10:53PM +-0300, Alexey Brodkin wrote:
+AD4- +AD4- +AD4- This reverts commit 5ef7bbb09f7b
+AD4- +AD4- +AD4- (+ACI-perf tools: Allow to specify custom linker command+ACI-).
+AD4- +AD4- +AD4-
+AD4- +AD4- +AD4- LD is a pre-defined variable in GNU Make. I.e. it is always defined.
+AD4- +AD4- +AD4- Which means there's no point to check +ACI-LD ?+AD0- ...+ACI- because it will never
+AD4- +AD4- +AD4- succeed. And so LD will be either that explicitly passed to make like
+AD4- +AD4- +AD4- this:
+AD4- +AD4- +AD4- -------+AD4-8-------
+AD4- +AD4- +AD4- make LD+AD0-path+AF8-to+AF8-my+AF8-ld ...
+AD4- +AD4- +AD4- -------+AD4-8-------
+AD4- +AD4- +AD4- or default value, which is host's +ACI-ld+ACI-.
+AD4- +AD4- +AD4-
+AD4- +AD4- +AD4- Latter leads to failure of cross-linkage because instead of cross linker
+AD4- +AD4- +AD4- +ACIAJA-(CROSS+AF8-COMPILE)ld+ACI- host's +ACI-ld+ACI- is used.
+AD4- +AD4- +AD4-
+AD4- +AD4- +AD4- As for commit which is reverted here:
+AD4- +AD4- +AD4- +AFs-1+AF0- Usually for selection of non-default flavour of CPU core/options
+AD4- +AD4- +AD4- linker flags are used like +ACI--mtune+AD0-xxx+ACI- or +ACI--mMyCPUType+ACI- etc.
+AD4- +AD4- +AD4-
+AD4- +AD4- +AD4- +AFs-2+AF0- Still to implement ability to use +ACI-ld+ACI- that differs from
+AD4- +AD4- +AD4- +ACIAJA-(CROSS+AF8-COMPILE)ld+ACI- one will need to add new makefile variable like
+AD4- +AD4- +AD4- TARGET+AF8-LD and then check if +ACQ-(TARGET+AF8-LD) is not specified on make
+AD4- +AD4- +AD4- invocation then use +ACIAJA-(CROSS+AF8-COMPILE)ld+ACI-.
+AD4- +AD4- +AD4-
+AD4- +AD4- +AD4- But for now to fix cross-building of perf this revert is enough.
+AD4- +AD4-
+AD4- +AD4- Hmm. You are probably right, my build system always exports LD with
+AD4- +AD4- correct linker for cross builds so perhaps that's why I this +ACI-worked+ACI-
+AD4- +AD4- for me when testing. Sorry.
+AD4-
+AD4- So, I think this is an +ACI-Acked-by: Aaro Koskinen +ADw-aaro.koskinen+AEA-iki.fi+AD4AIg-
+AD4- for the revert, right?
+AD4-
+AD4- +AD4- I guess the correct fix would be +AFs-1+AF0-, i.e. there should be some new
+AD4- +AD4- variable to pass flags to ld command.
+AD4- +AD4-
+AD4- +AD4- Or maybe +AFs-2+AF0-, could we use make +ACI-origin+ACI- function? If LD is +ACI-default+ACI-,
+AD4- +AD4- then use +ACIAJA-(CROSS+AF8-COMPILE)ld+ACI-, otherwise use what the user passed?
+AD4-
+AD4- When you guys get to some conclusion, please submit a new patch, for now
+AD4- I am taking the revert with the (implied) Acked-by Aaro, ok?

Please find my patch that both reverts initial Aaro's patch and implements
proper handling of CC, AR and LD substitution here - https://lkml.org/lkml/2015/7/14/149

-Alexey-

2015-07-14 14:45:25

by Arnaldo Carvalho de Melo

[permalink] [raw]
Subject: Re: [PATCH] Revert "perf tools: Allow to specify custom linker command"

Em Tue, Jul 14, 2015 at 02:00:05PM +0000, Alexey Brodkin escreveu:
> On Tue, 2015-07-14 at 10:46 -0300, Arnaldo Carvalho de Melo wrote:
> > Em Mon, Jul 13, 2015 at 11:24:06PM +0300, Aaro Koskinen escreveu:
> > > > But for now to fix cross-building of perf this revert is enough.

> > > Hmm. You are probably right, my build system always exports LD with
> > > correct linker for cross builds so perhaps that's why I this "worked"
> > > for me when testing. Sorry.

> > So, I think this is an "Acked-by: Aaro Koskinen <[email protected]>"
> > for the revert, right?

> > > I guess the correct fix would be [1], i.e. there should be some new
> > > variable to pass flags to ld command.

> > > Or maybe [2], could we use make "origin" function? If LD is "default",
> > > then use "$(CROSS_COMPILE)ld", otherwise use what the user passed?

> > When you guys get to some conclusion, please submit a new patch, for now
> > I am taking the revert with the (implied) Acked-by Aaro, ok?

> Please find my patch that both reverts initial Aaro's patch and implements
> proper handling of CC, AR and LD substitution here - https://lkml.org/lkml/2015/7/14/149

I saw it, will do.

- Arnaldo

Subject: [tip:perf/urgent] perf tools: Really allow to specify custom CC, AR or LD

Commit-ID: 3c71ba3f80bbd476bbfb2a008da9b676031cbd32
Gitweb: http://git.kernel.org/tip/3c71ba3f80bbd476bbfb2a008da9b676031cbd32
Author: Alexey Brodkin <[email protected]>
AuthorDate: Tue, 14 Jul 2015 12:05:20 +0300
Committer: Arnaldo Carvalho de Melo <[email protected]>
CommitDate: Wed, 15 Jul 2015 11:57:28 -0300

perf tools: Really allow to specify custom CC, AR or LD

Commit 5ef7bbb09f7b ("perf tools: Allow to specify custom linker
command") was meant to enable usage non $(CROSS_COMPILE)ld linker during
perf building.

But implementation didn't take into account the fact that LD is a
pre-defined variable in GNU Make. I.e. it is always defined.

Which means there's no point to check "LD ?= ..." because it will never
succeed.

And so LD will be either that explicitly passed to make like this:

------->8-------
make LD=path_to_my_ld ...
------->8-------
or default value, which is host's "ld".

Latter leads to failure of cross-linkage because instead of cross linker
"$(CROSS_COMPILE)ld" host's "ld" is used.

Fortunately there's a way to do correct substitution of $(CROSS_COMPILE)ld
with user defined LD on command-line.

As a reference was used implementation in "tools/lib/traceevent/Makefile".

Build tested for x86_64 and ARC.

Thanks Jiri for this hint.

Signed-off-by: Alexey Brodkin <[email protected]>
Fixes: 5ef7bbb09f7b ("perf tools: Allow to specify custom linker command")
Cc: Aaro Koskinen <[email protected]>
Cc: Jiri Olsa <[email protected]>
Cc: Paul Mackerras <[email protected]>
Cc: Peter Zijlstra <[email protected]>
Cc: Vineet Gupta <[email protected]>
Cc: Vineet Gupta <[email protected]>
Cc: [email protected]
Link: http://lkml.kernel.org/r/[email protected]
Signed-off-by: Arnaldo Carvalho de Melo <[email protected]>
---
tools/perf/Makefile.perf | 19 ++++++++++++++++---
1 file changed, 16 insertions(+), 3 deletions(-)

diff --git a/tools/perf/Makefile.perf b/tools/perf/Makefile.perf
index 7a4b549..bba3463 100644
--- a/tools/perf/Makefile.perf
+++ b/tools/perf/Makefile.perf
@@ -109,9 +109,22 @@ $(OUTPUT)PERF-VERSION-FILE: ../../.git/HEAD
$(Q)$(SHELL_PATH) util/PERF-VERSION-GEN $(OUTPUT)
$(Q)touch $(OUTPUT)PERF-VERSION-FILE

-CC = $(CROSS_COMPILE)gcc
-LD ?= $(CROSS_COMPILE)ld
-AR = $(CROSS_COMPILE)ar
+# Makefiles suck: This macro sets a default value of $(2) for the
+# variable named by $(1), unless the variable has been set by
+# environment or command line. This is necessary for CC and AR
+# because make sets default values, so the simpler ?= approach
+# won't work as expected.
+define allow-override
+ $(if $(or $(findstring environment,$(origin $(1))),\
+ $(findstring command line,$(origin $(1)))),,\
+ $(eval $(1) = $(2)))
+endef
+
+# Allow setting CC and AR and LD, or setting CROSS_COMPILE as a prefix.
+$(call allow-override,CC,$(CROSS_COMPILE)gcc)
+$(call allow-override,AR,$(CROSS_COMPILE)ar)
+$(call allow-override,LD,$(CROSS_COMPILE)ld)
+
PKG_CONFIG = $(CROSS_COMPILE)pkg-config

RM = rm -f