| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1647 人关注过本帖
标题:玩autotools遇到的一个make问题,请教wxjeacen大牛
取消只看楼主 加入收藏
StarWing83
Rank: 8Rank: 8
来 自:仙女座大星云
等 级:贵宾
威 望:19
帖 子:3951
专家分:748
注 册:2007-11-16
结帖率:90%
收藏
已结贴  问题点数:20 回复次数:5 
玩autotools遇到的一个make问题,请教wxjeacen大牛
是这样的。automake默认是自动启用了VPATH,这样就可以实现mkdir objdir; cd objdir; ../configure && make这种操作了。现在我需要把一个文件原封不动拷贝到TARGET的所在地。但是遇到了问题。

我这样写的(在src的Makefile.am中):
map.txt :
        test -f $@ || cp $(srcdir)/map.txt $@

因为当前目录是在objdir的src里面,在通常情况下,这个规则可以很好的运行。但是因为VPATH设置为了$(srcdir),make居然直接到$(srcdir)而不是$(builddir)去寻找map.txt,结果自然是“没什么可以做的为`map.txt'”了……

请问这种问题,应该如何解决呢?
搜索更多相关主题的帖子: makefile autotools VPATH 
2009-08-12 14:51
StarWing83
Rank: 8Rank: 8
来 自:仙女座大星云
等 级:贵宾
威 望:19
帖 子:3951
专家分:748
注 册:2007-11-16
收藏
得分:0 
这样,我叙述一下文件结构。
文件是这个样子的:
|-- Makefile.am
|-- autogen.sh
|-- configure.in
`-- src
    |-- Makefile.am
    |-- game.c
    |-- game.h
    |-- main.c
    |-- map.txt
    |-- pixmap
    |   |-- Makefile.am
    |   |-- pic_blank.png
    |   |-- pic_box.png
    |   |-- pic_box_dest.png
    |   |-- pic_dest.png
    |   |-- pic_man.png
    |   `-- pic_wall.png
    |-- widget.c
    `-- widget.h



所有有Makefile.am的地方都会生成Makefile,只需要执行:
$ ./autogen.sh
$ ./configure && make
就OK。


现在的问题是,如果我学习GCC的configure,新建一个目录,在目录下干净地
make,如下:


$ mkdir objdir
$ cd objdir
$ ../configure && make


编译是完全没有问题的,但是运行时sokoban游戏直接退出。因为map.txt地图文
件应该和sokoban程序文件在一个目录下。在上一个情况下,是可以保证这一点
的,但是现在显然不行了,于是我在src/Makefile.am里面加了一个sokoban的依
赖规则:


sokoban_DEPENDENCIES = map.txt
$(builddir)/map.txt :
    cp $(srcdir)/map.txt $(builddir)


意思很简单,sokoban依赖于map.txt,并在builddir下没有map.txt的时候,从
srcdir下复制一份过去,这样在编译完毕sokoban以后,应该有一份map.txt在它
的同一个目录下了。


可是在实际运行的时候,却并没有复制一份map.txt过去,经过查询automake以
及autoconf的文档确定,automake自动生成了VPATH = @srcdir@这样的指令,使
得如果make在当前目录(也就是builddir)找不到文件的时候,就会转而去
@srcdir找文件。这样,它就会在srcdir找到一份原始的map.txt,从而拒绝复制
过去。


在不修改automake的行为的同时,如何修改Makefile.am文件,让make能在编译
完成sokoban之前,复制一份map.txt过去呢?
   



专心编程………
飞燕算法初级群:3996098
我的Blog
2009-08-13 04:34
StarWing83
Rank: 8Rank: 8
来 自:仙女座大星云
等 级:贵宾
威 望:19
帖 子:3951
专家分:748
注 册:2007-11-16
收藏
得分:0 
= =大牛即使觉得automake垃圾,也应该稍微用过吧?毕竟没有automake写符合GNU标准的makefile是很麻烦的。上面的三行,第一行设置了一个sokoban的依赖,必须解决map.txt才能开始LINK,下两行是个典型的rule。指出除非编译文件夹下的map.txt存在,否则从源代码文件夹里面复制一份过来。

专心编程………
飞燕算法初级群:3996098
我的Blog
2009-08-13 15:17
StarWing83
Rank: 8Rank: 8
来 自:仙女座大星云
等 级:贵宾
威 望:19
帖 子:3951
专家分:748
注 册:2007-11-16
收藏
得分:0 
额……那贴一份过来吧。个人认为必须包含all, dist, distclean, maintainer-clean, tags, install, uninstall这些目标,其余的没用过。

另:autotools的优势就是判断是否有特定库的简便性吖,我写的这个程序就连接了gtk+-2.0的库,使用autotools以后,首先自动在configure里面判断,然后自动包含进makefile里面,十分方便。

专心编程………
飞燕算法初级群:3996098
我的Blog
2009-08-13 18:42
StarWing83
Rank: 8Rank: 8
来 自:仙女座大星云
等 级:贵宾
威 望:19
帖 子:3951
专家分:748
注 册:2007-11-16
收藏
得分:0 
哦……看上去是个简化版的automake产品……


顺带说一下,wx你的BigInteger接口有缺陷,至少可以允许(a + b) = c;这种语句,而且有些friend/member的设定也欠妥。好像有本书很详细地讲解了运算符重载时的规则和技巧,wx最好还是去看看。

最后说一句,libgmp是很好的高精度库,且支持C++界面。有时候用用前人的东西也是很不错的。

专心编程………
飞燕算法初级群:3996098
我的Blog
2009-08-14 07:25
StarWing83
Rank: 8Rank: 8
来 自:仙女座大星云
等 级:贵宾
威 望:19
帖 子:3951
专家分:748
注 册:2007-11-16
收藏
得分:0 
这个问题昨天解决了,其实很简单,解决方案如下:

1. 在Makefile.am中将$(abs_builddir)作为规则名,依赖于map.txt:
sokoban_DEPENDENCIES = $(abs_builddir)/map.txt

$(abs_builddir)/map.txt:
    cp $(srcdir)/map.txt $(builddir)

这样会遇到一个问题,在distclean不会清理掉这个文件,我们必须在srcdir不同于builddir的时候,手动清理掉它:

2. 在configure.in里面加入下面一行:
AM_CONDITIONAL(NOT_IN_LOCAL, test "`cd $srcdir && pwd`" != "`pwd`")

3. 在Makefile.am里面加入下面几行:
if NOT_IN_LOCAL
DISTCLEANFILES = $(abs_builddir)/map.txt
endif

这样问题就解决了。

专心编程………
飞燕算法初级群:3996098
我的Blog
2009-08-14 07:30
快速回复:玩autotools遇到的一个make问题,请教wxjeacen大牛
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.016454 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved