Thread (5 messages) 5 messages, 2 authors, 2021-09-21

Re: Module build problems with gmake 3.x

From: Masahiro Yamada <masahiroy@kernel.org>
Date: 2021-09-12 16:04:30

On Sat, Sep 11, 2021 at 7:45 AM Markus Mayer [off-list ref] wrote:
On Thu, 9 Sept 2021 at 05:20, Masahiro Yamada [off-list ref] wrote:
quoted
I sometimes test GNU make 3.81 for kernel builds, but I have not tested
the -e option.

Now I tested the -e option, and it worked for me.
Both $(M) and $(KBUILD_EXTMOD) were correctly set.

So, I did not observe anything you claim.
Thanks for trying it out. See below for a summary of my test comparing
GNUmake 3.81 and 4.1. All the tests have been performed on Ubuntu
14.04. (Yes, I know that's old.)
quoted
I ran this Makefile with GNU Make 3.81

masahiro@oscar:~/workspace/hello$ cat Makefile
obj-m += hello.o

KERNEL_DIR := $(HOME)/ref/linux

all:
        ${MAKE} -C $(KERNEL_DIR) -e M=$(PWD) modules

clean:
        make -C $(KERNEL_DIR) M=$(PWD) clean
masahiro@oscar:~/workspace/hello$ make-3.81 --version
GNU Make 3.81
Copyright (C) 2006  Free Software Foundation, Inc.
This is free software; see the source for copying conditions.
There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A
PARTICULAR PURPOSE.

This program built for x86_64-unknown-linux-gnu
masahiro@oscar:~/workspace/hello$ make-3.81
make-3.81 -C /home/masahiro/ref/linux -e
M=/home/masahiro/workspace/hello modules
make-3.81[1]: Entering directory `/home/masahiro/ref/linux'
make-3.81[2]: Entering directory `/home/masahiro/ref/linux'
  CC [M]  /home/masahiro/workspace/hello/hello.o
  MODPOST /home/masahiro/workspace/hello/Module.symvers
  CC [M]  /home/masahiro/workspace/hello/hello.mod.o
  LD [M]  /home/masahiro/workspace/hello/hello.ko
make-3.81[2]: Leaving directory `/home/masahiro/ref/linux'
make-3.81[1]: Leaving directory `/home/masahiro/ref/linux'
masahiro@oscar:~/workspace/hello$ ls hello*
hello.c  hello.ko  hello.mod  hello.mod.c  hello.mod.o  hello.o

hello.ko was successfully built.

Entering/Leaving directory is eye-sores,
but presumably it is because MAKEFLAGS is overridden
by the environment since you gave -e.
Here is what I have.

$ cat Makefile

export KERNEL_DIR = /local/users/mmayer/linux-5.4

From this line, I understand how to reproduce the case.

The key is 'linux-5.4'

In your initial email, you mentioned that this happened on

  * newish kernel  (>=5.1)


So, I used the latest kernel for testing,
but this does not happen after
bcf637f54f6d2515d4c9c81808faf01848916152
because the M= parameter is parsed before the sub-make.


By running your test code on linux 5.4, yes,
I can observe the same symptom.




The root case seams, GNU Make changes
the origin of variables to 'environment'.
I do not know if it is an intended behavior.
(maybe, better to ask the GNU Make maintainer)



I narrowed it down to the following test code.
To me, the behavior is weird.



masahiro@oscar:~/workspace/foo$ cat Makefile
$(warning the origin of FOO is: $(origin FOO))

all:
        $(MAKE) -e -f Makefile.sub1 FOO=1
masahiro@oscar:~/workspace/foo$ cat Makefile.sub1
$(warning the origin of FOO is: $(origin FOO))

all:
        $(MAKE) -f Makefile.sub2
masahiro@oscar:~/workspace/foo$ cat Makefile.sub2
$(warning the origin of FOO is: $(origin FOO))

all:
        @:
masahiro@oscar:~/workspace/foo$ make
Makefile:1: the origin of FOO is: undefined
make -e -f Makefile.sub1 FOO=1
make[1]: Entering directory '/home/masahiro/workspace/foo'
Makefile.sub1:1: the origin of FOO is: command line
make -f Makefile.sub2
make[2]: Entering directory '/home/masahiro/workspace/foo'
Makefile.sub2:1: the origin of FOO is: environment
make[2]: Leaving directory '/home/masahiro/workspace/foo'
make[1]: Leaving directory '/home/masahiro/workspace/foo'






So, this is what your can tell:

- The behavior of the -e option seems to have a weird
    side-effect.
    Later, I will ask this to the GNU Make maintainer
    to see whether it is a bug or not.

- I do not want to support the -e option.  I do not think
  it is a commonly-used option because you are the
  first person who asked this since Linux 5.4.
  (notice Linux 5.4 is almost two years old)

 - If you use the latest kernel
    (after bcf637f54f6d251), you will be able to build
    external modules with the -e option.
    But, I recommend you to not use -e.

 - If you still insist on the -e option on Linux 5.4,
    you can cherry-pick bcf637f54f6d251
    (but it is out of scope of the support of the community)



quoted
I do not understand your motivation for using -e, though.
I am not entirely clear on that either, but I have been told it is
needed in that particular build environment.

Maybe, better to consider removing the -e option.






-- 
Best Regards
Masahiro Yamada
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help