LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 973|回复: 14

makefile 的问题

[复制链接]
发表于 2004-12-29 14:10:44 | 显示全部楼层 |阅读模式
我遇到了关于 makefile 的问题, 和我正在做的项目有关.

我写了一个编译器, 用来把输入编译成(专用)打印机可以识别的指令. 由于文法的问题, 这个编译器中还要再嵌入另一个解释器(为了方便维护, 这个编译器和解释器都是用 yacc 来翻译成 C 文件的). 现在, 问题出现了. 假设我已有了一个文件 pc.y 以及与它配合的 lex.l, 这是编译器的文件. 我可以这样写 makefile:

  1. CC = gcc
  2. CFLAGS = -DYYDEBUG=1 -g
  3. YFLAGS = -v -d
  4. LFLAGS = -d

  5. OBJS = pc.o prop.o error.o lex.o

  6. pc:        $(OBJS)
  7.         $(CC) $(CFLAGS) $(OBJS) -ll -o pc

  8. lex.o pc.o prop.o error.o:        pc.h

  9. lex.o:        x.tab.h

  10. x.tab.h:        y.tab.h
  11.         -cmp -s x.tab.h y.tab.h || cp y.tab.h x.tab.h

  12. clean:
  13.         rm -f $(OBJS) y.output [xy].tab.[ch]
复制代码


make 知道如何从 pc.y 和 lex.l 制造出 pc.o 和 lex.o. 执行是这样的:

  1. [herbert@localhost pc]$ make
  2. yacc -v -d pc.y
  3. mv -f y.tab.c pc.c
  4. gcc -DYYDEBUG=1 -g   -c -o pc.o pc.c
  5. gcc -DYYDEBUG=1 -g   -c -o prop.o prop.c
  6. gcc -DYYDEBUG=1 -g   -c -o error.o error.c
  7. cmp -s x.tab.h y.tab.h || cp y.tab.h x.tab.h
  8. lex -d -t lex.l > lex.c
  9. gcc -DYYDEBUG=1 -g   -c -o lex.o lex.c
  10. gcc -DYYDEBUG=1 -g pc.o prop.o error.o lex.o -ll -o pc
  11. rm pc.c lex.c
  12. [herbert@localhost pc]$
复制代码


但是, 当我加入解释器的文件 arg.y 和 arglex.l 时就有问题了. 为了与已有的 pc.y 产生的输出 y.output, y.tab.c, y.tab.h 不同, 我应该使用 -b 选项, 这样, yacc 产生的输出就会以我希望的名字开头. 比如, 如果我用了 -b arg, yacc 就输出 arg.output, arg.tab.c, arg.tab.h. 可是 make 并不知道这些. 当我这样做时, make 出错了:

  1. [herbert@localhost pc]$ make
  2. yacc -v -d -b arg -p arg arg.y
  3. mv -f y.tab.c arg.c
  4. mv: can't stat source y.tab.c
  5. make: *** [arg.c] Error 1
  6. [herbert@localhost pc]$
复制代码


怎样告诉 make 用 arg.tab.c 而不是默认的 y.tab.c 呢?

这里还有另一个解决方案, 就是我把 arg.y 和 arglex.l 放入我现在的项目的子目录里. 可是, yacc 产生的输出都是在当前目录的, 而我又不会告诉 make 进入那个目录. 请问如何告诉 make 在一个合适的时机进入一个子目录并在另外一个合适的时机回来呢?
发表于 2004-12-29 19:29:01 | 显示全部楼层
可以试试自己指定Make的目标和过程。Makefile只能对当前的目录管用。但make程序会自动搜索子目录,所以只要在子目录中放一个Makefile就行了。
 楼主| 发表于 2004-12-30 11:50:13 | 显示全部楼层
试了一下,需要在项目主目录的 makefile 里写下递归使用 makefile 的信息才行。现在我的 makefile 是这样的,请您看看有什么可以改进的地方,谢谢。

- 项目主目录的 makefile

  1. CC = gcc
  2. CFLAGS = -DYYDEBUG=1 -g
  3. YFLAGS = -v -d
  4. LFLAGS = -d

  5. OBJS = pc.o prop.o error.o lex.o
  6. ARGPARSER = arg/arg.o arg/arglex.o

  7. pc:     $(OBJS) argparser
  8.         $(CC) $(CFLAGS) $(OBJS) $(ARGPARSER) -ll -o pc

  9. lex.o pc.o prop.o error.o arg/arg.o arg/arglex.o:       pc.h

  10. lex.o:  x.tab.h

  11. argparser:
  12.         cd arg && $(MAKE)

  13. x.tab.h:        y.tab.h
  14.         -cmp -s x.tab.h y.tab.h || cp y.tab.h x.tab.h

  15. clean:
  16.         rm -f $(OBJS) $(ARGPARSER) y.output arg/y.output [xy].tab.[ch] arg/xarg.tab.h arg/y.tab.[ch]
复制代码


- 子目录 arg 下的 makefile

  1. CC = gcc
  2. CFLAGS = -DYYDEBUG=1 -g
  3. YFLAGS = -v -d -p arg
  4. LFLAGS = -d -Parg

  5. arglex.o:       xarg.tab.h

  6. xarg.tab.h:     y.tab.h
  7.         -cmp -s xarg.tab.h y.tab.h || cp y.tab.h xarg.tab.h

  8. y.tab.h:        arg.o
复制代码
发表于 2004-12-30 19:28:13 | 显示全部楼层
我这里没有你的代码,不好调试。你先看看有什么错误,再错误信息贴出来分析。
 楼主| 发表于 2004-12-31 09:55:11 | 显示全部楼层
这里就是我的源代码了,请您看一看(写的是 zip,实际上是 tar.gz)。不过,由于它还在开发过程中,除了 makefile 的问题外还有其他的问题。谢谢。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
 楼主| 发表于 2004-12-31 10:31:03 | 显示全部楼层
对不起,我传上去的文件的 makefile 还没修改为新的呢。麻烦您一下吧,非常感谢。
发表于 2004-12-31 10:33:53 | 显示全部楼层
我先看看吧。对yacc和lex还不怎么熟悉呢。
发表于 2004-12-31 10:36:43 | 显示全部楼层
晕,你是用什么压缩的?我用unzip解压不了。能不能重新上传一下。
 楼主| 发表于 2004-12-31 10:57:35 | 显示全部楼层
先把文件名改为 tar.gz,然后用 tar 解压。
发表于 2004-12-31 11:07:46 | 显示全部楼层
Post by herberteuler
先把文件名改为 tar.gz,然后用 tar 解压。

原来如此,论坛上传文件不需要改名字吧。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表