一、添加“模块目录。
(1) 在Modules目录下新建MyModules子目录,加入“模块源代码”mymdule1.c
(2) 添加Modules.am文件
SOURCES_mymodule1 = mymodule1.c
libvlc_LTLIBRARIES += \
$(NULL)
(3) 修改Modules/Makefile.am文件,添加MyModules子目录
BASE_SUBDIRS = \
....
MyModules
(4) 修改根目录下的configure.ac文件,添加模块,支持编译
dnl
dnlmymodules
dnl
VLC_ADD_PLUGIN([mymodule1])
(4) 运行./bootstrap
./configure**.sh (自己定义的configure文件)
二、添加“模块”
例如:在Demux目录下添加MyModule1模块
(1) 修改Demux目录下的Modules.am文件,增加1行
SOURCES_mymodule1 = mymodule1.c
(2) 复制MyModule1.c到Demux目录
(3) 修改根目录下的configure.ac文件,添加模块,支持编译
dnl
dnlmymodules
dnl
VLC_ADD_PLUGIN([mymodule1])
(4) 运行./bootstrap
./configure**.sh (自己定义的configure文件)
附:MyModule1.c源代码:
#ifdef HAVE_CONFIG_H
# include "config.h"
#endif
#include <vlc_common.h>
#include <vlc_plugin.h>
/*****************************************************************************
* Local prototypes.
*****************************************************************************/
static intOpen ( vlc_object_t * )
static void Close( vlc_object_t * )
/*****************************************************************************
* Module descriptor
*****************************************************************************/
vlc_module_begin()
add_shortcut( "testmodule" )
set_description("testmodle plug-in")
set_callbacks( Open, Close )
set_capability( "testing", 0 )
set_category( CAT_INPUT )
vlc_module_end ()
/*****************************************************************************
* Open: initialize interface
*****************************************************************************/
static int Open( vlc_object_t *p_this )
{
msg_Dbg(p_this,"Using test module...\n")
return VLC_SUCCESS
}
/*****************************************************************************
* Close: destroy interface
*****************************************************************************/
static void Close( vlc_object_t *p_this )
{
msg_Dbg(p_this,"Close test module!\n")
}
假设我们要在内核源代码 drivers 目录下如下用于 test driver 的树型目录:|----test
|---- cpu
|---- cpu.c
|---- test.c
|---- test_client.c
|---- test_ioctl.c
|---- test_proc.c
|---- test_queue.c
在内核中增加目录和子目录,我们需为相应的新增目录创建 Kconfig 和 Makefile 文件,而新增目录的父目录中的 Kconfig 和 Makefile 文件也需要修改,以便新增的 Kconfig 和 Makefile 文件能被引用.
在新增的 test 目录下,应包含如下 Kconfig 文件:
#
# TEST driver configuration
#
menu "Test Driver "
comment "Test Driver"
config TEST
bool "TEST suport"
config TEST_USER
tristate "TEST user-space interface"
depends on TEST
endmenu
由于 TEST driver 对于内核来说是新的功能,所以首先需要创建一个菜单 TEST Driver 然后显示 "TEST support " ,等待用户选择接下来判断用户是否选择了 TEST Driver ,如果是 (CONFIG_TEST=y),则进一步显示子功能:用户接口与CPU功能支持由于用户接口功能可以被编译成内核模块,所以这里的询问语句使用了 tristate.
为了使这个 Kconfig 文件能起作用,需要修改 drivers/Kconfig 文件,增加以下内容:
source "drivers/test/Kconfig"
脚本中的 source 意味着引用新的 Kconfig 文件.在新增的 test 目录下,应该包含如下 Makefile 文件:
#drivers/test/Makefile
#
#Makefile for the TEST
#
obj-$(CONFIG_TEST) += test.o test_queue.o test_client.o
obj-$(CONFIG_TEST_USER) += test_ioctl.o
obj-$(CONFIG_PROC_FS) += test_proc.o
obj-$(CONFIG_TEST_CPU) += cpu/
该脚本根据配置变量的取值构建 obj-* 列表.由于 test 目录中包含一个子目录 cpu ,当CONFIG_TEST_CPU=y 时,需要将 cpu 目录加入列表.
test 目录中的 cpu 目录也需包含如下的 Makefile 文件:
# drivers/test/cpu/Makefile
#
# Makefile for the TEST cpu
#
obj-$(CONFIG_TEST_CPU) += cpu.o
为了使得整个 test 目录能够被编译命令作用到, test 目录父目录中的 Makefile 文件也需新增如下脚本:
obj-$(CONFIG_TEST) += test/
增加了 Kconfig 和 Makefile 文件之后的新的 test 树型目录如下所示:
|----test
|---- cpu
|---- cpu.c
|---- Makefile
|---- test.c
|---- test_client.c
|---- test_ioctl.c
|---- test_proc.c
|---- test_queue.c
|---- Makefile
|---- Kconfig
这样整个工作就算完成了
Linux Kconfig及Makefile学习 (2011-03-01 09:40)
内核源码树的目录下都有两个文档Kconfig(2.4版本是Config.in)和Makefile。分布到各目录的Kconfig构成了一个分布式的内核配置数据库,每个Kconfig分别描述了所属目录源文档相关的内核配置菜单。在内核配置makemenuconfig时,从Kconfig中读出菜单,用户选择后保存到.config的内核配置文档中。在内核编译时,主Makefile调用这个.config,就知道了用户的选择。
1.模块化编程是指将一个庞大的程序划分为若干个功能独立的模块,对各个模块进行独立开发,然后再将这些模块统一合并为一个完整的程序。这是C语言面向过程的编程方法,可以缩短开发周期,提高程序的可读性和可维护性。2.在单片机程序里,程序比较小或者功能比较简单的时候,我们不需要采用模块化编程,但是,当程序功能复杂、涉及的资源较多的时候,模块化编程就能体现它的优越性了。如前面我们写过的HT1380驱动程序、独立按键扫描程序和12864程序,每一个程序都是只用一个源文件编写就能完成,但是,当您制作一个12864液晶日历的时候,需要用到HT1380驱动程序、独立按键扫描程序和12864显示程序,如果把这三个程序全部集中在一个源文件里,将导致主体程序臃肿且杂乱,这样做并非不可取,只是降低了程序可读性、可维护性和代码的重用率。如果把这三个程序当做三个独立的模块放到你的主体工程进行模块化编程,效果就不一样了。实际上,模块化编程就是模块合并的过程,就是建立每个模块的头文件和源文件并将其加入到主体程序的过程。主体程序调用模块的函数是通过包含模块的头文件来实现,模块的头文件和源文件是模块密不可分的两个部分,缺一不可。所以,模块化编程必须提供每个模块的头文件和源文件。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)