linux 中的makefile

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了linux 中的makefile相关的知识,希望对你有一定的参考价值。

编写一个内核模块:
#include<linux/kernel.h>
#include<linux/module.h>
#if CONFIG_MODVERSIONS==1
#define MODVERSIONS
#include<linux/modversions.h>
#endif
MODULE_LICENSE("GPL");
int init_module()

printk("hello.word-this is the kernel speaking\n");
return 0;

void cleanup_module()

printk("Short is the life of a kernel module\n");

保存为文件hello.c
编写一个Makefile:
CC=gcc
MODCFLAGS:=-O6 -Wall -DMODULE -D__KERNEL__ -DLINUX
hello.o:hello.c /usr/include/linux/version.h
$(CC) $(MODCFLAGS) -c hello.c
echo insmod hello.o to turn it on
保存为文件Makefile
执行make
我们可以看到生成了一个hello.o的内核模块

这里的执行make是直接在terminal里 输入make就行了么 我输入了可是报错 说是:mising separator.stop 请说明我该怎么改 可能是哪里出错 我上网查 说是可能是tab的问题 可是我不知道怎么该 求高人指点

参考技术A 1. CC=gcc
2. MODCFLAGS:=-O6 -Wall -DMODULE -D__KERNEL__ -DLINUX
3. hello.o:hello.c /usr/include/linux/version.h
4. $(CC) $(MODCFLAGS) -c hello.c
5. echo insmod hello.o to turn it on
注意第四行开头要用tab键
参考技术B $(CC) $(MODCFLAGS) -c hello.c
echo insmod hello.o to turn it on

这两行开头只能以tab字符开头
参考技术C CC=gcc
MODCFLAGS:=-O6 -Wall -DMODULE -D__KERNEL__ -DLINUX
hello.o:hello.c /usr/include/linux/version.h
$(CC) $(MODCFLAGS) -c hello.c
echo insmod hello.o to turn it on

在执行语句行里必须有tab缩进本回答被提问者和网友采纳
参考技术D $(CC) $(MODCFLAGS) -c hello.c
echo insmod hello.o to turn it on

这两行前面tab一下

cyttsp4(linux内核)Makefile中的错误

【中文标题】cyttsp4(linux内核)Makefile中的错误【英文标题】:Error in cyttsp4 (linux kernel) Makefile 【发布时间】:2017-06-20 02:16:05 【问题描述】:

下面是我正在为 Android 编译的 Linux 内核中 cyttsp4 的 Makefile,使用 kyasu msm8974 项目 (https://github.com/kyasu/android_kernel_samsung_msm8974)。

### CYTTSP
#obj-m  += cyttsp4.o
obj-$(CONFIG_TOUCHSCREEN_CYPRESS_CYTTSP4) += cyttsp4_core.o
obj-$(CONFIG_TOUCHSCREEN_CYPRESS_CYTTSP4) += cyttsp4_i2c.o
obj-$(CONFIG_TOUCHSCREEN_CYPRESS_CYTTSP4) += cyttsp4_platform.o
obj-$(CONFIG_TOUCHSCREEN_CYPRESS_CYTTSP4) += cyttsp4_devtree.o
obj-$(CONFIG_TOUCHSCREEN_CYPRESS_CYTTSP4) += cyttsp4_mt_common.o
obj-$(CONFIG_TOUCHSCREEN_CYPRESS_CYTTSP4) += cyttsp4_mtb.o
obj-$(CONFIG_TOUCHSCREEN_CYPRESS_CYTTSP4) += cyttsp4_btn.o
obj-$(CONFIG_TOUCHSCREEN_CYPRESS_CYTTSP4) += cyttsp4_debug.o
obj-$(CONFIG_TOUCHSCREEN_CYPRESS_CYTTSP4) += cyttsp4_device_access.o
obj-$(CONFIG_TOUCHSCREEN_CYPRESS_CYTTSP4) += cyttsp4_loader.o
obj-$(CONFIG_TOUCHSCREEN_CYPRESS_CYTTSP4) += cyttsp4_samsung_sysfs.o

CY_CFLAG_ADD =\
    -DCONFIG_TOUCHSCREEN_CYPRESS_CYTTSP4\
    -DCONFIG_TOUCHSCREEN_CYPRESS_CYTTSP4_DEVICETREE_SUPPORT\
    -DCONFIG_TOUCHSCREEN_CYPRESS_CYTTSP4_BUTTON\
    -DCONFIG_TOUCHSCREEN_CYPRESS_CYTTSP4_DEVICE_ACCESS\
    -DCONFIG_TOUCHSCREEN_CYPRESS_CYTTSP4_LOADER\
    -DCONFIG_TOUCHSCREEN_CYPRESS_CYTTSP4_PLATFORM_FW_UPGRADE\
    -DCONFIG_TOUCHSCREEN_CYPRESS_CYTTSP4_BINARY_FW_UPGRADE

CY_CFLAG_REMOVE =\
    -DCYTTSP4_PDATA_IN_PLATFORM_C\
    -DCONFIG_TOUCHSCREEN_CYPRESS_CYTTSP4_PROXIMITY\
    -DCONFIG_TOUCHSCREEN_CYPRESS_CYTTSP4_PLATFORM_TTCONFIG_UPGRADE\
    -DCONFIG_TOUCHSCREEN_CYPRESS_CYTTSP4_DEVICE_ACCESS_API\
    -DCONFIG_TOUCHSCREEN_CYPRESS_CYTTSP4_DEBUG\
    -DCONFIG_TOUCHSCREEN_CYPRESS_CYTTSP4_MANUAL_TTCONFIG_UPGRADE

CFLAGS_cyttsp4_core.o           += $(CY_CFLAG_ADD) -DDEBUG
CFLAGS_cyttsp4_i2c.o            += $(CY_CFLAG_ADD) -DDEBUG
CFLAGS_cyttsp4_spi.o            += $(CY_CFLAG_ADD)
CFLAGS_cyttsp4_mta.o            += $(CY_CFLAG_ADD)
CFLAGS_cyttsp4_mtb.o            += $(CY_CFLAG_ADD)
CFLAGS_cyttsp4_mt_a.o           += $(CY_CFLAG_ADD)
CFLAGS_cyttsp4_mt_b.o           += $(CY_CFLAG_ADD)
CFLAGS_cyttsp4_mt_common.o      += $(CY_CFLAG_ADD)
CFLAGS_cyttsp4_btn.o            += $(CY_CFLAG_ADD)
CFLAGS_cyttsp4_proximity.o      += $(CY_CFLAG_ADD)
CFLAGS_cyttsp4_samsung_sysfs.o  += $(CY_CFLAG_ADD)
CFLAGS_cyttsp4_device_access.o  += $(CY_CFLAG_ADD)
CFLAGS_cyttsp4_test_device_access_api.o += $(CY_CFLAG_ADD)
CFLAGS_cyttsp4_loader.o         += $(CY_CFLAG_ADD)
CFLAGS_cyttsp4_debug.o          += $(CY_CFLAG_ADD)
CFLAGS_cyttsp4_devtree.o        += $(CY_CFLAG_ADD) -DDEBUG
CFLAGS_cyttsp4_platform.o       += $(CY_CFLAG_ADD) -DDEBUG

CFLAGS_cyttsp4_core.o           -= $(CY_CFLAG_REMOVE)
CFLAGS_cyttsp4_i2c.o            -= $(CY_CFLAG_REMOVE)
CFLAGS_cyttsp4_spi.o            -= $(CY_CFLAG_REMOVE)
CFLAGS_cyttsp4_mta.o            -= $(CY_CFLAG_REMOVE)
CFLAGS_cyttsp4_mtb.o            -= $(CY_CFLAG_REMOVE)
CFLAGS_cyttsp4_mt_a.o           -= $(CY_CFLAG_REMOVE)
CFLAGS_cyttsp4_mt_b.o           -= $(CY_CFLAG_REMOVE)
CFLAGS_cyttsp4_mt_common.o      -= $(CY_CFLAG_REMOVE)
CFLAGS_cyttsp4_btn.o            -= $(CY_CFLAG_REMOVE)
CFLAGS_cyttsp4_proximity.o      -= $(CY_CFLAG_REMOVE)
CFLAGS_cyttsp4_samsung_sysfs.o  -= $(CY_CFLAG_REMOVE)
CFLAGS_cyttsp4_device_access.o  -= $(CY_CFLAG_REMOVE)
CFLAGS_cyttsp4_test_device_access_api.o -= $(CY_CFLAG_REMOVE)
CFLAGS_cyttsp4_loader.o         -= $(CY_CFLAG_REMOVE)
CFLAGS_cyttsp4_debug.o          -= $(CY_CFLAG_REMOVE)
CFLAGS_cyttsp4_devtree.o        -= $(CY_CFLAG_REMOVE)
CFLAGS_cyttsp4_platform.o       -= $(CY_CFLAG_REMOVE)

我得到的错误是:

/home/USER/Projects/OS/android_kernel_samsung_msm8974/drivers/gpu/gpu_sysfs/Kbuild:29: **** Make sure target file is defined. Check the TARGET and GPU configs in Makefile and Kernel Config. Module won't work without target file. ****
/home/USER/Projects/OS/android_kernel_samsung_msm8974/drivers/input/touchscreen/cyttsp4/Makefile:50: *** missing separator.  Stop.
scripts/Makefile.clean:94: recipe for target 'drivers/input/touchscreen/cyttsp4' failed
make[3]: *** [drivers/input/touchscreen/cyttsp4] Error 2
scripts/Makefile.clean:94: recipe for target 'drivers/input/touchscreen' failed
make[2]: *** [drivers/input/touchscreen] Error 2
scripts/Makefile.clean:94: recipe for target 'drivers/input' failed
make[1]: *** [drivers/input] Error 2
Makefile:1201: recipe for target '_clean_drivers' failed
make: *** [_clean_drivers] Error 2

【问题讨论】:

第一次听说 Make 中的 -= 运算符。并且找不到任何支持它的证据。 我不太习惯 Makefiles,我通常使用 CMake 生成它们并且不手动编辑它们所以看到 += 让我觉得 -= 也存在,但你是对的,我也找不到。我通过用 $(filter-out, $(CY_CFLAG_REMOVE),$(CFLAGS_cyttsp_thing.o)) 替换所有 -= 条目来修复它,现在似乎可以正常工作,奇怪的是制作 Cyttsp4 驱动程序的人甚至会犯错误那... 当您的解决方案有效时,您可以考虑提供一个答案。如果其他人找到更好的解决方案(例如 make 的修补版本),那将只是另一个答案。 好主意,一旦我开始工作就太兴奋了,多亏了你,我编译了内核,现在我已经成功地在三星 S4 i9506 上移植了 90% 功能的 Android 版 Nethunter OS: ) 我会在几分钟内回答这个问题,使用我的 S4 作为键盘和鼠标:D 【参考方案1】:

这是(部分)使用我的 S4 i9506 作为键盘编写的,如果您希望 Nethunter 在您的 S4 上发表您的兴趣,并开始编写自己移植它的指南。无论如何,我很快就会制作一个,但如果人们有兴趣,我会更加努力地制作一个更快地移植 Nethunter 的指南。

基本上,正如@Tsyvarev 所述,Makefile 中没有 -= 命令。基本上,为 Cyttsp4 制作 Makefile 的人(至少在我拥有的内核源代码中)并没有做得很好,经过一些研究,他们可能像我一样认为分隔符丢失错误是由于某个地方缺少每个人的选项卡建议您搜索此问题时。使用@Tsyvarev 的关于 -= not existing 的信息进行快速搜索,我找到了做他们想做的事情的正确方法。这是经过适当修改的完整 Makefile。您使用 $(filter-out, VARS_TO_REMOVE, RESULT) 来删除标志。

这个错误太愚蠢了,考虑到它是在内核的源代码中发现的,我不知道它是如何产生的,而且制作内核的人通常不会这么不熟练,否则他们不会'不是在做内核。

等一下……我出错了,我……哦……

无论如何,这是代码!

### CYTTSP
#obj-m  += cyttsp4.o
obj-$(CONFIG_TOUCHSCREEN_CYPRESS_CYTTSP4) += cyttsp4_core.o
obj-$(CONFIG_TOUCHSCREEN_CYPRESS_CYTTSP4) += cyttsp4_i2c.o
obj-$(CONFIG_TOUCHSCREEN_CYPRESS_CYTTSP4) += cyttsp4_platform.o
obj-$(CONFIG_TOUCHSCREEN_CYPRESS_CYTTSP4) += cyttsp4_devtree.o
obj-$(CONFIG_TOUCHSCREEN_CYPRESS_CYTTSP4) += cyttsp4_mt_common.o
obj-$(CONFIG_TOUCHSCREEN_CYPRESS_CYTTSP4) += cyttsp4_mtb.o
obj-$(CONFIG_TOUCHSCREEN_CYPRESS_CYTTSP4) += cyttsp4_btn.o
obj-$(CONFIG_TOUCHSCREEN_CYPRESS_CYTTSP4) += cyttsp4_debug.o
obj-$(CONFIG_TOUCHSCREEN_CYPRESS_CYTTSP4) += cyttsp4_device_access.o
obj-$(CONFIG_TOUCHSCREEN_CYPRESS_CYTTSP4) += cyttsp4_loader.o
obj-$(CONFIG_TOUCHSCREEN_CYPRESS_CYTTSP4) += cyttsp4_samsung_sysfs.o

CY_CFLAG_ADD =\
    -DCONFIG_TOUCHSCREEN_CYPRESS_CYTTSP4\
    -DCONFIG_TOUCHSCREEN_CYPRESS_CYTTSP4_DEVICETREE_SUPPORT\
    -DCONFIG_TOUCHSCREEN_CYPRESS_CYTTSP4_BUTTON\
    -DCONFIG_TOUCHSCREEN_CYPRESS_CYTTSP4_DEVICE_ACCESS\
    -DCONFIG_TOUCHSCREEN_CYPRESS_CYTTSP4_LOADER\
    -DCONFIG_TOUCHSCREEN_CYPRESS_CYTTSP4_PLATFORM_FW_UPGRADE\
    -DCONFIG_TOUCHSCREEN_CYPRESS_CYTTSP4_BINARY_FW_UPGRADE

CY_CFLAG_REMOVE =\
    -DCYTTSP4_PDATA_IN_PLATFORM_C\
    -DCONFIG_TOUCHSCREEN_CYPRESS_CYTTSP4_PROXIMITY\
    -DCONFIG_TOUCHSCREEN_CYPRESS_CYTTSP4_PLATFORM_TTCONFIG_UPGRADE\
    -DCONFIG_TOUCHSCREEN_CYPRESS_CYTTSP4_DEVICE_ACCESS_API\
    -DCONFIG_TOUCHSCREEN_CYPRESS_CYTTSP4_DEBUG\
    -DCONFIG_TOUCHSCREEN_CYPRESS_CYTTSP4_MANUAL_TTCONFIG_UPGRADE

CFLAGS_cyttsp4_core.o           += $(CY_CFLAG_ADD) -DDEBUG
CFLAGS_cyttsp4_i2c.o            += $(CY_CFLAG_ADD) -DDEBUG
CFLAGS_cyttsp4_spi.o            += $(CY_CFLAG_ADD)
CFLAGS_cyttsp4_mta.o            += $(CY_CFLAG_ADD)
CFLAGS_cyttsp4_mtb.o            += $(CY_CFLAG_ADD)
CFLAGS_cyttsp4_mt_a.o           += $(CY_CFLAG_ADD)
CFLAGS_cyttsp4_mt_b.o           += $(CY_CFLAG_ADD)
CFLAGS_cyttsp4_mt_common.o      += $(CY_CFLAG_ADD)
CFLAGS_cyttsp4_btn.o            += $(CY_CFLAG_ADD)
CFLAGS_cyttsp4_proximity.o      += $(CY_CFLAG_ADD)
CFLAGS_cyttsp4_samsung_sysfs.o  += $(CY_CFLAG_ADD)
CFLAGS_cyttsp4_device_access.o  += $(CY_CFLAG_ADD)
CFLAGS_cyttsp4_test_device_access_api.o += $(CY_CFLAG_ADD)
CFLAGS_cyttsp4_loader.o         += $(CY_CFLAG_ADD)
CFLAGS_cyttsp4_debug.o          += $(CY_CFLAG_ADD)
CFLAGS_cyttsp4_devtree.o        += $(CY_CFLAG_ADD) -DDEBUG
CFLAGS_cyttsp4_platform.o       += $(CY_CFLAG_ADD) -DDEBUG

CFLAGS_cyttsp4_core.o           := $(filter-out $(CY_CFLAG_REMOVE),$(CFLAGS_cyttsp4_core.o))
CFLAGS_cyttsp4_i2c.o            := $(filter-out $(CY_CFLAG_REMOVE),$(CFLAGS_cyttsp4_i2c.o))
CFLAGS_cyttsp4_spi.o            := $(filter-out $(CY_CFLAG_REMOVE),$(CFLAGS_cyttsp4_spi.o))
CFLAGS_cyttsp4_mta.o            := $(filter-out $(CY_CFLAG_REMOVE),$(CFLAGS_cyttsp4_mta.o))
CFLAGS_cyttsp4_mtb.o            := $(filter-out $(CY_CFLAG_REMOVE),$(CFLAGS_cyttsp4_mtb.o))
CFLAGS_cyttsp4_mt_a.o           := $(filter-out $(CY_CFLAG_REMOVE),$(CFLAGS_cyttsp4_mt_a.o))
CFLAGS_cyttsp4_mt_b.o           := $(filter-out $(CY_CFLAG_REMOVE),$(CFLAGS_cyttsp4_mt_b.o))
CFLAGS_cyttsp4_mt_common.o      := $(filter-out $(CY_CFLAG_REMOVE),$(CFLAGS_cyttsp4_mt_common.o))
CFLAGS_cyttsp4_btn.o            := $(filter-out $(CY_CFLAG_REMOVE),$(CFLAGS_cyttsp4_btn.o))
CFLAGS_cyttsp4_proximity.o      := $(filter-out $(CY_CFLAG_REMOVE),$(CFLAGS_cyttsp4_proximity.o))
CFLAGS_cyttsp4_samsung_sysfs.o      := $(filter-out $(CY_CFLAG_REMOVE),$(CFLAGS_cyttsp4_samsung_sysfs.o))
CFLAGS_cyttsp4_device_access.o      := $(filter-out $(CY_CFLAG_REMOVE),$(CFLAGS_cyttsp4_device_access.o))
CFLAGS_cyttsp4_test_device_access_api.o     := $(filter-out $(CY_CFLAG_REMOVE),$(CFLAGS_cyttsp4_test_device_access_api.o))
CFLAGS_cyttsp4_loader.o         := $(filter-out $(CY_CFLAG_REMOVE),$(CFLAGS_cyttsp4_loader.o))
CFLAGS_cyttsp4_debug.o          := $(filter-out $(CY_CFLAG_REMOVE),$(CFLAGS_cyttsp4_debug.o))
CFLAGS_cyttsp4_devtree.o        := $(filter-out $(CY_CFLAG_REMOVE),$(CFLAGS_cyttsp4_devtree.o))
CFLAGS_cyttsp4_platform.o       := $(filter-out $(CY_CFLAG_REMOVE),$(CFLAGS_cyttsp4_platform.o))

【讨论】:

以上是关于linux 中的makefile的主要内容,如果未能解决你的问题,请参考以下文章

MakefileMakefile 中 LINUXINCLUDE 的作用

MakefileMakefile 中 LINUXINCLUDE 的作用

MakefileMakefile 中 LINUXINCLUDE 的作用

makefile

Linux makefile的基本使用

Linux makefile的基本使用