标题:玩autotools遇到的一个make问题,请教wxjeacen大牛
只看楼主
StarWing83
Rank: 8Rank: 8
来 自:仙女座大星云
等 级:贵宾
威 望:19
帖 子:3951
专家分:748
注 册:2007-11-16
结帖率:90%
已结贴  问题点数:20 回复次数:12 
玩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
广陵绝唱
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:29
帖 子:3607
专家分:1709
注 册:2008-2-15
得分:3 
帮顶。
2009-08-12 17:22
wxjeacen
Rank: 7Rank: 7Rank: 7
等 级:禁止访问
帖 子:1291
专家分:628
注 册:2009-3-22
得分:3 
map.txt是在哪个路径

Makefile 一般是放在src外面的。

如果项目很大,有多个目录下面有makefile

想执行更深路径下的makefile可以直接在上曾makefile里面加cd DIR之类的shell语句。

Makefile 里的变量最好大写。

生命不熄,战斗不止.
2009-08-12 17:23
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
wxjeacen
Rank: 7Rank: 7Rank: 7
等 级:禁止访问
帖 子:1291
专家分:628
注 册:2009-3-22
得分:0 
一般.h跟.cpp和.c是不放一个目录的。

automake 我觉得其实是比较垃圾的。

会自动添加一些你不需要的编译选项。


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


这叫个什么规则。。我估计这条语句什么也不干。

生命不熄,战斗不止.
2009-08-13 10:09
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
BlueGuy
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:29
帖 子:4476
专家分:4055
注 册:2009-4-18
得分:3 
帮顶啊。

我就是真命天子,顺我者生,逆我者死!
2009-08-13 15:19
wxjeacen
Rank: 7Rank: 7Rank: 7
等 级:禁止访问
帖 子:1291
专家分:628
注 册:2009-3-22
得分:0 
你看到我最近贴的包里面的Makefile是怎么写的。

跟之前贴的不一样了。

我是根据真实项目经验写出来的。

也许你觉得autoconfig automake 之类的好用。

我去年也用了一阵子autotool,在连别的库的时候,比如lc lxlib之类老出错。

建议还是自己学着怎么写。

生命不熄,战斗不止.
2009-08-13 15:37
CCVC果冻爽
Rank: 4
等 级:业余侠客
帖 子:116
专家分:209
注 册:2009-7-31
得分:3 
看完此贴,深受打击。比火星文还难懂。
2009-08-13 18:32
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



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-282383-1-1.html




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

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