Public bug reported:
When building alsa-source using:
$ sudo fakeroot debian/rules binary_modules
which causes configure to set the module destination as:
checking for directory to store kernel modules... /lib/modules/#define
The build fails:
/usr/bin/make DESTDIR=/usr/src/modules/alsa-driver/debian/alsa-modules-#define
LINUX_VERSION_CODE 132630 install-modules
make[1]: Entering directory `/usr/src/modules/alsa-driver'
make[1]: *** No rule to make target `LINUX_VERSION_CODE'. Stop.
make[1]: Leaving directory `/usr/src/modules/alsa-driver'
make: *** [install-stamp] Error 2
debian/rules tries to work out the source kernel version by using sed to
strip text from line 1 of $(KSRC)/include/linux/version.h but that entry
is LINUX_VERSION_CODE, a numeric of the form "123456" not a version
string as uname -r reports of the form "2.6.22-14-generic". As a result:
$ fakeroot debian/rules echo-vars
I've been configured using:
- Kernel source of /usr/src/linux
- Kernel version of #define LINUX_VERSION_CODE 132630
- Kernel revision of unknown
- C compiler of gcc
- Make options of
- Version of 1.0.14-1ubuntu2
KVERS "#define LINUX_VERSION_CODE 132630" is inserted into many settings
during configure and make.
----- /usr/src/linux/include/linux/version.h -----
#define LINUX_VERSION_CODE 132630
#define KERNEL_VERSION(a,b,c) (((a) << 16) + ((b) << 8) + (c))
-----
----- /usr/src/modules/alsa-driver/debian/rules -----
# If they didn't set $(KVERS), see if we can do it for them.
ifeq ($(KVERS),unknown)
ifneq "$(wildcard $(KSRC)/include/linux/version.h)" ""
KVERS = $(shell head -1 $(KSRC)/include/linux/version.h | sed
's/.*"\(.*\)"$$/\1/')
endif
endif
-----
An alternative method would be to read the target of the /usr/src/linux
symbolic link, although this won't work if the user over-rides KSRC:
ifeq ($(origin KSRC),file)
KVERS = $(shell ls -ld $(KSRC) | sed
's/.*linux-headers-\(.*\)$$/\1/')
endif
If the symbolic link isn't available then the script needs to convert
LINUX_VERSION_CODE to KVERS format. GNU 'make' doesn't provide built-in
math functions required to do that (bitwise-AND and bitwise-shift) and
we can't rely on the shell being BASH in order to use its math
functions.
The solution seems to be to incorporate both methods, using the sym-link
if KSRC hasn't been over-ridden, and otherwise use LINUX_VERSION_CODE by
compiling and calling a small conversion utility (lvc2kvers). The
modification to debian/rules:
----- debian/rules -----
# If they didn't set $(KVERS), see if we can do it for them.
ifeq ($(KVERS),unknown)
ifneq "$(wildcard $(KSRC)/include/linux/version.h)" ""
# if source directory hasn't been over-ridden
ifeq ($(origin KSRC),file)
# attempt to get symbolic link target
LNKVERS = $(shell ls -ld $(KSRC) | sed
's/.*linux-headers-\(.*\)$$/\1/')
# test whether directory exists
ifeq ($(shell sh -c "test -e /lib/modules/$(LNKVERS) &&
echo \"EXISTS\""),EXISTS)
# correct to use directory name as kernel
version
KVERS = $(LNKVERS)
endif
endif
ifeq ($(KVERS),unknown)
# KVERS still not set, so use LINUX_VERSION_CODE to
determine KVERS
# extract the LINUX_VERSION_CODE
LVC = $(shell head -1 $(KSRC)/include/linux/version.h |
sed 's/.* \([0-9]*\)$$/\1/')
# compile the converter source code
CONV = $(shell $(CC) debian/lvc2kvers.c -o
debian/lvc2kvers )
# call the converter
LVCKVERS = $(shell debian/lvc2kvers $(LVC) )
# only set KVERS if LVCKVERS isn't empty
ifneq ($(LVCKVERS)unset,unset)
KVERS = $(LVCKVERS)
endif
# NOTE: KVERS might not exist as a directory in
/lib/modules/
endif
endif
endif
-----
The lvc2kvers utility to do the conversion that is compiled when
debian/rules runs:
----- debian/lvc2kvers.c -----
/*
Convert LINUX_VERSION_CODE to KVERS format
Copyright 2008 TJ <[EMAIL PROTECTED]>
Licensed under the GNU GPL.
See debian/copyright for license terms.
*/
#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
int main(int argc, char **argv, char **env) {
int ret = 1; // default is to report an error
long linux_version_code = 0;
int major, minor, step;
if (argc > 1) {
linux_version_code = strtol(argv[1], NULL, 10);
if (errno != ERANGE && errno != EINVAL) {
ret = 0;
step = linux_version_code & 0xff;
minor = (linux_version_code & 0xff00) >> 8;
major = (linux_version_code & 0xff0000) >> 16;
printf("%d.%d.%d", major, minor, step);
}
}
if (ret != 0) printf("ERROR");
return ret;
}
-----
To test/debug add additional reports to the echo-vars target:
echo-vars:
@echo "I've been configured using:"
@echo " - Kernel source of $(KSRC)"
@echo " - LN Kernel version of $(LNKVERS)"
@echo " - LVC Kernel version of $(LVCKVERS)"
@echo " - Kernel version of $(KVERS)"
@echo " - Kernel revision of $(KDREV)"
@echo " - C compiler of $(CC)"
@echo " - Make options of $(MAKE_OPT)"
@echo " - Version of $(VERSION)"
With the directory existing:
$ fakeroot debian/rules echo-vars
I've been configured using:
- Kernel source of /usr/src/linux
- LN Kernel version of 2.6.22-14-generic
- LVC Kernel version of
- Kernel version of 2.6.22-14-generic
- Kernel revision of unknown
- C compiler of gcc
- Make options of
- Version of 1.0.14-1ubuntu2
If the directory doesn't exist:
$ fakeroot debian/rules echo-vars
I've been configured using:
- Kernel source of /usr/src/linux
- LN Kernel version of
- LVC Kernel version of 2.6.22
- Kernel version of 2.6.22
- Kernel revision of unknown
- C compiler of gcc
- Make options of
- Version of 1.0.14-1ubuntu2
** Affects: alsa-driver (Ubuntu)
Importance: Undecided
Status: New
--
FTBFS: debian/rules fails to set correct KVERS from include/linux/version.h
https://bugs.launchpad.net/bugs/212816
You received this bug notification because you are a member of Ubuntu
Bugs, which is subscribed to Ubuntu.
--
ubuntu-bugs mailing list
[email protected]
https://lists.ubuntu.com/mailman/listinfo/ubuntu-bugs