pdjlzs / dezhoukv-cpp

DezhouKV的C++版本实现(C++ implementation of DezhouKV database)

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

这是一个基于automake/autoconf的Makefile模板

如果你希望使用该模板,需要做以下事情:

Quick Start:
	svn co http://cvs.so.sohu.com:2080/svn/arch/trunk/Projects/MakefileDemo/ MDemo
	cd YourPackageDir
	../MDemo/applytpl projectname 1.0 yourmail@sohu-rd.com 'a.cpp b.cpp c.cpp k.h z.h'
	make



0.  假定你的项目叫做foo,项目根目录的位置是/foo

1.  使用applytpl脚本 或者 手工执行以下操作
1.1 拷贝MakefileDemo下的所有文件到/foo
    必须的有:configure.ac acsite.m4 common.mk到项目根目录
        demo/Makefile.am到项目的各个子目录(没有子目录的项目则是项目根目录)
        Makefile.am到项目的顶层目录(多目录的项目)

1.2	把MakefileDemo/demo/Makefile.am拷贝到项目的每个子目录,如果项目不分子目录那就直
	接放到项目的根目录下。

2.1 在Makefile.am中指定要BUILD的目标
	include...                            #不要动  
    bin_PROGRAMS=prog1 prog2              #需Build的可执行程序
    noinst_LIBRARIES=libfoo3.a libfoo4.a  #需Build的的静态库,必须是lib*.a
	---高级内容---
    lib_LTLIBRARIES=libfoo1.la libfoo2.la #需Build的的动态库,必须是lib*.la
    check_PROGRAMS=test1 test2            #make check时需Build的的测试程序
    TESTS=test1 test2                     #make check时运行的测试程序
    XFAIL_TESTS=test2                     #TESTS=中应该fail的那些
    
2.2 为每个需要编译的目标列出源文件和需要的库
    demo_SOURCES=demo.cpp stdafx.cpp stdafx.h 
    demo_LDADD=libfoo2.la -lace
    libfoo2_la_SOURCES=demo.cpp stdafx.cpp stdafx.h 
    最后一个"_"下划线前面是可执行程序或者库的名字,注意,libdemo2.a中的"."被换成"_"
    _SOURCES列出了所有相关的源文件和头文件,不用关心其它子目录的内容
    _LDADDS列出了需要link的库文件,可以用-l和直接写出库文件名两种方法

2.---高级内容---   
2.3 预编译头文件[可选]
    如果你喜欢vc的预编译头文件
    在Makefile.am中
		include $(top_srcdir)/util-gch-dbg.mk
		BUILT_SOURCES+=stdafx.gch
	并使用stdafx.h作为预编译头文件
        
2.4 分离调试信息[可选]
    如果你喜欢把庞大的debug info从执行程序动态库里去掉
    在Makefile.am中
		include $(top_srcdir)/util-gch-dbg.mk
    	bindbg_DATA=xxx.dbg
		libdbg_DATA=libyyy.so.dbg libzzz.la.dbg

3.  在项目根目录的Makefile.am的SUBDIRS=这一句列出你所有需要build的子目,如
    果这些子目录有依赖关系,请按照需要的顺序排列它们。嵌套的多级子目录依例
	办理。例:SUBDIRS=foo_lib1 foo_src

4.  修改configure.ac,在最后的AC_CONFIG_FILES列出所有需要build子目录的Makefile
    例如
    AC_CONFIG_FILES([Makefile foo_lib1/Makefile for_src/Makefile])
    修改configure.ac的最前面的AC_INIT,依次列出项目名字、版本、联系人、简称
    例如:  AC_INIT(Kirby Demo, 0.1.0, kirbyzhou@sohu-rd.com, kdemo)
    
    如果有必要,可以删掉或者添加AC_CONFIG_FILES前面的AK_DETECT_LIB2
    这些内容用来检测程序依赖的ACE MySQL DB4 SQLITE等库
    
    
5.  使用
    ./pre-build       执行autoreconf和./configure来准备Makefile
    make              Build所有代码
    make DEBUG=y      Build所有代码,强制带上调试信息,并禁止优化
	make OPTIMIZE=y   Build所有代码,强制优化
    make PROFILE=y    Build所有代码,并开启gprof性能分析功能
    make check        Build check_PROGRAMS里列出的所有测试程序,并运行测试程序
    make install      安装bin_PROGRAMS和lib_LTLIBRARIES到configure --prefix指定的路径
                      默认是/opt/demo
    make dist         把所有的源码、Makefile等等等等打包
    make clean        恢复到执行make以前的状态
    make distclean    恢复到执行./configure以前的状态

    autoreconf -isv   从Makefile.am和configure.ac生成configure
    ./configure       检测环境配置,准备Makefile
	configure的参数
	    --[enable/disable]-debug            是否打开调试信息[-g],默认允许
		--[enable/disable]-optimize         enbale=-O3优化 disable=-O0
		--[enbale/disable]-profile          是否允许profile

6. 附录
	宏AK_DETECT_LIB2                   用于检测第三方软件包ACE db4等等
	AK_DETECT_LIB2(软件包的名字, 在哪些路径里搜索, 
		1个标志性的头文件, 
		若干标志性的库名[会依次检测这些库是否存在, 例如db-4.3 db-4.2 第一个满足要求的库被记录下来], 
		在头文件和库中可以找到的一个标志性函数, 第三方软件包是否必须[required表示必须], 
		-I的时候在软件包路径后面附加的部分
			[例如软件包放在/opt/mysql下,但是必须-I/opt/mysql/include,此时此项填include]
		-L的时候在软件包路径后面附加的部分
			[例如软件包放在/opt/ACE_Wrapper下,但是必须-L/opt/ACE_Wrapper/lib,此时此项填lib])
	e.g:
	AK_DETECT_LIB2(ace551, [/usr/local/src/ACE* /usr/local/ACE* /opt/ACE*],
		[ace/ACE.h], [ACE ACE551], [ACE::init],
		[optional], [.], [lib])
	检测成功后会修改CPPFLAGS和LIBS,加入对应的-I和-L选项
	并把ace551_LDADD设置为-lACE或者-lACE551,在Makefile.am中可以用@ace551_LDADD@来引用。
	目前主要是在使用berkerly db时用到这一特性,因为不同版本的bdb的库名不一样[db-4.4 db-4.3 db-4.2]

	宏AK_CHECK_MODULE_ROOT             用于检测我们自己的软件包
	AK_CHECK_MODULE_ROOT(varname, description, defaultpostion, includepath-suffix, libpath-suffix)
	其中includepath-suffix和libpath-suffix的含义参见AK_DETECT_LIB2
	e.g:
	AK_CHECK_MODULE_ROOT(SSPLATFORM_ROOT, [the basic platform module], ssplatform, [], [Library/Linux]
	要求用户在执行configure时必须给出SSPLATFORM_ROOT的值或者存在ssplatform目录或者存在ssplatform.default目录
	例如:./configure SSPLATFORM_ROOT=~/ssplatform
	检测成功后会把SSPLATFORM_ROOT的值追加到变量MODULE_ROOT_VALUES中,把SSPLATFORM_ROOT这个变量名追加到MODULE_ROOT_VARS中
	

	宏AK_CHECK_BUILD_DEPENDENCIES      用于决定是否递归编译依赖的模块
	AK_CHECK_BUILD_DEPENDENCIES(default-value, dependencies)
	e.g:
	AK_CHECK_BUILD_DEPENDENCIES([yes], [$MODULE_ROOT_VALUES])
	这个宏配合Makefile.am中的特定语句工作,用于决定make时是否递归到dependencies指定的目录
	dependencies一般取值为$MODULE_ROOT_VALUES,也就是由AK_CHECK_MODULE_ROOT决定的一系列模块
	Makefile.am中应该有如下语句:
		SUBDIRS=@PACKAGE_DEPENDENCIES@ ...
		export @MODULE_ROOT_VARS@
		export BUILD_DEPENDENCIES
	注意:最上层的configure会默认BUILD_DEPENDENCIES=yes,编译自己的依赖项。并同时阻止依赖项递归编译2级依赖项

	宏AK_STD_FEATURES                  为configure添加debug optimize profile三个feature


About

DezhouKV的C++版本实现(C++ implementation of DezhouKV database)

License:MIT License


Languages

Language:Roff 59.9%Language:Shell 25.6%Language:Makefile 10.2%Language:C++ 3.0%Language:M4 1.3%Language:C 0.0%