diff mbox series

selftests: Makefile: create OUTPUT dir

Message ID 20240916075655.4117151-1-anders.roxell@linaro.org
State New
Headers show
Series selftests: Makefile: create OUTPUT dir | expand

Commit Message

Anders Roxell Sept. 16, 2024, 7:56 a.m. UTC
When cross building kselftest out-of-tree the following issue can be
seen:

[...]
make[4]: Entering directory
'/src/kernel/linux/tools/testing/selftests/net/lib'
  CC       csum
/usr/lib/gcc-cross/aarch64-linux-gnu/13/../../../../aarch64-linux-gnu/bin/ld:
cannot open output file /tmp/build/kselftest/net/lib/csum: No such
file or directory
collect2: error: ld returned 1 exit status
[...]

Create the output build directory before building the targets, solves
this issue with building 'net/lib/csum'.

Suggested-by: Jakub Kicinski <kuba@kernel.org>
Signed-off-by: Anders Roxell <anders.roxell@linaro.org>
---
 tools/testing/selftests/Makefile | 1 +
 1 file changed, 1 insertion(+)

Comments

Shuah Khan Sept. 19, 2024, 3:51 p.m. UTC | #1
On 9/16/24 01:56, Anders Roxell wrote:
> When cross building kselftest out-of-tree the following issue can be
> seen:
> 
> [...]
> make[4]: Entering directory
> '/src/kernel/linux/tools/testing/selftests/net/lib'
>    CC       csum
> /usr/lib/gcc-cross/aarch64-linux-gnu/13/../../../../aarch64-linux-gnu/bin/ld:
> cannot open output file /tmp/build/kselftest/net/lib/csum: No such
> file or directory
> collect2: error: ld returned 1 exit status
> [...]
> 
> Create the output build directory before building the targets, solves
> this issue with building 'net/lib/csum'.
> 
> Suggested-by: Jakub Kicinski <kuba@kernel.org>
> Signed-off-by: Anders Roxell <anders.roxell@linaro.org>
> ---
>   tools/testing/selftests/Makefile | 1 +
>   1 file changed, 1 insertion(+)
> 
> diff --git a/tools/testing/selftests/Makefile b/tools/testing/selftests/Makefile
> index b38199965f99..05c143bcff6a 100644
> --- a/tools/testing/selftests/Makefile
> +++ b/tools/testing/selftests/Makefile
> @@ -261,6 +261,7 @@ ifdef INSTALL_PATH
>   	@ret=1;	\
>   	for TARGET in $(TARGETS) $(INSTALL_DEP_TARGETS); do \
>   		BUILD_TARGET=$$BUILD/$$TARGET;	\
> +		mkdir -p $$BUILD_TARGET;	\
>   		$(MAKE) OUTPUT=$$BUILD_TARGET -C $$TARGET install \
>   				INSTALL_PATH=$(INSTALL_PATH)/$$TARGET \
>   				SRC_PATH=$(shell readlink -e $$(pwd)) \


Doesn't the "all" target mkdir work for this case? Why do we need another mkdir here?

thanks,
-- Shuah
Jakub Kicinski Sept. 20, 2024, 10:38 a.m. UTC | #2
On Thu, 19 Sep 2024 09:51:47 -0600 Shuah Khan wrote:
> > @@ -261,6 +261,7 @@ ifdef INSTALL_PATH
> >   	@ret=1;	\
> >   	for TARGET in $(TARGETS) $(INSTALL_DEP_TARGETS); do \
> >   		BUILD_TARGET=$$BUILD/$$TARGET;	\
> > +		mkdir -p $$BUILD_TARGET;	\
> >   		$(MAKE) OUTPUT=$$BUILD_TARGET -C $$TARGET install \
> >   				INSTALL_PATH=$(INSTALL_PATH)/$$TARGET \
> >   				SRC_PATH=$(shell readlink -e $$(pwd)) \  
> 
> Doesn't the "all" target mkdir work for this case? Why do we need another mkdir here?

I was wondering about that, too. Looks like the code from the all
target is copy/pasted in the install target except the mkdir line.
Best fix would be to make the dependency work, I don't understand
why it doesn't already, tho.
Shuah Khan Sept. 25, 2024, 5:26 p.m. UTC | #3
On 9/20/24 04:38, Jakub Kicinski wrote:
> On Thu, 19 Sep 2024 09:51:47 -0600 Shuah Khan wrote:
>>> @@ -261,6 +261,7 @@ ifdef INSTALL_PATH
>>>    	@ret=1;	\
>>>    	for TARGET in $(TARGETS) $(INSTALL_DEP_TARGETS); do \
>>>    		BUILD_TARGET=$$BUILD/$$TARGET;	\
>>> +		mkdir -p $$BUILD_TARGET;	\
>>>    		$(MAKE) OUTPUT=$$BUILD_TARGET -C $$TARGET install \
>>>    				INSTALL_PATH=$(INSTALL_PATH)/$$TARGET \
>>>    				SRC_PATH=$(shell readlink -e $$(pwd)) \
>>
>> Doesn't the "all" target mkdir work for this case? Why do we need another mkdir here?
> 
> I was wondering about that, too. Looks like the code from the all
> target is copy/pasted in the install target except the mkdir line.
> Best fix would be to make the dependency work, I don't understand
> why it doesn't already, tho.

I think this could be the issue:

net main Makefile doesn't have handling for subdirs. It looks
like the way this is handled is by adding an entry to the main
Makefile:

TARGETS += net/af_unix
TARGETS += net/forwarding
TARGETS += net/hsr
TARGETS += net/mptcp
TARGETS += net/openvswitch
TARGETS += net/tcp_ao
TARGETS += net/netfilter

So the solution would be similar adding net/lib to the main
Makefile.

Anders, can you try the above and see if it works.

Another issue - lib/Makefile
TEST_GEN_FILES += csum needs to be TEST_GEN_FILES = csum

thanks,
-- Shuah
Anders Roxell Oct. 2, 2024, 6:15 a.m. UTC | #4
On Wed, 25 Sept 2024 at 19:26, Shuah Khan <skhan@linuxfoundation.org> wrote:
>
> On 9/20/24 04:38, Jakub Kicinski wrote:
> > On Thu, 19 Sep 2024 09:51:47 -0600 Shuah Khan wrote:
> >>> @@ -261,6 +261,7 @@ ifdef INSTALL_PATH
> >>>     @ret=1; \
> >>>     for TARGET in $(TARGETS) $(INSTALL_DEP_TARGETS); do \
> >>>             BUILD_TARGET=$$BUILD/$$TARGET;  \
> >>> +           mkdir -p $$BUILD_TARGET;        \
> >>>             $(MAKE) OUTPUT=$$BUILD_TARGET -C $$TARGET install \
> >>>                             INSTALL_PATH=$(INSTALL_PATH)/$$TARGET \
> >>>                             SRC_PATH=$(shell readlink -e $$(pwd)) \
> >>
> >> Doesn't the "all" target mkdir work for this case? Why do we need another mkdir here?
> >
> > I was wondering about that, too. Looks like the code from the all
> > target is copy/pasted in the install target except the mkdir line.
> > Best fix would be to make the dependency work, I don't understand
> > why it doesn't already, tho.
>
> I think this could be the issue:
>
> net main Makefile doesn't have handling for subdirs. It looks
> like the way this is handled is by adding an entry to the main
> Makefile:
>
> TARGETS += net/af_unix
> TARGETS += net/forwarding
> TARGETS += net/hsr
> TARGETS += net/mptcp
> TARGETS += net/openvswitch
> TARGETS += net/tcp_ao
> TARGETS += net/netfilter
>
> So the solution would be similar adding net/lib to the main
> Makefile.
>
> Anders, can you try the above and see if it works.

Sadly that didn't help.

>
> Another issue - lib/Makefile
> TEST_GEN_FILES += csum needs to be TEST_GEN_FILES = csum
>
> thanks,
> -- Shuah
>
Shuah Khan Oct. 4, 2024, 12:01 a.m. UTC | #5
On 10/2/24 00:15, Anders Roxell wrote:
> On Wed, 25 Sept 2024 at 19:26, Shuah Khan <skhan@linuxfoundation.org> wrote:
>>
>> On 9/20/24 04:38, Jakub Kicinski wrote:
>>> On Thu, 19 Sep 2024 09:51:47 -0600 Shuah Khan wrote:
>>>>> @@ -261,6 +261,7 @@ ifdef INSTALL_PATH
>>>>>      @ret=1; \
>>>>>      for TARGET in $(TARGETS) $(INSTALL_DEP_TARGETS); do \
>>>>>              BUILD_TARGET=$$BUILD/$$TARGET;  \
>>>>> +           mkdir -p $$BUILD_TARGET;        \
>>>>>              $(MAKE) OUTPUT=$$BUILD_TARGET -C $$TARGET install \
>>>>>                              INSTALL_PATH=$(INSTALL_PATH)/$$TARGET \
>>>>>                              SRC_PATH=$(shell readlink -e $$(pwd)) \
>>>>
>>>> Doesn't the "all" target mkdir work for this case? Why do we need another mkdir here?
>>>
>>> I was wondering about that, too. Looks like the code from the all
>>> target is copy/pasted in the install target except the mkdir line.
>>> Best fix would be to make the dependency work, I don't understand
>>> why it doesn't already, tho.
>>
>> I think this could be the issue:
>>
>> net main Makefile doesn't have handling for subdirs. It looks
>> like the way this is handled is by adding an entry to the main
>> Makefile:
>>
>> TARGETS += net/af_unix
>> TARGETS += net/forwarding
>> TARGETS += net/hsr
>> TARGETS += net/mptcp
>> TARGETS += net/openvswitch
>> TARGETS += net/tcp_ao
>> TARGETS += net/netfilter
>>
>> So the solution would be similar adding net/lib to the main
>> Makefile.
>>
>> Anders, can you try the above and see if it works.
> 
> Sadly that didn't help.
> 

Okay. I tried the following:

make kselftest-all TARGETS=net/lib O=/tmp

I see /tmp/kselftest/net/lib/csum

Can you give me the exact command you are running?

The following from selftests/Makefile should take care of this.

# Networking tests want the net/lib target, include it automatically
ifneq ($(filter net drivers/net drivers/net/hw,$(TARGETS)),)
ifeq ($(filter net/lib,$(TARGETS)),)
         INSTALL_DEP_TARGETS := net/lib
endif
endif

thanks,
-- Shuah
diff mbox series

Patch

diff --git a/tools/testing/selftests/Makefile b/tools/testing/selftests/Makefile
index b38199965f99..05c143bcff6a 100644
--- a/tools/testing/selftests/Makefile
+++ b/tools/testing/selftests/Makefile
@@ -261,6 +261,7 @@  ifdef INSTALL_PATH
 	@ret=1;	\
 	for TARGET in $(TARGETS) $(INSTALL_DEP_TARGETS); do \
 		BUILD_TARGET=$$BUILD/$$TARGET;	\
+		mkdir -p $$BUILD_TARGET;	\
 		$(MAKE) OUTPUT=$$BUILD_TARGET -C $$TARGET install \
 				INSTALL_PATH=$(INSTALL_PATH)/$$TARGET \
 				SRC_PATH=$(shell readlink -e $$(pwd)) \