这样,我叙述一下文件结构。
文件是这个样子的:
|-- 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过去呢?