autotools生成makefile
安装
sudo apt-get install automake autotools-dev autoconf m4
测试程序
#include <stdio.h> #include <string.h> void print(void) { printf("Hello,ElfBoard!\n"); }
#ifndef __HELLO_H__ #define __HELLO_H__ void print(void); #endif
#include <stdio.h> #include <string.h> #include <hello.h> int main(void) { print(); return 0; }
使用autoscan工具生成configure.scan
文件
autoscan将生成一个名为configure.scan
的文件,
其中包含了自动扫描到的可能需要配置的信息。
$ autoscan $ ls autoscan.log configure.scan hello.c hello.h main.c
修改configure.ac
文件
将configure.scan
文件重命名为configure.ac
,然后进一步编辑该文件。
开发者通常会添加更多的配置检查和必要的宏定义,
以确保生成的configure
脚本能够正确地检测和配置系统环境。
$ mv configure.scan configure.ac
修改configure.ac
将:
AC_INIT([FULL-PACKAGE-NAME], [VERSION], [BUG-REPORT-ADDRESS])
修改为
AC_INIT(main,0.0.1, [bug@sounos.org])
其中:
-
FULL-PACKAGE-NAME
为程序名称, -
VERSION
为当前版本, -
BUG-REPORT-ADDRESS
为bug汇报地址。
然后添加两句话
AM_INIT_AUTOMAKE AC_CONFIG_FILES([Makefile])
-
AM_INIT_AUTOMAKE
宏用于初始化automake
, 告诉autotools
使用automake
工具来管理生成的Makefile。 -
AC_CONFIG_FILES
宏告诉autotools生成哪些文件。在这种情况下, 它指定生成一个名为Makefile
的文件。
修改完成的configure.ac
如下:
# -*- Autoconf -*- # Process this file with autoconf to produce a configure script. AC_PREREQ([2.69]) #AC_INIT([FULL-PACKAGE-NAME], [VERSION], [BUG-REPORT-ADDRESS]) AC_INIT(main,0.0.1, [bug@sounos.org]) AM_INIT_AUTOMAKE AC_CONFIG_SRCDIR([hello.h]) AC_CONFIG_HEADERS([config.h]) # Checks for programs. AC_PROG_CC # Checks for libraries. # Checks for header files. AC_CHECK_HEADERS([string.h]) # Checks for typedefs, structures, and compiler characteristics. # Checks for library functions. AC_CONFIG_FILES([Makefile]) AC_OUTPUT
执行aclocal
执行aclocal命令会生成aclocal.m4
文件,
这个文件包含了用于自动配置和构建软件的宏定义和规则。
$ aclocal $ ls aclocal.m4 autom4te.cache autoscan.log configure.ac hello.c hello.h main.c
autoconf
autoconf命令根据configure.ac
文件生成configure
脚本。
$ autoconf $ ls aclocal.m4 autom4te.cache autoscan.log configure configure.ac hello.c hello.h main.c
autoheader
autoheader命令用于生成config.h.in
文件。
这个文件是由configure.ac
中的一些宏命令生成的模板文件,
它包含了预处理器定义和配置选项,
会在configure
脚本执行时生成最终的config.h
文件。
$ autoheader $ ls aclocal.m4 autom4te.cache autoscan.log config.h.in configure configure.ac hello.c hello.h main.c
写出Makefile.am
Makefile.am
是用来描述源代码和生成目标之间依赖关系的Automake规则文件。
写出如下配置:
AUTOMAKE_OPTIONS= foreign bin_PROGRAMS= main main_SOURCES= main.c hello.c
生成Makefile.ini
使用automake --add-missing
生成Makefile.ini
:
$ automake --add-missing configure.ac:12: installing './compile' configure.ac:7: installing './install-sh' configure.ac:7: installing './missing' Makefile.am: installing './depcomp' $ ls aclocal.m4 autom4te.cache autoscan.log compile config.h.in configure configure.ac depcomp hello.c hello.h install-sh main.c Makefile.am Makefile.in missing
生成configure
使用./configure --host=x86
按CPU架构生成configure
文件:
./configure --host=x86
如果是arm架构就使用--host=arm
:
./configure --host=arm
make生成可执行文件
$ make $ ls aclocal.m4 autoscan.log config.h config.log configure depcomp hello.h install-sh main.c Makefile Makefile.in stamp-h1 autom4te.cache compile config.h.in config.status configure.ac hello.c hello.o main main.o Makefile.am missing
测试执行
如果是x86架构就直接执行:
$ ./main Hello,ElfBoard!
如果是arm构架,就复制到板子里再执行。