KBuild puts client progam output in upper level directory

Eric Fowler eric.fowler at gmail.com
Mon Feb 17 15:45:49 EST 2014


I have a simple project that includes one driver and one client
program to test the driver.

I have two directories under linux/drivers/myproject, mydriver/, and
myclient/, respectively. Each has a Makefile. The Makefile for the
driver functions just fine, and produces the driver in the same
directory as the makefile. The syntax here is as follows:

#DRIVER MAKEFILE
# If KERNELRELEASE is defined, we've been invoked from the
# kernel build system and can use its language.
ifneq ($(KERNELRELEASE),)
obj-m := mydriver.o
# Otherwise we were called directly from the command
# line; invoke the kernel build system.
else
KERNELDIR ?= /lib/modules/$(shell uname -r)/build
PWD := $(shell pwd)

default:
$(MAKE) -C $(KERNELDIR) M=$(PWD) modules
endif


When this is invoked with:
make  -C ~/linux-cortexm-1.12.0/linux/ M=`pwd`

It produces what I want, a mydriver.ko file in the same directory.

But when I try to build the client in it's own directory (from
myclient.c alone), I get a client executable two directories up, in
./linux .

Here is that Makefile:
# If KERNELRELEASE is defined, we've been invoked from the
# kernel build system and can use its language.
ifneq ($(KERNELRELEASE),)
host-progs := myclient
build-targets := $(host-prog)

# Otherwise we were called directly from the command
# line; invoke the kernel build system.
else
KERNELDIR ?= /lib/modules/$(shell uname -r)/build
PWD := $(shell pwd)

default:
$(MAKE) -C $(KERNELDIR) M=$(PWD) myclient
endif


I am puzzled about what KBuild is doing, and why it is doing it.

Eric


-- 
cc:NSA



More information about the Kernelnewbies mailing list