diff mbox series

[4/4] kbuild: include Makefile.compiler only when compiler is required

Message ID 20210228061028.239459-4-masahiroy@kernel.org (mailing list archive)
State New
Headers show
Series [1/4] kbuild: add image_name to no-sync-config-targets | expand

Commit Message

Masahiro Yamada Feb. 28, 2021, 6:10 a.m. UTC
Since commit f2f02ebd8f38 ("kbuild: improve cc-option to clean up all
temporary files"), running 'make kernelversion' in a read-only source
tree emits a bunch of warnings:

  mkdir: cannot create directory '.tmp_12345': Permission denied

Non-build targets such as kernelversion, clean, help, etc. do not
need to evaluate $(call cc-option,) and friends. Do not include
Makefile.compiler so $(call cc-option,) becomes no-op.

This not only fix the warnings, but also runs non-build targets much
faster.

Basically, all installation targets should also be non-build targets.
Unfortunately, vdso_install requires the compiler because it builds
vdso before installtion. This is a problem that must be fixed by a
separate patch.

Signed-off-by: Masahiro Yamada <masahiroy@kernel.org>
---

I am not adding Reported-by for now because a reporter sent me
an email privately.

If he allows me to add Reported-by, I will add it to record
the credit.

(Perhaps, another person might have reported a similar issue
somewhere, but my memory is obsure. I cannot recall it.)


 Makefile | 13 +++++++++++++
 1 file changed, 13 insertions(+)

Comments

Masahiro Yamada Feb. 28, 2021, 7 a.m. UTC | #1
On Sun, Feb 28, 2021 at 3:10 PM Masahiro Yamada <masahiroy@kernel.org> wrote:
>
> Since commit f2f02ebd8f38 ("kbuild: improve cc-option to clean up all
> temporary files"), running 'make kernelversion' in a read-only source
> tree emits a bunch of warnings:
>
>   mkdir: cannot create directory '.tmp_12345': Permission denied
>
> Non-build targets such as kernelversion, clean, help, etc. do not
> need to evaluate $(call cc-option,) and friends. Do not include
> Makefile.compiler so $(call cc-option,) becomes no-op.
>
> This not only fix the warnings, but also runs non-build targets much
> faster.
>
> Basically, all installation targets should also be non-build targets.
> Unfortunately, vdso_install requires the compiler because it builds
> vdso before installtion. This is a problem that must be fixed by a
> separate patch.
>
> Signed-off-by: Masahiro Yamada <masahiroy@kernel.org>
> ---
>
> I am not adding Reported-by for now because a reporter sent me
> an email privately.
>
> If he allows me to add Reported-by, I will add it to record
> the credit.
>
> (Perhaps, another person might have reported a similar issue
> somewhere, but my memory is obsure. I cannot recall it.)
>

Now, I got acknowledge to add this:

Reported-by: Israel Tsadok <itsadok@gmail.com>







>  Makefile | 13 +++++++++++++
>  1 file changed, 13 insertions(+)
>
> diff --git a/Makefile b/Makefile
> index eec7a94f5c33..20724711dc71 100644
> --- a/Makefile
> +++ b/Makefile
> @@ -263,6 +263,10 @@ no-dot-config-targets := $(clean-targets) \
>                          $(version_h) headers headers_% archheaders archscripts \
>                          %asm-generic kernelversion %src-pkg dt_binding_check \
>                          outputmakefile
> +# Installation targets should not require compiler. Unfortunately, vdso_install
> +# is an exception where build artifacts may be updated. This must be fixed.
> +no-compiler-targets := $(no-dot-config-targets) install dtbs_install \
> +                       headers_install modules_install kernelrelease image_name
>  no-sync-config-targets := $(no-dot-config-targets) %install kernelrelease \
>                           image_name
>  single-targets := %.a %.i %.ko %.lds %.ll %.lst %.mod %.o %.s %.symtypes %/
> @@ -270,6 +274,7 @@ single-targets := %.a %.i %.ko %.lds %.ll %.lst %.mod %.o %.s %.symtypes %/
>  config-build   :=
>  mixed-build    :=
>  need-config    := 1
> +need-compiler  := 1
>  may-sync-config        := 1
>  single-build   :=
>
> @@ -279,6 +284,12 @@ ifneq ($(filter $(no-dot-config-targets), $(MAKECMDGOALS)),)
>         endif
>  endif
>
> +ifneq ($(filter $(no-compiler-targets), $(MAKECMDGOALS)),)
> +       ifeq ($(filter-out $(no-compiler-targets), $(MAKECMDGOALS)),)
> +               need-compiler :=
> +       endif
> +endif
> +
>  ifneq ($(filter $(no-sync-config-targets), $(MAKECMDGOALS)),)
>         ifeq ($(filter-out $(no-sync-config-targets), $(MAKECMDGOALS)),)
>                 may-sync-config :=
> @@ -584,7 +595,9 @@ endif
>
>  # Include this also for config targets because some architectures need
>  # cc-cross-prefix to determine CROSS_COMPILE.
> +ifdef need-compiler
>  include $(srctree)/scripts/Makefile.compiler
> +endif
>
>  ifdef config-build
>  # ===========================================================================
> --
> 2.27.0
>
Nathan Chancellor March 18, 2021, 9:13 p.m. UTC | #2
On Sun, Feb 28, 2021 at 03:10:28PM +0900, Masahiro Yamada wrote:
> Since commit f2f02ebd8f38 ("kbuild: improve cc-option to clean up all
> temporary files"), running 'make kernelversion' in a read-only source
> tree emits a bunch of warnings:
> 
>   mkdir: cannot create directory '.tmp_12345': Permission denied
> 
> Non-build targets such as kernelversion, clean, help, etc. do not
> need to evaluate $(call cc-option,) and friends. Do not include
> Makefile.compiler so $(call cc-option,) becomes no-op.
> 
> This not only fix the warnings, but also runs non-build targets much
> faster.
> 
> Basically, all installation targets should also be non-build targets.
> Unfortunately, vdso_install requires the compiler because it builds
> vdso before installtion. This is a problem that must be fixed by a
> separate patch.
> 
> Signed-off-by: Masahiro Yamada <masahiroy@kernel.org>
> ---
> 
> I am not adding Reported-by for now because a reporter sent me
> an email privately.
> 
> If he allows me to add Reported-by, I will add it to record
> the credit.
> 
> (Perhaps, another person might have reported a similar issue
> somewhere, but my memory is obsure. I cannot recall it.)
> 
> 
>  Makefile | 13 +++++++++++++
>  1 file changed, 13 insertions(+)
> 
> diff --git a/Makefile b/Makefile
> index eec7a94f5c33..20724711dc71 100644
> --- a/Makefile
> +++ b/Makefile
> @@ -263,6 +263,10 @@ no-dot-config-targets := $(clean-targets) \
>  			 $(version_h) headers headers_% archheaders archscripts \
>  			 %asm-generic kernelversion %src-pkg dt_binding_check \
>  			 outputmakefile
> +# Installation targets should not require compiler. Unfortunately, vdso_install
> +# is an exception where build artifacts may be updated. This must be fixed.
> +no-compiler-targets := $(no-dot-config-targets) install dtbs_install \
> +			headers_install modules_install kernelrelease image_name
>  no-sync-config-targets := $(no-dot-config-targets) %install kernelrelease \
>  			  image_name
>  single-targets := %.a %.i %.ko %.lds %.ll %.lst %.mod %.o %.s %.symtypes %/
> @@ -270,6 +274,7 @@ single-targets := %.a %.i %.ko %.lds %.ll %.lst %.mod %.o %.s %.symtypes %/
>  config-build	:=
>  mixed-build	:=
>  need-config	:= 1
> +need-compiler	:= 1
>  may-sync-config	:= 1
>  single-build	:=
>  
> @@ -279,6 +284,12 @@ ifneq ($(filter $(no-dot-config-targets), $(MAKECMDGOALS)),)
>  	endif
>  endif
>  
> +ifneq ($(filter $(no-compiler-targets), $(MAKECMDGOALS)),)
> +	ifeq ($(filter-out $(no-compiler-targets), $(MAKECMDGOALS)),)
> +		need-compiler :=
> +	endif
> +endif
> +
>  ifneq ($(filter $(no-sync-config-targets), $(MAKECMDGOALS)),)
>  	ifeq ($(filter-out $(no-sync-config-targets), $(MAKECMDGOALS)),)
>  		may-sync-config :=
> @@ -584,7 +595,9 @@ endif
>  
>  # Include this also for config targets because some architectures need
>  # cc-cross-prefix to determine CROSS_COMPILE.
> +ifdef need-compiler
>  include $(srctree)/scripts/Makefile.compiler
> +endif
>  
>  ifdef config-build
>  # ===========================================================================
> -- 
> 2.27.0
> 

Hi Masahiro,

I see a new warning in my builds on arm64 now when running
'modules_install' or 'dtbs_install' because ld-option evaluates to
nothing, which triggers the warning in arch/arm64/Makefile:

$ make -skj"$(nproc)" \
ARCH=arm64 \
CROSS_COMPILE=aarch64-linux- \
INSTALL_DTBS_PATH=rootfs \
INSTALL_MOD_PATH=rootfs \
O=build/arm64 \
distclean defconfig all modules_install dtbs_install
...
/home/nathan/cbl/src/linux-next/arch/arm64/Makefile:25: ld does not support --fix-cortex-a53-843419; kernel may be susceptible to erratum
/home/nathan/cbl/src/linux-next/arch/arm64/Makefile:25: ld does not support --fix-cortex-a53-843419; kernel may be susceptible to erratum

$ sed -n '23,29p' arch/arm64/Makefile
ifeq ($(CONFIG_ARM64_ERRATUM_843419),y)
  ifeq ($(call ld-option, --fix-cortex-a53-843419),)
$(warning ld does not support --fix-cortex-a53-843419; kernel may be susceptible to erratum)
  else
LDFLAGS_vmlinux += --fix-cortex-a53-843419
  endif
endif

I am not sure how this should be resolved, hence just the report.

Cheers,
Nathan
Masahiro Yamada March 18, 2021, 11:36 p.m. UTC | #3
(CC: Will and ARM ML)


On Fri, Mar 19, 2021 at 6:14 AM Nathan Chancellor <nathan@kernel.org> wrote:
>
> On Sun, Feb 28, 2021 at 03:10:28PM +0900, Masahiro Yamada wrote:
> > Since commit f2f02ebd8f38 ("kbuild: improve cc-option to clean up all
> > temporary files"), running 'make kernelversion' in a read-only source
> > tree emits a bunch of warnings:
> >
> >   mkdir: cannot create directory '.tmp_12345': Permission denied
> >
> > Non-build targets such as kernelversion, clean, help, etc. do not
> > need to evaluate $(call cc-option,) and friends. Do not include
> > Makefile.compiler so $(call cc-option,) becomes no-op.
> >
> > This not only fix the warnings, but also runs non-build targets much
> > faster.
> >
> > Basically, all installation targets should also be non-build targets.
> > Unfortunately, vdso_install requires the compiler because it builds
> > vdso before installtion. This is a problem that must be fixed by a
> > separate patch.
> >
> > Signed-off-by: Masahiro Yamada <masahiroy@kernel.org>
> > ---
> >
> > I am not adding Reported-by for now because a reporter sent me
> > an email privately.
> >
> > If he allows me to add Reported-by, I will add it to record
> > the credit.
> >
> > (Perhaps, another person might have reported a similar issue
> > somewhere, but my memory is obsure. I cannot recall it.)
> >
> >
> >  Makefile | 13 +++++++++++++
> >  1 file changed, 13 insertions(+)
> >
> > diff --git a/Makefile b/Makefile
> > index eec7a94f5c33..20724711dc71 100644
> > --- a/Makefile
> > +++ b/Makefile
> > @@ -263,6 +263,10 @@ no-dot-config-targets := $(clean-targets) \
> >                        $(version_h) headers headers_% archheaders archscripts \
> >                        %asm-generic kernelversion %src-pkg dt_binding_check \
> >                        outputmakefile
> > +# Installation targets should not require compiler. Unfortunately, vdso_install
> > +# is an exception where build artifacts may be updated. This must be fixed.
> > +no-compiler-targets := $(no-dot-config-targets) install dtbs_install \
> > +                     headers_install modules_install kernelrelease image_name
> >  no-sync-config-targets := $(no-dot-config-targets) %install kernelrelease \
> >                         image_name
> >  single-targets := %.a %.i %.ko %.lds %.ll %.lst %.mod %.o %.s %.symtypes %/
> > @@ -270,6 +274,7 @@ single-targets := %.a %.i %.ko %.lds %.ll %.lst %.mod %.o %.s %.symtypes %/
> >  config-build :=
> >  mixed-build  :=
> >  need-config  := 1
> > +need-compiler        := 1
> >  may-sync-config      := 1
> >  single-build :=
> >
> > @@ -279,6 +284,12 @@ ifneq ($(filter $(no-dot-config-targets), $(MAKECMDGOALS)),)
> >       endif
> >  endif
> >
> > +ifneq ($(filter $(no-compiler-targets), $(MAKECMDGOALS)),)
> > +     ifeq ($(filter-out $(no-compiler-targets), $(MAKECMDGOALS)),)
> > +             need-compiler :=
> > +     endif
> > +endif
> > +
> >  ifneq ($(filter $(no-sync-config-targets), $(MAKECMDGOALS)),)
> >       ifeq ($(filter-out $(no-sync-config-targets), $(MAKECMDGOALS)),)
> >               may-sync-config :=
> > @@ -584,7 +595,9 @@ endif
> >
> >  # Include this also for config targets because some architectures need
> >  # cc-cross-prefix to determine CROSS_COMPILE.
> > +ifdef need-compiler
> >  include $(srctree)/scripts/Makefile.compiler
> > +endif
> >
> >  ifdef config-build
> >  # ===========================================================================
> > --
> > 2.27.0
> >
>
> Hi Masahiro,
>
> I see a new warning in my builds on arm64 now when running
> 'modules_install' or 'dtbs_install' because ld-option evaluates to
> nothing, which triggers the warning in arch/arm64/Makefile:
>
> $ make -skj"$(nproc)" \
> ARCH=arm64 \
> CROSS_COMPILE=aarch64-linux- \
> INSTALL_DTBS_PATH=rootfs \
> INSTALL_MOD_PATH=rootfs \
> O=build/arm64 \
> distclean defconfig all modules_install dtbs_install
> ...
> /home/nathan/cbl/src/linux-next/arch/arm64/Makefile:25: ld does not support --fix-cortex-a53-843419; kernel may be susceptible to erratum
> /home/nathan/cbl/src/linux-next/arch/arm64/Makefile:25: ld does not support --fix-cortex-a53-843419; kernel may be susceptible to erratum
>
> $ sed -n '23,29p' arch/arm64/Makefile
> ifeq ($(CONFIG_ARM64_ERRATUM_843419),y)
>   ifeq ($(call ld-option, --fix-cortex-a53-843419),)
> $(warning ld does not support --fix-cortex-a53-843419; kernel may be susceptible to erratum)
>   else
> LDFLAGS_vmlinux += --fix-cortex-a53-843419
>   endif
> endif
>
> I am not sure how this should be resolved, hence just the report.
>
> Cheers,
> Nathan


I see this a few lines below:

ifeq ($(CONFIG_ARM64_USE_LSE_ATOMICS), y)
  ifneq ($(CONFIG_ARM64_LSE_ATOMICS), y)
$(warning LSE atomics not supported by binutils)
  endif
endif


We can move ld-option evaluation to Kconfig.

ifeq ($(CONFIG_ARM64_ERRATUM_843419),y)
  ifneq ($(CONFIG_ARM64_LD_HAS_FIX_ERRATUM_843419,y))
$(warning ld does not support --fix-cortex-a53-843419; kernel may be
susceptible to erratum)
  else
LDFLAGS_vmlinux += --fix-cortex-a53-843419
  endif
endif


I do not know what CONFIG name is preferred.
diff mbox series

Patch

diff --git a/Makefile b/Makefile
index eec7a94f5c33..20724711dc71 100644
--- a/Makefile
+++ b/Makefile
@@ -263,6 +263,10 @@  no-dot-config-targets := $(clean-targets) \
 			 $(version_h) headers headers_% archheaders archscripts \
 			 %asm-generic kernelversion %src-pkg dt_binding_check \
 			 outputmakefile
+# Installation targets should not require compiler. Unfortunately, vdso_install
+# is an exception where build artifacts may be updated. This must be fixed.
+no-compiler-targets := $(no-dot-config-targets) install dtbs_install \
+			headers_install modules_install kernelrelease image_name
 no-sync-config-targets := $(no-dot-config-targets) %install kernelrelease \
 			  image_name
 single-targets := %.a %.i %.ko %.lds %.ll %.lst %.mod %.o %.s %.symtypes %/
@@ -270,6 +274,7 @@  single-targets := %.a %.i %.ko %.lds %.ll %.lst %.mod %.o %.s %.symtypes %/
 config-build	:=
 mixed-build	:=
 need-config	:= 1
+need-compiler	:= 1
 may-sync-config	:= 1
 single-build	:=
 
@@ -279,6 +284,12 @@  ifneq ($(filter $(no-dot-config-targets), $(MAKECMDGOALS)),)
 	endif
 endif
 
+ifneq ($(filter $(no-compiler-targets), $(MAKECMDGOALS)),)
+	ifeq ($(filter-out $(no-compiler-targets), $(MAKECMDGOALS)),)
+		need-compiler :=
+	endif
+endif
+
 ifneq ($(filter $(no-sync-config-targets), $(MAKECMDGOALS)),)
 	ifeq ($(filter-out $(no-sync-config-targets), $(MAKECMDGOALS)),)
 		may-sync-config :=
@@ -584,7 +595,9 @@  endif
 
 # Include this also for config targets because some architectures need
 # cc-cross-prefix to determine CROSS_COMPILE.
+ifdef need-compiler
 include $(srctree)/scripts/Makefile.compiler
+endif
 
 ifdef config-build
 # ===========================================================================