From: xu xin <[email protected]>
When we compile the kernel with cross compilers, if CROSS_COMPILE is
specified by the path containing special directory like '~', some
compilation error will occurs.
Here's an example:
$ make ARCH=x86_64
CROSS_COMPILE=~/x86_64_gcc9.2.0_glibc2.31.0/bin/x86_64-pc-linux-gnu- all
error:./scripts/mkcompile_h: line 64:
~/x86_64_gcc9.2.0_glibc2.31.0/bin/x86_64-pc-linux-gnu-ld: No such file or
directory
Since there are many other similar scripts using these variables, in
order to solve the problem from the source, add realpath in makefile to
turn these variables into absolute paths.
Signed-off-by: xu xin <[email protected]>
---
Makefile | 16 ++++++++--------
1 file changed, 8 insertions(+), 8 deletions(-)
diff --git a/Makefile b/Makefile
index fe5a4d8e4ac5..cdbb747787ac 100644
--- a/Makefile
+++ b/Makefile
@@ -459,14 +459,14 @@ OBJDUMP = llvm-objdump
READELF = llvm-readelf
STRIP = llvm-strip
else
-CC = $(CROSS_COMPILE)gcc
-LD = $(CROSS_COMPILE)ld
-AR = $(CROSS_COMPILE)ar
-NM = $(CROSS_COMPILE)nm
-OBJCOPY = $(CROSS_COMPILE)objcopy
-OBJDUMP = $(CROSS_COMPILE)objdump
-READELF = $(CROSS_COMPILE)readelf
-STRIP = $(CROSS_COMPILE)strip
+CC = $(realpath $(CROSS_COMPILE))gcc
+LD = $(realpath $(CROSS_COMPILE))ld
+AR = $(realpath $(CROSS_COMPILE))ar
+NM = $(realpath $(CROSS_COMPILE))nm
+OBJCOPY = $(realpath $(CROSS_COMPILE))objcopy
+OBJDUMP = $(realpath $(CROSS_COMPILE))objdump
+READELF = $(realpath $(CROSS_COMPILE))readelf
+STRIP = $(realpath $(CROSS_COMPILE))strip
endif
RUSTC = rustc
RUSTDOC = rustdoc
--
2.25.1
On Fri, Dec 31, 2021 at 07:55:51AM +0000, [email protected] wrote:
> From: xu xin <[email protected]>
>
> When we compile the kernel with cross compilers, if CROSS_COMPILE is
> specified by the path containing special directory like '~', some
> compilation error will occurs.
>
> Here's an example:
>
> $ make ARCH=x86_64
> CROSS_COMPILE=~/x86_64_gcc9.2.0_glibc2.31.0/bin/x86_64-pc-linux-gnu- all
>
> error:./scripts/mkcompile_h: line 64:
> ~/x86_64_gcc9.2.0_glibc2.31.0/bin/x86_64-pc-linux-gnu-ld: No such file or
> directory
>
> Since there are many other similar scripts using these variables, in
> order to solve the problem from the source, add realpath in makefile to
> turn these variables into absolute paths.
This is not going to work for the traditional approach of CROSS_COMPILE
being just a triple, rather than a full path plus a triple, because
$(realpath $(CROSS_COMPILE))
is going to evaluate to nothing in that case:
$ make -skj"$(nproc)" ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- defconfig all
warning: ld does not support --fix-cortex-a53-843419; kernel may be susceptible to erratum
ld: unrecognised emulation mode: aarch64linux
Supported emulations: elf_x86_64 elf32_x86_64 elf_i386 elf_iamcu elf_l1om elf_k1om i386pep i386pe
make[2]: *** [arch/arm64/kernel/vdso/Makefile:57: arch/arm64/kernel/vdso/vdso.so.dbg] Error 1
...
Why not just change '~' to '$HOME' in your build scripts so that it is
evaluated before the make command begins?
> Signed-off-by: xu xin <[email protected]>
> ---
> Makefile | 16 ++++++++--------
> 1 file changed, 8 insertions(+), 8 deletions(-)
>
> diff --git a/Makefile b/Makefile
> index fe5a4d8e4ac5..cdbb747787ac 100644
> --- a/Makefile
> +++ b/Makefile
> @@ -459,14 +459,14 @@ OBJDUMP = llvm-objdump
> READELF = llvm-readelf
> STRIP = llvm-strip
> else
> -CC = $(CROSS_COMPILE)gcc
> -LD = $(CROSS_COMPILE)ld
> -AR = $(CROSS_COMPILE)ar
> -NM = $(CROSS_COMPILE)nm
> -OBJCOPY = $(CROSS_COMPILE)objcopy
> -OBJDUMP = $(CROSS_COMPILE)objdump
> -READELF = $(CROSS_COMPILE)readelf
> -STRIP = $(CROSS_COMPILE)strip
> +CC = $(realpath $(CROSS_COMPILE))gcc
> +LD = $(realpath $(CROSS_COMPILE))ld
> +AR = $(realpath $(CROSS_COMPILE))ar
> +NM = $(realpath $(CROSS_COMPILE))nm
> +OBJCOPY = $(realpath $(CROSS_COMPILE))objcopy
> +OBJDUMP = $(realpath $(CROSS_COMPILE))objdump
> +READELF = $(realpath $(CROSS_COMPILE))readelf
> +STRIP = $(realpath $(CROSS_COMPILE))strip
> endif
> RUSTC = rustc
> RUSTDOC = rustdoc
> --
> 2.25.1
>
On Fri, Dec 31, 2021 at 4:56 PM <[email protected]> wrote:
>
> From: xu xin <[email protected]>
>
> When we compile the kernel with cross compilers, if CROSS_COMPILE is
> specified by the path containing special directory like '~', some
> compilation error will occurs.
>
> Here's an example:
>
> $ make ARCH=x86_64
> CROSS_COMPILE=~/x86_64_gcc9.2.0_glibc2.31.0/bin/x86_64-pc-linux-gnu- all
>
> error:./scripts/mkcompile_h: line 64:
> ~/x86_64_gcc9.2.0_glibc2.31.0/bin/x86_64-pc-linux-gnu-ld: No such file or
> directory
>
> Since there are many other similar scripts using these variables, in
> order to solve the problem from the source, add realpath in makefile to
> turn these variables into absolute paths.
>
> Signed-off-by: xu xin <[email protected]>
This depends on what shell you are using.
If you use a modern shell like bash,
~ is expanded into the home directory path
on the shell side.
So, Make will see the absolute path.
In contrast, dash does not expand ~.
[Test code]
$(warning CROSS_COMPILE is $(CROSS_COMPILE))
all:
@:
[Result]
masahiro@grover:/tmp$ bash
masahiro@grover:/tmp$ make
CROSS_COMPILE=~/x86_64_gcc9.2.0_glibc2.31.0/bin/x86_64-pc-linux-gnu-
all
Makefile:1: CROSS_COMPILE is
/home/masahiro/x86_64_gcc9.2.0_glibc2.31.0/bin/x86_64-pc-linux-gnu-
masahiro@grover:/tmp$ dash
$ make CROSS_COMPILE=~/x86_64_gcc9.2.0_glibc2.31.0/bin/x86_64-pc-linux-gnu- all
Makefile:1: CROSS_COMPILE is
~/x86_64_gcc9.2.0_glibc2.31.0/bin/x86_64-pc-linux-gnu-
Moreover, your patch does not work at all because
the $(realpath ) built-in function does not expand ~.
~ is a shell's special character (and only some shells recognize it).
GNU Make is completely agnostic about such a character.
If you are using such a shell that does not understand ~,
as Nathan suggested, you can use $HOME.
> ---
> Makefile | 16 ++++++++--------
> 1 file changed, 8 insertions(+), 8 deletions(-)
>
> diff --git a/Makefile b/Makefile
> index fe5a4d8e4ac5..cdbb747787ac 100644
> --- a/Makefile
> +++ b/Makefile
> @@ -459,14 +459,14 @@ OBJDUMP = llvm-objdump
> READELF = llvm-readelf
> STRIP = llvm-strip
> else
> -CC = $(CROSS_COMPILE)gcc
> -LD = $(CROSS_COMPILE)ld
> -AR = $(CROSS_COMPILE)ar
> -NM = $(CROSS_COMPILE)nm
> -OBJCOPY = $(CROSS_COMPILE)objcopy
> -OBJDUMP = $(CROSS_COMPILE)objdump
> -READELF = $(CROSS_COMPILE)readelf
> -STRIP = $(CROSS_COMPILE)strip
> +CC = $(realpath $(CROSS_COMPILE))gcc
> +LD = $(realpath $(CROSS_COMPILE))ld
> +AR = $(realpath $(CROSS_COMPILE))ar
> +NM = $(realpath $(CROSS_COMPILE))nm
> +OBJCOPY = $(realpath $(CROSS_COMPILE))objcopy
> +OBJDUMP = $(realpath $(CROSS_COMPILE))objdump
> +READELF = $(realpath $(CROSS_COMPILE))readelf
> +STRIP = $(realpath $(CROSS_COMPILE))strip
> endif
> RUSTC = rustc
> RUSTDOC = rustdoc
> --
> 2.25.1
>
--
Best Regards
Masahiro Yamada
On Thu, Dec 30, 2021 at 11:55 PM <[email protected]> wrote:
>
> From: xu xin <[email protected]>
>
> When we compile the kernel with cross compilers, if CROSS_COMPILE is
> specified by the path containing special directory like '~', some
> compilation error will occurs.
>
> Here's an example:
>
> $ make ARCH=x86_64
> CROSS_COMPILE=~/x86_64_gcc9.2.0_glibc2.31.0/bin/x86_64-pc-linux-gnu- all
I guess you could replace ~ with `$(realpath ...)` in the above
command line invocation of make?
--
Thanks,
~Nick Desaulniers