Re: kernelversion distinction

From: Axel Weiss (aweiss_at_informatik.hu-berlin.de)
Date: 04/12/04

  • Next message: Trond Myklebust: "Re: NFS umount"
    To: linux-kernel@vger.kernel.org
    Date:	Mon, 12 Apr 2004 16:51:39 +0200
    
    

    Am Montag, 12. April 2004 15:20 schrieb sam@ravnborg.org:
    > Date: Man, 12 Apr 2004 12:21:44 +0200 skrev Axel Weiss <aweiss@informatik.hu-berlin.de> :
    > Why you cannot use the same Makefile for 2.4 and 2.6?
    On SuSE-9.0 the build simply fails:

    rantanplan:/home/axel/freeSP-1.0.3 # make -C drivers/linux/harmonie/
    make: Entering directory `/home/axel/freeSP-1.0.3/drivers/linux/harmonie'
    make -C driver all
    make[1]: Entering directory `/home/axel/freeSP-1.0.3/drivers/linux/harmonie/driver'
    make -C /lib/modules/2.4.21-199-axel/build SUBDIRS=/home/axel/freeSP-1.0.3/drivers/linux/harmonie/driver modules
    make[2]: Entering directory `/usr/src/linux-2.4.21-199'
    make -C /home/axel/freeSP-1.0.3/drivers/linux/harmonie/driver CFLAGS="-D__KERNEL__ -I/usr/src/linux-2.4.21-199/include -Wall -Wstrict-prototypes -Wno-trigraphs -O2 -fno-strict-aliasing -fno-common -fomit-frame-pointer -fno-unit-at-a-time -pipe -msoft-float -mpreferred-stack-boundary=2 -march=athlon -DMODULE" MAKING_MODULES=1 modules
    make[3]: Entering directory `/home/axel/freeSP-1.0.3/drivers/linux/harmonie/driver'
    make[3]: *** Keine Regel, um »modules« zu erstellen. Schluss.
    make[3]: Leaving directory `/home/axel/freeSP-1.0.3/drivers/linux/harmonie/driver'
    make[2]: *** [_mod_/home/axel/freeSP-1.0.3/drivers/linux/harmonie/driver] Fehler 2
    make[2]: Leaving directory `/usr/src/linux-2.4.21-199'
    make[1]: *** [all] Fehler 2
    make[1]: Leaving directory `/home/axel/freeSP-1.0.3/drivers/linux/harmonie/driver'
    make: *** [module] Fehler 2
    make: Leaving directory `/home/axel/freeSP-1.0.3/drivers/linux/harmonie'

    >
    > A simple Makefile like you outline:
    > >EXTRA_CFLAGS := -I/usr/include
    > >obj-m += <my_module>.o
    > ><my_module>-objs = <my module object files>
    >
    > Will work flawlessly with both 2.4 and 2.6.
    > I know people for a long time have hardcoded the gcc commandline
    > to build modules for 2.4 - but thats just wrong.
    > In this way you do not catch differences in gcc options.
    > For 2.4 we have seen only few of these config related flags to gcc,
    > in 2.6 we have a lot.
    >
    > Please next time post the full Makefile.
    (see eom)
    >
    > Btw, a module that is dependent on /usr/include looks wrong...
    This is because I include the ioctl-definitions, and I put them to /usr/include/dsp, so the kernel module and user-space-lib see the identical file.
    Perhaps it would be better to include the local source (in this case ../system_include), I will think over it.

    > >clean:
    > > rm -f *.o *.ko .*.cmd <my_module>.mod.c
    >
    > For the new external module support implemented in -mc4 you
    > do not have to hardcode the clean: target, and no attempts will
    > be made to update the kernel stuff.
    > Documentation soon to arrive...
    Do you think, it would be better to write
    clean:
            $(MAKE) -C $(KDIR) SUBDIRS=$(PWD) clean
    ?

    There are still some inconsistencies, especially when I try to compile a second module. I will investigate this tonight and post cognitions here.

    The next problem arises when I have to ditinguish the kernel version within C source. For now I do it like this:
    // fw-declaration of /proc-read functions:
    #ifdef LINUX_VERSION_CODE
    #if LINUX_VERSION_CODE <= KERNEL_VERSION(2, 4, 18)
    int harmonie_read_proc(char *buf, char **start, off_t offset, int len, int unused);
    #else // 2.4.19 ... < 2.5
    int harmonie_read_proc(char *buf, char **start, off_t offset, int cnt, int *eof, void *data);
    #endif
    #else // >= 2.5
    int harmonie_read_proc(char *buf, char **start, off_t offset, int cnt, int *eof, void *data);
    #endif

    This looks really ugly, so what is the recommended way to get kernel version information? As the interface for ISRs has changed, too, there is a need for getting kernel version at compile time.

    For now, I have a running module for 2.2 - 2.6 :)

    Now the complete Makefile:

    # ***************************************************************************
    # makefile - description
    #
    # This is the harmonie device driver makefile.
    #
    # -------------------
    # begin : Wed May 29 2002
    # copyright : (C) 2002 by Axel Weiss
    # email : aweiss@informatik.hu-berlin.de
    # ***************************************************************************/
    #
    # ***************************************************************************
    # * *
    # * 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. *
    # * *
    # ***************************************************************************/

    KERNELVERSION := $(shell uname -r)
    KERNELBASE := $(basename $(KERNELVERSION))
    KERNELMINOR := $(suffix $(KERNELBASE))
    KERNELMAJOR := $(basename $(KERNELBASE))

    OLD_MODULES := $(strip $(foreach V, .0 .1 .2 .3 .4, $(shell [ "$(V)" = "$(KERNELMINOR)" ] && echo yes)))

    ifeq ($(KERNELMAJOR),2)
    ifeq ($(OLD_MODULES),yes) # old style make

    DEBUG := yes

    CC := gcc

    SOURCES := $(wildcard *.c)
    HEADERS := $(wildcard *.h)
    OBJS := $(SOURCES:%.c=%.o)

    CC_FLAGS := -c -Wall -I/lib/modules/`uname -r`/build/include -DMODULE -D__KERNEL__
    ifeq ($(DEBUG),yes)
            CC_FLAGS += -DHARMONIE_DEBUG
    endif

    all: harmonie.o

    harmonie.o: $(OBJS)
            $(LD) -r -o $@ $(OBJS)

    $(OBJS): %.o:%.c
            $(CC) $(CC_FLAGS) $<

    $(OBJS): $(HEADERS) $(SYSTEM_HEADERS_INSTALL)

    clean:
            @rm -f $(OBJS) *% *.bak harmonie.o

    else #ifeq ($(OLD_MODULES),yes) new style make

    ifneq ($(KERNELRELEASE),)

    EXTRA_CFLAGS := -I/usr/include
    obj-m += harmonie.o
    harmonie-objs = harmonie_buffer.o harmonie_device.o harmonie_module.o harmonie_procio.o harmonie_io.o

    else #ifneq ($(KERNELRELEASE),)

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

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

    clean:
            rm -f *.o *.ko .*.cmd harmonie.mod.c

    endif #ifneq ($(KERNELRELEASE),)
    endif #ifeq ($(OLD_MODULES),yes)

    else #ifeq ($(KERNELMAJOR),2) # kernel 1.x ?

    all:
            @echo kernel $(KERNELVERSION) not supported

    endif #ifeq ($(KERNELMAJOR),2)

    -
    To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
    the body of a message to majordomo@vger.kernel.org
    More majordomo info at http://vger.kernel.org/majordomo-info.html
    Please read the FAQ at http://www.tux.org/lkml/


  • Next message: Trond Myklebust: "Re: NFS umount"

    Relevant Pages