正好今天要使用automake来生成makefile,在此做个记录。
目前在同一个文件夹下有如下几个c++文件
下面一步一步的生成makefile文件
首先执行 :
ubuntu@VM-145-227-ubuntu:~/work/bbb/EcMasterDemoSyncSm$ autoscan
执行该命令后,会根据我的源码生成configure.scan文件,然后修改或者拷贝成configure.ac文件,大致过程如下:
your source files –> [autoscan*] –> [configure.scan] –> configure.ac
这里该需要对configure.ac做一下修改:
# -*- Autoconf -*-
# Process this file with autoconf to produce a configure script.
AC_PREREQ([2.69])
AC_INIT(acontiethercat, [1.0], [])
AM_INIT_AUTOMAKE(acontiethercat,1.0)
AC_CONFIG_SRCDIR([SyncSmDemoMain.cpp])
AC_CONFIG_HEADERS([config.h])
# Checks for programs.
AC_PROG_CXX(arm-linux-gnueabihf-g++)
AC_PROG_CC(arm-linux-gnueabihf-gcc)
# Checks for libraries.
# Checks for header files.
AC_CHECK_HEADERS([stdlib.h string.h unistd.h])
# Checks for typedefs, structures, and compiler characteristics.
AC_TYPE_SIZE_T
# Checks for library functions.
AC_CHECK_FUNCS([clock_gettime uname])
AC_OUTPUT(Makefile)
其中要改正的部分有:
AC_INIT(acontiethercat, [1.0], [])
其格式为:AC_INIT(package, version, bug-report-address)
这个第一个参数是要生成的bin文件的名字,第二个参数版本号,第二个参数写邮箱或者反馈bug的连接。
AM_INIT_AUTOMAKE(acontiethercat,1.0)
新加入的一个宏,为automake提供设置可移植性参数的一个宏,参数取上面的宏的前两项。
AC_CONFIG_SRCDIR([SyncSmDemoMain.cpp])
这只main函数所在的源码文件。
AC_PROG_CXX(arm-linux-gnueabihf-g++)
AC_PROG_CC(arm-linux-gnueabihf-gcc)
这里设置交叉编译器。
注意这个*.ac的格式,括号与宏之间不能用空格,例如:
AC_INIT ([oops], [1.0]) # incorrect
AC_INIT([hello], [1.0]) # good
AC_OUTPUT(Makefile)
每一个*.ac比如configure.ac文件都要以这个宏结束。
有了这个宏才会生成config.status并且运行它。我们这里吧输出文件设置Makefile ,该宏的设置格式为:
AC_OUTPUT ([file]. . . , [extra-cmds], [init-cmds])
这个宏是替换之前的废弃的老的格式:
AC_CONFIG_FILES(file...)
AC_CONFIG_COMMANDS([default],extra-cmds, init-cmds)
AC_OUTPUT
接下来执行aclocal 来生成aclocal.m4文件。执行autoconf生成configure文件。执行autoheader ,生成config.h.in ,config.h文件。
ubuntu@VM-145-227-ubuntu:~/work/bbb/EcMasterDemoSyncSm$ aclocal
ubuntu@VM-145-227-ubuntu:~/work/bbb/EcMasterDemoSyncSm$ autoconf
ubuntu@VM-145-227-ubuntu:~/work/bbb/EcMasterDemoSyncSm$ autoheader
完毕后,就要手动建立一个Makefile.am文件设置一些参数等等,下面我写的一个makefile.am
AM_LDFLAGS = -lpthread -lc -lm -lrt -ldl -lemllCPSW -lemllDW3504 \
-lemllFslFec -lemllGEM -lemllSockRaw
CXXFLAGS = -D__STDC_LIMIT_MACROS -g -Wall -DORDER_SERIALIZE \
-L /home/ubuntu/work/bbb/armv6-vfp-eabihf -I /home/ubuntu/work/bbb/INC \
-I/home/ubuntu/work/bbb/INC/Linux
AUTOMAKE_OPTIONS=foreign
bin_PROGRAMS=acontisethercat
acontisethercat_SOURCES= ecatDemoCommon.cpp \
Logging.cpp \
SyncSmDemo.cpp \
ecatNotification.cpp \
selectLinkLayer.cpp \
SyncSmDemoMain.cpp \
EcTimer.cpp
~
~
AM_LDFLAGS CXXFLAGS
是设置一些参数的,因人而异。
bin_PROGRAMS=acontisethercat
是设置做成二进制的文件名字
acontisethercat_SOURCES
这是设置是二进制的所以依赖的cpp文件。acontisethercat_SOURCES这个宏的前面的名字与生成二进制的名字向对应。
而下来就可以执行 automake –add-missing
ubuntu@VM-145-227-ubuntu:~/work/bbb/EcMasterDemoSyncSm$ automake --add-missing
接下来要进行配置,假如交叉编译,配置的时候要加上host参数
ubuntu@VM-145-227-ubuntu:~/work/bbb/EcMasterDemoSyncSm$ ./configure --host=arm-linux-gnueabihf
一切完毕,就可以进行make了。