makefile解析目标以定义依赖项

时间:2018-11-26 15:07:43

标签: makefile

我在几个目录中都有源文件,我想将它们编译在一个唯一的临时目录中,目前,我使用此目标来创建目标文件:

wCur := TFDGUIxWaitCursor.Create(nil);
conn := TFDConnection.Create(nil);
try
  .....
  conn.Connected := True;
  conn.ExecSQL('blah blah blah');
  conn.Connected := False;
finally
  conn.Free();
  wCur.Free();
end;

它运行良好,但是当我修改源文件时,不会重新编译对象一个。因此,我必须将源文件添加到依赖项中。

但是此目标无效:

$(BUILD_DIR)/%.o : 
    @echo "Compiling $@"
    $(VERBOSE) $(CC) $(CFLAGS) -c $(DEFINES) $(INCLUDES) -o $@ $(shell echo "$(SOURCES)" | sed 's/ /\n/g' | sed -nr '/\/$(*F)\.c/p')

有什么方法可以在依赖项中使用目标名称?

1 个答案:

答案 0 :(得分:1)

假设您正在使用GNU Make ...

使用类似以下的规则:

obj/%.o: %.c
    $(CC) $(CPPFLAGS) $(CFLAGS) -c -o $@ $<

告诉make要从源文件编译目标文件obj/<name>.o <name>.c

与此结合使用VPATH special variable 通知make应该在其中寻找任何<name>.c的目录(如果不是) 在当前目录中。

此外,添加一个order-only prerequisite 模式规则,以确保将目标文件编译到的目录(obj) 在需要时存在:

obj/%.o: %.c | obj
    $(CC) $(CPPFLAGS) $(CFLAGS) -c -o $@ $<

例如,具有项目结构:

./
-- Makefile
-- aa/
    -- main.c
-- bb/
    -- foo.c
-- obj/ #<-- Compile object files in here
-- prog #<- program to be built

并且:

制作文件

VPATH := aa:bb
SRCS := foo.c main.c
OBJS := $(addprefix obj/, $(SRCS:.c=.o))

.PHONY: all clean

all: prog

prog: $(OBJS)
    $(CC) $(LDFLAGS) -o $@ $^ $(LDLIBS)

obj/%.o: %.c | obj
    $(CC) $(CPPFLAGS) $(CFLAGS) -c -o $@ $<

obj:
    mkdir $@

clean:
    $(RM) $(OBJS) prog

构建过程如下:

$ make
cc   -c -o obj/foo.o bb/foo.c
cc   -c -o obj/main.o aa/main.c
cc  -o prog obj/foo.o obj/main.o