(GNU)Make:如何设置基本系统?

时间:2013-04-21 04:01:32

标签: build makefile gnu-make

我想尝试建立一个非常小的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 -lpthread

all: $(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    = crctest

all: $(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”或者至少在命令行中输入。否则,您会看到相应的输出“无所事事”。这是我以前知道的,但这次忽略了这一点(简单的检查:只看你的目录,你会看到你在环境/目录中有可执行文件)。

1 个答案:

答案 0 :(得分:1)

我想“转发”目标,你需要明确地做。像这个例子的东西应该有效(虽然我现在不能轻易测试,抱歉):

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