Autotools自动生成Makefile

Autotools自动生成Makefile Hilbert 2023-12-13 13:35:44 493

Autotools自动生成Makefile



Autotools

•系列工具包:Autoconf、Automake、Libtool

•工具安装 

•检测系统是否已经安装:which autoconf 
•自动安装:apt install autoconf automake libtool 
•需要依赖的包:m4\perl\autotools-dev\autoconf-archive\gnu-standards\ autobook … 
•手动安装: 

»下载对应.tar.gz源码包;解压tar xvf *.tar.gz 

»编译:./configure;make;make install 

Autotools自动创建Makefile流程

•生成Makefile的通用规则文件Makefile.in 

•(1)手工编写Makefile.am文件 
•(2)#automake:将Makefile.am-àMakefile.in 

•生成配置脚本configure 

•(1)#autoscan:生成configure.scanàconfigure.ac 
•(2)修改、配置configure.ac 
•(3)#aclocal:生成aclocal.m4,存放autoconf运行需要的宏 
•(4)#autoconf:将configure.acàconfigure 

•通过configure生成Makefile 

•(1)#./configure:Makefile.inàMakefile 
•(2)#make;make install 
示例:
  • 1、 在autotools下创建hello.c
  • 2、 用autoscan生成configure.scan
  • 3、 mv configure.scan configure.ac

  • 4、 修改configure.ac
  1 #                                               -*- Autoconf -*-
  2 # Process this file with autoconf to produce a configure script.
  3 
  4 AC_PREREQ([2.69])
  5 AC_INIT([FULL-PACKAGE-NAME], [VERSION], [BUG-REPORT-ADDRESS])  //FULL-PACKAGE-NAME 为软件包名, 
  6 AC_CONFIG_SRCDIR([hello.c])
  7 AC_CONFIG_HEADERS([config.h])
  8 
  9 # Checks for programs.
 10 AC_PROG_CC
 11 
 12 # Checks for libraries.
 13 
 14 # Checks for header files.
 15 
 16 # Checks for typedefs, structures, and compiler characteristics.
 17 
 18 # Checks for library functions.
 19 
 20 AC_OUTPUT

  1 #                                               -*- Autoconf -*-
  2 # Process this file with autoconf to produce a configure script.
  3 
  4 AC_PREREQ([2.69])
  5 AC_INIT(hello, 1.0, mail.original.com)
  6 AC_CONFIG_SRCDIR([hello.c])
  7 AC_CONFIG_HEADERS([config.h])
  8 AM_INIT_AUTOMAKE            //使用Automake编译
  9 
 10 # Checks for programs.
 11 AC_PROG_CC
 12 
 13 # Checks for libraries.
 14 
 15 # Checks for header files.
 16 
 17 # Checks for typedefs, structures, and compiler characteristics.
 18 
 19 # Checks for library functions.
 20 
 21 AC_OUTPUT(Makefile)  //指定输出文件 Makefiel
 22 
 23

  • 5、 aclocal:生成aclocal.m4,存放autoconf运行需要的宏

  • 6、 autoconf:将configure.ac->configure

  • 7、 创建 Makefile.am

  • 8 autoheader 生成配置文件

  • 9、 automake —add-missing(-a) 生成隐式配置

  • 10、 编译
        ./configure
        make
        make install
        make uninstall

工具的发展史

linux发行版


使用Autotools宏、变量配置flat目录的Makefile

软件目录结构

Flat

所有的文件都存放在同一个目录下


Shallow

主程序源文件放在顶层目录中
各个模块文件放在各个子目录中


Deep

所有源文件都存放在各个子目录中


Makefile.am语法

  1. 主要有宏、变量组成
  • 各个变量定义生成需要被编译、链接的目标、依赖源文件、要安装的目录等
  • 工具automake根据这些目标和源文件添加规则,生成makefile.in
  1. 少量的makefile语法、注释等
  • 在makefile.am定义的makefile代码将被添加到makefile.in的合适位置
  • 注释使用##表示,不会被输出到Makefile.in

Automake的宏、变量

文件编译类型 说明
_PROGRAMS 表示生成目标是可执行文件
_LIBRARIES 生成目标为库文件
_LTLIBRARIES 使用LIBTOOL生成库文件
_HEADERS 头文件
_DATA 数据文件、配置文件等
数据文件、配置文件等
bindir $(prefix)/bin
libdir $(prefix)/lib
datadir $(prefix)/share
sysconfdir $(prefix)/etc
includedir $(prefix)/include
$(top_srcdir) 工程顶层目录
$(top_builddir) 目标文件顶层目录
noinst 不安装
编译配置 说明
_SOURCES 目标依赖的源文件
_LIBADD 生成库时需要链接的其它库
_LDADD 链接需要链接的库
_LDFLAGS 链接选项:-I /-L/-shared/-fPIC
_LIBTOOLFLAGS Libtool编译选项
其它变量 说明
INCLUDES 链接所需头文件
SUBDIRS 递归处理子目录
EXTRA_DIST 打包文件或目录

Makfile.am示例

Configure.ac文件语法

说明 备注
AC_INI 一般以此开头 AC_INIT
AC_PROG_CC 检测C编译器,C项目需要设置此宏 检查编译器
AC_CONFIG_SRC_DIR 项目源文件 检测函数库
AC_CONFIG_HEADERS 配置头文件 检查头文件
AC_CHECK_LIB 检测lib库中是否有指定函数 检查函数定义类型
AC_PROG_LIBTOOL 使用libtool生成动态共享库
AC_PROG_RANLIB 静态库
AC_OUTPUT 设置configure输出的Makefile文件
AC_CONFIG_FILES([Makefile]) 用于生成相应的Makefile
AM_INIT_AUTOMAKE 运行Automake必需的宏
dnl或# 注释标志


Shallow目录架构的Makefile

shallow目录结构

在当前目录下做编译配置,会生成大量的配置文件,和原代码混合在一起,会十分混乱,所以新建一级src目录,使原码树保持整洁。

流程:

  1. 通过autoscan生成配置脚本
  2. mv configure.scan configure.ac
  3. 修改配置文件 vim configure.ac

    改为:

    添加生成静态库的宏:
  4. aclocal生成m4宏:
  5. 生成头文件autoheader:
  6. autoconf 生成 configure脚本
  7. 编写的Makfile.am
    根目录下的Makfile.am

    src目录下的Makefile.am

    usb下的Makefile.am

    lcd下的Makefile.am

    media下的Makefile.am

  8. 生成依赖automake -a:
  9. 生成makefile ./configure:
  10. 编译 make:

 头文件管理及路径指定

为了方便头文件的引用,把头文件放入指定的目录

# 修改src下的Makefile.am指定头文件路径:

  1. 老版本的INCLUDES宏指定:

 警告:

  1. 新版本的

打包软件包时怎么包含inc头文件目录

  1. 在inc下编写Makefile.am

  1. 在src下的主Makefile.am增加inc路径

  1. 在根上路的Makefile.am中指定要inc下生成makefile

  1. 重新配置 aclocal、 autoconf automake
  2. ./configure
  3. make
  4. make dist

确定头文件与C文件的依赖关系

  1. gcc -MM play.c 查看依赖的头文件
  2. 在Makefile.am中添加头文件的依赖

构建目标文件

Automake 没有定义目标文件的宏与变量,可以通编译原理来生成目标文件

  1. automake后手动修改Makfile.am
  • 修改src/Makefile.am

  • automake、./configure 后修改lcd/Makefile.in

  1. automake后手动修改Makfile.am
  • 修改src/Makefile.am

  • 修改src/usb/Makefile.am

  • ./configure后手动修改src/usb/Makefile.in


使用Libtool构建动态链接库

Libtool简介

  1. 不同Unix平台,共享库的编译、命名、管理方式不相同
  2. 库的命名:.so/.a/.sa/.o
  3. 有的平台支持动态加载、有的平台提供其它机制、有的不提供
  4. Libtool对库进行抽象,生成.la形式,支持不同平台

Libtool包

  1. 包含libtool和libtoolize两个工具
  2. 使用libtool之前,先使用libtoolize,生成本地化的libtool

Libtool的选项

—tag选项
语言 Tag名称 备注
C CC
C++ CXX
JAVA GCJ
Go GO
Fortran FC
Fortran 77 F77
—mode选项
—mode选项 说明 备注
compile 将一个源文件编译为Libtool目标文件
link 生成一个库或者可执行文件
install 安装一个库或可执行文件
execute 运行可执行文件,并自动设置库路径
uninstall 卸载库
clean 从编译目录清楚生成的文件
finish 完成Libtool库文件的安装

linux平台下动库的编译

编译目标文件
gcc -o jpg.o -c  -fPIC jpg.c
生成动态库
gcc -o libjpg.so -shared jpg.o

libtool 的使用

libtool —help
original@192:/work/autotools/jpg$ libtool --help
Usage: libtool [OPTION]... [MODE-ARG]...

Provide generalized library-building support services.

      --config             show all configuration variables
      --debug              enable verbose shell tracing
  -n, --dry-run            display commands without modifying any files
      --features           display basic configuration information and exit
      --mode=MODE          use operation mode MODE
      --preserve-dup-deps  don't remove duplicate dependency libraries
      --quiet, --silent    don't print informational messages
      --no-quiet, --no-silent
                           print informational messages (default)
      --no-warn            don't display warning messages
      --tag=TAG            use configuration variables from tag TAG
  -v, --verbose            print more informational messages than default
      --no-verbose         don't print the extra informational messages
      --version            print version information
  -h, --help, --help-all   print short, long, or detailed help message

MODE must be one of the following:

        clean              remove files from the build directory
        compile            compile a source file into a libtool object
        execute            automatically set library path, then run a program
        finish             complete the installation of libtool libraries
        install            install libraries or executables
        link               create a library or an executable
        uninstall          remove libraries from an installed directory

MODE-ARGS vary depending on the MODE.  When passed as first option,
`--mode=MODE' may be abbreviated as `MODE' or a unique abbreviation of that.
Try `libtool --help --mode=MODE' for a more detailed description of MODE.

When reporting a bug, please describe a test case to reproduce it and
include the following information:

        host-triplet:    x86_64-redhat-linux-gnu
        shell:        /bin/sh
        compiler:        gcc
        compiler flags:        -O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches   -m64 -mtune=generic -fPIC
        linker:        /usr/bin/ld -m elf_x86_64 (gnu? yes)
        libtool:    (GNU libtool) 2.4.2
        automake:    automake (GNU automake) 1.13.4
        autoconf:    autoconf (GNU Autoconf) 2.69

Report bugs to <bug-libtool@gnu.org>.
GNU libtool home page: <http://www.gnu.org/software/libtool/>.
General help using GNU software: <http://www.gnu.org/gethelp/>.
original@192:/work/autotools/jpg$

示例

使用libtool编译库文件
libtool --tag=CC  --mode=compile gcc -o jpg.lo -c jpg.c

libtool --tag=CC  --mode=link gcc -o libjpg.la -c jpg.lo

使用libtool编译可执行文件
libtool --tag=CC  --mode=compile gcc   -I./  -c hello.c
libtool --tag=CC  --mode=link gcc -o hello hello.lo  ./libjpg.la
sudo libtool  --mode=install install -c  hello /usr/local/bin/
sudo libtool  --mode=uninstall rm  /usr/local/bin/hello

autoconf、automake 与 libtool 配合使用

  1. 编写Makefile.am

  1. 生成配置脚本
  • autoscan
  • mv configure.scan configure.ac
  • vim configure.ac
  • aclocal
  • autoconf
  • libtoolize —automake —copy —debug —force //告诉automake 与 libtool 配合使用
  • automake -a
  • ./configure

mp3工程为例:

修改configure.ac

修改src/lcd/Makefile.am

修改src/usb/Makefile.am

修改src/Makefile.am

修改src/inc/Makefile.am

 autoconf
 autoheader
 libtoolize  --automake --copy --debug --force 
 aclocal
 automake -a
 ./configure

编译结果:

声明:本文内容由易百纳平台入驻作者撰写,文章观点仅代表作者本人,不代表易百纳立场。如有内容侵权或者其他问题,请联系本站进行删除。
Hilbert
红包 3 2 评论 打赏
评论
0个
内容存在敏感词
手气红包
    易百纳技术社区暂无数据
相关专栏
置顶时间设置
结束时间
删除原因
  • 广告/SPAM
  • 恶意灌水
  • 违规内容
  • 文不对题
  • 重复发帖
打赏作者
易百纳技术社区
Hilbert
您的支持将鼓励我继续创作!
打赏金额:
¥1易百纳技术社区
¥5易百纳技术社区
¥10易百纳技术社区
¥50易百纳技术社区
¥100易百纳技术社区
支付方式:
微信支付
支付宝支付
易百纳技术社区微信支付
易百纳技术社区
打赏成功!

感谢您的打赏,如若您也想被打赏,可前往 发表专栏 哦~

举报反馈

举报类型

  • 内容涉黄/赌/毒
  • 内容侵权/抄袭
  • 政治相关
  • 涉嫌广告
  • 侮辱谩骂
  • 其他

详细说明

审核成功

发布时间设置
发布时间:
是否关联周任务-专栏模块

审核失败

失败原因
备注
拼手气红包 红包规则
祝福语
恭喜发财,大吉大利!
红包金额
红包最小金额不能低于5元
红包数量
红包数量范围10~50个
余额支付
当前余额:
可前往问答、专栏板块获取收益 去获取
取 消 确 定

小包子的红包

恭喜发财,大吉大利

已领取20/40,共1.6元 红包规则

    易百纳技术社区