编译特定的源列表并生成依赖关系

时间:2015-12-01 14:02:14

标签: c makefile

我的文件列表如下:

fd1/foo.c
fd2/foo.c
fd2/bar.c
fd2/bar.h

我想编译fd1 / foo.c和fd2 / bar.c。 fd2 / foo.c是一个被排除在外的人。如果我使用vapth选择所有源文件,将编译fd2 / foo.c.所以我想指定源列表:

SRC_C = fd1/foo.c fd2/bar.c

由于我无法使用vpath,所以我只能编译SRC_C:

SRC_O = $(patsubst %.c,%.o,$(SRC_C))
SRC_C_LIST = $(notdir $(SRC_C))
OBJ_LIST = $(patsubst %.c,%.o,$(SRC_C_LIST) )
.PHONY: all
all: $(OBJ_LIST)
    ar rvs foobar.a $(OBJ_LIST)
$(SRC_O): %.o : %.c
    gcc -c  $< -I inc/ -MM -MF $(patsubst .o,.d,$(notdir $@)) -o $(notdir $@)

但我也想要添加依赖规则。但是依赖文件似乎只包含没有原始文件夹名称的对象目标:

foo.o : src/foo.c inc/bar.h

在这种情况下如何使用依赖文件?感谢。

解决方案

根据Joachim的建议,我修改我的解决方案如下。似乎工作:

SRC_C = fd1/foo.c fd2/bar.c
SRC_O = $(patsubst %.c,%.o,$(SRC_C))
SRC_C_LIST = $(notdir $(SRC_C))
OBJ_LIST = $(patsubst %.c,%.o,$(SRC_C_LIST) )
SRC_D_LIST = $(patsubst %.o,%.d,$(OBJ_LIST))
.PHONY:all
all: $(SRC_O)
    ar rvs foobar.a $(OBJ_LIST)
$(SRC_O): %.o : %.c
    arm-none-eabi-gcc -c $< -I inc/ -o $@ -MM -MT $@ -MF $(notdir $(patsubst %.o,%.d,$@))
-include $(SRC_D_LIST)

1 个答案:

答案 0 :(得分:1)

如果您不介意在相应的.o文件中包含.d.c文件,请使用隐式规则:

LIB := foobar.a
SRC := fd1/foo.c fd2/bar.c
OBJ := $(SRC:.c=.o)
DEP := $(OBJ:.o=.d)

CC       := arm-none-eabi-gcc
ARFLAGS  := rvs
CPPFLAGS := -MMD -MP -I inc

.PHONY: all
.PRECIOUS: $(OBJ)

all: $(LIB)

$(LIB): $(LIB)($(OBJ))

-include $(DEP)