Problema ao compilar um driver: “Nenhuma regra para fazer o alvo”

1

Primeiro, estou executando uma instalação do CentOS 6.4. Meu computador é um laptop e estou tentando instalar os drivers para minha placa ethernet, porque neste fim de semana perdi minha capacidade de me conectar à Internet.

Então baixei o driver: jmebp-1.0.8.5

Instalei o gcc, kernel-devel e, como não estava funcionando, finalmente instalei o grupo Development Tools (no caso de eu ter esquecido alguma coisa).

Quando eu

make install

Eu recebo este erro:

*** No rule to make target 'internet/jmebp-1.0.8.5'.  Stop.
Leaving directory '/lib/modules/2.6.32-358.6.1.el6.x86_64/build'

Meu makefile é:

    MODNAME := jme
obj-m := $(MODNAME).o

ifneq ($(KERNELRELEASE),)
#########################
# kbuild part of makefile
#########################
EXTRA_CFLAGS += -Wall -O3
#EXTRA_CFLAGS += -DTX_DEBUG
#EXTRA_CFLAGS += -DREG_DEBUG

else
#########################
# Normal Makefile
#########################
TEMPFILES := $(MODNAME).o $(MODNAME).mod.c $(MODNAME).mod.o Module.symvers .$(MODNAME).*.cmd .tmp_versions modules.order Module.markers Modules.symvers

ifeq (,$(KVER))
KVER=$(shell uname -r)
endif
KSRC ?= /lib/modules/$(KVER)/build
MINSTDIR ?= /lib/modules/$(KVER)/kernel/drivers/net

all: modules
    @rm -rf $(TEMPFILES)
modules:
    @$(MAKE) -C $(KSRC) M=$(shell pwd) modules

checkstack: modules
    objdump -d $(obj-m) | perl $(KSRC)/scripts/checkstack.pl $(shell uname -m)
    @rm -rf $(TEMPFILES)

namespacecheck: modules
    perl $(KSRC)/scripts/namespace.pl
    @rm -rf $(TEMPFILES)

install: modules
    install -m 644 $(MODNAME).ko $(MINSTDIR)
    depmod -a $(KVER)

patch:
    @/usr/bin/diff -uar -X dontdiff ../../trunc ./ > bc.patch || echo > /dev/null

buildtest:
    SRCDIRS='find ~/linux-src -mindepth 1 -maxdepth 1 -type d -name 'linux-*' | sort -r -n'; \
    SRCDIRS="$${SRCDIRS} 'find ~/linux-src/centos -mindepth 2 -maxdepth 2 -type d -name 'linux-*' | sort -r -n'"; \
    SRCDIRS="$${SRCDIRS} 'find ~/linux-src/fedora -mindepth 2 -maxdepth 2 -type d -name 'linux-*' | sort -r -n'"; \
    for d in $${SRCDIRS}; do \
        $(MAKE) clean && $(MAKE) -C . KSRC=$${d} modules; \
        if [ $$? != 0 ]; then \
            exit $$?; \
        fi; \
    done
    $(MAKE) clean

clean:
    @rm -rf $(MODNAME).ko $(TEMPFILES)

%::
    $(MAKE) -C $(KSRC) M='pwd' $@

endif

Alguma sugestão?

    
por Ahuri3 14.05.2013 / 21:31

1 resposta

3

Primeira edição

Você está perdendo o pacote kernel-headers . Você precisa deles para compilar os módulos do kernel.

yum install kernel-headers

Assumindo onde você baixou os drivers . Quando os descompactei em um sistema CentOS 6.4, recebi o seguinte erro:

$ cd jmebp-1.0.8.5
$ ls
CHANGELOG  jme.c  jme.h  Makefile  scripts
$ make
make: *** /lib/modules/2.6.32-279.14.1.el6.x86_64/build: No such file or directory.  Stop.
make: *** [modules] Error 2

Depois de instalar o pacote kernel-headers , executei make uma segunda vez:

$ make
make: *** /lib/modules/2.6.32-279.14.1.el6.x86_64/build: No such file or directory.  Stop.
make: *** [modules] Error 2

Ainda é um problema? Depurando ainda mais eu descobri o meu outro problema, que você pode encontrar também, então eu estou documentando isso abaixo, apenas no caso.

segunda edição

O link no diretório do kernel parecia estar quebrado.

$ pwd
/lib/modules/2.6.32-279.14.1.el6.x86_64

$ ls -l | grep build
lrwxrwxrwx  1 root root     51 Dec 15 14:49 build -> ../../../usr/src/kernels/2.6.32-279.14.1.el6.x86_64
lrwxrwxrwx  1 root root      5 Dec 15 14:50 source -> build

$ ls -l build/
ls: cannot access build/: No such file or directory

Opa, versão incorreta do kernel-headers e kernel-devel da versão do kernel. Estamos atualmente executando esta versão do kernel:

$ uname -r
2.6.32-279.14.1.el6.x86_64

Mas acabamos de instalar os pacotes kernel-headers e kernel-devel para esta versão:

2.6.32-358.6.1.el6.x86_64

Então, vamos instalar essa versão do kernel também e reinicializar para que possamos usar o kernel mais novo:

$ yum update kernel

Após a reinicialização, tudo fica muito melhor:

$ ls
CHANGELOG  jme.c  jme.h  Makefile  scripts

$ make
make[1]: Entering directory '/usr/src/kernels/2.6.32-358.6.1.el6.x86_64'
  CC [M]  /home/sam/jmebp/jmebp-1.0.8.5/jme.o
  Building modules, stage 2.
  MODPOST 1 modules
  CC      /home/sam/jmebp/jmebp-1.0.8.5/jme.mod.o
  LD [M]  /home/sam/jmebp/jmebp-1.0.8.5/jme.ko.unsigned
  NO SIGN [M] /home/sam/jmebp/jmebp-1.0.8.5/jme.ko
make[1]: Leaving directory '/usr/src/kernels/2.6.32-358.6.1.el6.x86_64'

$ ls
CHANGELOG  jme.c  jme.h  jme.ko  jme.ko.unsigned  Makefile  scripts

Agora vemos o módulo do kernel jme.ko. Para instalá-lo:

make install
    
por 14.05.2013 / 23:02