我想尝试建立一个非常小的Makefile系统。我有以下设置,但有些事情是不对的(这是通过阅读关于该主题的一些SO帖子拼凑而成的,虽然有些项目特定的,有些网站。我不能抓住一些基本的东西“ Makefile“调用sub-makefile。
这比在不同子目录中使用主Makefile调用文件更简单。以下是我准备的以下文件:
生成文件:
all: $(MAKE) -f ./make_system.mk $(MAKE) -f ./make_crc.mk
make_system.mk:
G = -g ## debug option CC = gcc ## compiler SRCS = source.c sink.c gateway.c EXES = source sink gateway OBJS = source.o sink.o gateway.o CFLG = LFLG = LIB = #-lsocket -lnsl -lpthreadall: $(EXES)
%.o: %.c %.h $(CC) -c $G $(CFLG) $<
source: source.o $(CC) -o source source.o $(LIB) $(LFLG)
sink: sink.o $(CC) -o sink sink.o $(LIB) $(LFLG)
gateway: gateway.o $(CC) -o gateway gateway.o $(LIB) $(LFLG)
clean: /bin/rm -f core *.o $(EXES) *~
make_crc.mk:
CC = gcc CFLAGS = -g LFLAGS = HDR = crcmode.h SRC = crcmodel.c crctest.c OBJ = crcmodel.o crctest.o EXE = crctestall: $(EXE)
%.o: %.c %.h $(CC) -c $(CLFAGS) $<
$(EXE): $(OBJ) $(CC) $(LFLAGS) $(OBJ) -o $(EXE)
clean: /bin/rm -f *.o *~ core $(EXE)
如何设置Makefile来调用较小的子makefile(类型为* .mk)?这是使用大规模makefile系统的基本但重要的第一步(有手册可供咨询,但我认为它没有明确的基本示例)。如果有人这样做可以向我展示一个小的Makefile插图,那将非常感激(同样,这个makefile系统可以存在于同一个本地目录中)。
注意:单个makefile“make_system”和“make_crc”在它们自己被命名为“Makefile”时工作正常,但我想尝试将它们作为单独的子makefile调用一个整体Makefile。
ADDENDUM(以下解决方案): 一旦我实现了下面显示的Carl的解决方案,我意识到你需要在调用Makefile之前总是包含某种形式的“make clean”或者至少在命令行中输入。否则,您会看到相应的输出“无所事事”。这是我以前知道的,但这次忽略了这一点(简单的检查:只看你的目录,你会看到你在环境/目录中有可执行文件)。
答案 0 :(得分:1)
我想“转发”目标,你需要明确地做。像这个例子的东西应该有效(虽然我现在不能轻易测试,抱歉):
default: all
%:
$(MAKE) -f ./make_system.mk $@
$(MAKE) -f ./make_crc.mk $@