将其他源目录添加到c makefile

时间:2017-03-20 15:52:30

标签: linux makefile linux-kernel

对不起,如果这是noob问题。

在我的c函数中,我使用btrfs_inode.h文件中定义的宏 当我将文件直接包含在路径中时:

#include "/data/kernel/linux-4.1.21-x86_64/fs/btrfs/btrfs_inode.h"

项目编译没有错误,我不想使用该直接路径,我下载包含此头文件的包kernel-source。
安装软件包后头文件的位置是:/ usr / src / linux / fs / btrfs /

所以我将#include改为:

#include "btrfs_inode.h"

我希望添加“/ usr / src / linux / fs / btrfs /”作为搜索“btrfs_inode.h”的位置并获取:“/ usr / src / linux / fs / btrfs / btrfs_inode .H“

我收到错误:
    / bin / sh:1:/ usr / src / linux / fs / btrfs /:权限被拒绝

我正在以root身份运行make。

Makefile:

all:: user

obj-m += my-driver.o


# Make arguments
PWD := $(shell pwd)
INCLUDE := -I/usr/include/asm/mach-default/
KDIR    := /lib/modules/$(KERNEL_HEADERS)/build;/usr/src/linux/fs/btrfs/


# Add flags to auto build
EXTRA_CFLAGS    +=-D__Linux -std=gnu99

# extra warning flags
ccflags-y := -Wall -Wextra #-pedantic
# disable some warning flags
ccflags-y += -Wno-unused-parameter
# make all warnings into errors
ccflags-y += -Werror
# increase verbosity
KBUILD_VERBOSE := 1

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

2 个答案:

答案 0 :(得分:1)

首先,尽可能避免以root身份制作。接下来,您将目录添加到KDIR,而不是INCLUDE(然后将KDIR传递给make的-C参数,这样您就会看到一行:

make -C /lib/modules/$(KERNEL_HEADERS)/build;/usr/src/linux/fs/btrfs/ ...

注意分号,bash将作为命令的结尾插入,并开始下一个命令。因此它尝试运行make,然后尝试运行/usr/src/linux/fs/btrfs/,并向您发出警告。你应该拥有的是:

# Make arguments
PWD := $(shell pwd)
INCLUDE := -I/usr/include/asm/mach-default/
INCLUDE += -I/usr/src/linux/fs/btrfs/
KDIR    := /lib/modules/$(KERNEL_HEADERS)/build

(您希望路径前面有-I告诉make在该目录中搜索包含文件。)

修改

您也没有将-I传递给$(CC)$(CXX)命令。要做到这一点,你有几个选项,虽然我建议最不容易出错:首先,你必须将标志传递给子make。为此,首先添加以下行:

export INCLUDE

到您的主makefile。您的子邮件现在可以访问变量$(INCLUDE)。从那里,如果您有一个明确的规则来编译CC文件,您可以将$(INCLUDE)添加到编译命令。像

这样的东西
%.o: %.c
     $(CC) $(CFLAGS) $(INCLUDE) -o $@ $<

或者,如果您使用的是内置隐式规则,只需将$(INCLUDE)添加到CPP_FLAGS

CPP_FLAGS += $(INCLUDE)

(注意,默认情况下,CPP_FLAGS用于c和c ++编译)。

最后,$(INCLUDE)传递给您的make命令。如果这样做,它会告诉 make 查找这些目录中的子makefile(不是gcc ...)。

答案 1 :(得分:0)

通过this question我可以理解,您可以在Makefile中添加多个-I标志。