Jade Dungeon

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构架,就复制到板子里再执行。