autoconf&automake使用小结

    今天被这个东西折磨了一天,其实就是因为改变了wireshark的代码想把它重新编译,但是有没有办法弄懂他的makefile,只能在原有的基础之上进行一些修改来使用。我们实际上主要修改了gtk目录的一些界面来尝试一下,但是悲剧的是根本无从下手。和大部分开源软件一样,wireshark的makefiles是用automake自动生成的。囧啊~~~所以不得不研究了一下这个automake工具了。

    网上还是有些资料是可以参考以下的:

http://linux.chinaunix.net/techdoc/system/2009/02/05/1060775.shtml

https://www.ibm.com/developerworks/cn/linux/l-makefile/

    整个流程大概如下,每步的作用也做了简要说明:(转)

1. 源码根目录调用autoscan脚本,生成configure.scan文件,然后将此文件重命名为configure.ac(configure.in,早期使用.in后缀)

2. 修改【configure.ac,利用autoconf提供的各种M4宏,配置项目需要的各种自动化探测项目

3. 编写【自定义宏】,建议每个宏一个单独的*.m4文件;

4. 调用aclocal收集configure.ac中用到的各种非Autoconf的宏,包括自定义宏;

5. 调用autoheader,扫描configure.ac(configure.in)acconfig.h(如果存在),生成config.h.in宏定义文件,里面主要是根据configure.ac中某些特定宏(AC_DEFINE)生成的#define#undefine宏,configure在将根据实际的探测结果决定这些宏是否定义(具体见后面例子)。

6. 按照automake规定的规则和项目的目录结构,编写一个或多个【Makefile.am(Makefile.am数目和存放位置和源码目录结构相关)Makefile.am主要写的就是编译的目标及其源码组成。

7. 调用automake,将每个Makefile.am转化成Makefile.in,同时生成满足GNU编码规范的一系列文件(带-a选项自动添加缺少的文件,但有几个仍需要自己添加,在执行automake前需执行touch NEWS README AUTHORS ChangeLog)。如果configure.ac配置了使用libtool(定义了AC_PROG_LIBTOOL宏(老版本)或LT_INIT宏),需要在此步骤前先在项目根目录执行libtoolize --automake --copy --force,以生成ltmain.sh,供automakeconfig.status调用。

8. 调用autoconf,利用M4解析configure.ac,生成shell脚本configure。以上几步完成后,开发者的工作就算完成了,后面的定制就由开源软件的用户根据需要给configure输入不同的参数来完成。

9. 用户调用configure,生成Makefile,然后make && make install

  说穿了就是在工程目录下运行一系列命令,创建和修改几个文件,就可以生成符合该平台的Makefile文件。

   具体使用的时候,首先我们进入 project 目录:

1) 运行autoscan命令

2) 将configure.scan 文件重命名为configure.in,并修改configure.in文件

3) 在project目录下新建Makefile.am文件,并在各个子目录下也新建makefile.am文件

4) 在project目录下新建NEWS、 README、 ChangeLog 、AUTHORS文件

5) 将/usr/share/automake-1.X/目录下的depcomp和complie文件拷贝到本目录下

6) 运行aclocal命令

7) 运行autoconf命令

8) 运行automake -a命令

9) 运行./confiugre脚本

   可以通过图看出产生Makefile的流程,如图所示:


    就按上面的,我先把gtk文件夹的makefile.am文件修改一下。比如我添加了两个文件1.c,2.c,我就得在makefile.am中对应的列举源码常量的位子给写上这两个文件。

然后就试图automake生成makefile.in文件,可是它老说我的automake是和工程中不匹配,建议我aclocal,结果我运行aclocal后就报错了类似macro `AM_PATH_GTK 3_0' not found in library之类的错误,好纠结啊~~一直不明白为啥,甚至吧configure里AM_PATH_GTK 3_0宏删掉,但是那样在编译的时候会产生一些异常的错误。纠结了许久之后,在一个国外网站

https://github.com/pruby/GNUnet-Mirror  

发现这个

If you receive an error during the
running of ". bootstrap" that looks like "macro `AM_PATH_GTK' not
found in library", you may need to run aclocal by hand with the -I
option, pointing to your aclocal m4 macros, i.e.

$ aclocal -I /usr/local/share/aclocal

    乱试了一通后,突然想起来有个aclocal-fallback的文件加下面有一些类似的东西,就运行了aclocal -I aclocal-fallback 结果就可以正常编译了。网上还是有蛮多的教程的,不过感觉都是在对几个helloword在举例,到了面对wireshark这种庞大的开源软件的时候,还真的有点束手,希望后面好过点,少浪费时间了~~




你可能感兴趣的:(脚本,Path,library,makefile,gtk,macros)