mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
* Re: compiling external modules
@ 2004-04-16 15:41 Axel Weiss
  2004-04-16 16:54 ` Sam Ravnborg
  0 siblings, 1 reply; 12+ messages in thread
From: Axel Weiss @ 2004-04-16 15:41 UTC (permalink / raw)
  To: Sam Ravnborg; +Cc: linux-kernel

On Thursday 15 April 2004 23:59, Sam Ravnborg wrote:
> The general feedback is that it looks like you have
> made it less simple than it ought to be.
>
> You should also consider that you end up with files
> that does not look like ordinary kbuild makefiles.

Hi, Sam,

seems you don't like my style putting things into variables ;)

Here's my latest work, I have tested this Makefile with vanilla-2.6.5, -2.6.6-rc1 and  suse-2.4.21-199 (SuSE 9.0).

Regards,
Axel

#/***************************************************************************
# *                                                                         *
# *   This program is free software; you can redistribute it and/or modify  *
# *   it under the terms of the GNU General Public License as published by  *
# *   the Free Software Foundation; either version 2 of the License, or     *
# *   (at your option) any later version.                                   *
# *                                                                         *
# ***************************************************************************/
#
#  Template Makefile for external module compilation
#
#  (C) 2004 by Axel Weiss (aweiss@informatik.hu-berlin.de)
#

KDIR          := /lib/modules/$(shell uname -r)/build
PWD           := $(shell pwd)

K_MAJOR := $(shell uname -r | sed -e "s/\..*//")
K_MINOR := $(shell uname -r | sed -e "s/$(K_MAJOR)\.//" -e "s/\..*//")
K_REV   := $(shell uname -r | sed -e "s/$(K_MAJOR)\.$(K_MINOR)\.//" -e "s/-.*//")

NEED_EXPORT := $(strip $(shell [[ "$(K_MAJOR)" = "2" \
                               && "$(K_MINOR)" < "7" \
                               && "$(K_REV)"   < "6" ]] && echo yes || echo no))

NEED_CLEAN  := $(strip $(shell [[ "$(K_MAJOR)" = "2" \
                               && "$(K_MINOR)" < "7" \
                               && "$(K_REV)"   < "6" ]] && echo yes))

.PHONY: all clean


ifneq ($(KERNELRELEASE),)

obj-m         := <mod-name>.o
<mod-name>-objs := <mod-object-list>
ifeq ($(NEED_EXPORT),yes)
export-objs := <mod-export-list>
endif # ifeq ($(NEED_EXPORT),yes)

-include $(KDIR)/Rules.make

<mod-name>.o: $(<mod-name>-objs)
	$(Q)$(LD) $(LD_RFLAG) -r -o $@ $(<mod-name>-objs)


else  # ifneq ($(KERNELRELEASE),)

all:
	$(MAKE) -C $(KDIR) SUBDIRS=$(PWD) modules

clean:
ifeq ($(NEED_CLEAN),yes)
	rm -f <mod-name>.ko *.o .*.cmd .*.o.flags <mod-name>.mod.c $(KDIR)/.tmp_versions/<mod-name>.mod
else
	$(MAKE) -C $(KDIR) SUBDIRS=$(PWD) clean
endif # ifeq ($(NEED_CLEAN),yes)
endif # ifneq ($(KERNELRELEASE),)



^ permalink raw reply	[flat|nested] 12+ messages in thread
* compiling external modules
@ 2004-04-15 21:05 Axel Weiss
  2004-04-15 21:59 ` Sam Ravnborg
  0 siblings, 1 reply; 12+ messages in thread
From: Axel Weiss @ 2004-04-15 21:05 UTC (permalink / raw)
  To: linux-kernel

Hi,

after some study of kernel Makefiles, I'm able now to compile externel modules 
for both, 2.4 and 2.6 kernels correctly. I'd like to share my Makefiles here, 
maybe somebody finds them useful.

Starting point was http://lwn.net/Articles/driver-porting/ which provides very 
good and useful information. But there were some difficulties which I briefly 
describe:

2.6-compilation of drivers consisting of more than one module leaded to very 
ugly warnings from scripts/Makefile.modpost, when make was invoked after 
'make clean'. The reason were lying-around objects in .tmp_versions directory 
which were not deleted by 'make clean'. Solution: clean must explicitly 
delete the version-object in .tmp_versions.

2.4-compilation requires inclusion of Rules.make and an additional rule for 
module-object linkage. In 2.6 Rules.make does not exist, and the linking rule 
would conflict with an already defined one. Solution: distinct current kernel 
version.

When I gave the rule:
clean:
	$(MAKE) -C $(KDIR) SUBDIRS=$(PWD) clean
the whole kernel tree was cleaned. This is not my intention, when I'm working 
on external modules and want to make clean e.g. for cvs commits. So I defined 
my own clean rule, kicking away everything but source files.

So far the difficulties. Next I propose an assumption about filenames, when a 
module consists of several objects which will be linked together. Let 
<module-name> be a basic name for the module, so <module-name>.(k)o (with k 
for 2.6, without for 2.4) will be the final target. I assume that all 
elementary object-filenames begin with <module-name>, for clarification. E.g. 
the module adc64.ko is composed of adc64_module.o, adc64_device.o, adc64_io.o 
and so on. Generally, the name of an object is <module-name>_<object-name>.o,
and the object-names can be collected in a symbol <module-name>-obj-names. 
Some objects may export symbols to other modules, they can be collected in a 
<module-name>-exp-names list.

Finally, all the modules' Makefiles were very similar, so I split them into 
two files: one Makefile for every module and a common Makefile.module which 
is included by each Makefile. Each module-specific Makefile contains the 
definition of
- <module-name>
- <module-name>-obj-names
- <module-name>-exp-names
- EXTRA_CFLAGS
which makes up all information Makfile.module needs.

Here is my solution:

Module-specific Makefile example: adc64-Makefile

#/***************************************************************************
# *                                                                         *
# *   This program is free software; you can redistribute it and/or modify  *
# *   it under the terms of the GNU General Public License as published by  *
# *   the Free Software Foundation; either version 2 of the License, or     *
# *   (at your option) any later version.                                   *
# *                                                                         *
# ***************************************************************************/
#
#/*
# *  (C) 2004 by Axel Weiss (aweiss@informatik.hu-berlin.de)
# */

MOD_NAME := adc64

ifeq ($($(MOD_NAME)_PWD),)
export $(MOD_NAME)_PWD := $(shell pwd)
endif

$(MOD_NAME)-obj-names := device io mailbox module ringbuffer talker
#$(MOD_NAME)-exp-names := not defined (no symbols exported here)
EXTRA_CFLAGS  := -I$($(MOD_NAME)_PWD)/../include \
		$(if $(ADC64_DEBUG),-DADC64_DEBUG,)

include ../../Makefile.module	#Path to Makefile.module

#*****************************************************************************

Makefile.module:

#/***************************************************************************
# *                                                                         *
# *   This program is free software; you can redistribute it and/or modify  *
# *   it under the terms of the GNU General Public License as published by  *
# *   the Free Software Foundation; either version 2 of the License, or     *
# *   (at your option) any later version.                                   *
# *                                                                         *
# ***************************************************************************/
#
#/*
# *  (C) 2004 by Axel Weiss (aweiss@informatik.hu-berlin.de)
# */

KERNELVERSION := $(shell uname -r)
KDIR          := /lib/modules/$(KERNELVERSION)/build
PWD           := $(shell pwd)

KERNELBASE    := $(basename $(KERNELVERSION))
KERNELMINOR   := $(suffix $(KERNELBASE))
KERNELMAJOR   := $(basename $(KERNELBASE))
KERNELMINOR_0_3   := $(strip $(foreach V, .0 .1 .2 .3, $(shell [ "$(V)" = \ 
			"$(KERNELMINOR)" ] && echo yes)))
KERNELMINOR_4_5   := $(strip $(foreach V, .4 .5, $(shell [ "$(V)" = \ 
			"$(KERNELMINOR)" ] && echo yes)))

.PHONY: all clean

ifeq ($(KERNELMAJOR),2)
ifeq ($(KERNELMINOR_0_3),yes)

all:
	@echo *** kernel $(KERNELVERSION) not supported
	@echo     please upgrade to kernel 2.4 or newer

else  # ifeq ($(KERNELMINOR_0_3),yes)

ifneq ($(KERNELRELEASE),)

obj-m      = $(MOD_NAME).o
$(MOD_NAME)-objs := $($(MOD_NAME)-obj-names:%=$(MOD_NAME)_%.o)
export-objs := $($(MOD_NAME)-exp-names:%=$(MOD_NAME)_%.o)

ifeq ($(KERNELMINOR_4_5),yes)

include $(KDIR)/Rules.make

$(MOD_NAME).o: $($(MOD_NAME)-objs)
	$(Q)$(LD) $(LD_RFLAG) -r -o $@ $($(MOD_NAME)-objs)

endif # ifeq ($(KERNELMINOR_4_5),yes)
else  # ifneq ($(KERNELRELEASE),)

all:
	$(MAKE) -C $(KDIR) SUBDIRS=$(PWD) modules

clean:
#	$(MAKE) -C $(KDIR) SUBDIRS=$(PWD) clean
	rm -f $(MOD_NAME).ko *.o .*.cmd .*.o.flags $(MOD_NAME).mod.c 
$(KDIR)/.tmp_versions/$(MOD_NAME).mod

endif # ifneq ($(KERNELRELEASE),)
endif # ifeq ($(KERNELMINOR_0_3),yes)
else  # ifeq ($(KERNELMAJOR),2)

all:
	@echo *** kernel $(KERNELVERSION) not supported
	@echo     please upgrade to kernel 2.4 or newer

endif #ifeq ($(KERNELMAJOR),2)

#*****************************************************************************

Regards,
Axel




^ permalink raw reply	[flat|nested] 12+ messages in thread

end of thread, other threads:[~2004-04-16 23:26 UTC | newest]

Thread overview: 12+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2004-04-16 15:41 compiling external modules Axel Weiss
2004-04-16 16:54 ` Sam Ravnborg
2004-04-16 20:09   ` Axel Weiss
2004-04-16 20:51     ` Sam Ravnborg
2004-04-16 21:04       ` Sam Ravnborg
2004-04-16 23:24       ` Axel Weiss
  -- strict thread matches above, loose matches on Subject: below --
2004-04-15 21:05 Axel Weiss
2004-04-15 21:59 ` Sam Ravnborg
2004-04-16  7:22   ` Duncan Sands
2004-04-16 12:06   ` Axel Weiss
2004-04-16 12:34     ` Axel Weiss
2004-04-16 16:55     ` Sam Ravnborg

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox

all inboxes | Powered by JetHome®