【问题标题】:(GNU) Make: How does one set up a basic system?(GNU) Make:如何建立一个基本系统?
【发布时间】:2013-04-21 04:01:32
【问题描述】:

我想尝试建立一个非常小的 Makefiles 系统。我有以下设置,但有些地方不太正确(这是通过阅读一些关于该主题的 SO 帖子拼凑而成的,虽然有点特定于项目,还有一些网站。我一定没有抓住一些基本的东西来拥有一个“ Makefile”调用子makefile。

这甚至比在不同的子目录中拥有主 Makefile 调用文件更简单。以下是我准备的以下文件:

生成文件:

全部: $(MAKE) -f ./make_system.mk $(MAKE) -f ./make_crc.mk

make_system.mk:

G = -g ## 调试选项 CC = gcc ## 编译器 SRCS = source.c sink.c gateway.c EXES = 源宿网关 OBJS = source.o sink.o gateway.o CFLG = LFLG = LIB = #-lsocket -lnsl -lpthread

全部:$(EXES)

%.o: %.c %.h $(CC) -c $G $(CFLG) $

来源:source.o $(CC) -o source source.o $(LIB) $(LFLG)

水槽:sink.o $(CC) -o sink sink.o $(LIB) $(LFLG)

网关:gateway.o $(CC) -o 网关 gateway.o $(LIB) $(LFLG)

干净: /bin/rm -f 核心 *.o $(EXES) *~

make_crc.mk:

CC = gcc CFLAGS = -g LFLAGS = HDR = crcmode.h SRC = crcmodel.c crctest.c OBJ = crcmodel.o crctest.o EXE = crctest

全部:$(EXE)

%.o: %.c %.h $(CC) -c $(CLFAGS) $

$(EXE): $(OBJ) $(CC) $(LFLAGS) $(OBJ) -o $(EXE)

干净: /bin/rm -f *.o *~ 核心 $(EXE)

如何设置 Makefile 来调用较小的子 makefile(*.mk 类型)?这是使用更大规模 makefile 系统的基本但重要的第一步(有手册可供参考,尽管我认为它没有明确的基本示例)。如果这样做的人可以向我展示一个小的 Makefile 小插图,我们将不胜感激(同样,这个 makefile 系统可以存在于同一个本地目录中)。

注意:单独的 makefile “make_system” 和 “make_crc” 当它们本身被命名为“Makefile”时可以正常工作,但我想尝试将它们称为单独的子 makefile,并带有一个整体 Makefile。

附录(以下解决方案): 一旦我实现了如下所示的 Carl 解决方案,我意识到您需要始终包含某种形式的“make clean”,或者至少在调用 Makefile 之前在命令行中输入 at。否则,您会看到相应的输出“无事可做”。这是我以前知道的,但这次忽略了(简单检查:只需查看您的目录,您就会看到环境/目录中有可执行文件)。

【问题讨论】:

  • 您遇到了什么问题?对我来说这看起来不错。
  • 当您说“单个 makefile ......当它们自己被命名为“Makefile”时工作正常,但是”,你的意思是当它们被调用为“make -f make_system.mk”时它们不起作用" 和 "make -f make_crc.mk"?
  • 我已经更新了我上面的帖子,所以你可以看到我得到的输出。当我输入标签“all”时它似乎不起作用,即使在两个子makefile中也是如此。我选择将每个子makefile 从“Makefile”(它们最初被称为)重命名为“some_descriptive_name.mk”,然后将新的主makefile 命名为“Makefile”。在执行这个新的系统之前,我确实输入了“make clean”。

标签: build makefile gnu-make


【解决方案1】:

如果你想“转发”目标,你需要明确地这样做。像这个例子这样的东西应该可以工作(虽然我现在不能轻松测试,抱歉):

default: all 
%:
    $(MAKE) -f ./make_system.mk $@
    $(MAKE) -f ./make_crc.mk $@

【讨论】:

  • 按照您的建议,在主 Makefile 中执行此操作后,我得到以下信息(您帖子中的内容正是主 Makefile 中的内容): $ make Makefile:2: ***缺少分隔符。停止。 @ 符号后面有什么东西吗?
  • 这通常意味着你的食谱中有空格而不是制表符。
  • 刚刚修复了它,所以没有标签(你是对的,GNUmake 对待标签的方式不同)。还是一样的错误。
  • 不,需要标签。
  • 你说得对,我的语法错误严重。好吧,我现在有了你发布的主 makefile 并得到了这个:“$ make make: *** No targets. Stop。”
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-28
  • 2016-02-12
  • 2013-06-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多