Skip to contentSkip to conversation

fix compilation error with CROSS_COMPILE

PATCH RESEND Superseded Wu Fengguang 3 participants 7 messages Aug 21, 2010 – Aug 23, 2010 Kbuild

v1 of 2 Superseded Latest is v2 →

lore
Share & tools
lore
#0 lore raw

PATCH RESEND 1/1 fix compilation error with CROSS_COMPILE

        $ make CROSS_COMPILE=x86_64-linux-gnu-
        ...
        cc1: error: unrecognized command line option "-m64"
        cc1: error: unrecognized command line option "-mno-red-zone"
        cc1: error: unrecognized command line option "-mcmodel=kernel"
        cc1: error: unrecognized command line option "-maccumulate-outgoing-args"
Cc Tiago Maluta <[email protected]>
Cc Michal Marek <[email protected]>

---

Andrew: the compile error only occurs in the -mm tree
The bug is introduced by patch "Linux has an recent option to define CROSS_COMPILE in menuconfig.".

Makefile +1 -1
index d646d69..af8864e 100644
@@ -190,7 +190,7 @@ SUBARCH := $(shell uname -m | sed -e s/i.86/i386/ -e s/sun4u/sparc64/ \
 export KBUILD_BUILDHOST := $(SUBARCH)
 ARCH		?= $(SUBARCH)
 CROSS_COMPILE	?=
-CROSS_COMPILE	:= $(shell grep CONFIG_CROSS_COMPILE .config | cut -d'"' -f2)
+CROSS_COMPILE	?= $(shell grep CONFIG_CROSS_COMPILE .config | cut -d'"' -f2)
 
 # Architecture as present in compile.h
 UTS_MACHINE 	:= $(ARCH)
#1 lore raw
Quoted 21 lines · Wu Fengguang
        $ make CROSS_COMPILE=x86_64-linux-gnu-
        ...
        cc1: error: unrecognized command line option "-m64"
        cc1: error: unrecognized command line option "-mno-red-zone"
        cc1: error: unrecognized command line option "-mcmodel=kernel"
        cc1: error: unrecognized command line option "-maccumulate-outgoing-args"
Cc Tiago Maluta <[email protected]>
Cc Michal Marek <[email protected]>

---

Andrew: the compile error only occurs in the -mm tree
The bug is introduced by patch "Linux has an recent option to define CROSS_COMPILE in menuconfig.".

Makefile +0 -0
index d646d69..af8864e 100644

Makefile SUBARCH := $(shell uname -m | sed -e s/i.86/i386/ -e s/sun4u/sparc64/ \ · line 193

Quoted 5 lines
Makefile +1 -1
@@ -190,7 +190,7 @@ SUBARCH := $(shell uname -m | sed -e s/i.86/i386/ -e s/sun4u/sparc64/ \
 export KBUILD_BUILDHOST := $(SUBARCH)
 ARCH		?= $(SUBARCH)
 CROSS_COMPILE	?=
-CROSS_COMPILE	:= $(shell grep CONFIG_CROSS_COMPILE .config | cut -d'"' -f2)
+CROSS_COMPILE	?= $(shell grep CONFIG_CROSS_COMPILE .config | cut -d'"' -f2)

I cannot see how this would solve your problem.
Any variable assigned using := or ?= can be overrided by variable assigned on the command line like this:

make VAR=values

Please note that there is a big difference between the above and this:

VAR=value make

In the latter case you pass in VAR using the enviroment and it is just like any other environment variable as seen from make.

On top of that the upstream kernel does not have the first assignmnet to CROSS_COMPILE - so you need to update your sources (or Andrews --mm is not recent enough.

Please try again with upstream kernel and let us know what you conclude.

Sam

#2 lore raw
Quoted 32 lines · Sam Ravnborg
Quoted 21 lines · Wu Fengguang
        $ make CROSS_COMPILE=x86_64-linux-gnu-
        ...
        cc1: error: unrecognized command line option "-m64"
        cc1: error: unrecognized command line option "-mno-red-zone"
        cc1: error: unrecognized command line option "-mcmodel=kernel"
        cc1: error: unrecognized command line option "-maccumulate-outgoing-args"
Cc Tiago Maluta <[email protected]>
Cc Michal Marek <[email protected]>

---

Andrew: the compile error only occurs in the -mm tree
The bug is introduced by patch "Linux has an recent option to define CROSS_COMPILE in menuconfig.".

Makefile +0 -0
index d646d69..af8864e 100644

Makefile SUBARCH := $(shell uname -m | sed -e s/i.86/i386/ -e s/sun4u/sparc64/ \ · line 193

Quoted 5 lines
Makefile +1 -1
@@ -190,7 +190,7 @@ SUBARCH := $(shell uname -m | sed -e s/i.86/i386/ -e s/sun4u/sparc64/ \
 export KBUILD_BUILDHOST := $(SUBARCH)
 ARCH		?= $(SUBARCH)
 CROSS_COMPILE	?=
-CROSS_COMPILE	:= $(shell grep CONFIG_CROSS_COMPILE .config | cut -d'"' -f2)
+CROSS_COMPILE	?= $(shell grep CONFIG_CROSS_COMPILE .config | cut -d'"' -f2)

I cannot see how this would solve your problem.
Any variable assigned using := or ?= can be overrided by variable assigned on the command line like this:

Quoted 5 lines

make VAR=values

Please note that there is a big difference between the above and this:

VAR=value make

Ah yes I'm using that form indeed. Sorry for the confusion.

Quoted 9 lines

In the latter case you pass in VAR using the enviroment and it is just like any other environment variable as seen from make.

On top of that the upstream kernel does not have the first assignmnet to CROSS_COMPILE - so you need to update your sources (or Andrews --mm is not recent enough.

Please try again with upstream kernel and let us know what you conclude.

Upstream kernel uses the ?= form and runs always OK.

The recent -mm kernels I tried all have the problem.

Thanks,
Fengguang

#3 lore raw
Quoted 48 lines · Wu Fengguang
Quoted 32 lines · Sam Ravnborg
Quoted 21 lines · Wu Fengguang
        $ make CROSS_COMPILE=x86_64-linux-gnu-
        ...
        cc1: error: unrecognized command line option "-m64"
        cc1: error: unrecognized command line option "-mno-red-zone"
        cc1: error: unrecognized command line option "-mcmodel=kernel"
        cc1: error: unrecognized command line option "-maccumulate-outgoing-args"
Cc Tiago Maluta <[email protected]>
Cc Michal Marek <[email protected]>

---

Andrew: the compile error only occurs in the -mm tree
The bug is introduced by patch "Linux has an recent option to define CROSS_COMPILE in menuconfig.".

Makefile +0 -0
index d646d69..af8864e 100644

Makefile SUBARCH := $(shell uname -m | sed -e s/i.86/i386/ -e s/sun4u/sparc64/ \ · line 193

Quoted 5 lines
Makefile +1 -1
@@ -190,7 +190,7 @@ SUBARCH := $(shell uname -m | sed -e s/i.86/i386/ -e s/sun4u/sparc64/ \
 export KBUILD_BUILDHOST := $(SUBARCH)
 ARCH		?= $(SUBARCH)
 CROSS_COMPILE	?=
-CROSS_COMPILE	:= $(shell grep CONFIG_CROSS_COMPILE .config | cut -d'"' -f2)
+CROSS_COMPILE	?= $(shell grep CONFIG_CROSS_COMPILE .config | cut -d'"' -f2)

I cannot see how this would solve your problem.
Any variable assigned using := or ?= can be overrided by variable assigned on the command line like this:

Quoted 5 lines

make VAR=values

Please note that there is a big difference between the above and this:

VAR=value make

Ah yes I'm using that form indeed. Sorry for the confusion.

Quoted 7 lines

In the latter case you pass in VAR using the enviroment and it is just like any other environment variable as seen from make.

On top of that the upstream kernel does not have the first assignmnet to CROSS_COMPILE - so you need to update your sources (or Andrews --mm is not recent enough.

Quoted 6 lines
Quoted 2 lines

Please try again with upstream kernel and let us know what you conclude.

Upstream kernel uses the ?= form and runs always OK.

The recent -mm kernels I tried all have the problem.

Good.
Then we can assume that next -mm has this fixed when he picks up this change from upstream. Or maybe -mm has a patch in needs for revert.

Took a quick looks at -mm and only fould this:
kbuild-fix-config_cross_compile-issue-in-config.patch And this is already upstream.

So I suggest you to fix it locally and check that
next -mm is correct.

Sam

#4 lore raw
Quoted 34 lines · Sam Ravnborg
Quoted 33 lines · Wu Fengguang
Quoted 32 lines · Sam Ravnborg
Quoted 21 lines · Wu Fengguang
        $ make CROSS_COMPILE=x86_64-linux-gnu-
        ...
        cc1: error: unrecognized command line option "-m64"
        cc1: error: unrecognized command line option "-mno-red-zone"
        cc1: error: unrecognized command line option "-mcmodel=kernel"
        cc1: error: unrecognized command line option "-maccumulate-outgoing-args"
Cc Tiago Maluta <[email protected]>
Cc Michal Marek <[email protected]>

---

Andrew: the compile error only occurs in the -mm tree
The bug is introduced by patch "Linux has an recent option to define CROSS_COMPILE in menuconfig.".

Makefile +0 -0
index d646d69..af8864e 100644

Makefile SUBARCH := $(shell uname -m | sed -e s/i.86/i386/ -e s/sun4u/sparc64/ \ · line 193

Quoted 5 lines
Makefile +1 -1
@@ -190,7 +190,7 @@ SUBARCH := $(shell uname -m | sed -e s/i.86/i386/ -e s/sun4u/sparc64/ \
 export KBUILD_BUILDHOST := $(SUBARCH)
 ARCH		?= $(SUBARCH)
 CROSS_COMPILE	?=
-CROSS_COMPILE	:= $(shell grep CONFIG_CROSS_COMPILE .config | cut -d'"' -f2)
+CROSS_COMPILE	?= $(shell grep CONFIG_CROSS_COMPILE .config | cut -d'"' -f2)

I cannot see how this would solve your problem.
Any variable assigned using := or ?= can be overrided by variable assigned on the command line like this:

Quoted 7 lines
Quoted 7 lines
Quoted 5 lines

make VAR=values

Please note that there is a big difference between the above and this:

VAR=value make

Ah yes I'm using that form indeed. Sorry for the confusion.

Here is the exact command line (w/o this patch):

wfg@bee ~/cc/mmotm% ARCH=x86_64 CROSS_COMPILE=x86_64-linux-gnu- /usr/bin/make /home/wfg/cc/mmotm/arch/x86/Makefile:81: stack protector enabled but no compiler support

  CHK     include/linux/version.h
  CHK     include/generated/utsrelease.h
  CC      kernel/bounds.s

cc1: error: unrecognized command line option "-m64"
cc1: error: unrecognized command line option "-mno-red-zone"
cc1: error: unrecognized command line option "-mcmodel=kernel"
cc1: error: unrecognized command line option "-maccumulate-outgoing-args" make[1]: *** [kernel/bounds.s] Error 1
make: *** [prepare0] Error 2

Quoted 12 lines
Quoted 12 lines
Quoted 9 lines

In the latter case you pass in VAR using the enviroment and it is just like any other environment variable as seen from make.

On top of that the upstream kernel does not have the first assignmnet to CROSS_COMPILE - so you need to update your sources (or Andrews --mm is not recent enough.

Please try again with upstream kernel and let us know what you conclude.

Upstream kernel uses the ?= form and runs always OK.

Quoted 8 lines
Quoted 1 line

The recent -mm kernels I tried all have the problem.

Good.
Then we can assume that next -mm has this fixed when he picks up this change from upstream. Or maybe -mm has a patch in needs for revert.

Took a quick looks at -mm and only fould this:
kbuild-fix-config_cross_compile-issue-in-config.patch

Yes it is.

Quoted 1 line

And this is already upstream.

However I confirmed that the linux-2.6 tree is OK, the above patch that caused the problem is still sitting in -mm tree:

commit 7f48a0a8c15c41f382f2265088bc96007836e608

Author: Tiago Maluta <[email protected]>
Date:   Mon Jun 21 22:00:17 2010 +0200

Linux has an recent option to define CROSS_COMPILE in menuconfig.

Typically, one of the options when building for another target is ('arm' is just an example):

# make ARCH=arm CROSS_COMPILE=arm-cc O=../build

If I omit CROSS_COMPILE and use the new way in .config:
CONFIG_CROSS_COMPILE="arm-cc"

I got:

cc1: error: unrecognized command line option "-mlittle-endian"
cc1: error: unrecognized command line option "-mabi=aapcs-linux"
cc1: error: unrecognized command line option "-mno-thumb-interwork" /usr/src/linux/kernel/bounds.c:1: error: bad value (armv5t) for -march= switch /usr/src/linux/kernel/bounds.c:1: error: bad value (armv5t) for -mtune= switch make[2]: *** [kernel/bounds.s] Error 1
make[1]: *** [prepare0] Error 2
make: *** [sub-make] Error 2

Verbose output clearly says that I'm using the host compiler instead cross compiler. This patch fixed my problem.

Makefile +1 -1
index 7431c28..13126ae 100644
@@ -190,7 +190,7 @@ SUBARCH := $(shell uname -m | sed -e s/i.86/i386/ -e s/sun4u/sparc64/ \
 export KBUILD_BUILDHOST := $(SUBARCH)
 ARCH           ?= $(SUBARCH)
 CROSS_COMPILE  ?=
-CROSS_COMPILE  ?= $(CONFIG_CROSS_COMPILE:"%"=%)
+CROSS_COMPILE  := $(shell grep CONFIG_CROSS_COMPILE .config | cut -d'"' -f2)
 
 # Architecture as present in compile.h
 UTS_MACHINE    := $(ARCH)

Thanks,
Fengguang

#5 lore raw
Quoted 40 lines

However I confirmed that the linux-2.6 tree is OK, the above patch that caused the problem is still sitting in -mm tree:

commit 7f48a0a8c15c41f382f2265088bc96007836e608

Author: Tiago Maluta <[email protected]>
Date:   Mon Jun 21 22:00:17 2010 +0200

Linux has an recent option to define CROSS_COMPILE in menuconfig.

Typically, one of the options when building for another target is ('arm' is just an example):

# make ARCH=arm CROSS_COMPILE=arm-cc O=../build

If I omit CROSS_COMPILE and use the new way in .config:
CONFIG_CROSS_COMPILE="arm-cc"

I got:

cc1: error: unrecognized command line option "-mlittle-endian"
cc1: error: unrecognized command line option "-mabi=aapcs-linux"
cc1: error: unrecognized command line option "-mno-thumb-interwork" /usr/src/linux/kernel/bounds.c:1: error: bad value (armv5t) for -march= switch /usr/src/linux/kernel/bounds.c:1: error: bad value (armv5t) for -mtune= switch make[2]: *** [kernel/bounds.s] Error 1
make[1]: *** [prepare0] Error 2
make: *** [sub-make] Error 2

Verbose output clearly says that I'm using the host compiler instead cross compiler. This patch fixed my problem.

Makefile +0 -0
index 7431c28..13126ae 100644

Makefile SUBARCH := $(shell uname -m | sed -e s/i.86/i386/ -e s/sun4u/sparc64/ \ · line 193

Quoted 5 lines
Makefile +1 -1
@@ -190,7 +190,7 @@ SUBARCH := $(shell uname -m | sed -e s/i.86/i386/ -e s/sun4u/sparc64/ \
 export KBUILD_BUILDHOST := $(SUBARCH)
 ARCH           ?= $(SUBARCH)
 CROSS_COMPILE  ?=
-CROSS_COMPILE  ?= $(CONFIG_CROSS_COMPILE:"%"=%)
+CROSS_COMPILE  := $(shell grep CONFIG_CROSS_COMPILE .config | cut -d'"' -f2)

So this patch does two things:
1) It grep for CONFIG_CROSS_COMPILE because we may not have incldued .config
2) It no longer pick up CROSS_COMPILE from the environment.

Traditionally we have picked up ARCH and CROSS_COMPILE from the environmnet, hence the use of "?=".
"?=" says - perfrom this assignmnet unless lhs is already defined. And lhs may be already defined is we have the ysmbol defined in the environmnet.

I think the original submitter chenged from ?= to := without realising this.
So the patch should be adjusted to use ?= again as you suggest before it is applied.
I assume Michal / Andrew will take care.

Subject on patch could also be better.
Suggestion: kbuild: fix reading CROSS_COMPILE from .config

Sam

#6 lore raw
Quoted 5 lines · Sam Ravnborg
Quoted 5 lines

commit 7f48a0a8c15c41f382f2265088bc96007836e608

Author: Tiago Maluta<[email protected]>
Date:   Mon Jun 21 22:00:17 2010 +0200

Linux has an recent option to define CROSS_COMPILE in menuconfig.

[...]

Quoted 21 lines

Makefile SUBARCH := $(shell uname -m | sed -e s/i.86/i386/ -e s/sun4u/sparc64/ \ · line 193

Quoted 10 lines
Makefile +1 -1
index 7431c28..13126ae 100644
@@ -190,7 +190,7 @@ SUBARCH := $(shell uname -m | sed -e s/i.86/i386/ -e s/sun4u/sparc64/ \
  export KBUILD_BUILDHOST := $(SUBARCH)
  ARCH           ?= $(SUBARCH)
  CROSS_COMPILE  ?=
-CROSS_COMPILE  ?= $(CONFIG_CROSS_COMPILE:"%"=%)
+CROSS_COMPILE  := $(shell grep CONFIG_CROSS_COMPILE .config | cut -d'"' -f2)

So this patch does two things:
1) It grep for CONFIG_CROSS_COMPILE because we may not have incldued .config
2) It no longer pick up CROSS_COMPILE from the environment.

Traditionally we have picked up ARCH and CROSS_COMPILE from the environmnet, hence the use of "?=".
"?=" says - perfrom this assignmnet unless lhs is already defined. And lhs may be already defined is we have the ysmbol defined in the environmnet.

Quoted 5 lines

I think the original submitter chenged from ?= to := without realising this.
So the patch should be adjusted to use ?= again as you suggest before it is applied.
I assume Michal / Andrew will take care.

I would rather check if the patch is still needed at all. Tiago, can you try vanilla 2.6.36-rc1, which has the first "CROSS_COMPILE ?="
line removed (commit 235caa2) and check if your original problem still presists?

Thanks,
Michal