Permalink
Browse files

compat: fix few compilations by adding compat_autoconf.h support

The Makefile was generating the appropriate CONFIG_COMPAT_KERNEL_*
variables for our Makefiles but this was being ignored by C files
as compat had no compat_autoconf.h being generated. This patch
addresses this but also puhes out the CONFIG_COMPAT_KERNEL_* variable
generation to scripts. We have now two scripts:

scripts/gen-compat-config.sh - generates .config for Makefile propagation
scripts/gen-compat-autoconf.sh  - generates compat_autoconf.h for code propagation

This fixes running ckmake on older kernels. This issue was present
only on compat and not compat_wireless as compat_wireless was generating
its own compat_autoconf.h. This fixes compilation against some older
kernels of just the compat module alone. Some work is still required
for some newer and really ancient kernels:

mcgrof@tux ~/compat (git::master)$ ckmake
Trying kernel                  3.3.0-030300rc2-generic  [FAILED]
Trying kernel                     3.2.2-030202-generic  [FAILED]
Trying kernel                    3.1.10-030110-generic  [FAILED]
Trying kernel                    3.0.18-030018-generic  [FAILED]
Trying kernel                  2.6.39-02063904-generic  [FAILED]
Trying kernel                         2.6.38-8-generic  [OK]
Trying kernel                        2.6.38-13-generic  [OK]
Trying kernel                        2.6.38-12-generic  [OK]
Trying kernel                        2.6.38-11-generic  [OK]
Trying kernel                        2.6.38-10-generic  [OK]
Trying kernel                  2.6.38-02063808-generic  [OK]
Trying kernel                  2.6.37-02063706-generic  [OK]
Trying kernel                  2.6.36-02063604-generic  [OK]
Trying kernel                  2.6.35-02063512-generic  [OK]
Trying kernel                  2.6.34-02063410-generic  [OK]
Trying kernel                  2.6.33-02063305-generic  [OK]
Trying kernel                  2.6.32-02063255-generic  [OK]
Trying kernel                        2.6.31-22-generic  [OK]
Trying kernel                  2.6.31-02063113-generic  [OK]
Trying kernel                  2.6.30-02063010-generic  [OK]
Trying kernel                  2.6.29-02062906-generic  [OK]
Trying kernel                  2.6.28-02062810-generic  [OK]
Trying kernel                    2.6.27-020627-generic  [OK]
Trying kernel                    2.6.26-020626-generic  [OK]
Trying kernel                    2.6.25-020625-generic  [FAILED]
Trying kernel                    2.6.24-020624-generic  [FAILED]

Signed-off-by: Luis R. Rodriguez <mcgrof@frijolero.org>
  • Loading branch information...
mcgrof committed Feb 24, 2012
1 parent a30bd3c commit 7bf2796dc1899d68c721a1b74777df4879c89a2e
Showing with 191 additions and 70 deletions.
  1. +10 −0 .gitignore
  2. +26 −33 Makefile
  3. +0 −37 include/linux/compat_autoconf.h
  4. +105 −0 scripts/gen-compat-autoconf.sh
  5. +50 −0 scripts/gen-compat-config.sh
@@ -3,3 +3,13 @@ Module.symvers
module.order
.pc
ckmake.log
.config
include/linux/compat_autoconf.h
.tmp_versions/
compat/*.cmd
compat/*.o
compat/*.mod.c
compat/*.ko
modules.order
modules
*.patch
@@ -20,37 +20,14 @@ export COMPAT_BASE_TREE_VERSION := "next-20100517"
export COMPAT_VERSION := $(shell git describe)
endif

# This generates a bunch of CONFIG_COMPAT_KERNEL_2_6_22 CONFIG_COMPAT_KERNEL_3_0 .. etc for
# each kernel release you need an object for.
ifneq ($(wildcard $(KLIB_BUILD)/Makefile),)
# to check config and compat autoconf
export COMPAT_CONFIG=.config
export COMPAT_AUTOCONF=include/linux/compat_autoconf.h
export MAKE

COMPAT_LATEST_VERSION = 3
KERNEL_VERSION := $(shell $(MAKE) -C $(KLIB_BUILD) kernelversion | sed -n 's/^\([0-9]\)\..*/\1/p')

ifneq ($(KERNEL_VERSION),2)
KERNEL_SUBLEVEL := $(shell $(MAKE) -C $(KLIB_BUILD) kernelversion | sed -n 's/^3\.\([0-9]\+\).*/\1/p')
else
COMPAT_26LATEST_VERSION = 39
KERNEL_26SUBLEVEL := $(shell $(MAKE) -C $(KLIB_BUILD) kernelversion | sed -n 's/^2\.6\.\([0-9]\+\).*/\1/p')
COMPAT_26VERSIONS := $(shell I=$(COMPAT_26LATEST_VERSION); while [ "$$I" -gt $(KERNEL_26SUBLEVEL) ]; do echo $$I; I=$$(($$I - 1)); done)
$(foreach ver,$(COMPAT_26VERSIONS),$(eval export CONFIG_COMPAT_KERNEL_2_6_$(ver)=y))
KERNEL_SUBLEVEL := -1
endif

COMPAT_VERSIONS := $(shell I=$(COMPAT_LATEST_VERSION); while [ "$$I" -gt $(KERNEL_SUBLEVEL) ]; do echo $$I; I=$$(($$I - 1)); done)
$(foreach ver,$(COMPAT_VERSIONS),$(eval export CONFIG_COMPAT_KERNEL_3_$(ver)=y))

endif

ifeq ($(CONFIG_COMPAT_KERNEL_2_6_33),y)
ifneq ($(CONFIG_FW_LOADER),)
export CONFIG_COMPAT_FIRMWARE_CLASS=m
endif
endif

ifeq ($(CONFIG_COMPAT_KERNEL_2_6_36),y)
export CONFIG_COMPAT_KFIFO=m
endif #CONFIG_COMPAT_KERNEL_2_6_36
# Recursion lets us ensure we get this file included.
# Trick is to run make -C $(PWD) modules later.
-include $(PWD)/$(COMPAT_CONFIG)

obj-y += compat/

@@ -65,15 +42,31 @@ NOSTDINC_FLAGS := -I$(M)/include/ \
-DCOMPAT_PROJECT="\"Generic kernel\"" \
-DCOMPAT_VERSION="\"$(COMPAT_VERSION)\""

modules:
all: $(COMPAT_CONFIG)

modules: $(COMPAT_CONFIG) $(COMPAT_AUTOCONF)
$(MAKE) -C $(KLIB_BUILD) M=$(PWD) modules
@touch modules

install: modules
$(MAKE) -C $(KLIB_BUILD) M=$(PWD) $(KMODDIR_ARG) $(KMODPATH_ARG) \
modules_install
depmod -a
@./scripts/compat_firmware_install
$(MAKE) -C $(KLIB_BUILD) M=$(PWD) clean

$(COMPAT_AUTOCONF): ;

$(COMPAT_CONFIG):
@$(PWD)/scripts/gen-compat-config.sh > $(PWD)/$(COMPAT_CONFIG)
@$(PWD)/scripts/gen-compat-autoconf.sh $(COMPAT_CONFIG) > $(PWD)/$(COMPAT_AUTOCONF)
@$(MAKE) -C $(PWD) modules

install: modules

clean:
$(MAKE) -C $(KLIB_BUILD) M=$(PWD) clean
all: modules

clean-files := Module.symvers modules.order Module.markers compat/modules.order
clean-files += modules $(COMPAT_CONFIG) $(COMPAT_AUTOCONF)

.PHONY: all install clean

This file was deleted.

Oops, something went wrong.
@@ -0,0 +1,105 @@
#!/bin/bash
#
# Copyright 2012 Luis R. Rodriguez <mcgrof@frijolero.org>
# Copyright 2011 Hauke Mehrtens <hauke@hauke-m.de>
# Copyright 2011 John W. Linville <linville@tuxdriver.com>
#
# Use this to parse a small .config equivalent looking file to generate
# our own autoconf.h. This file has defines for each config option
# just like the kernels include/linux/autoconf.h
#
# XXX: consider using scripts/kconfig/confdata.c instead.
# On the downside this would require the user to have libc though.

# This indicates which is the oldest kernel we support
# Update this if you are adding support for older kernels.
OLDEST_KERNEL_SUPPORTED="2.6.24"

if [ $# -ne 1 ]; then
echo "Usage $0 config-file"
exit
fi

COMPAT_CONFIG="$1"

if [ ! -f $COMPAT_CONFIG ]; then
echo "File $1 is not a file"
exit
fi

# Defines a CONFIG_ option if not defined yet, this helps respect
# linux/autoconf.h
function define_config {
VAR=$1
VALUE=$2
case $VALUE in
n) # Try to undefine it
echo "#undef $VAR"
;;
y)
echo "#ifndef $VAR"
echo "#define $VAR 1"
echo "#endif /* $VAR */"
;;
m)
echo "#ifndef $VAR"
echo "#define $VAR 1"
echo "#endif /* $VAR */"
;;
*) # Assume string
# XXX: add better checks to make sure what was on
# the right was indeed a string
echo "#ifndef $VAR"
echo "#define $VAR \"$VALUE\""
echo "#endif /* $VAR */"
;;
esac
}

function kernel_version_req {
VERSION=$(echo $1 | sed -e 's/\./,/g')
echo "#if (LINUX_VERSION_CODE < KERNEL_VERSION($VERSION))"
echo "#error compat requirement: Linux >= $VERSION"
echo "#endif /* (LINUX_VERSION_CODE < KERNEL_VERSION($VERSION) */"
}

cat <<EOF
#ifndef COMPAT_AUTOCONF_INCLUDED
#define COMPAT_AUTOCONF_INCLUDED
/*
* Automatically generated C config: don't edit
*/
EOF

# Checks user is compiling against a kernel we support
kernel_version_req $OLDEST_KERNEL_SUPPORTED

# For each CONFIG_FOO=x option
for i in $(egrep '^CONFIG_|^ifdef CONFIG_|^ifndef CONFIG_|^endif #CONFIG_|^else #CONFIG_' $COMPAT_CONFIG | sed 's/ /+/'); do
case $i in
'ifdef+CONFIG_'* )
echo "#$i" | sed -e 's/+/ /' -e 's/\(ifdef CONFIG_COMPAT_KERNEL_3_\)\([0-9]*\)/if (LINUX_VERSION_CODE < KERNEL_VERSION(3,\2,0))/' -e 's/\(ifdef CONFIG_COMPAT_KERNEL_2_6_\)\([0-9]*\)/if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,\2))/' -e 's/\(ifdef CONFIG_COMPAT_RHEL_\)\([0-9]*\)_\([0-9]*\)/if (defined(RHEL_MAJOR) \&\& RHEL_MAJOR == \2 \&\& RHEL_MINOR >= \3)/' -e 's/\(#ifdef \)\(CONFIG_[^:space:]*\)/#if defined(\2) || defined(\2_MODULE)/'
continue
;;
'ifndef+CONFIG_'* )
echo "#$i" | sed -e 's/+/ /' -e 's/\(ifndef CONFIG_COMPAT_KERNEL_3_\)\([0-9]*\)/if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,\2,0))/' -e 's/\(ifndef CONFIG_COMPAT_KERNEL_2_6_\)\([0-9]*\)/if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,\2))/' -e 's/\(ifndef CONFIG_COMPAT_RHEL_\)\([0-9]*\)_\([0-9]*\)/if (!defined(RHEL_MAJOR) || RHEL_MAJOR != \2 || RHEL_MINOR < \3)/' -e 's/\(#ifndef \)\(CONFIG_[^:space:]*\)/#if !defined(\2) \&\& !defined(\2_MODULE)/'
continue
;;
'else+#CONFIG_'* | 'endif+#CONFIG_'* )
echo "#$i */" |sed -e 's/+#/ \/* /g'
continue
;;
CONFIG_* )
# Get the element on the left of the "="
VAR=$(echo $i | cut -d"=" -f 1)
# Get the element on the right of the "="
VALUE=$(echo $i | cut -d"=" -f 2)

# Any other module which can *definitely* be built as a module goes here
define_config $VAR $VALUE
continue
;;
esac
done

echo "#endif /* COMPAT_AUTOCONF_INCLUDED */"
@@ -0,0 +1,50 @@
#!/bin/bash
# Copyright 2012 Luis R. Rodriguez <mcgrof@frijolero.org>
# Copyright 2012 Hauke Mehrtens <hauke@hauke-m.de>
#
# This generates a bunch of CONFIG_COMPAT_KERNEL_2_6_22
# CONFIG_COMPAT_KERNEL_3_0 .. etc for each kernel release you need an object
# for.
#
# Note: this is part of the compat.git project, not compat-wireless.git,
# send patches against compat.git.

if [[ ! -f ${KLIB_BUILD}/Makefile ]]; then
exit
fi

# Actual kernel version
KERNEL_VERSION=$(${MAKE} -C ${KLIB_BUILD} kernelversion | sed -n 's/^\([0-9]\)\..*/\1/p')

# 3.0 kernel stuff
COMPAT_LATEST_VERSION="3"
KERNEL_SUBLEVEL="-1"

# This allows all these variables to be propagated through
# all of our Makefiles
echo export

if [[ ${KERNEL_VERSION} -eq "3" ]]; then
KERNEL_SUBLEVEL=$(${MAKE} -C ${KLIB_BUILD} kernelversion | sed -n 's/^3\.\([0-9]\+\).*/\1/p')
else
COMPAT_26LATEST_VERSION="39"
KERNEL_26SUBLEVEL=$(${MAKE} -C ${KLIB_BUILD} kernelversion | sed -n 's/^2\.6\.\([0-9]\+\).*/\1/p')
let KERNEL_26SUBLEVEL=${KERNEL_26SUBLEVEL}+1

for i in $(seq ${KERNEL_26SUBLEVEL} ${COMPAT_26LATEST_VERSION}); do
echo "CONFIG_COMPAT_KERNEL_2_6_${i}=y"
done
fi

let KERNEL_SUBLEVEL=${KERNEL_SUBLEVEL}+1
for i in $(seq ${KERNEL_SUBLEVEL} ${COMPAT_LATEST_VERSION}); do
echo "CONFIG_COMPAT_KERNEL_3_${i}=y"
done

if [[ ${CONFIG_COMPAT_KERNEL_2_6_33} -eq "y" ]]; then
echo "CONFIG_COMPAT_FIRMWARE_CLASS=m"
fi

if [[ ${CONFIG_COMPAT_KERNEL_2_6_36} -eq "y" ]]; then
echo "CONFIG_COMPAT_KFIFO=m"
fi

0 comments on commit 7bf2796

Please sign in to comment.