• 自动生成项目的Makefile文件


    自动生成项目的Makefile文件

    理论基础

    跟我一起写 Makefile:   http://bbs.chinaunix.net/forum.php?mod=viewthread&tid=408225

    例解 autoconf 和 automake 生成 Makefile 文件:   http://www.ibm.com/developerworks/cn/linux/l-makefile/index.html

    步骤

    1. 写好Makefile.am
    2. 运行 autoscan , 自动创建两个文件: autoscan.log configure.scan
    3. configure.scan 命名为configure.ac,修改某些内容,具体怎么修改后面再讲
    4. 运行aclocal,生成一个“aclocal.m4”文件和一个缓冲文件夹autom4te.cache,该文件主要处理本地的宏定义
    5. 运行 autoconf,目的是生成 configure
    6. 运行 autoheader,它负责生成config.h.in文件。该工具通常会从“acconfig.h”文件中复制用户附加的符号定义
    7. 运行automake,生成Makefile.in
    8. 运行configure,通过运行自动配置设置文件configure,把Makefile.in变成了最终的Makefile

    注意到,在前面介绍的步骤中,只有两处需要对文件内容进行修改:Makefile.amconfigure.ac

    编写Makefile.am

    假如安装目录如下:

    .
    
    ├── echo_server # 打包生成动态链接库(so文件) 
    
    ├── etc # 配置文件
    
    ├── script # 启动、停止等脚本文件
    
    ├── src # 源文件
    
    └── tools # 工具文件
    

       

    主目录的Makefile.am

    # Process this file with automake to produce Makefile.in
    
     
    
    SUBDIRS = etc src script tools echo_server
    
    DIST_SUBDIRS = etc src script tools echo_server
    

     

    etc目录的Makefile.am

    # Makefile.am不能有空格,必须是tab才行,这个Makefile.am主要作用是把framework.json这个配置文件安装到相应的目录中
    
     
    
    # Process this file with automake to produce Makefile.in
    
     
    
    DEFAULT_CONFIG_DIR = $(sysconfdir)
    
     
    
    # more configs can be separated by a space
    
    DEFAULT_GLB_CONFIG_DIR = $(sysconfdir)/glb
    
    FRAMEWORK_CONFS = framework.json
    
     
    
    install-data-local: 
    
    @if test ! -d $(DESTDIR)$(DEFAULT_CONFIG_DIR); then 
    
    $(mkinstalldirs) $(DESTDIR)$(DEFAULT_CONFIG_DIR); 
    
    fi
    
    @if test ! -d $(DESTDIR)$(DEFAULT_GLB_CONFIG_DIR); then 
    
    $(mkinstalldirs) $(DESTDIR)$(DEFAULT_GLB_CONFIG_DIR); 
    
    fi
    
    $(INSTALL_DATA) $(srcdir)/$(FRAMEWORK_CONFS) $(DESTDIR)$(DEFAULT_GLB_CONFIG_DIR)/$(FRAMEWORK_CONFS);
    

      

    echo_server目录的Makefile.am

    # Process this file with automake to produce Makefile.in
    
     
    
    CXX = g++ -std=c++0x
    
    LIBS = -ljsoncpp -lrt -lpthread -levent  # 依赖的库
    
     
    
    lib_LTLIBRARIES = libecho_server.la # 动态链接库名称
    
     
    
    libecho_server_la_SOURCES =  # 生成动态链接库的源文件
    
    echo.cc
    
     
    
    libecho_server_la_LIBADD =  # 依赖于src/libframework_tool.so
    
    $(top_srcdir)/src/libframework_tool.la
    
     
    
    # $(top_srcdir)实际就是主目录
    
    # $(prefix)这个是从./configure --prefix=/home/yjr/framework中传进来
    
     
    
    AM_CPPFLAGS = 
    
    -I$(prefix)/modules/include 
    
    -I$(top_srcdir)/src
    
     
    
    AM_CXXFLAGS = -Wall -Wextra -pedantic
    
    AM_LDFLAGS =  # 安装目录
    
    -L$(prefix)/modules/lib  # 动态链接库将会安装到$(prefix)/modules/lib
    
    -I$(top_srcdir)/src # 依赖的源文件
    
     
    
    clean-local: # 执行make clean时,执行的命令
    
    $(RM) -r genpy # 执行make clean时,删除genpy这个目录
    

     

    srcMakefile.am

    # Process this file with automake to produce Makefile.in
    
     
    
    CXX = g++ -std=c++0x
    
    LIBS = -ljsoncpp -lpthread -levent -DUSE_JEMALLOC -ljemalloc -ldl -L$(prefix)/modules/lib -I$(prefix)/modules/include # 依赖的库
    
     
    
    lib_LTLIBRARIES = libframework_tool.la # 生成动态链接库
    
    libframework_tool_la_SOURCES = 
    
    logging/debug.cc 
    
    base/CUtil.cc 
    
    config/config_module.cc
    
    libframework_tool_la_LIBADD = 
    
    $(prefix)/modules/lib/libevent.la
    
        
    
    noinst_LTLIBRARIES = libdfrpcif.la # 生成库,但无需安装
    
    nodist_libdfrpcif_la_SOURCES = 
    
    protocol/rpc_handler.cc 
    
    protocol/rpc_types.cc 
    
    base/set_proc_title.c
    
    libdfrpcif_la_LIBADD = 
    
    $(prefix)/modules/lib/libevent.la
    
     
    
    sbin_PROGRAMS = framework framework_gdb # 生成两个bin文件,如果生成一个,则把其中一个去掉即可
    
    framework_SOURCES =  # 第一个bin文件,主文件
    
    main.cc
    
    framework_LDADD =  # 依赖的第三方库
    
    -lboost_system -lboost_filesystem -ldl -L$(prefix)/modules/lib
    
    libdfrpcif.la 
    
    libframework_tool.la
    
     
    
    framework_gdb_SOURCES =  # 第二个bin文件
    
    main.cc
    
    framework_gdb_LDADD = 
    
    -lboost_system -lboost_filesystem -ldl -L$(prefix)/modules/lib
    
    libdfrpcif.la 
    
    libframework_tool.la
    
    framework_gdb_LDFLAGS = -g -Ddebug
    
     
    
     
    
    include_HEADERS =  # 需要安装的头文件
    
    framework.h
    
     
    
    base_includedir = $(includedir)/base # 需要安装的头文件
    
    base_include_HEADERS = 
    
    base/CUtil.h
    
     
    
    config_includedir = $(includedir)/config # 需要安装的头文件
    
    config_include_HEADERS = 
    
    config/config_module.h
    
     
    
    logging_includedir = $(includedir)/logging # 需要安装的头文件
    
    logging_include_HEADERS = 
    
    logging/debug.h
    
     
    
    AM_CPPFLAGS = 
    
    $(BOOST_CPPFLAGS) 
    
    $(LIBEVENT_CPPFLAGS) 
    
    -I$(top_srcdir)/src 
    
    -I$(top_srcdir)/src/base 
    
    -I$(top_srcdir)/src/config 
    
    -I$(top_srcdir)/src/debug 
    
    -I$(top_srcdir)/src/protocol 
    
    -I$(prefix)/modules/include
    
    AM_CXXFLAGS = -Wall -Wextra -pedantic
    
    AM_LDFLAGS = $(BOOST_LDFLAGS) $(LIBEVENT_LDFLAGS)
    
     
    
    clean-local:
    
    $(RM) -r protocol/cpp
    
     
    
    install-exec-hook: # 安装可执行文件
    
    $(INSTALL) $(top_srcdir)/script/start_server.sh $(DESTDIR)$(sbindir)/start_server.sh
    
    $(INSTALL) $(top_srcdir)/script/stop_server.sh $(DESTDIR)$(sbindir)/stop_server.sh
    

     

    其它的就不再细说

    编写configure.ac

    AC_INIT([df_framework], [1.0], [http://www.yejinru.com])
    
    AC_CONFIG_SRCDIR([src/main.cc])     # main函数文件
    
    AC_CONFIG_HEADERS([config.h])
    
    AM_INIT_AUTOMAKE([-Wall -Werror foreign])
    
    AC_PROG_LIBTOOL
    
     
    
    AC_CONFIG_FILES([Makefile # 包含有Makefile文件的目录
    
                     etc/Makefile
    
                     src/Makefile
    
                     script/Makefile
    
                     tools/Makefile])
    

    除了前面修改的内容以外,还可以增加第三方库的安装检查。比如判断boost_filesystem是否已经安装,可在configure.ac中增加:

    # FIXME: Replace `main' with a function in `-lboost_filesystem':
    
    AC_CHECK_LIB([boost_filesystem], [main])
    

     

    假如我们想在安装前执行某个shell脚本,我们也可以在configure.ac中增加相关命令。

    cd src/protocol && ./update_proto.sh && cd -
    

    注意

    1. 如果在confiugre.ac中定义了宏AC_PROG_LIBTOOL

        1automake时可能提示提示“required file `build/ltmain.sh' not found”。可运行如下命令自动copy到当前工程:

              libtoolize --automake --copy --debug --force

        2)  如果出现如下提示:

    configure.ac: required file `./install-sh' not found

    configure.ac: required file `./missing' not found

    Makefile.am: required file `./depcomp' not found

            可使用命令automake --add-missing,或将/usr/share/automake-1.X/目录下的depcomp等文件拷贝到本目录下

    2. 如果引用第三方的库需要先解压和编译,也可以将对应的configure & make & make install写在configure.ac

  • 相关阅读:
    CC3200作为STA模式连接路由器sl_WlanConnect出现exception occured at:0xa72fcf6
    HI2115软件开发板V150版本AT+NSOST指令
    利尔达NB-IOT模块对接移动onenet平台步骤
    ip4addr_ntoa和不可重入函数
    VHDL入门学习-程序组成
    nexys4-DDR开发板温度传感器ADT7420U
    2016-2017股票亏损反省
    一起来学linux:例行性任务之at和crontab
    linux c编程:进程间通信
    一起来学linux:sudo
  • 原文地址:https://www.cnblogs.com/yejinru/p/4983209.html
Copyright © 2020-2023  润新知