2016-11-11 11:23:30

by Jiri Slaby

[permalink] [raw]
Subject: Kbuild: CC= handling broken for tools/

Hi,

I am trying a new gcc with new warnings enabled:

make O=../a/gcc7/ CC='gcc-7' V=1 kernel/exit.o
EXTRA_CFLAGS='-Wimplicit-fallthrough=3'

But the build fails when building under tools/:
...
make -f /home/latest/linux/tools/build/Makefile.build dir=. obj=fixdep
gcc
-Wp,-MD,/home/latest/a/gcc7/tools/objtool/.exec-cmd.o.d,-MT,/home/latest/a/gcc7/tools/objtool/exec-cmd.o
-Wbad-function-cast -Wdeclaration-after-statement -Wformat-security
-Wformat-y2k -Winit-self -Wmissing-declarations -Wmissing-prototypes
-Wnested-externs -Wno-system-headers -Wold-style-definition -Wpacked
-Wredundant-decls -Wshadow -Wstrict-aliasing=3 -Wstrict-prototypes
-Wswitch-default -Wswitch-enum -Wundef -Wwrite-strings -Wformat
-Wimplicit-fallthrough=3 -ggdb3 -Wall -Wextra -std=gnu99 -O6
-U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=2 -fPIC -Werror
-D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 -D_GNU_SOURCE
-I/home/latest/linux/tools/include/ -I/home/latest/linux/include/uapi
-I/home/latest/linux/include -D"BUILD_STR(s)=#s" -c -o
/home/latest/a/gcc7/tools/objtool/exec-cmd.o exec-cmd.c
gcc: error: unrecognized command line option ‘-Wimplicit-fallthrough=3’;
did you mean ‘-Wno-fallthrough’?


Apparently, CC is not respected for tools/ dir.

Well, it is used (tools/build/Makefile.build):
# Compile command
quiet_cmd_cc_o_c = CC $@
cmd_cc_o_c = $(CC) $(c_flags) -c -o $@ $<


But I don't know why CFLAGS propagate from Makefile to tools/, but CC
doesn't (both are exported)? Any ideas?

thanks,
--
js
suse labs


2016-11-11 12:38:03

by Michal Marek

[permalink] [raw]
Subject: Re: Kbuild: CC= handling broken for tools/

On 2016-11-11 12:23, Jiri Slaby wrote:
> Hi,
>
> I am trying a new gcc with new warnings enabled:
>
> make O=../a/gcc7/ CC='gcc-7' V=1 kernel/exit.o
> EXTRA_CFLAGS='-Wimplicit-fallthrough=3'

Note that EXTRA_CFLAGS is a makefile variable read by both kbuild and
tools/build apparently.

>
> But the build fails when building under tools/:
[...]
> gcc: error: unrecognized command line option ‘-Wimplicit-fallthrough=3’;
> did you mean ‘-Wno-fallthrough’?
>
>
> Apparently, CC is not respected for tools/ dir.

Jiri can better explain the behavior of the tools/ Makefiles, but if you
want to use extra flags for kernel compilation, you should be using the
KCFLAGS variable (see Documentation/kbuild/kbuild.txt).

Michal

2016-11-11 14:00:55

by Jiri Olsa

[permalink] [raw]
Subject: Re: Kbuild: CC= handling broken for tools/

On Fri, Nov 11, 2016 at 12:23:25PM +0100, Jiri Slaby wrote:
> Hi,
>
> I am trying a new gcc with new warnings enabled:
>
> make O=../a/gcc7/ CC='gcc-7' V=1 kernel/exit.o
> EXTRA_CFLAGS='-Wimplicit-fallthrough=3'
>
> But the build fails when building under tools/:
> ...
> make -f /home/latest/linux/tools/build/Makefile.build dir=. obj=fixdep
> gcc
> -Wp,-MD,/home/latest/a/gcc7/tools/objtool/.exec-cmd.o.d,-MT,/home/latest/a/gcc7/tools/objtool/exec-cmd.o
> -Wbad-function-cast -Wdeclaration-after-statement -Wformat-security
> -Wformat-y2k -Winit-self -Wmissing-declarations -Wmissing-prototypes
> -Wnested-externs -Wno-system-headers -Wold-style-definition -Wpacked
> -Wredundant-decls -Wshadow -Wstrict-aliasing=3 -Wstrict-prototypes
> -Wswitch-default -Wswitch-enum -Wundef -Wwrite-strings -Wformat
> -Wimplicit-fallthrough=3 -ggdb3 -Wall -Wextra -std=gnu99 -O6
> -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=2 -fPIC -Werror
> -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 -D_GNU_SOURCE
> -I/home/latest/linux/tools/include/ -I/home/latest/linux/include/uapi
> -I/home/latest/linux/include -D"BUILD_STR(s)=#s" -c -o
> /home/latest/a/gcc7/tools/objtool/exec-cmd.o exec-cmd.c
> gcc: error: unrecognized command line option ‘-Wimplicit-fallthrough=3’;
> did you mean ‘-Wno-fallthrough’?
>
>
> Apparently, CC is not respected for tools/ dir.
>
> Well, it is used (tools/build/Makefile.build):
> # Compile command
> quiet_cmd_cc_o_c = CC $@
> cmd_cc_o_c = $(CC) $(c_flags) -c -o $@ $<
>
>
> But I don't know why CFLAGS propagate from Makefile to tools/, but CC
> doesn't (both are exported)? Any ideas?

so the root Makefile assign CC directly:
CC = $(CROSS_COMPILE)gcc

we are trying to be a little bit smarter in perf
and set it only if it's not set by user

# 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)

I did not check the other tools..

thanks,
jirka

2016-11-11 14:04:40

by Jiri Slaby

[permalink] [raw]
Subject: Re: Kbuild: CC= handling broken for tools/

On 11/11/2016, 03:00 PM, Jiri Olsa wrote:
> On Fri, Nov 11, 2016 at 12:23:25PM +0100, Jiri Slaby wrote:
>> Hi,
>>
>> I am trying a new gcc with new warnings enabled:
>>
>> make O=../a/gcc7/ CC='gcc-7' V=1 kernel/exit.o
>> EXTRA_CFLAGS='-Wimplicit-fallthrough=3'
>>
>> But the build fails when building under tools/:
>> ...
>> make -f /home/latest/linux/tools/build/Makefile.build dir=. obj=fixdep
>> gcc
>> -Wp,-MD,/home/latest/a/gcc7/tools/objtool/.exec-cmd.o.d,-MT,/home/latest/a/gcc7/tools/objtool/exec-cmd.o
>> -Wbad-function-cast -Wdeclaration-after-statement -Wformat-security
>> -Wformat-y2k -Winit-self -Wmissing-declarations -Wmissing-prototypes
>> -Wnested-externs -Wno-system-headers -Wold-style-definition -Wpacked
>> -Wredundant-decls -Wshadow -Wstrict-aliasing=3 -Wstrict-prototypes
>> -Wswitch-default -Wswitch-enum -Wundef -Wwrite-strings -Wformat
>> -Wimplicit-fallthrough=3 -ggdb3 -Wall -Wextra -std=gnu99 -O6
>> -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=2 -fPIC -Werror
>> -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 -D_GNU_SOURCE
>> -I/home/latest/linux/tools/include/ -I/home/latest/linux/include/uapi
>> -I/home/latest/linux/include -D"BUILD_STR(s)=#s" -c -o
>> /home/latest/a/gcc7/tools/objtool/exec-cmd.o exec-cmd.c
>> gcc: error: unrecognized command line option ‘-Wimplicit-fallthrough=3’;
>> did you mean ‘-Wno-fallthrough’?
>>
>>
>> Apparently, CC is not respected for tools/ dir.
>>
>> Well, it is used (tools/build/Makefile.build):
>> # Compile command
>> quiet_cmd_cc_o_c = CC $@
>> cmd_cc_o_c = $(CC) $(c_flags) -c -o $@ $<
>>
>>
>> But I don't know why CFLAGS propagate from Makefile to tools/, but CC
>> doesn't (both are exported)? Any ideas?
>
> so the root Makefile assign CC directly:
> CC = $(CROSS_COMPILE)gcc
>
> we are trying to be a little bit smarter in perf
> and set it only if it's not set by user
>
> # 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)
>
> I did not check the other tools..

Note that I don't care about tools at all. objtool (see the dump above)
is apparently needed to build the kernel proper, so it is built as a
part of kernel.

BTW shouldn't it use HOSTCC anyway?

thanks,
--
js
suse labs

2016-11-11 15:14:31

by Jiri Olsa

[permalink] [raw]
Subject: Re: Kbuild: CC= handling broken for tools/

On Fri, Nov 11, 2016 at 03:04:35PM +0100, Jiri Slaby wrote:
> On 11/11/2016, 03:00 PM, Jiri Olsa wrote:
> > On Fri, Nov 11, 2016 at 12:23:25PM +0100, Jiri Slaby wrote:
> >> Hi,
> >>
> >> I am trying a new gcc with new warnings enabled:
> >>
> >> make O=../a/gcc7/ CC='gcc-7' V=1 kernel/exit.o
> >> EXTRA_CFLAGS='-Wimplicit-fallthrough=3'
> >>
> >> But the build fails when building under tools/:
> >> ...
> >> make -f /home/latest/linux/tools/build/Makefile.build dir=. obj=fixdep
> >> gcc
> >> -Wp,-MD,/home/latest/a/gcc7/tools/objtool/.exec-cmd.o.d,-MT,/home/latest/a/gcc7/tools/objtool/exec-cmd.o
> >> -Wbad-function-cast -Wdeclaration-after-statement -Wformat-security
> >> -Wformat-y2k -Winit-self -Wmissing-declarations -Wmissing-prototypes
> >> -Wnested-externs -Wno-system-headers -Wold-style-definition -Wpacked
> >> -Wredundant-decls -Wshadow -Wstrict-aliasing=3 -Wstrict-prototypes
> >> -Wswitch-default -Wswitch-enum -Wundef -Wwrite-strings -Wformat
> >> -Wimplicit-fallthrough=3 -ggdb3 -Wall -Wextra -std=gnu99 -O6
> >> -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=2 -fPIC -Werror
> >> -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 -D_GNU_SOURCE
> >> -I/home/latest/linux/tools/include/ -I/home/latest/linux/include/uapi
> >> -I/home/latest/linux/include -D"BUILD_STR(s)=#s" -c -o
> >> /home/latest/a/gcc7/tools/objtool/exec-cmd.o exec-cmd.c
> >> gcc: error: unrecognized command line option ‘-Wimplicit-fallthrough=3’;
> >> did you mean ‘-Wno-fallthrough’?
> >>
> >>
> >> Apparently, CC is not respected for tools/ dir.
> >>
> >> Well, it is used (tools/build/Makefile.build):
> >> # Compile command
> >> quiet_cmd_cc_o_c = CC $@
> >> cmd_cc_o_c = $(CC) $(c_flags) -c -o $@ $<
> >>
> >>
> >> But I don't know why CFLAGS propagate from Makefile to tools/, but CC
> >> doesn't (both are exported)? Any ideas?
> >
> > so the root Makefile assign CC directly:
> > CC = $(CROSS_COMPILE)gcc
> >
> > we are trying to be a little bit smarter in perf
> > and set it only if it's not set by user
> >
> > # 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)
> >
> > I did not check the other tools..
>
> Note that I don't care about tools at all. objtool (see the dump above)
> is apparently needed to build the kernel proper, so it is built as a
> part of kernel.
>
> BTW shouldn't it use HOSTCC anyway?

hum, probably.. adding Josh to the loop

jirka

2016-11-11 15:30:44

by Josh Poimboeuf

[permalink] [raw]
Subject: Re: Kbuild: CC= handling broken for tools/

On Fri, Nov 11, 2016 at 04:14:27PM +0100, Jiri Olsa wrote:
> On Fri, Nov 11, 2016 at 03:04:35PM +0100, Jiri Slaby wrote:
> > On 11/11/2016, 03:00 PM, Jiri Olsa wrote:
> > > On Fri, Nov 11, 2016 at 12:23:25PM +0100, Jiri Slaby wrote:
> > >> Hi,
> > >>
> > >> I am trying a new gcc with new warnings enabled:
> > >>
> > >> make O=../a/gcc7/ CC='gcc-7' V=1 kernel/exit.o
> > >> EXTRA_CFLAGS='-Wimplicit-fallthrough=3'
> > >>
> > >> But the build fails when building under tools/:
> > >> ...
> > >> make -f /home/latest/linux/tools/build/Makefile.build dir=. obj=fixdep
> > >> gcc
> > >> -Wp,-MD,/home/latest/a/gcc7/tools/objtool/.exec-cmd.o.d,-MT,/home/latest/a/gcc7/tools/objtool/exec-cmd.o
> > >> -Wbad-function-cast -Wdeclaration-after-statement -Wformat-security
> > >> -Wformat-y2k -Winit-self -Wmissing-declarations -Wmissing-prototypes
> > >> -Wnested-externs -Wno-system-headers -Wold-style-definition -Wpacked
> > >> -Wredundant-decls -Wshadow -Wstrict-aliasing=3 -Wstrict-prototypes
> > >> -Wswitch-default -Wswitch-enum -Wundef -Wwrite-strings -Wformat
> > >> -Wimplicit-fallthrough=3 -ggdb3 -Wall -Wextra -std=gnu99 -O6
> > >> -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=2 -fPIC -Werror
> > >> -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 -D_GNU_SOURCE
> > >> -I/home/latest/linux/tools/include/ -I/home/latest/linux/include/uapi
> > >> -I/home/latest/linux/include -D"BUILD_STR(s)=#s" -c -o
> > >> /home/latest/a/gcc7/tools/objtool/exec-cmd.o exec-cmd.c
> > >> gcc: error: unrecognized command line option ‘-Wimplicit-fallthrough=3’;
> > >> did you mean ‘-Wno-fallthrough’?
> > >>
> > >>
> > >> Apparently, CC is not respected for tools/ dir.
> > >>
> > >> Well, it is used (tools/build/Makefile.build):
> > >> # Compile command
> > >> quiet_cmd_cc_o_c = CC $@
> > >> cmd_cc_o_c = $(CC) $(c_flags) -c -o $@ $<
> > >>
> > >>
> > >> But I don't know why CFLAGS propagate from Makefile to tools/, but CC
> > >> doesn't (both are exported)? Any ideas?
> > >
> > > so the root Makefile assign CC directly:
> > > CC = $(CROSS_COMPILE)gcc
> > >
> > > we are trying to be a little bit smarter in perf
> > > and set it only if it's not set by user
> > >
> > > # 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)
> > >
> > > I did not check the other tools..
> >
> > Note that I don't care about tools at all. objtool (see the dump above)
> > is apparently needed to build the kernel proper, so it is built as a
> > part of kernel.
> >
> > BTW shouldn't it use HOSTCC anyway?
>
> hum, probably.. adding Josh to the loop

Does it work if you use KCFLAGS instead of EXTRA_CFLAGS?

--
Josh

2016-11-11 17:08:29

by Jiri Slaby

[permalink] [raw]
Subject: Re: Kbuild: CC= handling broken for tools/

On 11/11/2016, 04:30 PM, Josh Poimboeuf wrote:
> Does it work if you use KCFLAGS instead of EXTRA_CFLAGS?

Yes, the kernel builds with the flags now.

But objtool is unexpectedly still built by a different compiler.

I would also prefer the flags (like the warning above) to be passed even
when building host commands.

thanks,
--
js
suse labs

2016-11-11 17:21:20

by Josh Poimboeuf

[permalink] [raw]
Subject: Re: Kbuild: CC= handling broken for tools/

On Fri, Nov 11, 2016 at 06:08:24PM +0100, Jiri Slaby wrote:
> On 11/11/2016, 04:30 PM, Josh Poimboeuf wrote:
> > Does it work if you use KCFLAGS instead of EXTRA_CFLAGS?
>
> Yes, the kernel builds with the flags now.
>
> But objtool is unexpectedly still built by a different compiler.
>
> I would also prefer the flags (like the warning above) to be passed even
> when building host commands.

In that case, if you want to build *everything* in tools and kernel with
the new compiler and new flags, I think you'll need to set HOSTCC,
HOSTCFLAGS, and CFLAGS, in addition to CC and KCFLAGS.

objtool uses the host compiler, but it doesn't support setting HOSTCC or
HOSTCFLAGS yet. It always just uses 'gcc'. I'll add HOSTCC/HOSTCFLAGS
to the TODO list, though feel free to work up a patch.

--
Josh