zoukankan      html  css  js  c++  java
  • 关于linux模块驱动简单的Makefile

    ( 转)嵌入式Linux驱动开发笔记
    Linux驱动一般以模块module的形式来加载,首先需要把驱动编译成模块的形式。简单的例子,
    Begin of hello.c file
    #include <linux/init.h>
    #include
    <linux/kernel.h>
    #include
    <linux/module.h>

    static int __init test_init(void)
    {
    printk(
    "init module\n");

    return 0;
    }
    static void __exit test_exit(void)
    {
    printk(
    "exit modules\n");
    }

    module_init(test_init);
    module_exit(test_exit);
      Over of hello.c file
      Makefile为,
        PWD = $(shell pwd)
        KERNEL_SRC
        = /usr/src/linux-source-2.6.15/

        obj
        -m := test.o
        module
        -objs := test.o

        all:
        $(MAKE)
        -C $(KERNEL_SRC) M=$(PWD) modules


        clean:
        rm
        *.ko
        rm
        *.o
      在test.c和Makefile所在的目录下运行make,如果看到类似输出
      make -C /usr/src/linux-source-2.6.15/ M=/home/vmeth modules

      make[
      1]: Entering directory `/usr/src/linux-source-2.6.15'
      CC [M] /home/vmeth/hello.o
      Building modules, stage
      2.
      MODPOST
      CC
      /home/vmeth/hello.mod.o
      LD [M]
      /home/vmeth/hello.ko
      make[
      1]: Leaving directory `/usr/src/linux-source-2.6.15'
      一般用下面的Makefile
      # Makefile2.6
      ifneq ($(KERNELRELEASE),)
      #kbuild syntax. dependency relationshsip of files and target modules are listed here.

      mymodule
      -objs := hello.o
      obj
      -m := hello.o

      else
      PWD :
      = $(shell pwd)

      KVER
      ?= $(shell uname -r)
      KDIR :
      = /lib/modules/$(KVER)/build #KDIR目录其实是链接到上面那个Makefile中的那个
      /usr/src/linux-source-2.6.15/*
      all:
      $(MAKE) -C $(KDIR) M=$(PWD)

      clean:
      rm -rf .*.cmd *.o *.mod.c *.ko .tmp_versions

      endif
      KERNELRELEASE 是在内核源码的顶层Makefile中定义的一个变量,在第一次读取执行此Makefile时,KERNELRELEASE没有被定义,所以make将读取执行else之后的内容。
      当make的目标为all时,-C $(KDIR) 指明跳转到内核源码目录下读取那里的Makefile;M=$(PWD) 表明然后返回到当前目录继续读入、执行当前的Makefile。
      当从内核源码目录返回时,KERNELRELEASE已被被定义,kbuild也被启动去解析kbuild语法的语句,make将继续读取else之前的内容。else之前的内容为kbuild语法的语句, 指明模块源码中各文件的依赖关系,以及要生成的目标模块名。
      每个内核的名字都包含了它的版本号,这也是 uname -r 命令显示的值。
      关于报以下错误的解决方法:
      Makefile:1: *** 遗漏分隔符
      这个有多种情况:
      1,命令前要加tab键
      2,可能标点符号输成中文形的了
      3,比如上面那个文件:ifneq后面要加个空格
      转自:http://blog.csdn.net/lufeiop02/archive/2011/05/26/6446343.aspx
    1. 相关阅读:
      AIMS 2013中的性能报告工具不能运行的解决办法
      读懂AIMS 2013中的性能分析报告
      在线研讨会网络视频讲座 方案设计利器Autodesk Infrastructure Modeler 2013
      Using New Profiling API to Analyze Performance of AIMS 2013
      Map 3D 2013 新功能和新API WebCast视频下载
      为Autodesk Infrastructure Map Server(AIMS) Mobile Viewer创建自定义控件
      ADN新开了云计算Cloud和移动计算Mobile相关技术的博客
      JavaScript修改css样式style
      文本编辑神器awk
      jquery 开发总结1
    2. 原文地址:https://www.cnblogs.com/hnrainll/p/2081136.html
    Copyright © 2011-2022 走看看