Переменные Makefile: разница между "MY_FILE" и "obj-m" - PullRequest
0 голосов
/ 26 января 2019

У меня есть две простые программы (приложение, драйвер) и Makefile, который динамически компилирует эти приложения. Когда я запускаю «make test_prg», он правильно компилирует приложение. Это, однако, не работает для драйвера "make test_drv".

~ / тест / test_prg / привет-world.c

#include <stdio.h>
int main(void) {
    printf("Hello world\n");
    return 0;
}

~ / тест / test_drv / привет-world.c

#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/init.h>
int __init hello_init(void) {
    printk(KERN_INFO "Hello world\n");
    return 0;
}
void __exit hello_exit(void) {
    printk(KERN_INFO "Bye world\n");
}
module_init(hello_init);
module_exit(hello_exit);

~ / тест / Makefile

MAKEFLAGS       := -B
DRV_PATH        := /lib/modules/$(shell uname -r)/build
PRG_PATH        := .

MY_PATH         := 
MY_TARGET       :=
MY_FILE         ?=

test_%: _setup_test_%
        make M=$(PWD) -C $(MY_PATH) MY_FILE=$@/$(MY_FILE) $(MY_TARGET)

build:
        gcc $(MY_FILE)

_setup_test_drv:
        $(eval MY_PATH=$(DRV_PATH))
        $(eval MY_TARGET=modules)
        $(eval obj-m=hello-world.o)
        echo $(obj-m) $(MY_PATH)

_setup_test_prg:
        $(eval MY_PATH=$(PRG_PATH))
        $(eval MY_TARGET=build)
        $(eval MY_FILE=hello-world.c)

Установлены правильные значения, но он не находит модуль для компиляции:

echo hello-world.o /lib/modules/4.6.7-pd-4.6.y/build
hello-world.o /lib/modules/4.6.7-pd-4.6.y/build
make M=/home/timgru/test -C /lib/modules/4.6.7-pd-4.6.y/build MY_FILE=test_drv/ modules
make[1]: Entering directory '/usr/src/linux-headers-4.6.7-pd-4.6.y'
  Building modules, stage 2.
  MODPOST 0 modules
make[1]: Leaving directory '/usr/src/linux-headers-4.6.7-pd-4.6.y'

Странно, если я жестко закодирую «параметры драйвера», драйвер компилируется правильно:

~ / тест / test_drv / Makefile

obj-m:=hello-world.o
#hello-world-objs:=$(shell find . -name '*.c')

all:
    make -C/lib/modules/$(shell uname -r)/build M=$(PWD) modules

Я пытаюсь понять, почему не работает решение ~ / test / Makefile для компиляции драйвера. Кроме того, я бы хотел как-то обойти эту проблему: -)

1 Ответ

0 голосов
/ 26 января 2019

Совет: никогда жесткий код make в make-файле.Всегда используйте $(MAKE).

Ваш make-файл не определяет obj-m, когда он вызывается с целью modules.Правильным будет

obj-m :=
obj-m += hello-world.o

test_drv test_prg:
        $(MAKE) M=$(PWD) -C $(MY_PATH) $(MY_TARGET)

test_drv: MY_PATH   := $(DRV_PATH)
test_drv: MY_TARGET := modules

Вот исправленная версия вашего Makefile:

MAKEFLAGS := -B
DRV_PATH  := /lib/modules/$(shell uname -r)/build
PRG_PATH  := .

.PHONY: test_drv test_prg
test_drv test_prg:
    $(MAKE) M=$(PWD) -C $(MY_PATH) MY_FILE=$@/$(MY_FILE) $(MY_TARGET)

.PHONY: build
build:
    gcc $(MY_FILE)

test_drv: MY_PATH   := $(DRV_PATH)
test_drv: MY_TARGET := modules
# input values for "modules" & friends
obj-m               :=
obj-m               += hello-world.o

test_prg: MY_PATH   := $(PRG_PATH)
test_prg: MY_TARGET := build
test_prg: MY_FILE   := hello-world.c
...